garyPenhook/IronView
GitHub: garyPenhook/IronView
IronView 是一个基于 radare2 和 PySide6 的 Linux 二进制逆向分析桌面工作台,提供 section 检查、反汇编、函数 CFG、交叉引用和 HLL 反编译等可视化分析功能。
Stars: 0 | Forks: 0
# IronView
`IronView` 是一个用于在 Linux 上检查二进制文件的 Python 桌面应用程序。
它结合了以下四个部分:
- `libbfd`:用于获取 section 元数据和原始 section 字节
- `PySide6`:用于构建 Qt GUI
- 通过 `r2pipe` 调用 `radare2`:用于反汇编和函数发现
- 可选的 `Ghidra`:用于外部 GUI 操作和无头分析报告
- GNU 工具链辅助工具,如 `addr2line`、`c++filt`、`nm`、`readelf` 和 `gdb`
该项目同时支持 GUI 和 CLI 工作流。
## 当前功能
- 打开二进制文件并检查 section 元数据
- 检测加载的二进制文件是 `ELF`、`PE/COFF` 还是 `Mach-O`
- 将原始 section 字节预览为格式化的十六进制
- 将选定的 section 导出到磁盘
- 按名称、索引、大小或地址过滤 section
- 预览 section 级别的 radare2 反汇编
- 浏览 radare2 发现的函数
- 浏览 radare2 发现的字符串
- 浏览 radare2 导入
- 浏览 radare2 导出
- 浏览 radare2 重定位
- 浏览跨 `ELF`、`PE/COFF` 和 `Mach-O` 的 radare2 符号
- 检查 radare2 函数 CFG
- 按名称、地址、类型或签名过滤函数
- 按值、地址、section 或类型过滤字符串
- 按名称、PLT 地址、绑定或类型过滤导入
- 按原始名称、demangled 名称、地址或类型过滤符号
- 预览所选函数的完整函数反汇编
- 通过 radare2 反编译后端预览函数级别的 HLL 风格视图,并在 `pdg`、`pdd` 和 `pdc` 之间提供回退支持
- 当 radare2 暴露数据时,跟踪 HLL 后端元数据、回退状态、警告以及行/地址关联
- 从 GUI 中选择并重新加载 HLL 后端,点击关联的 HLL 行即可跳转到反汇编代码
- 切换 `Clean HLL` 模式,在原始后端输出和 IronView 清理后的呈现方式之间进行切换
- 查看函数、导入、字符串和符号相关的 HLL 上下文,然后直接跳转到这些面板
- 当渲染文本明确无误时,跟随匹配函数、导入、字符串和符号的内联语义 HLL 链接
- 查看反编译文本旁边的 HLL 调用摘要和提取的参数/局部变量声明
- 在可用时优先使用后端 JSON 来获取 HLL 调用和声明,以文本解析作为回退方案
- 在 `Clean HLL` 模式下,折叠常见的导入 thunk、静态注册、fini 析构、stack-canary、stack-probe、scoped-stack-object 和开头的临时声明样板代码
- 直接从 section 和函数反汇编中点击跳转和调用目标
- 检查所选字符串的交叉引用,并从交叉引用跳转到函数
- 检查导入函数的调用者,并从调用者跳转到函数
- 在可能的情况下,将导出和重定位关联到加载的符号、导入和函数
- 检查所选导出和重定位的交叉引用,并从这些交叉引用跳转到函数
- 使用 `c++filt` 解析 demangled 名称
- 当调试数据可用时,为 ELF 二进制文件使用 `addr2line` 解析源码位置
- 检查 `ELF`、`PE/COFF` 和 `Mach-O` 的跨格式二进制元数据和链接库
- 从 GUI 启动 `Ghidra`
- 为加载的二进制文件运行应用内的 `Ghidra` 无头分析报告
- 在浅色和深色主题之间切换
- 查看带有运行时事件和分析活动的底部系统控制台
- 从底部控制台运行 Linux shell 命令
- 从 `View` 菜单折叠和恢复浏览器及控制台面板
- 从 GUI 在外部终端启动 `codex`
- 为当前二进制文件在外部终端启动 `gdb`
## 环境要求
- Python `3.14+`
- `uv`
- 主机上存在可用的 `libbfd` 共享库
- `radare2` 可在 `PATH` 中找到
- 当前已记录并在本地验证的基准版本是 `radare2 6.1.1`
- 可选的 radare2 反编译插件,如 `r2ghidra` (`pdg`) 或 `r2dec` (`pdd`),以获取更丰富的 HLL 输出
- 可选的 `Ghidra`,需要 `ghidra` 和 `analyzeHeadless` 可用,用于 GUI 启动和无头报告
- GNU 用户空间工具:`addr2line`、`c++filt`、`nm`、`readelf` 以及可选的 `gdb`
- 用于运行 GUI 的 Linux 桌面会话
项目依赖在 [`pyproject.toml`](/home/gary/PycharmProjects/IronView/pyproject.toml) 中管理。
## 安装
在项目根目录下执行:
```
cd /home/gary/PycharmProjects/IronView
uv sync
```
如果项目环境尚不存在,`uv sync` 将创建它并安装:
- `PySide6`
- `pytest`
- `r2pipe`
该应用目前是基于 `radare2 6.1.1` 进行开发和记录的。
## 运行
启动 GUI:
```
cd /home/gary/PycharmProjects/IronView
uv run python -m src.main
```
启动 GUI 并预加载二进制文件:
```
uv run python -m src.main --gui /bin/ls
```
运行 CLI JSON 输出模式:
```
uv run python -m src.main /bin/ls
```
在 CLI 模式下将一个 section 转储为十六进制:
```
uv run python -m src.main /bin/ls --section .text
```
## GUI 工作流
1. 启动应用程序。
2. 使用 `Ctrl+O` 或 `Open Binary` 按钮打开二进制文件。
3. 使用 `Sections` 面板检查原始 section。
4. 使用底部的浏览器标签页查看 `Functions`、`Strings`、`Imports`、`Exports`、`Relocations` 和 `Symbols`。
5. 在右侧的 `Section`、`Function`、`String`、`Import`、`Export`、`Relocation`、`Symbol` 和 `Binary` 检查器标签页之间切换。
6. 使用 section 检查器内的 `Hex` 和 `Disassembly` 标签页查看字节和指令,并点击链接的跳转或调用目标进行导航。
7. 选择一个字符串以加载交叉引用,然后在可用时双击交叉引用行跳转到引用的函数。
8. 选择一个导入以加载调用者,然后在可用时双击调用者行跳转到引用的函数。
9. 选择一个导出或重定位以加载关联的上下文和交叉引用。
10. 在可用时双击导出或重定位行,跳转到匹配的符号、导入或函数。
11. 在可用时双击导出或重定位的交叉引用行,跳转到引用的函数。
12. 选择一个函数或符号以加载 demangling(名称还原),对于 ELF 二进制文件,还会加载源码位置元数据。
13. 使用函数检查器内的 `HLL` 子标签页查看可用的最佳 radare2 反编译后端输出,切换后端,重新加载 HLL 视图,以及开启或关闭 `Clean HLL`。
14. 当地址映射可用时,点击关联的 HLL 行链接跳转到函数反汇编代码。
15. 使用 HLL 上下文表跳转到反编译输出引用的匹配函数、导入、字符串和符号。
16. 在可用时,点击内联 HLL 语义链接跳转到匹配的函数、导入、字符串和符号。
17. 保持启用 `Clean HLL` 以获得精简视图,该视图会移除常见的 radare2/插件样板代码,如导入 thunk、构造函数注册、fini 析构、stack-canary 脚手架、stack probe 以及反编译器临时变量声明墙。
18. 使用 HLL 调用摘要和声明视图来检查推断出的被调用者、参数和局部变量。
19. 使用函数检查器内的 `CFG` 子标签页检查基本块,并点击某个块跳转到反汇编代码。
20. 使用 `Binary` 标签页通过基于 radare2 的元数据报告和链接库视图检查当前二进制文件。
21. 使用底部的 `System Console` 查看加载、导出、错误和分析活动。
22. 在控制台输入框中输入 Linux 命令,并在项目目录中运行它们。
23. 当专注于 HLL、反汇编或 CFG 工作时,使用 `View > Show Browser` 和 `View > Show Console` 来重新利用空间。
24. 如果分割线被拖动到尴尬的状态,请使用 `View > Reset Layout`;浏览器、检查器、HLL 和控制台面板都将恢复到默认比例。
25. 使用 `Run Codex` 在带有真实 TTY 的外部终端中启动 `codex`。
26. 使用 `Run GDB` 为当前二进制文件在外部终端中启动 `gdb`。
27. 使用 `Launch Ghidra` 打开外部 Ghidra GUI,或在 `Binary` 标签页中使用 `Run Headless Analysis` 在 IronView 内收集 Ghidra 报告。
## CLI 行为
[`src/main.py`](/home/gary/PycharmProjects/IronView/src/main.py) 目前的行为如下:
- 没有位置的 `path` 参数:启动 Qt GUI
- 仅有 `path`:打印包含路径、文件格式、格式详情、架构大小和 section 的 JSON
- `path --section NAME`:以十六进制形式打印 section 字节
- `--gui [path]`:强制 GUI 模式
## 架构
实现细节记录在 [`docs/architecture.md`](/home/gary/PycharmProjects/IronView/docs/architecture.md) 中。
总体来说:
- [`src/binary_loader.py`](/home/gary/PycharmProjects/IronView/src/binary_loader.py) 封装了 `libbfd`
- [`src/disassembler.py`](/home/gary/PycharmProjects/IronView/src/disassembler.py) 封装了 `radare2`
- [`src/ghidra_toolchain.py`](/home/gary/PycharmProjects/IronView/src/ghidra_toolchain.py) 封装了可选的 `Ghidra` 启动和无头分析
- [`src/gnu_toolchain.py`](/home/gary/PycharmProjects/IronView/src/gnu_toolchain.py) 封装了 GNU binutils 辅助工具
- [`src/gui.py`](/home/gary/PycharmProjects/IronView/src/gui.py) 实现了 Qt 应用程序
- [`src/main.py`](/home/gary/PycharmProjects/IronView/src/main.py) 是 CLI/GUI 的入口点
## 验证
运行测试套件:
```
cd /home/gary/PycharmProjects/IronView
QT_QPA_PLATFORM=offscreen uv run pytest
```
运行语法检查:
```
python3 -m py_compile src/ghidra_toolchain.py src/gnu_toolchain.py src/disassembler.py src/gui.py src/main.py src/binary_loader.py src/test_main.py
```
## 已知限制
- 该应用目前主要面向 Linux。
- `libbfd` 必须在运行时可用,否则 section 加载将失败。
- radare2 仅用于只读分析。
- 目前 `ELF` 是最完善的格式。
- `PE/COFF` 和 `Mach-O` 目前使用 `libbfd` 和 radare2 路径,而 GNU `addr2line` 源码查找对其仍然被有意禁用。
- 源码映射依赖于二进制文件中存在或可访问的调试信息。
- 目前的 radare2 集成涵盖了 section、字符串、导入、导出、重定位、符号、函数、交叉引用/调用者、反汇编、通过 `pdg`/`pdd`/`pdc` 回退的 HLL 风格输出、`Clean HLL` 渲染启发式方法以及初步的 CFG 视图。
- 目前的 Ghidra 集成是有意保持浅层的:仅限外部 GUI 启动和按需的无头报告收集。
- `Clean HLL` 是一个展示层。它通过折叠反编译器临时局部变量、thunk 样板代码、堆栈脚手架和类似的噪音来提高可读性,但它不能替代真正的源码级反编译器,也不能保证语义正确的重写。
标签:ELF, Python, radare2, Wayback Machine, 二进制分析, 云安全运维, 云资产清单, 反汇编, 安全规则引擎, 无后门, 桌面应用, 逆向工具, 逆向工程