我对 Ghidra 一点也不熟悉,但我可以告诉你如何解释机器指令......
CALL dword ptr [EBX*0x4 + 0x402ac0]
有一个函数地址表0x402ac0
;正在调用该表中的第 EBX 项。我不知道是什么DAT_00402abc
意思,但是如果您在地址处检查双字大小的块中的内存,0x0402ac0
您应该会找到合理的函数地址。[编辑:0x0040_2abc = 0x0040_2ac0 - 4。我怀疑这意味着 Ghidra 认为当控制达到这一点时 EBX 的值为 -1。它可能是错误的,或者程序可能有错误。当控制达到这一点时,人们会期望 EBX 具有非负值。]
对应于该指令的自然 C 源代码将类似于
extern void do_thing_zero(void);
extern void do_thing_one(void);
extern void do_thing_two(void);
extern void do_thing_three(void);
typedef void (*do_thing_ptr)(void);
const do_thing_ptr do_thing_table[4] = {
do_thing_zero, do_thing_one, do_thing_two, do_thing_three
};
// ...
void do_thing_n(unsigned int n)
{
if (n >= 4) abort();
do_thing_table[n]();
}
如果表中的函数接受参数或返回值,您将在引用的 CALL 指令之前和之后看到参数处理代码,但 CALL 指令本身不会改变。
如果函数不都采用相同的参数集,您会看到一些不同且复杂得多的东西。