re-plugin-dev について
re-plugin-devは、GhidraやIDAを使うリバースエンジニア向けのプラグイン開発スキルです。反復する分析作業を再利用可能なスクリプトやプラグインにし、UI機能、自動実行、テスト、チーム配布まで扱います。
主な機能
- 01スクリプトとプラグインの選択
- 02Ghidra Java拡張の構築
- 03IDA idapythonプラグインの開発
- 04既存の分析スクリプトの再利用
- 05互換性テストとプラグイン配布
活用シーン
- 01一括注釈処理をメニュー機能にする
- 02プロジェクト読み込み時に分析処理を自動実行
- 03チームの複数端末へ共通プラグインを配布
- 04ツールのバージョンごとに動作を検証
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ dslsdzc/ rev-skills --skill re-plugin-devインストール後、Claude Code で/re-plugin-devを入力して読み込まれたか確認します。
詳細
Ghidra / IDA プラグイン開発
使用する場合 / 使用しない場合
- 使用する:繰り返し行う分析手順を再利用可能なツールとして定着させる必要がある場合(一括ラベル付け、復号ループ、カスタム形式の解析、特殊なプロトコルフィールドのラベル付け)
- 使用する:対話型 UI(メニュー/ショートカットキー/パネル)や「プロジェクトの読み込み時に自動実行」する常駐機能が必要な場合
- 使用する:チーム内での配布や、複数マシンに統一された分析環境が必要な場合([[re-ghidra]] / [[re-ida]] のスクリプトを、開発・運用可能なプラグインにする)
- 使用しない:一度限りの分析タスク(スクリプトを実行してすぐ終了する方法で十分な場合。[[re-ghidra]] 手順 4 / [[re-ida]] 手順 4 の軽量なスクリプトで対応できます)
- 使用しない:既存のロジックを別の言語で書き直すだけの場合(まず状況を確認してください。手順 1 を参照)
ツールの準備
静的解析ツールの開発では、サンドボックスは不要です。プラグインは分析ツールのプロセス内で動作し、サンプルコードを実行しません(サンドボックス不要。[[re-analyze/platform-tips]] の静的解析優先を参照)。
Ghidra —— Java 拡張 / Python スクリプト
- Ghidra のインストール(JDK 21 以上。Ghidra 11.3 以上で必須)については、[[re-ghidra]] の「ツールの準備」を参照
- GhidraDev Eclipse プラグイン(公式。GitHub の
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 のバージョンには対応表があるため、インストールできない場合は公式リリースノートで組み合わせを確認してください - Gradle(任意。Java 拡張のビルド用):Debian/Ubuntu は
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 ラッパー(./gradlew)を優先してください - 確認方法:Ghidra GUI の Script Manager にスクリプトが表示されること。
File > Install Extensionsにインストールした拡張が表示されること
IDA —— idapython プラグイン
- IDA のインストールについては [[re-ida]] の「ツールの準備」を参照(idapython は組み込みのため、別途インストールする必要はありません)
- プラグインディレクトリ:Windows は
%APPDATA%\Hex-Rays\IDA Pro\plugins\(または IDA のインストールディレクトリ内のplugins\)、Linux/macOS は~/.idapro/plugins/ - 確認方法:プラグインファイルをディレクトリに置いた後、IDA の起動ログに
Loading plugin ...が表示されること。File > Script commandでprint(idaapi.IDA_SDK_VERSION)を実行し、SDK バージョンが出力されること
操作手順
順番に実行してください。各プラグインの成果物(ソースコード/ビルド成果物/テストサンプルと出力)は、レポートと再利用のために sha256 とパスを記録して保存してください([[re-ioc]] の証拠保全要件)。
-
用途の特定(バッチスクリプトと対話型プラグインのどちらか):
- 一度限り/単純な繰り返し → スクリプト([[re-ghidra]] の GhidraScript / [[re-ida]] の idapython スクリプト)
- 常駐/UI が必要/読み込み時に実行/複数マシンへの配布 → プラグイン(Ghidra Java Extension / IDA idapython プラグイン)
- 判断基準は以下の 4 項目です。いずれかに該当すればプラグインにします:① 対話型 UI(メニュー/ショートカットキー/ダイアログ)が必要 ② プロジェクトの読み込み後に自動実行する ③ チーム内の複数マシンに配布する(バージョンを統一する)④ 外部サービス/API との連携が必要
- 判断内容を記録します:用途 + ツールチェーン + 保守責任者(落とし穴 4 の保守コストをあらかじめ明確にします)
-
Ghidra プラグインのひな形(Java 拡張 / プログラムスクリプト):
- Python スクリプト(最も手軽):
@categoryヘッダーコメントを付けて GhidraScripts ディレクトリに保存し、Script Manager から実行します(組み込みの Jython 2.7 に注意。落とし穴 2 と [[re-ghidra]] の落とし穴を参照) - Java 拡張(開発・運用向け):GhidraDev の
New > Ghidra Module Projectで Extension を選択 →Pluginクラスを実装(init/disposeをオーバーライドし、init内でメニューアクションを登録)→ Gradle のgradle buildExtensionで .zip を生成 → 対象マシンのFile > Install Extensionsからインストール - ひな形のポイント:アクションの登録には
ToolAction/AbstractActionを使用してメニューに追加します。ヘッドレス環境では-postScriptでテストします([[re-ghidra]] 手順 4)。スクリプトと拡張の使い分けについては [[re-ghidra]] の落とし穴(スクリプトと拡張の選択)を参照 - 拡張の構成:ビルド成果物の .zip には extension.properties が含まれ、対応する Ghidra のバージョン範囲を宣言します。範囲外のバージョンにインストールすると読み込みが拒否されるため、配布時に対応バージョンを明記し、範囲を固定してください
- 確認方法:インストール後、メニューからアクションを実行します。ヘッドレス環境で
analyzeHeadless ... -postScript MyPluginTest.javaを実行し、出力が得られることを確認します。gradle buildExtensionで zip を生成したら、配布前に extension.properties のバージョン範囲を確認してください
- Python スクリプト(最も手軽):
-
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]] のスクリプト):
- 出発点となる素材:[[re-ghidra]] 手順 4 の一括リネーム/復号ループスクリプト、[[re-ida]] 手順 4 の一括 patch/ラベル付けスクリプト。「手動で一度実行する」処理を「メニューから実行する」形にします
- 用途の例:定数テーブルの自動スキャン([[re-crypto-id]] の FindCrypt の考え方)、ジャンクコードの一括除去([[re-deobfuscate]] の D-810 の考え方)、PE/ELF のカスタム形式解析([[re-format-pe]] / [[re-format-elf]])
- 再利用時のルール:スクリプト内の変更されやすいロジック(パターン文字列/テーブル/しきい値)は、設定ファイルまたはプラグインのオプションとして外部化し、コードに直接埋め込まないでください(落とし穴 4 の保守コストを抑えます)
- 古いスクリプトは、まず実行して基準となる出力を確認してからプラグイン化します。プラグインの導入前後で出力が一致する必要があります(回帰テスト)
-
テストと配布:
- テストマトリクス:複数のツールバージョン(IDA/Ghidra。落とし穴 1 を参照)、複数アーキテクチャのサンプル(x86/x64/ARM)、シンボルあり/なしのサンプル。変更を伴うスクリプトは、まず複製した .i64/.idb または独立したプロジェクトで実行します([[re-ida]] の落とし穴を参照)
- まず読み取り専用で確認:先に読み取り専用の統計スクリプトを実行して想定どおりか確認し、その後で変更を伴うロジックを実行します([[re-ida]] の落とし穴:変更を伴うスクリプトを元のデータベースに直接実行すると、破損時に元に戻すのが困難です)
- 配布:Ghidra 拡張は .zip(
gradle buildExtension。README に Ghidra のバージョンを記載)。IDA プラグインは単一の .py ファイルまたはパッケージとして配布し、IDA のバージョンと Python のバージョンを明記します。商用版 IDA の配布ではプラグイン署名も必要です(落とし穴 3) - 受け入れ確認:クリーンな環境(新しいプロジェクト/新しい IDB)にゼロからインストール → 実行 → 出力が開発環境と一致したら、リリース完了です
跨域联合
- [[re-binary-core]]:本技能是其工具链扩展环节(网关工作流第 5 步反编译之后的可选工程化动作)
- [[re-ghidra]]:Ghidra 脚本/扩展开发起点(工作流步骤 4 的脚本即插件素材)
- [[re-ida]]:idapython 插件开发起点(工作流步骤 4 的脚本即插件素材;无头测试写法)
- [[re-deobfuscate]]:插件化脱混淆场景(D-810 思路)
- [[re-crypto-id]]:插件化常量表指纹扫描(FindCrypt 思路)
- [[re-format-pe]] / [[re-format-elf]] / [[re-format-macho]]:格式解析类插件的目标对象
- [[re-binaryninja]]:Binary Ninja 脚本 API 插件(多工具插件体系可互参考)
- 引用 [[re-analyze/platform-tips]] 静态优先原则(插件开发与测试免沙箱)
常见坑与陷阱
- API 版本差异(Ghidra/IDA 升级破坏):现象——插件在旧版工具正常,升级后加载失败/运行报错/菜单消失;原因——Ghidra 11.x 有破坏性 API 变更(如函数管理类迁移)、IDA 9.x 把部分
idc/idaapi函数重组织到新模块(ida_bytes等);对策——插件文档锁版本(写明测试过的 Ghidra/IDA 版本),测试矩阵覆盖新旧版本(步骤 5),升级工具后先跑只读脚本再改代码([[re-ida]] 坑) - Java 环境要求:现象——Ghidra 扩展构建或运行报
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]] 坑) - 插件签名(IDA 商业版):现象——插件放进 plugins 目录但商业版 IDA 不加载(启动日志无该插件,无任何报错);原因——IDA 商业版对第三方插件做签名验证,未签名插件被拒;对策——确认 IDA 版本(Freeware 不做签名验证),开发期用 Freeware/无头模式测试,正式分发走 Hex-Rays 官方插件签名申请流程;把"签名状态"写进分发文档
- 维护成本失控:现象——插件发布三个月后跟不上升级/新样本形态,没人修,反而拖慢分析;原因——插件是长期承诺(API 升级 + 场景变化都要跟进),一次性脚本没有这个成本;对策——步骤 1 先判值不值: 逻辑简单/变化快 → 脚本;稳定且复用高 → 插件;插件内把易变逻辑(模式串/表/阈值)外置配置,减少改码面;每次发布记录版本与对应工具版本
- 修改型插件直接改库,改坏不可逆:现象——批量改名/patch 插件跑完,IDB 标注错乱且撤销困难;原因——跳过只读验证、没在副本上跑;对策——先跑只读统计脚本确认预期([[re-ida]] 坑),修改逻辑先在副本 .i64/.idb 或独立 Ghidra 工程上验证,验收通过再上正式库
- Ghidra 扩展版本范围拒载:现象——扩展装进 Ghidra 无报错但列表里不出现;原因——extension.properties 声明的适用版本范围与当前 Ghidra 不匹配,被安装器拒载;对策——先解压 zip 核对 extension.properties 的版本范围(
ghidra.version字段),用 GhidraDev 生成工程时按目标版本建;分发文档写明测试过的 Ghidra 版本 - 无头/批处理环境不能依赖交互对话框:现象——
analyzeHeadless或 IDA 无头模式([[re-ida]])下插件行为异常/卡住;原因——批处理模式没有 UI 事件循环,ask_* 对话框类 API 与菜单触发逻辑不可用;对策——交互参数(路径/阈值/模式串)改从命令行参数或配置文件读取,插件内先判断运行环境(是否 GUI 会话)再决定走哪条分支;无头测试脚本只验证纯计算逻辑
コメント
Markdown 対応