leechristensen/ghidra_markdown_docs
GitHub: leechristensen/ghidra_markdown_docs
将 Ghidra 的 HTML 帮助文档转换为带完整导航和交叉引用的 Markdown,方便脱离 Ghidra 环境查阅和发布。
Stars: 1 | Forks: 0
# Ghidra 帮助文档转 Markdown 工具
将 Ghidra 的 HTML 帮助文档转换为 Markdown,并提供最大努力的交叉引用和导航。
凭直觉编写,可能有些地方存在问题,但整体效果相当不错!
## 快速入门
将其指向已安装的 Ghidra:
```
uv sync
uv run ghidra-help-to-markdown /path/to/ghidra ./docs
```
或者指向源码树检出目录(适用于标记版本和开发构建):
```
git clone --depth 1 --branch Ghidra_12.0.4_build https://github.com/NationalSecurityAgency/ghidra
uv run ghidra-help-to-markdown ./ghidra ./docs --ghidra-install /path/to/installed/ghidra
```
无论哪种方式,输出结果都会存放在 `./docs/Ghidra_/` —— 版本号
会从 `Ghidra/application.properties` 中读取并自动附加,以便
多个构建版本可以共存:
```
docs/
Ghidra_12.0.4_PUBLIC/
Ghidra_11.3_DEV/
...
```
## 模式
转换器会检测你指向的目录,并自动选择以下两种模式之一:
- **已安装的 Ghidra (运行时模式)**:目录中包含 `ghidraRun`。
通过 [`pyghidra`](https://pypi.org/project/pyghidra/) 启动无头 Ghidra JVM
并直接从模块 jar 包中读取帮助信息。无需提取文件系统。
跨模块链接解析和图标查找通过 Ghidra 自身的
`GhidraHelpService` 和 `HelpBuildUtils` 进行 —— 与 Swing 帮助
查看器使用的代码相同。
- **源码树模式**:目录包含 `**/src/main/help/help/topics/`。
直接在磁盘上遍历帮助文件。向已构建/安装的 Ghidra 传入 `--ghidra-install `,以解析程序化图标引用
(`Icons.ADD_ICON`、`icon.bsim.connected`);若不提供此参数,这些引用将回退
为文本占位符。
## 选项
```
--ghidra-install PATH Path to an installed/extracted Ghidra. Required
for programmatic icon resolution. Optional in
runtime mode (ghidra_root itself is used).
--module NAME Convert only the named topic (e.g. DecompilePlugin).
--no-images Skip image copying.
--verbose, -v Show detailed progress.
```
## 兼容性
| Ghidra | 运行时模式 | 源码树模式 |
|---|---|---|
| 12.0+ | ✅ | ✅ |
| 11.0 – 11.4 | ❌ (PyPI pyghidra 要求 Ghidra 版本 ≥12.0) | ✅ (克隆源码标签,将 `--ghidra-install` 指向 12.x 安装目录以获取图标) |
已通过端到端测试的版本包括 11.0、11.3、12.0.4、12.1_DEV 和 12.2_DEV。
## 项目结构
```
src/ghidra_help_to_markdown/
main.py # Entry point, orchestrates the pipeline
ghidra_session.py # Lazy pyghidra session (idempotent start, theme init)
runtime_help.py # Reads merged help model from running Ghidra JVM
toc_parser.py # Parses TOC_Source.xml into a TOC tree (source mode)
html_converter.py # HTML to Markdown body conversion
link_resolver.py # help/topics/... -> relative Markdown paths
icon_resolver.py # Resolves icon refs via HelpBuildUtils + classpath
generate_full_index.py # Expands index.md with each page's headers
validator.py # Standalone link/anchor/render checker
```
## 转换流水线
在运行时模式下:
1. **JVM 引导** —— 启动 pyghidra,初始化 `HeadlessThemeManager`,调用
`GhidraHelpService.install()` 以合并所有 `_HelpSet.hs`。
2. **TOC 遍历** —— 从 `getMasterHelpSet()` 遍历已合并的 TOC 树。
3. **主题枚举** —— 遍历每个已加载 HelpSet 的本地映射,获取完整的跨模块主题列表(在实际安装中约有 2700 个主题)。
4. **HTML 获取** —— 通过其 `jar:file:.../!/help/topics/...` URL 上的 `URL.openStream()` 读取每个主题的字节数据。
5. **HTML 转 Markdown** —— `html_converter.py` 负责处理标题、表格、
列表、代码块、定义列表(pandoc 风格)、提示框
(note/tip/warning)、键盘快捷键和可点击的图片。
6. **链接解析** —— 将 `help/topics/X/Y.htm#anchor` 重写为相对路径
`X/Y.md#slug`,并对锚点进行 slug 化处理以匹配 GFM 标题 slug。
7. **图标解析** —— 程序化引用(`Icons.X`、`icon.X`)和
jar 根目录图片(`
`)通过
`HelpBuildUtils.locateImageReference` 和 `ResourceManager.getResource` 进行处理,
提取的字节将被缓存并复制到 `docs/.../icons/`。
8. **图片提取** —— 将 `help/topics//images/*` 和
`help/shared/*` 从模块 jar 包中提取到相应的输出路径。
9. **外部文档** —— 转换 `WhatsNew`、`ChangeHistory`、`README_PDB`、
`InstallationGuide`(Ghidra 源码格式有所不同:11.x 版本为 HTML,
12.x 版本为 Markdown —— 两者均可处理)。
10. **索引 + 导航** —— 生成主 `index.md`、各模块的 `index.md`、
面包屑导航和上一页/下一页链接,以及包含所有
页面标题的 `index-full.md`。
在源码树模式下,步骤 1–4 替换为直接在文件系统上遍历
`**/src/main/help/help/topics/`;其余步骤完全相同。
## 输出
```
docs/Ghidra_/
index.md # Master TOC
index-full.md # Full TOC expanded with every page's headers
icons/ # Resolved icons (jar-extracted + theme-resolved)
images/ # Logo + master-index images
shared/ # Shared images (note.png, etc.)
docs/ # External docs (WhatsNew, ChangeHistory, README_PDB)
Misc/Tips.md # Tip-of-the-Day (generated from tips.txt)
/
index.md # Topic index
*.md # Converted help pages
images/ # Topic-specific images
```
## 验证
```
# 快速内置检查器(作为最后转换步骤自动运行)
uv run ghidra-docs-validator ./docs/Ghidra_12.0.4_PUBLIC
# 通过 mkdocs 进行渲染 + 链接/锚点检查。封装了 `mkdocs build --strict`
# 并在出现任何警告时失败(锚点损坏、未知的 nav 文件、缺失的
# 片段)。在每次更改 converter 或编辑 doc 后运行此检查。
./scripts/check_links.sh
```
内置验证器可以捕获损坏的内部链接、格式错误的表格、
未闭合的粗体/反引号标记、缺失的图片文件,以及同行内
锚点+标题的渲染错误。`mkdocs build --strict` 还会根据目标文件中渲染的标题 slug 和任何 `` 标记,额外验证每个 `[文本](path.md#anchor)` 引用(通过 `mkdocs.yml` 中的 `validation:` 进行配置)。
标签:Ghidra, HTML转Markdown, Java虚拟机, JS文件枚举, Markdown转换, NSA, pyghidra, Python, Wayback Machine, 二进制分析, 云安全监控, 云安全运维, 云资产清单, 反汇编, 文档生成, 文档转换器, 无后门, 网络取, 网络安全, 逆向工具, 逆向工程, 隐私保护, 静态分析