我有以下装配线,但我有一些问题需要理解,因为到目前为止,我一直看到这样的装配线:mov eax, 0,依此类推。
但是现在,我有以下内容(我使用IDA PRO):当我将loc_4048E0解释为全局变量时,可以假设dword_4870058获得值dword_4870058(如果我将10h用作返回值寄存器)。这是我唯一能想到的。

是对还是错的假设?

评论

编号loc_4048E0 SEEMS是一个函数。如果是,则dword_4870058是一个函数指针(以及您已经发现的全局变量),如果不是,则它是一个数据指针,由于某种原因,IDA似乎将其视为一个函数(不知道IDA误贴的可能性) />
我认为mov指令用于存储数据/内容。当它是函数指针时是否不同?我的意思是,为什么编译器选择mov而不是lea?

lea / mov的差异在这里很好地涵盖了。.stackoverflow.com/questions/1658294/…

#1 楼

较干净的版本为:

mov [dword_4870058] , offset loc_4048E0


然后,是一个变体:它包含在[ ]中的一个内存地址
,在这种情况下放入的值是另一个内存地址(在代码部分中)。

mov [address], value


值部分可以是值,指针,常量...它们都是相同的...只是数字。
< br忘了一点小事,在x86中,您无法执行内存到内存的移动。因此,“我可以假设[]获得值dword_4870058”是完全错误的,尚未调用该地址的函数吗?因此,它无法获得值10h ...

它只是将一个值(函数的地址)存储到另一个内存块中。

评论


大概,OP会在代码的其他地方找到类似调用ds:[dword_4870058]的内容。是否要调用此特定函数需要完整的流程跟踪,以查明它是一个常量(一次写入,从未修改),还是只能在运行时确定。

–杂件
2014-09-13 10:14