重新分析 HexRays 反编译输出

逆向工程 艾达 反编译 六线谱
2021-06-11 10:37:42

我在旧版本的 IDA 中分析了一个大型库,想升级。我已将许多函数标记为“反编译”并更改了它们的函数签名。

如何在 IDA 和 HexRays 中自动重新分析库中的所有函数,而不会丢失我已经做出的更改,以便我可以从反编译器的更新中受益?

1个回答

听起来您很清楚如何使用 Hex-Rays。您可能已经注意到,在反编译一个您已经反编译的大型函数时,Hex-Rays 可能会——也可能不会——明显暂停。这是因为 Hex-Rays 经常在用户分析会话的整个过程中不止一次反编译同一个函数——实际上是多次反编译。

过去几个版本的 Hex-Rays 为反编译结果引入了缓存,特别是 SDK 中mba_tcfunc_t结构,以加快显示最近分析的函数的反编译速度。也就是说,这些只是缓存;它们可能因诸如用户更改函数类型或缓存函数使用的全局数据项等原因而被驱逐。无论缓存如何,Hex-Rays 有时仍会重新分析以前看到的功能。另外,用户也可以通过手动通过清除所有的缓存缩减他们的数据库Edit->Other->Reset decompiler information...,该All caches复选框。

不管缓存如何,Hex-Rays 当然要保存所有的局部变量名称、类型和位置;工会选择;标签名称;数字格式;评论; 映射变量;强制变量;拆分任务;用户自定义调用;间接调用的手动强制原型;等等用户在注释函数时创建的。此信息存储在数据库中,因此即使 Hex-Rays 没有函数的缓存条目,因此必须“从头”反编译,它仍会将用户保存的分析注释合并到反编译过程中。这很像普通的拆机清单;所有用户注释都保存在数据库中,这样即使您在更新版本中打开 IDB,您仍然会看到以前的注释。

在将 IDB 升级到新版本时,只有一个 Hex-Rays 分析元素(我知道)会从旧版本中继承。特别是,Hex-Rays 在分析了一个函数后,将局部变量分配的结果保存在数据库中。这意味着,如果您使用旧版本的 Hex-Rays 创建了一个数据库,并且新版本会对局部变量进行更好的分析并获得更令人满意的结果,那么在升级到新版本时您将无法从这些升级中受益。所以它去。

TL;DR:您可以升级之前在 Hex-Rays 中执行分析的数据库,您将看到对伪代码的所有修改。我一直这样做。在此期间,您将能够使用 Hex-Rays 引入的任何新功能。如果在反编译函数时自动运行任何新的自动分析功能,您也将从中受益。升级后的数据库中仅保留先前版本自动分析的几个方面(与手动注释相反,所有方面都将保留);其余的将在相关函数的缓存逐出时重新执行。您可以使用第二段中描述的菜单项清除所有缓存,这将强制重新反编译所有函数。