这两个 Ghidra 警告是什么意思?

逆向工程 艾达 拆卸 手臂 吉德拉 开发
2021-06-12 16:50:24

在 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;
    }
1个回答

来自Ghidra.re

有时您会在反编译器视图中看到警告,指出有太多分支无法恢复跳转表。一个原因是实际上有一个跳转表,但反编译器无法确定 switch 变量的边界

对于您的示例,这表示可能有一个跳转表(实际上只是一个指针数组),但反编译器无法弄清楚不同的可能性param2什么

吉德拉建议:

在这种情况下,您可以手动添加跳转目标,然后运行脚本 SwitchOverride.java。注意:要在程序中查找此类位置,请运行脚本 FindUnrecoveredSwitchesScript.java。