keithgh1/m740recon

GitHub: keithgh1/m740recon

针对 Renesas/Mitsubishi 740 系列微控制器固件的高级反汇编与静态分析工具,支持递归遍历、值跟踪、交叉引用及结构化报告。

Stars: 1 | Forks: 0

# m740recon ## 概述 m740recon 是一款用于 Renesas/Mitsubishi 740 固件的高级反汇编器和静态分析工具。除了生成与 as740 兼容的汇编代码外,它还执行递归遍历的代码/数据分离、数据流值跟踪、声明式控制文件驱动的分析、交叉引用以及 call graph / JSON 报告,从而加速对 8 位三菱微控制器 ROM 的逆向工程。 m740recon 对许多 8 位三菱微控制器的固件进行反汇编,并生成与 [as740](http://shop-pdp.net/ashtml/as740.htm) 汇编器兼容的输出。16 位和 32 位三菱微控制器使用不同的指令集,因此不受支持。 底层反汇编器系列最初是为了对 TechniSat 制造的 [Volkswagen Gamma V](https://github.com/mnaberez/vwradio) 和 [Volkswagen Rhapsody](https://github.com/mnaberez/vwradio) 汽车收音机固件进行反汇编而开发的。这两款收音机均使用 [M38869FFAHP](http://6502.org/documents/datasheets/mitsubishi/renesas_3886_group_users_manual.pdf) 微控制器。 ## 功能 - **完全一致的重汇编。** m740recon 输出的汇编代码使用 as740 汇编后,能够生成与原始二进制文件按位完全一致的副本。一个纯 Python 的结构化往返测试在无需外部汇编器的情况下验证了这一特性。 - **代码/数据分离。** 从内存顶部的 vector 开始,m740recon 使用递归遍历反汇编来分离代码和数据。 - **符号生成。** 硬件寄存器、vector、被引用的内存位置、分支 label 和 subroutine 会被自动命名,而无需编写硬编码地址。 - **声明式控制文件 (`-c`)。** 类似 da65 风格的控制文件用于提供设备、entry point、label/注释、segment 内存映射、带类型的数据范围 (`byte`/`word`/`addr`/`text`),以及将 dispatch table 解码为命名 handler 的 address-table —— 而无需修改源码。 - **设备层级 (`-m`)。** 在 `devices.py` 中,设备被定义为 base/group/part 继承层级结构,涵盖了 M37450/51、M3802/07/3886、M50734 以及许多其他 740 系列部件及其别名。设备还可以将其核心未实现的 opcode 视为数据进行解码;该机制已为需要此功能的核心准备就绪,尽管目前没有任何捆绑设备使用它。 - **值跟踪分析 (`-a`, `--auto_tables`)。** 可选的常量传播可以解析计算出的 `jmp [zp]` / `jsr [zp]` 目标;`--auto_tables` 会枚举为它们提供数据的连续 ROM jump table。这两者都是增量式的,并且对重汇编是安全的。 - **交叉引用 (`-x`)。** 为每个 label 标注引用它的指令。 - **报告 (`-j`, `-g`)。** 输出机器可读的 JSON 模型或人类可读的 call graph 以代替列表代码(请参阅 [报告与可视化](#reports-and-visualization))。 ## 安装说明 m740recon 使用 Python 编写,需要 Python 3.8 或更高版本。您可以从该 git repository 下载包,然后使用以下命令将其安装到虚拟环境中: ``` $ git clone https://github.com/keithgh1/m740recon.git $ cd m740recon $ python3 -m venv ./venv $ ./venv/bin/pip3 install --editable '.[test]' ``` 运行上述命令后,您可以使用 `./venv/bin/m740recon` 运行反汇编器 或使用 `./venv/bin/pytest` 运行其单元测试。 ## 运行说明 m740recon 接受纯二进制文件作为输入。该文件被假定为应与内存顶部对齐的 ROM image。例如,如果给定一个 32K 的文件,m740recon 将假定该 image 应位于 0x8000-0xFFFF。加载 image 后,反汇编器会读取内存顶部的 vector 并从那里开始跟踪指令。 ``` $ ./venv/bin/m740recon input.bin > output.asm ``` 默认的 MCU 类型是 `M3886` 系列。可以使用 `-m` 选项指定其他类型,例如 `-m M37450` 或 `-m M50734`。您可以通过编辑 `devices.py` 来添加对新设备的支持。 对于任何不仅仅是单个顶部对齐 ROM 的情况 —— 如 RAM/ROM 分割、额外的 entry point、dispatch table 或数据区域 —— 请使用 `-c` 提供控制文件,而不是修改源码。控制文件提供了设备、segment 内存映射、entry point、label 和注释、带类型的数据范围,以及将 dispatch table 解码为命名 handler 的 address-table: ``` $ ./venv/bin/m740recon -c firmware.m740 > output.asm # device + memory map + labels $ ./venv/bin/m740recon -c firmware.m740 -a -x > output.asm # + analysis + xrefs ``` 控制文件扩展名 `.m740` 指的是 740 芯片系列。在 [`docs/example.m740`](docs/example.m740) 中包含了一个完整的、带有注释并演示了所有指令(设备、segment 内存映射、entry point、label、注释、带类型的数据范围和 address-table)的控制文件示例。 大多数二进制文件包含一些计算出的跳转。`-a`/`--analyze` 会跟踪寄存器和 zero-page 的值以解析 `jmp [zp]` / `jsr [zp]` 目标,而 `--auto_tables` 会枚举为它们提供数据的 ROM jump table。对于仍无法自动解析的地址,可以直接在控制文件中对其进行命名。 一旦反汇编完成,可以使用 [as740](http://shop-pdp.net/ashtml/as740.htm) 将输出文件重新汇编为完全相同的二进制文件。其中包含了一个示例 [`Makefile`](m740recon/tests/end_to_end/Makefile),展示了所需的 as740 命令。 ### 报告与可视化 除了汇编列表之外,m740recon 还可以根据跟踪的程序生成两种报告。两者都仅读取已跟踪的状态,并输出到 stdout 以代替列表代码: ``` $ ./venv/bin/m740recon -c firmware.m740 --call-graph > callgraph.txt # human-readable $ ./venv/bin/m740recon -c firmware.m740 --json > report.json # machine-readable ``` `--call-graph` 列出了每个 routine 及其调用的 routine 和调用它的 routine。`--json` 输出结构化模型 (`m740recon-report/1`):routine(每个都带有其 outgoing/incoming call 边)、vector、symbol 以及完整的交叉引用映射。 JSON 模型可以渲染成 [Graphviz](https://graphviz.org/) 图表。完整的固件图表通常太大而难以阅读,因此可以过滤出您感兴趣的 routine —— 例如,从某一个 routine 可达的所有内容,深度为两层: ``` # report_to_dot.py: 将 `m740recon --json` 输出转换为 Graphviz import json, sys model = json.load(open(sys.argv[1])) routines = {r["address"]: r for r in model["routines"]} by_name = {r["name"]: r["address"] for r in model["routines"]} root = by_name[sys.argv[2]] depth = int(sys.argv[3]) if len(sys.argv) > 3 else 2 seen, frontier = set(), {root} for _ in range(depth + 1): seen |= frontier frontier = {e["to"] for a in frontier if a in routines for e in routines[a]["calls"]} - seen print("digraph g {\n rankdir=LR;\n node [shape=box, fontname=Helvetica];") for a in seen: for e in routines.get(a, {}).get("calls", []): if e["to"] in seen: dash = "" if e["type"] == "call" else " [style=dashed]" print(' "%s" -> "%s"%s;' % (routines[a]["name"], e["name"], dash)) print("}") ``` ``` $ ./venv/bin/m740recon -c firmware.m740 --json > report.json $ python report_to_dot.py report.json main_loop 2 | dot -Tsvg -o callgraph.svg ``` 例如,这里有一个从真实固件渲染出来的 call graph —— Star NX-1020 针式打印机(一款基于 M50734 的设备)的 *打印路径*,从行/打印 dispatcher 一直到触发打印头的 routine: ![Star NX-1020 打印路径 call graph](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/85fea8f187222402.png) 这些方框是 m740recon 跟踪并命名的 subroutine,由它恢复的 call 和 tail-call 边连接起来;简短的描述是为了使路径易于阅读而手动添加的注释。该图表的 Graphviz 源文件包含在 [`docs/nx1020_printpath.dot`](docs/nx1020_printpath.dot) 中。 ## 测试 ``` $ ./venv/bin/pytest ``` 测试套件是自包含的:每个输入都是合成的测试夹具或仓库自身的 `testprog.asm`,因此不需要外部的 ROM image。 端到端重汇编测试使用真实的 [as740](http://shop-pdp.net/ashtml/as740.htm) + aslink 来证明该列表代码能够按位精确地汇编回输入。当在 `PATH` 中(或作为 `~/bin` 中的 `.exe`)未找到该工具链时,这些测试将**跳过**,其余的测试套件仍然会通过 —— 纯 Python 的结构化往返测试 (`test_roundtrip`) 会在此期间持续验证重新编码。设置 `M740_REQUIRE_AS740=1` 可以将缺失的工具链转换为严重错误(推荐用于绝不允许重汇编保证未经验证的 CI)。要在本地运行完整检查,请从 ASxxxx 源码构建 `as740` 和 `aslink`,并将它们放在 `PATH` 中。 ## 与 m740dasm 的关系 m740recon 是由 Mike Naberezny 开发的 [m740dasm](https://github.com/mnaberez/m740dasm) 的友好分支,基于其 BSD-3-Clause 许可证使用。m740dasm 提供了经过验证的 740 系列指令集、递归遍历反汇编器核心、自动符号生成以及按位精确重汇编的保证。 m740recon 在此基础上,以静态分析和逆向工程为重点,增加了以下功能: - 声明式 da65 风格的控制文件 (`-c`),用于设备选择、segment 内存映射、entry point、label/注释、带类型的数据范围以及 address-table 解码; - 涵盖许多 740 系列部件及别名的 base/group/part 设备继承层级结构; - 数据流值跟踪 (`-a`) 以解析计算出的 `jmp [zp]` / `jsr [zp]` 目标,并带有自动的 ROM jump-table 枚举 (`--auto_tables`); - 交叉引用注释 (`-x`);以及 - 用于可视化的人类可读 call graph 和机器可读的 JSON 报告。 m740recon 是一个独立的项目。Mike Naberezny 不认可、赞助或维护 m740recon,m740dasm 仅被标明为此分支派生的基础。 ## 作者 m740recon 由 [Keith Monahan](https://github.com/keithgh1) 维护。 作为 m740recon 基础的原始 m740dasm 反汇编器,由 [Mike Naberezny](https://github.com/mnaberez) ([m740dasm](https://github.com/mnaberez/m740dasm)) 创建。 ## 许可证 m740recon 在 BSD-3-Clause 许可证下分发。原始的版权声明、条件和免责声明 —— 版权所有 (c) 2018 Mike Naberezny 及贡献者 —— 均保留在 [LICENSE](LICENSE.txt) 中。此分支中所做的添加内容的版权所有 (c) 2026 Keith Monahan。完整文本请参阅 [LICENSE](LICENSE.txt)。
标签:Homebrew安装, 云安全监控, 云资产清单, 反汇编器, 固件分析, 安全规则引擎, 嵌入式系统, 逆向工具, 逆向工程, 静态分析