找到'功能'最后一次改变了寄存器中的位置?

时间:2011-12-18 16:06:33

标签: assembly x86 ida

抱歉,对于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还是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每次都不同。如果有人有任何想法,非常感谢,谢谢。

3 个答案:

答案 0 :(得分:1)

你能运行这个程序吗?

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

答案 1 :(得分:1)

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

当然,如果间接设置值,此方法需要更改,在这种情况下,您需要找到mov [r32 + 0x679],c32lea r32,[r32 + 0x679]行的内容。

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

答案 2 :(得分:-1)

可能是因为[ecx + 679h]可能指向一个被大量使用的内存地址,比如堆栈或堆。所以监视这个很烦人,因为它是应用程序的暂存器,对于这种情况,你可能想要读取调试器的文档,如果它支持内存地址的条件发生变化,那么你可以设置你的调试器只有在每次调试时才会进入它满足特定值的写入/读取条件。