Ghidra 可以向我展示为指令生成的 p 代码吗?

逆向工程 拆卸 吉德拉
2021-06-18 07:02:49

我正在尝试验证 Ghidra 中自定义处理器模块的正确性。我目前正在分析的指令对其p-code做了一些奇特的事情具体来说,它使用了一堆表格当它反汇编该指令时,这些表格最终形成了一个多级深p 代码树由于 p-code 树以深度优先的顺序遍历,这意味着子节点的 p-code 将在其父节点之前首先发出。这可能会导致指令的 p 代码无法按您预期的顺序工作。

我希望能够让 Ghidra(或 SLEIGH,或任何附属工具)在遍历树后吐出完整生成的 p 代码,以便我可以验证事情是否按照我认为的顺序发生。

2个回答

对于个人指令,是的,当然。查看最近的这篇博文并搜索“Jenga”。如果您正在谈论在反编译器完成其业务后检查 pcode,那么用户 d-millar 在 Ghidra GitHub 上反复链接的几个脚本演示了如何使用来自 API 的 pcode 形式,以及提供一些输出代码。

正如 Rolf Rolles 已经提到的,有两种不同的 P-Code 可以显示和访问。

第一种是解除指令信息。您可以通过单击列表顶部的“编辑列表字段”按钮打开来显示它:

在此处输入图片说明

然后右键单击PCode栏和Enable Field在此处输入图片说明

启用此功能后,您还可以单击某些 PCode 语句,然后currentLocation在任何类型的 GhidraScript 或 shell 中运行以访问与其关联的 PCode 对象。

在此处输入图片说明

第二种 PCode 是反编译器返回的。访问它的最简单方法是在 Decompile 窗口中单击您感兴趣的令牌,然后currentLocation.token.pcodeOp在 shell 或脚本中运行

在此处输入图片说明

>>> currentLocation.token.pcodeOp
(register, 0x4000, 2) CALL (ram, 0x10031f898, 8) , (unique, 0x12580, 4)