在 Ghidra 中反汇编 ARM 二进制文件时,我经常看到这些警告:
/* WARNING: Could not recover jumptable at 0x0747c198. Too many branches */
/* WARNING: Treating indirect jump as call */
他们的意思是什么?为了理解这些问题的原因,我应该学习哪些基本的架构概念?
这是一个真实程序的例子,在 Ghidra 的反汇编中看到:
if (param_2 == 0x78) {
/* WARNING: Could not recover jumptable at 0x0747c198. Too many branches */
/* WARNING: Treating indirect jump as call */
uVar3 = (*DAT_0747c19c)();
return uVar3;
}
有时您会在反编译器视图中看到警告,指出有太多分支无法恢复跳转表。一个原因是实际上有一个跳转表,但反编译器无法确定 switch 变量的边界
对于您的示例,这表示可能有一个跳转表(实际上只是一个指针数组),但反编译器无法弄清楚不同的可能性param2
是什么。
吉德拉建议:
在这种情况下,您可以手动添加跳转目标,然后运行脚本 SwitchOverride.java。注意:要在程序中查找此类位置,请运行脚本 FindUnrecoveredSwitchesScript.java。