Трудно описать, как именно это сделать, так как это сильно зависит от программы, которую вы изучаете, и от того, вышел ли автор, если его способ усложнить вашу жизнь.Обратите внимание, что я делал это только один раз, но он работал достаточно хорошо, даже если я знал только небольшую сборку.
Вероятно, происходит то, что значения распределяются в куче с использованием вызова malloc / new икаждый раз, когда вы меняете уровень, они очищаются и перераспределяются где-то еще.Поэтому идея состоит в том, чтобы взглянуть на ассемблерный код программы, чтобы найти, где хранится указатель, возвращенный функцией malloc, и найти способ надежно прочитать содержимое указателя и найти искомое значение.
Первое, что вам нужно, это отладчик типа OllyDbg и базовые знания по сборке.После этого начните с установки точки останова на чтение и запись для переменной, которую вы хотите исследовать.Поскольку вы сказали, что не можете точно сказать, где находится переменная, вам придется приостановить процесс во время его выполнения и найти значение в памяти программы.Надеемся, что в итоге вы получите только несколько результатов, которые будут просеиваться, но с подозрением относитесь ко всему, что находится в стеке, поскольку это может быть просто копия для вызова функции или для локального использования.
Как только точка остановаустановить просто запустить программу, пока не произойдет перерыв.Теперь все, что вам нужно сделать, это посмотреть на код и проверить, как осуществляется доступ к переменной.Если он передается в качестве параметра, перейдите на сайт вызова функции.Если к нему обращаются через указатель, запишите его и начните проверять указатель.Если к нему обращаются как к смещению указателя, это означает, что он является частью структуры данных, поэтому запишите это и начните исследовать другую переменную.И так далее.
Сосредоточьтесь на своей переменной и продолжайте изучать код, пока в конце концов не найдете корень, который может быть одним из двух:
Глобальная переменнаякоторый имеет статический адрес.Это самый простой сценарий, поскольку у вас есть статический адрес, жестко запрограммированный прямо в коде, который вы можете использовать для надежного обхода структур данных.
Переменная, выделенная в стеке.Это сложнее, и я не совсем уверен, как надежно справиться с этим сценарием.Возможно, что его адрес будет иметь такое же смещение от начала стека большую часть времени, но это может и не быть.Вы также можете пройтись по стеку, чтобы найти соответствующую функцию и ее параметры, но это немного сложно, чтобы получить право.
Как только у вас есть адрес, все, что осталось сделать, это использовать Прочтите ReadProcessMemory , чтобы найти переменную, используя найденную информацию.Например, если ваш адрес представляет указатель на структуру данных, в которой по смещению 0x40 хранится значение вашего топлива, вам нужно будет прочитать значение по адресу, добавить 0x40 к нему и еще раз прочитать результат.
Обратите внимание, что адрес действителен только до тех пор, пока исполняемый файл не изменяется.Если он перекомпилирован или исправлен, то вы должны начать все сначала.Я полагаю, вам также следует быть осторожным с Windows * ASLR , которая может менять адрес при каждом запуске программы.
Поле для комментариев было слишком маленьким, чтобы соответствовать этомупоэтому я поставлю это здесь.
Если это esp
плюс константа, то я считаю, что это параметр, а не локальная переменная (подтвердите, проверив расположение соглашения о вызовах).Если это так, то вы должны пошагово выполнить программу до тех пор, пока она не вернется к своему вызывающему, выяснить, как устанавливается параметр (ищите инструкции push перед инструкцией call) и продолжить изучение оттуда.Когда я сделал это, мне пришлось размотать стек один или два раза, прежде чем я нашел глобальный указатель на структуру данных.
Также регистр esi
не связан со стеком (мне пришлось посмотреть его ), поэтому я бы проверил, как он устанавливается.Возможно, он содержит адрес структуры данных, а константа - это смещение переменной.Если вы выясните, как установлен регистр, вы окажетесь намного ближе к указателю.