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, 二进制分析, 云安全运维, 云资产清单, 反汇编, 安全规则引擎, 无后门, 桌面应用, 逆向工具, 逆向工程