如何将 .cspec 文件中的新 CompilerSpec 添加到 Ghidra?

逆向工程 吉德拉
2021-06-14 23:11:56

Ghidra 使用.cspec文件x86win.cspec来定义编译器相关信息,这些信息被导入到定义处理器语言.ldef文件中x86.ldef

如何在不编辑本质上属于 Ghidra 核心一部分的现有文件的情况下,CompilerSpec通过.cspec文件向 Ghidra添加新文件.ldef,而且也不添加新处理器(使用新.ldef文件)?这也应该适用于analyzeHeadless,所以不仅仅是将它添加到 GUI 中。

这可能最终需要一个不是问题的扩展,我只是不知道将文件放在哪里以使其自动加载,或者作为扩展初始化的一部分调用哪些 API 函数以添加新的CompilerSpec. 实现CompilerSpec接口的类具有公共构造函数,将.cspec文件作为参数,但这看起来不会在创建它的实例后自动添加。

2个回答

当前(Ghidra 9.2.2)无法执行您的要求。每个处理器由架构、字节顺序、大小和变体的 4 元组标识。您只能指定一次 ID。所以不幸的是,您不能只是在某处添加另一个 .ldefs 文件并“打开”语言(处理器的内部名称)来添加新的编译器规范条目和 .cspec 文件。这是 SleighLanguageProvider 加载处理器方式的限制。

旁白:我假设您想要做的是,例如,向 x86:LE:32:default 添加一个新的编译器规范,以便它与 clang、gcc 和 Visual Studio 一起显示在列表中。

您现在可以做的最好的事情是添加一个带有新处理器的扩展,该处理器具有相同的架构、字节顺序和大小,但变体名称不同。不过,这可能会对未来的官方处理器升级产生严重影响;您可能必须仔细查看版本号并复制 .trans 文件(如果有)。

您可能需要考虑直接在 Processor 目录中进行更改,并与官方团队共享您的添加内容。

根据初步发布说明,此功能将成为 Ghidra 10 的一部分:https : //github.com/NationalSecurityAgency/ghidra/blob/master/Ghidra/Configurations/Public_Release/src/global/docs/WhatsNew.html#L124-L130

可以从程序对话框Specification Extensions下的选项卡添加扩展Options

测试版已经可以在https://ghidra-sre.org/下载

添加新的编译器规范

完整的过程是,从一个带有一些名为 的二进制文件的 Codebrowser 窗口开始ls

Edit - Options for 'ls' 然后这个窗口应该打开,你可以点击Specification Extensions左边的:

在此处输入图片说明

单击Import...并选择定义扩展名的文件。例如,如果您想定义一个 callfixup 来告诉反编译器将某些函数视为NOPif 调用,则可以编写如下文件:

<callfixup name="objc_retain">
    <target name="_objc_retain"/>
    <target name="_objc_retainAutorelease"/>
    <pcode>
      <body><![CDATA[
      x0 = x0;
     ]]></body>
    </pcode>
  </callfixup>

似乎每个文件只能定义一个扩展名,并且不能一次导入多个文件。尽管至少在我的情况下,实际替换通常是相同的,只是针对不同的功能,因此您可以添加多个目标。