Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
GhidraEmu — 原生 Pcode 模拟器 | Kitploit
工具/GitHubGitHub/nalen98/ghidraemu
动态代码分析 (DAST)逆向工程调试器二进制分析
GitHubnalen98/ghidraemu

GhidraEmu

原生 Pcode 模拟器

查看仓库
3052372年前Kitploit 审核通过

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

GhidraEmu



这个实验性的 Ghidra 插件让你能够轻松处理原生 pcode 模拟。不再需要编写脚本,可以直接在 Ghidra 中使用它。它对于处理各种常见模拟器不支持的非主流处理器尤为有用。

如果处理器/虚拟机受 Ghidra 支持以进行逆向工程,它就可以被模拟!例如,下面演示了 eBPF 指令模拟:

GhidraEmu

它能做什么

本质上,该插件是对 ghidra.app.emulator 包内类的扩展包装。以下是已实现的功能:

  • 支持 Ghidra 支持的所有架构,因此你可以添加非主流处理器并进行模拟
  • CPU 上下文、栈和堆模拟
  • 通过 Ghidra GUI 应用补丁字节以改变模拟进程
  • 用于控制模拟进程的断点
  • 在模拟过程中于 ByteViewer 中显示变更的字节
  • Hook 一些 libc 函数(尽管功能仍然很弱)

尽管 PCode 模拟在理想情况下意味着统一性,但大多数处理器需要各自专属的处理方式。欢迎随时报告你遇到的问题。我确实很想测试所有处理器,但这几乎不可能。

它不能做什么

  • 步入外部库函数(受 EmulatorHelper 限制)
  • 系统调用模拟

所有插件窗口集合

GhidraEmu

功能

菜单窗口

包含所有插件窗口:栈视图、寄存器、断点视图和主窗口。

GhidraEmu menu

下载工具

弹出窗口

包含用于设置模拟开始与结束、断点以及将变更字节应用到模拟器状态的热键。

寄存器视图

你可以按需修改寄存器。设置链接寄存器(绿色箭头)有助于模拟器判断哪个寄存器包含返回地址。该插件了解如何通过栈、lr 寄存器、AARCH64 和 MIPS 寄存器工作。如果你遇到的是非主流的处理器/虚拟机,请选择链接寄存器并点击按钮。

栈视图

当你在 CodeBrowser 中打开程序时,GhidraEmu 会自动映射栈空间。栈指针将设置在栈范围的中间。这样你可以在栈帧的顶部或底部设置值。如果在更新或重置时遇到卡顿,请滚动它。在模拟过程中,如果程序需要更多栈空间,插件会自动分配。

断点视图

RAM 视图

如果模拟期间有任何字节发生变化,你会在经典 ByteViewer 中看到它们。别担心,按下 "Reset" 按钮后,它们将重置为原始值。

应用补丁字节

如果你做了更改,请让模拟器知道已变更的字节(栈会自动更新——无需操作)。更改后,选中这些字节(它们会显示为绿色),然后点击此选项(或使用热键 "M")。

GhidraEmu apply patched bytes

控制台

插件在此打印输出信息。例如,类似下面的模拟错误消息:

GhidraEmu console

新功能 - 跳越(Jump Over)

“Jump Over” 功能允许你出于某种原因不想模拟当前指令时,向前跳过一条指令。由于一旦检测到尝试读取未初始化的内存,模拟进程就会中止,因此该功能允许你绕过此问题。看一个例子。这是许多 x86_64 程序中的首批指令之一,用于保存 canary 栈:

MOV RAX, qword ptr FS:[0x28]

我们只需稍微“作弊”一下,通过增大 PC 值来跳过它。为此,请在你不想模拟的指令处停下,然后按 J 热键。否则,继续单步执行将导致未初始化内存读取错误。

Jump Over

新功能 - 步过(Step Over)

如果你停在一个通向子程序(内部调用)的指令处,并且希望模拟执行到下一条指令(经典的“step over”),请按 F6 热键,事情就会如你所愿:

Step Over

开始之前

几点重要事项需要留意:

  • 别忘了在 Ghidra 中分析你的程序,模拟器依赖于此。
  • 如前所述,如果你使用非主流的处理器/虚拟机,请设置链接寄存器。
  • 如果你的二进制文件的处理器根据规范需要某些内存段,请不要忘记在 Ghidra 的 MemoryMap 窗口中创建它们,并用零进行初始化。否则,模拟器在读写操作时会抱怨未知的内存空间,并停止模拟过程。如果内存块存在但未用零初始化,且该内存块是模拟器所需的,插件将尝试将其初始化,以便模拟继续运行。
  • 如果你通过 ByteViewer 更改了任何字节,插件在重置模拟状态时不会把它们恢复为原始值。
  • 在关闭 Ghidra 项目之前,如果尚未完成,请按 "Reset" 按钮并重置上一次模拟的状态。这一点很重要,因为在关闭时,Listing 中重绘已跟踪指令的事务以及模拟后恢复程序字节的事务都不会执行。这不仅可能导致看到“老黄色鹦鹉”(这还算小问题),还可能使修改后的字节保持原样而无法恢复为原始值(当然,除非在 Ghidra 中回滚项目)。

安装

  1. 使用 gradle 构建扩展:GHIDRA_INSTALL_DIR=${GHIDRA_HOME} gradle,然后使用 Ghidra 安装它:File → Install Extensions...

  2. 在 CodeBrowser 中,进入 File → Configure → Miscellaneous,然后勾选 GhidraEmu 插件。

反馈

在使用插件时遇到任何 bug,或者有改进的想法?别害羞,尽管打开新的 issue,我会处理的。

未来工作

EmulatorHelper 的限制不允许在另一个空间中使用程序空间。因此,例如,你的外部共享库永远不会知道程序内存空间,反之亦然。所以你无法将其当作具有单一内存空间的单一进程来模拟。如果我在这里遗漏了什么,请告诉我。