我正在进行一些逆向工程,我设法找到了我想要的东西。我在程序中发现了以下情况:
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还是0的函数a 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是第一个片段。
对不起,如果我絮絮叨叨,我感谢任何建议,谢谢。
在获取Jens建议之后,我尝试添加写跟踪断点,但内存位置发生了变化,即地址ecx + 679h每次都不同。如果有人有任何想法,非常感谢,谢谢。
答案 0 :(得分:1)
你能运行这个程序吗?
然后最简单的方法是在调试器中运行它;找到实际地址,然后在该地址处写入内存断点。
答案 1 :(得分:1)
一种非常便宜的方法是滥用代码段中常量的唯一性。 0x679
是一个非常独特的结构偏移量,因此很可能在应用程序模块中对它的任何引用都引用了您感兴趣的内容,因此您只需要搜索{{{1}中的某些内容。 {1}}或mov [r32 + 0x679],r32
。
当然,如果间接设置值,此方法需要更改,在这种情况下,您需要找到mov [r32 + 0x679],c32
或lea r32,[r32 + 0x679]
行的内容。
r32这里代表任何32位寄存器,类似地c32是任何32位(或更少)常量,这是ollydbg表示法,IDA应该有类似的外卡搜索
答案 2 :(得分:-1)
可能是因为[ecx + 679h]可能指向一个被大量使用的内存地址,比如堆栈或堆。所以监视这个很烦人,因为它是应用程序的暂存器,对于这种情况,你可能想要读取调试器的文档,如果它支持内存地址的条件发生变化,那么你可以设置你的调试器只有在每次调试时才会进入它满足特定值的写入/读取条件。