第一章: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出来,经过触发器,再通过布线网络送到下一级。说白了,就是个“组合逻辑+时序逻辑”的循环。

FPGA逻辑单元结构图 LUT (查找表) FF (触发器) 布线网络 (Switch Matrix) 输入 → → 输出 时钟信号

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:调试用,也可以配置,但速度慢

配置流程是这样的:

  1. 上电后,FPGA进入配置模式
  2. 从外部存储器读取比特流
  3. 逐帧写入内部SRAM
  4. CRC校验通过后,启动用户逻辑

安全要点:配置存储器是逆向攻击的突破口。很多设计者把密钥存在SPI Flash里,以为加密了就安全。其实,只要用逻辑分析仪抓SPI总线,就能直接读到明文比特流。我见过太多这样的案例了。

为什么会这样?因为FPGA上电时,SPI Flash的数据是明文传输的。加密只保护了存储,没保护传输。所以,我建议你:

  • 使用FPGA内置的AES解密引擎
  • 密钥用电池供电的SRAM保存
  • 或者用OTP(一次性可编程)存储器

避坑指南:我曾经帮一个客户做安全审计,发现他们把密钥存在SPI Flash的0x00地址。攻击者只要读前256字节,就能拿到密钥。后来我建议他们把密钥分散存储,并加上随机填充。嗯,从那以后,他们的产品再没被破解过。

好了,这一章的内容就到这里。记住:架构是骨架,比特流是血肉,配置存储器是命门。搞逆向,这三样缺一不可。

专注资料整理