我正在尝试重新编译用 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
属于功能本身,而不是“跳出”。有没有办法告诉十六进制射线函数没有在这里结束并将正确的函数开始/结束地址传递给它?