0

抱歉,对于 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 是第一个片段。

对不起,如果我漫无目的,我很感激任何建议,谢谢。

在听取了 Jens 的建议后,我尝试添加一个 write trace 断点,但是内存位置发生了变化,即地址 ecx+679h 每次都不一样。如果有人有更多的想法,非常感谢,谢谢。

4

3 回答 3

1

你能运行程序吗?

那么最简单的方法应该是在调试器中运行它;找到实际地址,然后在该地址处设置写内存断点。

于 2011-12-18T16:33:43.260 回答
1

一种非常便宜的方法是滥用代码片段中常量的唯一性。0x679是一个非常独特的结构偏移量,因此很可能在应用程序模块中对它的任何引用都引用了您感兴趣的内容,因此您只需要搜索类似mov [r32 + 0x679],r32or的内容mov [r32 + 0x679],c32

当然,如果值是间接设置的,则此方法需要更改,在这种情况下,您需要找到类似lea r32,[r32 + 0x679]or的内容add r32,0x679

这里的 r32 代表任何 32 位寄存器,类似地 c32 是任何 32 位(或更少)常量,这是 ollydbg 表示法,IDA 应该有类似的通配符搜索

于 2011-12-18T19:03:54.067 回答
-1

可能是因为 [ecx+679h] 可能指向一个经常使用的内存地址,比如堆栈或堆。因此监视这很烦人,因为它是应用程序的暂存器,对于这种情况,如果它支持内存地址条件更​​改,您可能需要阅读调试器的文档,因此您可以将调试器设置为仅在出现满足特定值的写/读条件。

于 2016-07-27T03:42:31.000 回答