计划执行与检查节点
executing-plans
按既定实施计划完成工作,保持过程检查和反馈。
re-plugin-dev【效率与协作】Ghidra/IDA 插件开发:脚本→插件工程化。 触发词:插件开发、Ghidra插件、IDA插件、插件工程
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
静态分析工具开发可免沙箱;插件跑在分析工具进程内,不执行样本代码(免沙箱,[[re-analyze/platform-tips]] 静态优先)。
NationalSecurityAgency/ghidra 仓库内 GhidraDev 目录): 需要 Eclipse(Linux apt install eclipse / Fedora dnf install eclipse-platform / Arch pacman -S eclipse-java;macOS brew install --cask eclipse-java;Windows 官网 zip 解压);非必需——纯 Gradle 也能构建扩展;GhidraDev 版本与 Eclipse 版本有配套表,装不上先在官方 release notes 核对组合apt install gradle / Fedora dnf install gradle / Arch pacman -S gradle;macOS brew install gradle;Windows choco install gradle;验证 gradle --version;发行版仓库的 Gradle 可能过旧(构建 Ghidra 扩展失败)——优先用 GhidraDev 工程自带的 gradle wrapper(./gradlew)File > Install Extensions 能看到安装的扩展%APPDATA%\Hex-Rays\IDA Pro\plugins\(或 IDA 安装目录 plugins\);Linux/macOS ~/.idapro/plugins/Loading plugin ...;File > Script command 执行 print(idaapi.IDA_SDK_VERSION) 输出 SDK 版本按顺序执行;每个插件产物(源码/构建产物/测试样本与输出)存档 sha256 + 路径,供报告与复用([[re-ioc]] 证据链要求)。
场景识别(批处理脚本 vs 交互插件):
Ghidra 插件骨架(Java 扩展 / 程序脚本):
@category 头注释 + 存 GhidraScripts 目录,Script Manager 运行(注意内置 Jython 2.7,见坑 2 与 [[re-ghidra]] 坑)New > Ghidra Module Project 选 Extension → 实现 Plugin 类(覆写 init/dispose,在 init 里注册菜单动作)→ Gradle gradle buildExtension 产出 .zip → 目标机器 File > Install Extensions 安装ToolAction/AbstractAction 挂到菜单;无头环境用 -postScript 测试([[re-ghidra]] 步骤 4);脚本与扩展的边界见 [[re-ghidra]] 坑(脚本 vs 扩展选型)analyzeHeadless ... -postScript MyPluginTest.java 跑通输出;gradle buildExtension 产出 zip 后先查 extension.properties 版本范围再分发IDA 插件骨架(idapython):
# myplugin.py —— 放到 plugins 目录,IDA 启动自动加载
import idaapi
class MyPlugin(idaapi.plugin_t):
flags = idaapi.PLUGIN_KEEP
comment = "demo plugin"
help = ""
wanted_name = "MyPlugin"
wanted_hotkey = "Ctrl-Shift-M"
def init(self):
idaapi.register_action(idaapi.action_desc_t(
"my:action", "My Action", MyAct(), "Ctrl-Shift-M"))
return idaapi.PLUGIN_KEEP
def run(self, arg):
print("hello from MyPlugin")
def PLUGIN_ENTRY():
return MyPlugin()
idaapi.register_action + idaapi.attach_action_to_menu("Edit/...", "my:action");对话框: ida_kernwin.ask_str / ask_buttons(注意 IDA 9.x 中部分 API 迁到 ida_kernwin,见坑 1)-A -S 用法见 [[re-ida]](脚本内 ida_auto 等同样按该处写法)Loading plugin ... MyPlugin;快捷键触发动作输出正常与现有脚本复用([[re-ghidra]] / [[re-ida]] 的脚本):
测试与分发:
gradle buildExtension,README 注明 Ghidra 版本);IDA 插件单 .py 文件或打包,注明 IDA 版本与 Python 版本;商业 IDA 的分发还要过插件签名(坑 3)idc/idaapi 函数重组织到新模块(ida_bytes 等);对策——插件文档锁版本(写明测试过的 Ghidra/IDA 版本),测试矩阵覆盖新旧版本(步骤 5),升级工具后先跑只读脚本再改代码([[re-ida]] 坑)UnsupportedClassVersionError、Python 脚本语法错误;原因——JDK 版本不匹配(Ghidra 11.3+ 需 JDK 21,见 [[re-ghidra]])、内置解释器是 Jython 2.7(Python 2 语法,不支持 f-string/海象运算,也无法 import pip 包);对策——java -version 确认 21+ 且 JAVA_HOME 正确;脚本按 Python 2 兼容语法写,需要现代 Python 时用 ghidra-bridge 外接 Python 3([[re-ghidra]] 坑)ghidra.version 字段),用 GhidraDev 生成工程时按目标版本建;分发文档写明测试过的 Ghidra 版本analyzeHeadless 或 IDA 无头模式([[re-ida]])下插件行为异常/卡住;原因——批处理模式没有 UI 事件循环,ask_* 对话框类 API 与菜单触发逻辑不可用;对策——交互参数(路径/阈值/模式串)改从命令行参数或配置文件读取,插件内先判断运行环境(是否 GUI 会话)再决定走哪条分支;无头测试脚本只验证纯计算逻辑