В настоящее время я редактирую память в игре под названием 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;
}
что, я думаю, еще более уродливо, чем то, что я написал. Я не рекомендую вам читать это, если вы не хотите мигреней.
char*
иchar**
. Тогда вам не понадобится/sizeof(int)
, и вы сможете корректно работать со смещениями, не кратнымиsizeof(int)
. - person john   schedule 28.04.2013