2016-01-30 2 views
-4

Я пытаюсь прочитать значение регистра на определенном этапе выполнения. Например: Регистр ESI установлен на значение insn при 0x80487a0.C++ Возвращаемое значение регистра после выполнения команды по определенному адресу

Мой код, чтобы получить значение ESI является:

__asm{ 
    mov dword ptr [pBasePointer],esi 
}; 

но значение ESI было установлено на что-то другое, когда этот код RAN, мне нужно, чтобы получить значение ESI, когда его набор в 0x80487a0

Любое понимание?

+0

Не могли бы вы объяснить немного больше? Регистры не указаны ни в одном адресе, и если ESI равно 2, то его значение равно 2. –

+0

@SamiKuhmonen Регистр ESI устанавливается несколько раз за раз, я хочу получить значение ESI, поскольку оно находится в определенной точке памяти – Ex1Le

+0

Связан ли этот CheatEngine? –

ответ

1

Теперь, когда вопрос окончательно выяснены комментариев:

Я не знаю, почему вы хотите это, или то, что вы надеетесь получить. Поскольку вы, по-видимому, можете перекомпилировать свою программу с помощью кода трассировки, вы должны просто выяснить, как отслеживать, что вы пытаетесь проследить.

Окончательный адрес данной строки кода не фиксируется до момента ссылки, поэтому говорить об абсолютных адресах для меня не имеет смысла. Решения о распределении регистров, принимаемые компиляторами, также чувствительны к небольшим изменениям источника и уровню оптимизации.

Так что «ESI, установленный insn по фиксированному адресу», не является полезной вещью для записи, если только бинарный файл уже не скомпилирован и не может быть перекомпилирован. Даже если источником был asm, вы просто добавили insn после того, который вас интересовал, так как строка источника, а не какой-то двоичный адрес.


Лучше всего, вероятно, использовать одни и те же объекты, как отладчик, чтобы остановить выполнение в инструкции после того, вас интересует. Зафиксируйте значение ESI и затем возобновить выполнение.

В Linux вы должны использовать интерфейс ptrace (или построенную на нем библиотеку) и установить точку останова. Очевидно, что Windows имеет какой-то API для процесса отслеживания другого процесса. Я не знаю, как использовать, или даже то, что называется Windows, извините.

Я подозреваю, что у вас будет меньше кода для записи, если у вас есть отдельный процесс «отлаживать» тот, который вы хотите отслеживать. Сам процесс «отладки» может быть сложнее, если API не предназначены для него.

Обратите внимание, что инструкции переменной переменной x86 очень усложняют программный поиск начала следующей инструкции.

Как я понимаю, контрольные точки устанавливаются путем замены первого байта инструкции с 0xCC, который является специальной однобайтной кодирование int 3, который также имеет некоторые специальные регистры в исполнении из CD 03 (двух- байтовая форма int 3).

Если кто-то хочет улучшить этот ответ, отредактируйте это или скопируйте столько, сколько хотите, в свой собственный ответ. Все, что я могу сделать, это указать OP на средства отладки без каких-либо конкретных предложений кода. Мне неинтересно писать собственный отладчик или более детально узнать, как это работает, чтобы прочитать сами документы, чтобы решить проблему OP.

Смежные вопросы