Поиск «функции», которая последней изменила место в регистре?

извините, я полный нуб, когда дело доходит до 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 каждый раз разный. Если у кого-то есть еще идеи, это очень ценится, спасибо.


person ownagesbot    schedule 18.12.2011    source источник
comment
If the result isn't 0: JNE и JNZ являются синонимами одного и того же кода операции. Not-equal в данном случае является правильной семантической интерпретацией. (ZF устанавливается, если byte ptr [ecx+679h] - 1 равно нулю, потому что cmp похож на подпрограмму, которая только устанавливает флаги).   -  person Peter Cordes    schedule 27.07.2016


Ответы (3)


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

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

person Jens Björnhager    schedule 18.12.2011
comment
Привет, спасибо за ответ Йенс. Да, я могу запустить его в отладчике под IDA. То есть вы имеете в виду, найти адрес [ecx+679h], добавить точку останова записи в память, и после этого я смогу увидеть, какая функция записывает в нее? Извините, еще одно, что, если адрес будет отличаться каждый раз, когда запускается cmp byte ptr [ecx+679h], 1, то трассировка записи не будет работать? Извините за эти дилетантские вопросы. - person ownagesbot; 18.12.2011
comment
Да, при условии, что ecx и адрес не меняются. - person Jens Björnhager; 18.12.2011
comment
В этом случае подпрограмма, которая меняет один из флагов, может быть той, которая меняет и другие. - person Jens Björnhager; 18.12.2011
comment
Это меняется, я только что попробовал отладку. Jens, спасибо за совет, попробую разобраться. :) - person ownagesbot; 18.12.2011

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

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

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

person Necrolis    schedule 18.12.2011
comment
Я искал каждую ссылку на 679h, похоже, что он когда-либо использовался только для cmp и никогда для mov/add/lea и т. д. Возможно ли это, потому что, хотя 679h является константой, ecx изменяется и, таким образом, во время выполнения функции call/run ecx имеет другое значение? Извините, я ужасно дилетант в этом. Возможно, мне следует придумать другой способ найти нужную функцию. Это просто расстраивает, потому что я чувствую себя «так близко». - person ownagesbot; 19.12.2011
comment
@user1104652 user1104652: меняется ли когда-нибудь занятая ветка? потому что может быть возможно, что он никогда не был установлен, иначе он может быть установлен через другой двоичный модуль, такой как загруженная dll - person Necrolis; 19.12.2011

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

person rcd    schedule 27.07.2016
comment
ОП сказал, что ecx каждый раз указывает на другую структуру, а не на одно место с высоким трафиком. ОП сказал, что это проблема с попыткой использовать точку наблюдения для записи. Хорошее предложение попробовать отфильтровать условие при записи определенного значения, но в данном случае это не поможет. - person Peter Cordes; 27.07.2016