这是我在此处发布的问题的后续问题。根据答案,我能够从二进制文件中获取所有函数原型。但是,我遇到的问题是我得到的大多数函数签名都没有参数,而同一函数的实际反编译版本(使用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合作。感谢您的时间。

#1 楼

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

#2 楼

您注意到Decompiler Parameter ID可以解决这一差异,但是我怀疑相关逻辑是上下文菜单操作Commit Params/Return背后的逻辑。

Ghidra Advanced Class幻灯片状态:


反编译器参数ID

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


(强调我的)