OwenPawl/ghidra-re-skill

GitHub: OwenPawl/ghidra-re-skill

基于 Ghidra 的双宿主逆向工程技能,通过实时桥接与无头工作流提升 Apple Mach-O 与框架分析效率。

Stars: 37 | Forks: 3

# ghidra-re ![Claude Code](https://img.shields.io/badge/Claude%20Code-skill-orange?logo=anthropic) ![OpenAI Codex](https://img.shields.io/badge/OpenAI%20Codex-skill-412991?logo=openai) ![macOS](https://img.shields.io/badge/macOS-arm64-black?logo=apple) ![Windows](https://img.shields.io/badge/Windows-x86__64-blue?logo=windows) `ghidra-re` 是一个基于 Ghidra 的本地技能,适用于 macOS 和 Windows 上的逆向工程,工作流针对 Apple Mach-O 二进制文件、dyld 提取的框架、多目标调查任务进行了优化,并提供用于迭代逆向工程会话的实时 Ghidra 桥接。 **双宿主设计。** 同一份签出可以安装为 **OpenAI Codex** 技能(`~/.codex/skills/ghidra-re`)或 **Anthropic Claude Code** 技能(`~/.claude/skills/ghidra-re`),或两者同时安装。`scripts/` 和 `powershell/` 中的单一统一后端被所有宿主共享——没有任何宿主特定的脚本分支。请参阅 [`scripts/lib/skill_host.sh`](./scripts/lib/skill_host.sh) 了解统一的主机解析层。 | 宿主 | 安装路径 | 读取内容 | |------|-------------|-------| | **Claude Code**(Anthropic) | `~/.claude/skills/ghidra-re` | `SKILL.md` 前置事项 | | **Codex**(OpenAI) | `~/.codex/skills/ghidra-re` | `SKILL.md` + `agents/openai.yaml` | ## 包含内容 - 无头导入与分析辅助工具 - 函数、字符串、符号、Objective-C 元数据和交叉引用的结构化导出 - 更丰富的 Swift 导出,包含去混淆别名映射、元数据节恢复和表层类型报告 - 多个开放目标的实时 Ghidra 桥接注册表 - 桥接快照、任务完成/清理以及自主多轮任务驱动 - 任务工作区,包含持久的 SQLite 调查图、笔记和报告 - 更智能的自动驾驶种子排名、更丰富的实时快照以及任务收尾文件 - 函数卷宗、写回辅助工具和可选的错误追踪覆盖层 - 用于导航、反编译、注释、重命名和可控程序手术的实时 Ghidra 桥接扩展 - macOS 框架和 Apple 二进制文件的 dyld 感知导入辅助工具 - 用于将技能传递给另一台 Mac 的共享包构建器 ## 布局 - [SKILL.md](./SKILL.md):技能入口点和工作流说明,由 Codex 和 Claude Code 两者加载 - [scripts](./scripts):Shell 封装、构建器和与宿主无关的 `install_skill` - [scripts/lib/skill_host.sh](./scripts/lib/skill_host.sh):统一的“当前运行在哪个技能宿主下”解析层 - [powershell](./powershell):面向 Windows 的原生 PowerShell 模块(探测 `CODEX_HOME` 和 `CLAUDE_HOME`) - [bridge-extension](./bridge-extension):Ghidra 桥接源代码和预构建扩展压缩包 - [references](./references):笔记、模式和启发式 - [agents/openai.yaml](./agents/openai.yaml):可选的 Codex 发现元数据;Claude Code 直接读取 `SKILL.md` 前置事项 ## 共享笔记 `ghidra-re` 现在拥有一个基于 GitHub 的全局用例笔记系统。 - 规范公共待办事项:GitHub 仓库 `OwenPawl/ghidra-re-skill` 中的一个问题 - 本地弹性层:`~/.config/ghidra-re/shared-notes/` - 写入路径:先写入结构化的本地队列,然后在 `gh` 认证时同步到 GitHub 主要命令如下: ``` ./scripts/ghidra_notes_status ./scripts/ghidra_notes_add title='Missing live-export ingest' body='Baseline export still requires close/reopen for an already-open target.' category=workflow target=workflowkit_bug_smoke:WorkflowKit ./scripts/ghidra_notes_sync ./scripts/ghidra_notes_pull ./scripts/ghidra_notes_open_shared ``` 旧的 [use-case-driven-notes.md](./references/use-case-driven-notes.md) 文件现在已是遗留/参考专用,不再是规范的活动待办事项。 ## 快速安装 推荐的安装路径是适用于任一宿主的与宿主无关的安装程序。它会将签出复制到正确的位置,运行 `bootstrap`,并安装 Ghidra 实时桥接扩展。从一个全新的 `git clone` 运行: ``` ./scripts/install_skill # auto-detect host(s): Codex, Claude Code, or both ./scripts/install_skill --host codex # force Codex only ./scripts/install_skill --host claude # force Claude Code only ./scripts/install_skill --host both # install into every known host ``` 或者,如果偏好完全手动的方式: ``` # Codex mkdir -p ~/.codex/skills cp -R . ~/.codex/skills/ghidra-re ~/.codex/skills/ghidra-re/scripts/bootstrap # Claude Code mkdir -p ~/.claude/skills cp -R . ~/.claude/skills/ghidra-re ~/.claude/skills/ghidra-re/scripts/bootstrap ``` 两个宿主都会加载相同的 `SKILL.md`(YAML 前置事项包含 `name` + `description`)和相同的 `scripts/` 表面;技能无需知道是哪个宿主启动它。 如果你想要一个单文件的 macOS 安装包: ``` ./scripts/build_mac_desktop_share_package ``` 该压缩包会创建一个可安装技能、Ghidra、启动器应用和 Java 21 的 zip 文件,用于另一台 Mac。 如果你想要一个单文件的 Windows 安装包: ``` ./scripts/build_windows_desktop_share_package ``` 该压缩包包含一个 PowerShell 安装程序,可执行以下操作: - 将技能安装到 `%USERPROFILE%\.codex\skills\ghidra-re` - 安装用户范围的 `GhidraRe` PowerShell 模块 - 在缺少 Git Bash 时安装 Git for Windows - 在需要时安装 Java 21 - 复用已存在的 Ghidra 安装或解压旁边的 `ghidra_*.zip` ## 发布到 GitHub 如果已安装 `gh` 并完成认证: ``` ./publish-to-github.sh ``` 默认设置: - 仓库名称:`ghidra-re-skill` - 可见性:`public` 你可以覆盖两者: ``` ./publish-to-github.sh my-repo-name private ``` ## 要求 - macOS 或 Windows - Ghidra 12.0.4 - Java 21 - 支持的技能宿主(任意一种:带本地技能支持的 OpenAI Codex 或带本地技能支持的 Anthropic Claude Code) 在 Windows 上,你现在可以使用 Git Bash 或原生的 `GhidraRe` PowerShell 模块。 默认的本地假设如下: - Ghidra 安装: - macOS:`/Applications/Ghidra` - Windows:`/c/Program Files/Ghidra` - 启动器应用: - macOS:`/Applications/Ghidra.app` - Windows:`ghidraRun.bat` - JDK: - macOS:`/opt/homebrew/opt/openjdk@21/libexec/openjdk.jdk/Contents/Home` - Windows:`/c/Program Files/Eclipse Adoptium/jdk-21` - 工作区:`~/ghidra-projects` 共享笔记默认值: - 仓库:`OwenPawl/ghidra-re-skill` - 自动同步:当 `gh` 认证时启用 - 本地队列/缓存:`~/.config/ghidra-re/shared-notes/` ## Windows Apple 目标流程 Windows 安装程序现在安装一个名为 `GhidraRe` 的 PowerShell 模块。安装完成后: ``` Import-Module GhidraRe Get-GhidraReBridgeSessions Start-GhidraReMission -Name win_trace -Goal 'Trace a subsystem' -Target 'source:mac-image:/System/Library/PrivateFrameworks/WorkflowKit.framework/Versions/A/WorkflowKit' ``` 该模块是一个面向原生 PowerShell 的层,位于相同的 `ghidra-re` 脚本之上,因此在 PowerShell 中使用时行为正常,同时底层仍复用该技能的经过实战检验的 Bash 工作流。 共享笔记流程在 PowerShell 中也可用: ``` Get-GhidraReNotesStatus Add-GhidraReNote -Title 'Missing feature' -Body 'Describe the friction here.' Sync-GhidraReNotes Receive-GhidraReNotes Open-GhidraReSharedNotes ``` 如果你更偏好直接使用 Bash,源支持的 Apple 流程仍然有效: 当 Windows 机器需要 Apple 二进制文件时,将已挂载或解压的 macOS 根注册为一个源: ``` ./scripts/ghidra_source_add mac-image root=/d/macos-root platform=macos-image copy=cache ./scripts/ghidra_source_list ./scripts/ghidra_import_analyze source:mac-image:/System/Library/PrivateFrameworks/VoiceShortcuts.framework/Versions/A/VoiceShortcuts ``` 任务目标可以使用相同的源格式: ``` ./scripts/ghidra_mission_start win_trace \ goal='Trace a subsystem across Apple userland targets' \ target=source:mac-image:/System/Library/PrivateFrameworks/WorkflowKit.framework/Versions/A/WorkflowKit ``` 如果你正在另一台机器上准备一个 Windows 共享包,并且已经有一个 Windows Ghidra 压缩包,可以将其嵌入: ``` ./scripts/build_windows_desktop_share_package out.zip --ghidra-zip /path/to/ghidra_*.zip ``` ## 典型工作流 ``` ./scripts/bootstrap ./scripts/ghidra_mission_start my_mission \ goal='Trace a subsystem across related targets' \ target=/absolute/path/to/binary \ target=existing_project:FrameworkName ./scripts/ghidra_mission_trace my_mission seed=selector:initWithCoder: ./scripts/ghidra_mission_autopilot my_mission rounds=2 ./scripts/ghidra_mission_report my_mission ./scripts/ghidra_mission_report my_mission format=casefile ./scripts/ghidra_mission_finish my_mission shared_note_title='Autopilot friction' shared_note_body='Need a better ObjC sender ranking view in live snapshots.' ``` 对于聚焦的单目标会话,最快的交互式循环通常是: ``` ./scripts/ghidra_import_analyze /path/to/binary my_project ./scripts/ghidra_export_apple_bundle my_project BinaryName ./scripts/ghidra_bridge_open my_project BinaryName ./scripts/ghidra_bridge_functions_search 'SomeFunctionName' ./scripts/ghidra_bridge_analyze_target 'SomeFunctionName' ./scripts/ghidra_bridge_selector_trace 'someSelector:' ./scripts/ghidra_bridge_snapshot ``` `ghidra_bridge_snapshot` 现在能够在可能的情况下从当前地址解析包含的函数,因此即使 UI 停在函数中间而不是干净入口点,桥接快照仍然保持可用。 对于实时的多目标会话,首先启动注册表: ``` ./scripts/ghidra_bridge_sessions ./scripts/ghidra_bridge_select project=workflowkit_bug_smoke ``` 当两个实时目标具有相同的程序名称时,优先使用 `project=` 或 `session=`。 可选的错误层仍然存在,当你希望使用时: ``` ./scripts/ghidra_export_bug_hunt_bundle my_project BinaryName ./scripts/ghidra_function_dossier my_project BinaryName 100012340 ``` 对于 Swift 密集型 Apple 框架,更高信噪比的流程现在是: ``` ./scripts/ghidra_import_macos_framework /System/Library/PrivateFrameworks/VoiceShortcuts.framework/VoiceShortcuts ./scripts/ghidra_export_apple_bundle VoiceShortcuts_ VoiceShortcuts ./scripts/ghidra_swift_surface_report VoiceShortcuts_ VoiceShortcuts query=VoiceShortcuts. format=markdown ./scripts/ghidra_describe_swift_type VoiceShortcuts_ VoiceShortcuts VoiceShortcuts.SpotlightIndexingCoordinator ./scripts/ghidra_bridge_open VoiceShortcuts_ VoiceShortcuts ./scripts/ghidra_bridge_swift_search 'VoiceShortcuts.EventNode' ./scripts/ghidra_bridge_swift_type VoiceShortcuts.SpotlightIndexingCoordinator ``` `ghidra_bridge_open` 现在会等待 `/health` 和 `/session` 都成功后再返回,因此“桥接就绪”也意味着“桥接可查询”。 对于 Objective-C 密集型 Apple 框架或混合 Swift/Obj-C 子系统,优先使用: ``` ./scripts/ghidra_export_apple_bundle workflowkit_full_dyld_extract WorkflowKit ./scripts/ghidra_objc_surface_report workflowkit_full_dyld_extract WorkflowKit markdown ./scripts/ghidra_describe_objc_class workflowkit_full_dyld_extract WorkflowKit WFRemoteExecutionCoordinator ./scripts/ghidra_describe_objc_protocol workflowkit_full_dyld_extract WorkflowKit IndexedEntity ./scripts/ghidra_describe_selector workflowkit_full_dyld_extract WorkflowKit 'handleRunRequest:service:account:fromID:context:' ./scripts/ghidra_trace_classref workflowkit_full_dyld_extract WorkflowKit WFRemoteExecutionCoordinator ./scripts/ghidra_objc_message_flow workflowkit_full_dyld_extract WorkflowKit 'handleRunRequest:service:account:fromID:context:' class=WFRemoteExecutionCoordinator ``` 这些辅助工具将更丰富的 `symbols.json` Objective-C 方法表面与 `objc_metadata.json` 合并,因此像 `-[WFRemoteExecutionCoordinator_handleRunRequest:...]` 这样的导入风格方法即使在更平坦的元数据方法桶不完整时仍会显示。`ghidra_objc_message_flow` 在桥接会话可用时对接收者类、兄弟选择器和实时发送者提示进行分组。 ## 注意事项 - 实际工作流摩擦和愿望清单现在位于共享的基于 GitHub 的笔记流程中。使用 `./scripts/ghidra_notes_add` 添加新条目,使用 `./scripts/ghidra_notes_open_shared` 查看规范公共待办事项。 - [use-case-driven-notes.md](./references/use-case-driven-notes.md) 仍保留在仓库中作为遗留/参考历史,而不是规范化的日常写入目标。 - 任务工作区位于 `~/ghidra-projects/investigations//`。 - 已完成的任务现在也会生成 `reports/casefile.md` 和 `reports/casefile.json`,便于分析师友好收尾。 - 实时桥接在 `bridge-current.json` 中保留一个兼容性指针,但真实的会话注册表位于 `~/.config/ghidra-re/bridge-sessions/`。 - 该技能在迭代 GUI 会话比另一次无头导出更有用时优先使用实时桥接,并现在支持在多个实时目标之间进行选择。 - `ExportAppleBundle.java` 现在输出更丰富的 `swift_metadata.json` 内容,包括去混淆/原始名称、稳定别名、元数据节摘要、异步类条目、协议见证提示和调度 thunk 标记。 - Windows 桌面安装程序还会安装一个用户 PowerShell 模块,以便日常 Windows 使用不必从 Git Bash 启动。 - `ghidra_mission_finish` 默认关闭任务的实时 Ghidra 会话,而 `ghidra_bridge_close_all all=true` 是在需要关闭所有桥接管理的 Ghidra 窗口时的紧急清理按钮。 - `ghidra_polish_release` 是用于语法、构建器、桥接可构建性和打包的显式预测试阶段。
标签:AI合规, Anthropic Claude Code, Codex, dyld, Ghidra, JS文件枚举, Mach-O, MacOS, SEO: Ghidra 技能, SEO: Mach-O 分析, SEO: 逆向工程工具, SQLite, 云安全监控, 云资产清单, 代码分析, 凭证管理, 函数分析, 域名枚举, 多目标调查, 头工作流程, 实时桥接, 应用安全, 技能安装, 持久化图谱, 无头分析, 符号导出, 自动化逆向, 逆向工具, 逆向工程, 静态分析