第一章:FPGA芯片架构与比特流基础
各位同学,咱们今天聊聊FPGA的“底裤”——芯片架构和比特流。说实话,搞逆向安全,不懂底层架构,就像修车不知道发动机长啥样。我当年刚入行时,也踩过不少坑,今天把这些经验掰开了揉碎了讲给你听。
1.1 主流FPGA芯片架构:Xilinx vs Intel
目前市面上,FPGA基本被两家巨头垄断:Xilinx(现在叫AMD Xilinx)和Intel(原Altera)。两家架构思路有差异,但核心逻辑相通。
Xilinx的架构特点:
- CLB(可配置逻辑块)是基本单元,里面包含Slice
- 每个Slice里有LUT(查找表)、触发器、进位链
- 布线资源丰富,但延迟相对高一些
- 我习惯叫它“岛式架构”——逻辑块像岛屿,布线像桥梁
Intel的架构特点:
- LAB(逻辑阵列块)是基本单元
- 每个LAB包含多个ALM(自适应逻辑模块)
- 布线更规整,有点像“网格状”
- 我个人觉得Intel的时序收敛更容易,但灵活性稍差
核心区别一句话:Xilinx像乐高,零件多、组合灵活;Intel像宜家,模块化、组装快。搞逆向时,Xilinx的比特流更难解析,因为布局更随机。
我在项目中遇到过一件事:客户拿了一块Xilinx的板子,说比特流被加密了。我一看,用的是7系列芯片。嗯,这系列有个漏洞——配置存储器没做物理隔离,可以通过JTAG直接读。后来我们用了点小技巧,绕过了加密。具体怎么绕?后面章节会细讲。
1.2 可编程逻辑单元结构
你想想看,FPGA为什么叫“可编程”?核心就在逻辑单元。咱们拆开来看:
LUT(查找表):
- 本质是SRAM,存的是真值表
- 4输入LUT = 16位SRAM,6输入LUT = 64位SRAM
- 逆向时,读LUT内容就能还原组合逻辑
触发器(Flip-Flop):
- 存储状态,通常是D触发器
- 有置位/复位、时钟使能等控制端
- 我建议你重点关注复位信号——很多设计者会忽略它,导致逆向时状态机跑飞
进位链(Carry Chain):
- 用于算术运算,比如加法器
- Xilinx的进位链是专用的,Intel的集成在ALM里
- 逆向时,进位链能暴露数据路径的宽度
我的小技巧:逆向时先找触发器,再找LUT。因为触发器数量少,容易定位。我曾经用这个方法,半小时就还原了一个加密算法的状态机。
下面这张图,是我自己画的FPGA逻辑单元内部结构。你看,数据从LUT出来,经过触发器,再通过布线网络送到下一级。说白了,就是个“组合逻辑+时序逻辑”的循环。
1.3 比特流文件格式解析
比特流,说白了就是FPGA的“机器码”。它告诉芯片:哪个LUT存什么值,哪个触发器接什么信号,布线开关怎么闭合。
Xilinx比特流结构:
- 同步字(Sync Word):0xAA995566,用于对齐
- 配置命令:比如写配置寄存器、加载帧数据
- 帧数据:真正的配置内容,按帧组织
- CRC校验:防止传输错误
Intel比特流结构:
- 起始码(Start Code):0xFF 0xFF 0x00 0x00
- 配置数据包:包含地址、长度、数据
- 结束码(End Code):0x00 0x00 0x00 0x00
注意:Xilinx的比特流是“帧”结构,Intel的是“包”结构。逆向时,Xilinx的更难解析,因为帧边界不固定。我曾经花了两周才写了个解析器,结果发现芯片型号搞错了——帧长度不一样。嗯,从那以后我每次先查芯片手册。
下面这个表格,是我整理的常见比特流格式对比:
| 特性 | Xilinx (.bit) | Intel (.rbf) |
|---|---|---|
| 同步头 | 0xAA995566 | 0xFFFF0000 |
| 数据组织 | 帧(Frame) | 包(Packet) |
| 压缩方式 | 支持多帧写入 | 支持部分重配置 |
| 逆向难度 | 高(帧边界难定位) | 中(包结构清晰) |
1.4 配置存储器原理
FPGA是SRAM工艺,掉电就丢配置。所以需要外部存储器来存比特流。常见的配置存储器有:
- SPI Flash:最常用,串行接口,容量大
- BPI Flash:并行接口,速度快,但引脚多
- JTAG:调试用,也可以配置,但速度慢
配置流程是这样的:
- 上电后,FPGA进入配置模式
- 从外部存储器读取比特流
- 逐帧写入内部SRAM
- CRC校验通过后,启动用户逻辑
安全要点:配置存储器是逆向攻击的突破口。很多设计者把密钥存在SPI Flash里,以为加密了就安全。其实,只要用逻辑分析仪抓SPI总线,就能直接读到明文比特流。我见过太多这样的案例了。
为什么会这样?因为FPGA上电时,SPI Flash的数据是明文传输的。加密只保护了存储,没保护传输。所以,我建议你:
- 使用FPGA内置的AES解密引擎
- 密钥用电池供电的SRAM保存
- 或者用OTP(一次性可编程)存储器
避坑指南:我曾经帮一个客户做安全审计,发现他们把密钥存在SPI Flash的0x00地址。攻击者只要读前256字节,就能拿到密钥。后来我建议他们把密钥分散存储,并加上随机填充。嗯,从那以后,他们的产品再没被破解过。
好了,这一章的内容就到这里。记住:架构是骨架,比特流是血肉,配置存储器是命门。搞逆向,这三样缺一不可。