Assembly 查找';功能';最后一个改变了登记册上的位置?

Assembly 查找';功能';最后一个改变了登记册上的位置?,assembly,x86,ida,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 我的

对不起,我对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的建议后,我尝试添加一个写跟踪断点,但内存位置发生了变化,即地址ecx+679h每次都不同。如果有人还有其他想法,我们将不胜感激。谢谢。

您能运行该程序吗


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

一个非常便宜的方法是滥用代码段中常量的唯一性
0x679
是一个非常独特的结构偏移量,因此应用程序模块中对它的任何引用都很可能是指您感兴趣的内容,这导致您只需沿着
mov[r32+0x679]、r32
mov[r32+0x679]、c32
搜索内容

当然,如果该值是间接设置的,则需要更改此方法,在这种情况下,您需要沿着
lea r32、[r32+0x679]
add r32,0x679
的行查找某些内容


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

,可能是因为[ecx+679h]可能指向一个经常使用的内存地址,如堆栈或堆。因此,监视这一点很烦人,因为它是应用程序的草稿行。在这种情况下,如果调试器支持内存地址的条件发生变化,您可能需要读取调试器的文档,因此您可以将调试器设置为仅在满足特定值的写/读条件时才打断它。

您好,感谢您的回复。是的,我可以在IDA下的调试器中运行它。你的意思是,找到[ecx+679h]的地址,添加一个写内存断点,然后我应该能够看到什么函数写入它?抱歉,还有一件事,如果每次运行cmp字节ptr[ecx+679h],1时地址都不一样,那么写跟踪将无法工作?很抱歉提出这些业余问题。是的,假设ecx和地址不变。在这种情况下,更改其中一个标志的例程可能就是更改其他标志的例程。它确实会更改,我只是尝试了调试。谢谢你的建议,詹斯,我会尽力解决的。:)我搜索了679h的每一个引用,它看起来似乎只用于cmp,而不用于mov/add/lea等。这是否可能是因为679h是一个常数,ecx会发生变化,因此在调用/运行函数时ecx具有不同的值?对不起,我在这方面非常业余。也许我应该开始设计另一种方法来找到所需的功能。令人沮丧的是,我感觉自己“离得太近了”。@user1104652:taked分支是否会改变?原因可能是它实际上从未设置过,否则,它可能是通过另一个二进制模块设置的,例如,如果结果不是0,则加载的dll
:是相同操作码的同义词。在这种情况下,“不平等”是正确的语义解释。(如果
byte ptr[ecx+679h]
-
1
为零,则设置ZF,因为cmp就像一个只设置标志的子组件)。OP说
ecx
每次指向不同的结构,而不是指有一个高流量位置。OP表示,这就是试图使用写观察点的问题所在。建议尝试在写入特定值时过滤条件,但在这种情况下没有帮助。