У меня проблемы с пониманием того, что означает адрес и указатели.
Я получил адрес client.dll или в этом случае «ac_client.exe», как я работаю на штурмовой куб.
Я добавляю этот адрес к базовому адресу, чтобы получить указатель локального игрока, который появляется как 509b74.
Пример изображения
В этом указателе я использую localplayer и добавляю смещение F8, которое указывает мне на здоровье.
Как вы можете видеть это говорит 0x509b74 -> 000E1B188 …..
Откуда берется «000E1B188»? Я не понимаю?
тогда это делает 000E1B188 + f8 = 00E1B280
Что просходит? Я не понимаю ?!
Чтобы уточнить, 0x509b74 — это жестко закодированный адрес, который хорошо работает для Assault Cube, потому что рандомизация уровня адресного пространства не включена, а .exe всегда загружается в 0x400000. Вы также можете динамически получить адрес модуля ac_client.exe и затем добавить относительное смещение 0x109B74, используя ToolHelp32Snapshot
Для целей этого упражнения указатель — это переменная, которая просто содержит число, представляющее адрес. Когда вы программируете и определяете указатель, вы должны определить тип переменной, на которую будет указывать указатель. Это только ради компилятора, чтобы он мог создавать код, который правильно обращается к переменной в конце указателя с правильными инструкциями для этого типа данных и строгой типизированной проверкой ошибок компилятора.
0x509b74 — это указатель, который указывает на динамический объект локального игрока. Другими словами, указатель объекта динамического проигрывателя расположен по адресу 0x509b74. Он указывает на 0x00E1B188, который является адресом локального объекта проигрывателя, который выделяется динамически. Для перехода от 0x509b74 к 0x00E1B188 называется разыменовкой, которая просто считывает адрес, содержащийся в указателе.
После того, как указатель будет удален, вы увидите адрес 0x00E1B188, который можно назвать «базовым адресом» локального объекта игрока. Также учтите, что это по смещению 0x0 объекта игрока. Когда вы добавляете 0xF8 к нему, вы теперь смотрите на 0x0E1B280, адрес переменной здоровья, которая находится внутри класса игрока, это просто простое добавление на данный момент.
Это на самом деле просто, когда вы изучаете это. В основном это выглядит примерно так в коде:
struct player
{
int ammo;
int health;
}
player* localPlayerPtr = new player();
В этом примере боеприпасы смещены 0x0, здоровье смещено 0x4, предполагая, что целые числа равны 4 байта. Допустим, localPlayerPtr расположен в 0x509b74, указывает на новый объект игрока, расположенный в 0x00E1B188. Смещение 0x0 — это боеприпасы. Когда вы добавляете смещение 0x4, вы получаете 0x00E1B18C, который является адресом здоровья.
Понимание указателей и объектно-ориентированного программирования с точки зрения C ++ значительно упростит работу с указателями обратного инжиниринга, поэтому вам может понадобиться освежить в этом информацию и сделать несколько практических приложений.
Других решений пока нет …