私は現在、Assault Cube というゲームをメモリー編集しています。残念ながら、動的メモリ割り当てのため、編集したい値へのアドレスはゲームが開始するたびに変わります。幸いなことに、常に動的アドレスを指す静的ポインターがあります。チート エンジンを使用すると、ポインターを見つけることができますが、8 レベルまで上がることもあります。********pointer
毎回行うのではなく、次のようにします*pointer
。その上、オフセットがあるため、ハードコードするのは悪夢です。
代わりに、次の関数を使用しています。
int* getLowestPointer(int** highestPointer, int levels, int offsets[])
{
for (int i = 0; i < levels; i++) {
highestPointer = (int**) (*highestPointer + offsets[i]/sizeof(int)); // I am dividing by sizeof(int) here to undo pointer arithmetic (since the offsets are the difference between the offsetted pointer and the base pointer - not in integer increments)
}
return (int*) highestPointer;
}
しかし、それは非常に面倒です。私は int* を int** に、またはその逆にキャストしていますが、これは悪い習慣と考えられています。悪い習慣にならないようにできることはありますか?これもウェブで見つけました:
DWORD FindDmaAddy(int PointerLevel, DWORD Offsets[], DWORD BaseAddress)
{
DWORD Ptr = *(DWORD*)(BaseAddress);
if(Ptr == 0) return NULL;
for(int i = 0; i < PointerLevel; i ++)
{
if(i == PointerLevel-1)
{
Ptr = (DWORD)(Ptr+Offsets[i]);
if(Ptr == 0) return NULL;
return Ptr;
}
else
{
Ptr = *(DWORD*)(Ptr+Offsets[i]);
if(Ptr == 0) return NULL;
}
}
return Ptr;
}
私が書いたものよりもさらに醜いと思います。片頭痛が必要でない限り、読むことはお勧めしません。