理解x86 r / m32指令

时间:2016-12-25 06:47:59

标签: assembly reverse-engineering static-analysis ida

我有这段x86汇编代码:

mov edx, off_984C400
mov eax, [edx+1E0h]
call eax

OpenSecurityTraining-Videos告诉我[something]我要求处理器尝试访问位置something的内存。
这意味着move 0x984C400 into edx, add 0x1E0 to it and call whatever address there is in memory

我现在的问题是,我只通过IDA进行静态分析,不知道如何找出[0x984C400 + 0x1E0]的地址。有什么方法可以得到函数的静态地址吗?

2 个答案:

答案 0 :(得分:1)

最有可能的解释是,有问题的地址是struct,其中包含虚拟函数指针(在其他地方设置),或者它是vtable(如果是&##} 39; s C ++)。指针可能在数据段中(自己检查)

如果它是具有虚拟功能的struct,请检查地址的xref(以及其周围的地址)

vtable已在ctor中初始化,因此在这种情况下,xref地址应该会转到ctor

无论如何,请记住,此调用可以转换为多个可能的函数。

答案 1 :(得分:1)

首先,您的问题与r/m32无关。 r/m32是一种语法,表示指令的操作数可以是寄存器或32位内存地址。请参阅 Intel 64 and IA-32 Architectures软件开发人员手册

的第2A卷第3节中的更多详细信息。

第二,[something]表示将地址放在方括号内,然后从该地址获取值。在C语言中,这称为解引用指针。请记住,LEA指令并非如此。

例如mov eax, 0x1004000表示将值0x1004000移入eax寄存器。现在,mov ecx, [eax]将在RVA 0x1004000处获取任何32位值,并将其复制到ecx寄存器中。

最后,您将获得与您描述的功能完全相同的地址。您将按照说明进行操作,并注意保存在何处。我不知道您为什么称其为“静态”地址。