Ghidra 给出的函数原型不一致

逆向工程 二元分析 固件 雷达2 吉德拉
2021-06-18 01:17:52

这是我在此处发布的问题的后续问题根据答案,我能够从二进制文件中获取所有函数原型。但是,我遇到的问题是我得到的大多数函数签名都没有参数,而同一函数的实际反编译版本(使用 Ghidra 已经提供的反编译脚本)有参数。

例如,我有一个undefined HAL_TIMEx_OnePulseN_Stop_IT(void)由上面链接的答案给出的函数签名,而在反编译文件中(取自运行 ghidra 提供的 Decompile.java 脚本)我有它的签名,undefined4 HAL_TIMEx_OnePulseN_Stop_IT(uint **param_1,uint param_2)因为我相信在我越过时会更准确- 检查二进制文件的实际来源。

这种不一致的原因是什么?无论如何,我可以以反编译版本的形式获取函数参数吗?我试图使用,DecompInterface但我无法弄清楚提取原型的方法,就好像它们是在反编译版本中一样。抱歉,我是初学者,刚刚开始使用 Ghidra。感谢您的时间。

2个回答

所以,我找到了原因。默认情况下,当我们加载二进制文件时 ghidra 要求选项时,Decompiler Parameter ID选项被禁用。启用后,您将正确拥有功能参数。启用此选项后,进行分析将需要更长的时间。

您注意到Decompiler Parameter ID修复了差异,但我怀疑相关逻辑是 context menu action 背后的逻辑Commit Params/Return

Ghidra 高级课程幻灯片指出:

反编译器参数 ID

反编译器参数 ID 分析器(Analysis → One Shot → Decompiler Parameter ID)使用反编译器和对调用树的探索来确定程序中函数的参数、返回类型和调用约定信息。当您拥有一些丰富的类型信息(例如来自库调用的已知类型)时,此分析器会非常有用。但是,如果您过早地或在解决问题之前运行此分析器,则最终可能会在整个程序中传播不良信息。

注意:这个分析器会提交每个函数的签名。

(强调我的)