2016-12-25 162 views
0

我有这片x86汇编代码:认识86 R/M32指令

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

的OpenSecurityTraining-画TEACHED我说的是,处理器尝试在该位置something访问存储器[something] meants。
这将意味着move 0x984C400 into edx, add 0x1E0 to it and call whatever address there is in memory

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

+1

标题从身体问一个不同的问题。您对间接寻址模式有什么不了解? IDA通常是非常好的发现间接目标,如果它没有提出任何建议,那么目标可能取决于计划状态和知道它是什么的更简单的方法,它正在打电话之前就打破了。你可以看到* off_984c400 *的所有交叉引用,并希望有一些结果有帮助 –

+0

'0x1E0'为480 ...这与'off_984C400'有一些偏移,所以对'off_984C400'的交叉引用可能不会显示代码它正在准备地址(如果它被其他代码动态地写入'0x984C5E0'的内存中)。如果你能够调试代码,那么在那里设置一个内存写入断点可能会更容易,以查看地址是如何设置的(如果它不是静态的,那么在调用之前的断点就足以将其全部公开,就像Margaret所建议的那样)。 – Ped7g

+0

'有没有什么办法可以得到函数的静态地址?'不太可能。如果只有一个可能的目标,那么代码可能不会首先使用间接的“调用”。这个例外是针对库函数调用,其中动态链接是通过间接级别来完成的,而不是在典型的操作系统上重写整个可执行文件中的'调用rel32'编码。 –

回答

0

最可能的解释是有问题的地址是struct有一个虚拟函数指针(设置别的地方),或者它是一个vtable(如果它是C++)。指针可能是在数据段(检查自己)

如果是用虚拟的功能struct,检查地址的xref S(也许它周围的地址)

vtable s的在ctor小号初始化,所以在这种情况下xref ing地址应该让你到ctor

无论如何,请记住,这个调用可以被翻译成多个可能的函数。