本文仅用于自有设备、拥有完整知识产权的固件维护、学习研究 ,禁止未经授权破解第三方产品、侵权、盗版等违法行为,由此产生一切法律责任由使用者自行承担。
适用芯片:R8C(R5F2xxxx)、RL78(R5F1xxxx)
目录
- 系列基础与安全机制总览
- R8C 保护原理 & 保护位
- RL78 两套Security ID、Option Byte安全机制(重点纠正)
- 读取/提取固件的前提条件
- 硬件方案区分:串行编程模式 / 片上调试模式 / 运行态Dump
- 固件提取流程(Bin导出)
- 固件解析:Hex → Bin、内存映射、向量表
- 逆向工具链(ImHex、Binwalk、IDA、Ghidra)
- 高频踩坑点
- 总结与合规提醒
1. 系列基础与安全机制总览
R8C(R5F2 前缀,16位 M16C 内核,已停产)
- 内核:M16C/60
- 存储:Code Flash + RAM + Data Flash
- 安全机制:保护标志位(Security Flag)
- 特性:串行编程模式自带Flash读命令;保护位开启后,串行接口禁止读出Flash。
- 没有Security ID,不存在密码校验。
RL78(R5F1 前缀,16位低功耗,在产)
- 内核:RL78-S1 / S2
- 存储:Code Flash、Data Flash、RAM
- ✅ 重点官方特性:RL78串行BOOT编程接口,硬件层面没有读Flash指令!
串行模式只支持:擦除、烧录、Verify(校验,逐块比对,不能返回原始数据) - 两套独立Security ID,分开管控:
- 片上调试Security ID:控制片上调试接口,ID校验通过后,配合Debug Monitor才可以读取Flash
- 串行编程Security ID:控制串行烧写/擦除权限 ,ID错误,无法擦除、烧录;就算ID正确,串行模式依然读不出Flash
很多逆向新手最大误区:以为拿到串行Security ID就能在BOOT模式读出固件,这是错误的。
系列区分:✅ R8C:
R5F2xxxx✅ RL78:
R5F1xxxx❌ R5F5xxxx = RX系列,安全机制完全不一样,不要混用

