Нашли «функцию», которая в последний раз изменяла место в регистре? - PullRequest
0 голосов
/ 18 декабря 2011

извините, я полный нуб, когда дело доходит до ASM и IDA.Мой опыт программирования в основном в качестве разработчика Java, и я чувствую себя немного не в своей зоне комфорта.

Я занимаюсь реверс-инжинирингом, и мне удалось найти почти то, что я хотел.Я обнаружил следующее условие в моей программе:

mov     ecx, [esi+500h]
cmp     byte ptr [ecx+679h], 1
jnz     loc_7256AAD

Насколько я понимаю, он перемещает значение [esi + 500h] в регистр ecx, после чего сравнивает байт по адресу [exc + 679h].с байтом 1. Если результат не равен 0, он переходит к функции loc_7256AAD.

Моя проблема в том, что байт в [ecx + 679h] фактически является логическим, всегда 0 или 1. Этоэто хорошо, но я понятия не имею, как найти функцию, которая решает, будет ли результат 0 или 1. В основном я был бы просто признателен за несколько советов о том, как найти место, где значение [ecx + 679h]задавать.Спасибо.

Я предоставлю некоторый код из подпрограммы, которая вызывает этот фрагмент, если он помогает.

push    ecx
lea     eax, [esp+70h+arg_8]
mov     ecx, esp
mov     dword ptr [esp+70h+var_30], esp
push    eax
call    ds:mfc90u_280
mov     byte ptr [esp+70h+var_4], 9
mov     byte ptr [esp+70h+var_4], 1
mov     ecx, [esi+500h]
call    sub_7210050
mov     ebp, eax
test    ebp, ebp
jz      loc_7256E73

, а loc_7256E73 - первый фрагмент.

Извините, если яспасибо, и я ценю любой совет, спасибо.

Получив совет Йенса, я попытался добавить точку останова трассировки записи, но место в памяти меняется, то есть адрес ecx + 679h каждый раз отличается.Если у кого-то есть идеи, это очень ценится, спасибо.

Ответы [ 3 ]

1 голос
/ 18 декабря 2011

Действительно дешевый способ - это злоупотреблять уникальностью констант в вашем фрагменте кода. 0x679 является довольно уникальным структурным смещением, поэтому весьма вероятно, что любые ссылки на него в модуле (-ах) приложений относятся к тому, что вас интересует, поэтому вам нужно искать только что-то вроде mov [r32 + 0x679],r32 или mov [r32 + 0x679],c32.

Конечно, этот метод должен был бы измениться, если значение установлено косвенно, и в этом случае вам нужно найти что-то вроде lea r32,[r32 + 0x679] или add r32,0x679.

r32 здесь обозначает любой 32-битный регистр, аналогично c32 - любая 32-битная (или менее) константа, это нотация ollydbg, IDA должен иметь аналогичный поиск по подстановочному знаку

1 голос
/ 18 декабря 2011

Можете ли вы запустить программу?

Тогда самый простой способ - запустить ее в отладчике;найти фактический адрес и затем создать точку останова памяти для записи по этому адресу.

0 голосов
/ 27 июля 2016

возможно, потому что [ecx + 679h], возможно, указывает на адрес памяти, который часто используется, например, на стек или кучу. поэтому наблюдение за этим раздражает, так как это блокнот для приложения, для этой ситуации вы можете прочитать документы вашего отладчика, если он поддерживает изменение условий для адресов памяти, поэтому вы можете настроить отладчик так, чтобы он входил в него только тогда, когда условие записи / чтения определенного значения выполнено.

...