我有这段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]
的地址。有什么方法可以得到函数的静态地址吗?
答案 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软件开发人员手册
第二,[something]
表示将地址放在方括号内,然后从该地址获取值。在C语言中,这称为解引用指针。请记住,LEA指令并非如此。
例如mov eax, 0x1004000
表示将值0x1004000移入eax寄存器。现在,mov ecx, [eax]
将在RVA 0x1004000处获取任何32位值,并将其复制到ecx寄存器中。
最后,您将获得与您描述的功能完全相同的地址。您将按照说明进行操作,并注意保存在何处。我不知道您为什么称其为“静态”地址。