2. R8C 保护原理 & 常见保护位
R8C无密钥,依靠Flash内的保护标志位控制访问权限。
保护位常见定义:
PRI:保护总开关DBG:调试接口禁用RDO:Flash读出禁止EEN:擦除允许
行为:
- 保护关闭:串行编程器可以正常读、写、擦除Flash,仿真调试
- 保护开启:串行编程接口禁止读取Code Flash;大部分型号仍然支持整片擦除,擦除后保护标志清零,Flash清空。
少数高安全子型号:擦除权限也被锁死。
关键点:R8C保护是访问拦截,Flash数据本身是明文;保护开启后,串行读指令直接被拒绝。
思路:要么擦除解锁(数据丢失),要么运行态劫持dump。
3. RL78 两套Security ID、Option Byte安全机制
RL78安全配置放在Option Byte区域,包含两套独立ID,功能完全不同:
-
片上调试Security ID(On-chip Debug Security ID)
- 长度:10字节 / 16字节,不同Group有差异
- 作用:解锁片上调试接口
- 读取Flash必要条件:
- Option Byte开启片上调试
- 调试器输入正确的调试Security ID
- Flash内存在Debug Monitor监控代码
全部满足,调试接口才可以读取Flash内容。
- ID校验失败行为:可配置,部分芯片会自动擦除整片Flash。
-
串行编程Security ID(Flash Serial Programming Security ID)
- 作用:管控BOOT串行模式下的【擦除、烧写】操作
- 限制:该ID再正确,串行模式也不能读出Code Flash
- 用途:防止别人随意改写芯片固件,不是防读取。
额外安全选项(Option Byte):
- 禁止片上调试:直接锁死调试口,无论ID是什么都无法调试
- 块擦除保护:禁止外部整片/块擦除,只能自编程
- 串行编程禁用:直接关闭BOOT串行烧写通道
一句话总结RL78:
想读Flash → 走【片上调试通道 + 调试Security ID + Debug Monitor】
想烧写擦除 → 走【串行BOOT通道 + 串行编程Security ID】
串行BOOT通道天生不支持读Flash,这是硬件协议设计。
补充:RL78大部分型号没有出厂固化唯一UID;UID和这两组Security ID没有任何关系,不要混淆。
4. 读取/提取固件前提条件
仅允许自有、拥有完整知识产权的芯片
- 准确芯片型号,核对硬件手册、Option Byte定义
- 判断安全配置:
- R8C:保护位是否开启RDO读出禁止
- RL78:是否开启片上调试、是否有调试Security ID、是否存在Debug Monitor
- 硬件接线、复位时序稳定(RL78/R8C对复位时序非常敏感)
- 供电稳定,板载上下拉电阻不干扰BOOT/调试引脚
⚠️ 无法提取固件的场景:
- RL78:Option Byte关闭片上调试(无调试通道)
- RL78:开启调试,但丢失【片上调试Security ID】
- RL78:有调试ID,但Flash里没有Debug Monitor
- RL78:开启块擦除保护、串行编程禁用
- R8C:高安全版本,擦除权限锁死
5. 常见硬件读取方案
方案1:R8C 串行编程读取(R8C独有)
R8C串行协议原生支持读Flash。
条件:保护位RDO关闭,E2 Lite / PG-FP5 / 第三方编程器可直接读出Bin。
方案2:RL78 片上调试读取(RL78唯一正规读Flash方式)
工具:E2、E2 Lite、E2 emulator
流程:
- Option Byte开启片上调试
- 调试器校验【片上调试Security ID】
- 芯片内存在Debug Monitor
- 通过调试监控代码,搬运Flash数据到调试接口导出
坑:很多量产固件直接关闭片上调试,这条路直接堵死。
方案3:运行态内存Dump(R8C / RL78通用,调试口锁死时的思路)
原理:芯片正常上电运行,固件本身是在CPU内部取指执行,Flash内容对CPU是可见的。
操作思路:
- 板上预留测试点,接入调试探针或者劫持中断
- 注入一段短代码,循环把Code Flash复制到RAM
- 导出RAM里的明文副本
难度高,需要看懂汇编、中断劫持;风险高,容易跑飞、触发看门狗复位。
方案4:串行BOOT模式(RL78只能烧写、校验,不能读)
RL78串行模式,无论ID是否正确,只能擦除、烧录、Verify校验,无法读出原始固件 。
Verify只是比对,不会返回Flash数据。
6. 固件提取流程(Bin导出)
R8C流程
- 正确接线,进入串行BOOT编程模式
- 工具读取保护标志,确认RDO读出禁止关闭
- 发送读Flash命令,接收原始数据
- 导出
.bin/.mot/.hex,校验CRC
RL78流程(调试通道)
- 调试器连接,复位进入调试会话
- 输入正确【片上调试Security ID】完成校验
- 确认Debug Monitor正常运行
- 分段读取Flash存储区,拼接导出bin
串行BOOT模式不能用来导出RL78固件
格式说明:
.mot:S-record.hex:Intel Hex.bin:原始二进制,逆向首选
Hex转Bin工具:srec_cat、ImHex、Hex2Bin
7. 固件解析:内存映射、向量表
R8C 内存映射示例
- Flash:高地址向下排布(16K/32K/64K/128K)
- 中断向量表:Flash最高地址区域,复位向量为程序入口
- RAM:低地址区间
RL78 内存映射示例(G13举例)
- Code Flash:起始地址
0x00000 - 中断向量表:
0x00000 ~ 0x0007F - 复位向量:
0x00000,存放复位入口地址 - Data Flash:独立地址区间,存放参数、校准数据
逆向第一步:定位复位向量,找到程序入口,再梳理中断函数。
8. 逆向工具链
| 工具 | 用途 |
|---|---|
| ImHex | 二进制查看、字符串搜索、校验、Hex<->Bin转换 |
| Binwalk | 查找固件内嵌文件、压缩包(R8C/RL78固件大多无压缩) |
| IDA Pro | 反汇编,需要单独安装R8C(M16C) / RL78处理器模块 |
| Ghidra | 开源反汇编,需要导入对应处理器定义文件 |
| Srecord | SREC/Hex文件裁剪、拼接、格式转换 |
重点提醒:
RL78是变长16位CISC指令集,R8C是M16C指令集,和ARM、RX指令集完全不兼容,插件混用会全部乱码。
9. 高频踩坑点
- RL78串行BOOT读不出Flash
不是工具问题,是协议本身没有读命令,不要反复尝试输入串行Security ID来读固件。 - 分不清两套Security ID
拿到串行编程ID,依然无法读Flash;读Flash必须要【片上调试Security ID】,并且调试通道开启。 - 读出Bin全FF
R8C:RDO保护开启;RL78:调试校验失败、没有进入调试会话。 - 擦除=丢固件
R8C擦除会清空保护位,同时清空Flash;RL78串行擦除会直接清空固件,擦除前务必确认已经备份。 - Debug Monitor缺失
RL78就算ID正确、调试开启,没有Monitor代码,调试器也无法批量读取Flash。 - Code Flash和Data Flash区分
Data Flash存放校准参数、配置,很多人只导出Code Flash,漏掉配置区。
10. 总结与合规提醒
- R8C:串行接口原生支持读Flash,安全只有RDO保护位,无Security ID。
- RL78:串行BOOT通道只负责烧写擦除,没有读Flash命令;读取固件依赖片上调试通道 + 调试Security ID + Debug Monitor。两套ID各司其职,不能混用。
- 两者Flash内数据本身都是明文,安全机制是访问权限拦截,不是AES加密。
- 逆向难点:R8C看保护位;RL78难点在于调试通道是否开放、调试ID是否持有、Debug Monitor是否存在。
📜 法律声明
本文所有内容仅用于自有设备、拥有完整知识产权的固件学习、维护、备份。未经版权方授权,禁止对第三方商用设备进行固件读取、逆向、篡改、二次分发,否则将承担民事、行政乃至刑事责任。