Я занимаюсь некоторыми исследованиями по взлому, и я наткнулся на некоторые уроки Cheat Engine для взлома памяти. Если бы мы захотели найти адрес памяти переменной, нам пришлось бы сканировать память процесса с помощью Cheat Engine, чтобы найти адрес. Однако, поскольку эти адреса динамичны, каждый раз, когда запускается новый процесс этой игры, адрес будет меняться.
Поэтому в учебнике были введены статические адреса, которые не меняются для каждого экземпляра игры. И чтобы найти этот адрес, нам пришлось повторно сканировать "для доступа к этому адресу", используя регистр из строки сборки из предыдущего сканирования, чтобы найти следующий. Сборка будет в форме
opcode [esi + offset]
Итак, в конце концов, мы получаем адрес и смещение, которое является базовым адресом.
Но как это работает?
Кроме того, я не совсем понимаю понятие базового адреса. Это какой-то относительный адрес, где программа загружается в память? Таким образом, это не изменится, когда мы снова загрузим программу?
Вероятно, переменная хранится в классе, который динамически выделяется во время выполнения, поэтому переменный адрес изменяется при каждом прогоне. Будучи динамически распределенным, что-то должно ссылаться на этот адрес, и именно там статические адреса начинают входить в игру. В вашем примере ESI
, скорее всего, был назначен адрес базовой памяти выделенного класса, например, с оператором mov esi, [somevar]
(где somevar
- переменная указателя, которая содержит выделенный адрес), а offset
- это смещение байта целевой переменной внутри класса. Поэтому сначала найдите somevar
а затем вы можете перейти к целевой переменной.