这个实验性的 Ghidra 插件可让您轻松处理本机 pcode 模拟。不再需要脚本,只需直接从 Ghidra 使用它即可。它对于使用常见仿真器不支持的各种奇异处理器特别有用。
如果处理器/虚拟机支持 Ghidra 进行逆向工程,则可以对其进行仿真!例如,eBPF指令仿真演示如下:
本质上,该插件是ghidra.app.emulator
包内类的扩展包装器。以下是已实施的内容:
尽管 PCode 仿真在理想情况下意味着统一,但大多数处理器需要自己的方法。请随时报告您遇到的任何问题。我真的很想测试所有处理器,但这几乎不可能。
包含所有插件窗口:堆栈视图、寄存器、断点视图和主窗口。
包含用于设置仿真开始和结束、断点以及将更改的字节应用于仿真器状态的热键。
根据需要更改寄存器。设置链接寄存器(绿色箭头)将帮助仿真器了解哪个寄存器包含返回地址。该插件通过堆栈、lr 寄存器、AARCH64 和 MIPS 寄存器了解其工作原理。如果您有异国情调,请选择链接寄存器并按下按钮。
当您在 СodeBrowser 中打开程序时,GhidraEmu 将自动映射堆栈空间。堆栈指针将设置在堆栈范围的中间。这允许您在堆栈帧的顶部或底部设置值。如果您在更新或重置时遇到冻结,请滚动它。在仿真过程中,如果程序需要更多的堆栈空间,插件会自动分配。
如果在模拟过程中任何字节发生变化,您将在经典的 ByteViewer 中看到它们。不用担心,按“重置”按钮后它们将重置为原始值。
如果您进行了更改,请让模拟器知道更改的字节(堆栈自动更新 - 不需要)。更改后,选择它们(它们将呈绿色),然后按此选项(或使用热键“M”)。
这里插件打印输出信息。例如,类似这样的仿真错误消息:
如果由于某种原因您不想模拟当前指令,“跳转”功能允许您向前跳转一条指令。由于如果检测到尝试读取未初始化的内存,仿真过程将中止,因此此功能允许您绕过它。看一个例子。这是许多 x86_64 程序中的第一个指令,金丝雀堆栈保存:
MOV RAX, qword ptr FS:[0x28]
我们将尝试作一点小作弊并通过增加 PC 值来跳过它。为此,请停在您不想模拟的指令处,然后按J
热键。否则,进一步执行将导致未初始化的内存读取错误。
如果您停在导致子例程(内部调用)的指令处,并且想要模拟下一条指令之前的所有内容(经典的“跳过”),请按F6
热键,这肯定会发生:
需要考虑的几个要点:
使用 gradle 构建扩展: GHIDRA_INSTALL_DIR=${GHIDRA_HOME} gradle
并使用 Ghidra 安装它: File → Install Extensions...
在 CodeBrowser 中,转到File → Configure → Miscellaneous
,然后选中 GhidraEmu 插件的复选框。
使用插件时遇到任何错误或有改进的想法吗?不要羞于提出新问题,我会弄清楚的。
EmulatorHelper 限制不允许在另一个程序中使用程序空间。因此,例如,您的外部共享库永远不会知道程序内存空间,反之亦然。所以你不能将其模拟为一个具有一个内存空间的进程。如果我在这里遗漏了什么,请告诉我。