Hex-Rays:由于自动检测到的函数边界不正确而插入了 JUMPOUT 语句

逆向工程 艾达 六线谱
2021-06-10 11:14:04

我正在尝试重新编译用 VS 2008 编译的 Windows 可执行文件。在初始自动分析之后,大多数功能都被正确检测到;然而,有些有错误的结束地址——出于某种原因,IDA 提前放置了函数的结尾,留下了与任何函数无关的代码块。未检测到的函数获取noreturn属性并经常有sp-based autoanalysis failed消息。我已经手动修复了大部分这些问题。问题是 Hex-Rays 似乎使用了自动检测的函数边界,因此在函数内部跳转后反编译失败,这看起来像是跳转到 Hex-Rays 之外。

十六进制射线输出示例:

void __thiscall sub_403CE0(void *this, unsigned int a2, int a3)
{
    sub_407F30(this, a2, a3);
    JUMPOUT(locret_403CFD);
}

如您所见,JUMPOUT函数末尾有一条语句。这在功能边界调整之前是正确的,但现在locret_403CFD属于功能本身,而不是“跳出”。有没有办法告诉十六进制射线函数没有在这里结束并将正确的函数开始/结束地址传递给它?

3个回答

就在这里。HexRays 从 IDA 反汇编中获取函数边界,因此只要您可以在反汇编视图中更改函数边界,您可以按照以下方式管理函数边界(解决方案针对您的具体情况,解决这个问题可能更复杂):

  1. 在反汇编窗口中找到函数
  2. 转到与任何函数无关但应该在您正在使用的函数中的代码的末尾,在那里按光标。
  3. E这会将当前位置标记为区域之前的函数结束
  4. 返回反编译窗口。F5JUMPOUT如果它现在跳转到的地址属于您正在使用的函数,则应该消失。

在对数据库进行了一些工作之后,我找出了 IDA 奇怪行为的原因。我试图反编译的二进制文件是一个使用 MFC 的 GUI 应用程序;我已经从从 Microsoft Symbol store 获得的 PDB 文件中导入了许多 MFC 类型。它要么是 IDA 错误,要么是损坏的 PDB——如果我不导入类型,所有函数都会被正确检测并且反编译按预期工作,如果我这样做了——许多函数边界出错,反编译失败,函数属性被 Hex-Rays 忽略,并且很快。

一种可能的解决方法是将数据库导出为 IDC 文件,然后在干净的数据库上运行生成的脚本。这样,函数原型和类型信息保持完整。但是,Hex-Rays 反编译结果会有所不同(变量映射信息丢失,局部变量名称也丢失)。

  1. 检查跳转目标是否为函数后面的连续区域,如果为真,alt+p,调整函数范围。
  2. 如果没有,首先取消定义目标区域,然后使用 IDA 内置函数“append_func_tail”将该块添加到所有者函数。是 IDA 参考文档链接
  3. 一跳完成。如果太多,那么写一个脚本来自动化它。