Ghidra 从开源项目中添加数据类型

逆向工程 吉德拉
2021-06-15 17:32:13

我知道我正在反编译的程序使用 openSSL。
我想include将项目文件夹中的类型添加到数据类型中。
为此,我使用 File => Parse C Source。
然后我includeopenSSL 项目中选择文件夹

对于我得到的每个解析配置

Encountered "<EOF>" at line 0 column 0
Was expecting one of:
"#line"...
<LINEALT>...
";"...

如果我尝试导入 .h 文件的子集,我会收到以下错误,因为某些类型未直接在文件中定义。

C parser: Encountered errors during parsing

有没有办法从项目的源中导入所有类型?

1个回答

Ghidra 的 C 解析器有各种问题,例如,它的健全的预处理器变量列表不太广泛,而且它完全限制了 GCC 属性。我个人尝试了一些方法来使这项工作更好,例如使用 clang/gcc 预处理器转储一个巨大的头文件,但它们仍然是高度实验性的并且可能需要大量修补,所以我总体上只是将 C 解析器声明为不可行的方法来解决您的问题。

到目前为止,我听说过的最好的方法是在您需要的版本和目标中使用完整的调试符号编译库,然后将其导入 Ghidra。然后 Ghidra 应该解析所有 PDB/DWARF 类型信息,创建所有相关类型并应用函数签名。然后,您可以将库文件链接到您首先要分析的二进制文件,并将该信息传播给它。我现在不知道有什么教程,但是 Ghidra 对涉及多个二进制文件的此类项目有很好的支持。如果您遇到任何问题,那么这些问题很可能值得一个单独的专门问题,因为这与从库中传播类型信息的过程相同,您也必须对其进行逆向工程。

编辑:我最近需要这样做,并将其写成一篇小博文

一般方法就像我描述的那样,但博客文章本身的格式和精美程度并不像我希望 StackExchange 答案那样,所以我认为将它复制到这里是不合适的。