第二章 数字电路基础回顾:从布尔代数到有限状态机
说实话,很多刚入行的朋友觉得数字电路基础太简单,翻翻书就过了。但我做了这么多年逆向,可以负责任地告诉你——你越往后走,越会发现基础决定上限。尤其是做FPGA逆向,你面对的是一堆网表和比特流,没有扎实的数字电路功底,根本读不懂芯片在说什么。
这一章,我带你把几个核心概念再过一遍。不是照本宣科,而是结合我实际踩过的坑来讲。
2.1 布尔代数与逻辑门:逆向工程的“字母表”
布尔代数,说白了就是0和1的游戏。与、或、非,这三个基本操作构成了所有数字逻辑的基础。你想想看,一个复杂的FPGA设计,最终拆解到最底层,就是一堆逻辑门的组合。
我在逆向一个通信芯片时,遇到过这样的情况:对方用了一大堆看似冗余的逻辑门,实际上是在做逻辑混淆。如果你不懂布尔代数的化简规则,比如德摩根定律、吸收律,你根本看不穿他的真实意图。
核心逻辑门速查表
| 逻辑门 | 布尔表达式 | 真值表(A,B) | 我的备注 |
|---|---|---|---|
| 与门 (AND) | Y = A · B | 只有11得1 | 常用作使能信号 |
| 或门 (OR) | Y = A + B | 有1就得1 | 注意毛刺问题 |
| 非门 (NOT) | Y = ¬A | 取反 | 最简单的反相器 |
| 异或门 (XOR) | Y = A ⊕ B | 相同得0,不同得1 | 逆向中常用来做数据比较或加密 |
嗯,这里要注意:在FPGA中,实际使用的查找表(LUT)可以模拟任何逻辑门。所以你在逆向时看到的可能不是标准门,而是LUT的配置值。这时候,布尔代数知识就派上用场了——你得能反推出LUT实现了什么功能。
2.2 组合逻辑与时序逻辑:分清“当下”和“过去”
这是新手最容易混淆的地方。我简单说:
- 组合逻辑:输出只取决于当前输入。没有记忆,没有时钟。比如一个加法器,输入变了,输出立刻变。
- 时序逻辑:输出不仅取决于当前输入,还取决于之前的状态。说白了,它有“记忆”。
为什么这个区分在逆向中很重要?
我曾经逆向过一个加密协处理器,一开始我把它所有的逻辑都当成组合逻辑来分析,结果死活对不上波形。后来才发现,里面藏了一个状态寄存器,它的输出反馈到了输入——这就是典型的时序逻辑。如果不区分清楚,你分析出来的功能图完全是错的。
我的小技巧:在网表中,看到反馈回路或者时钟驱动的节点,基本可以判定是时序逻辑。组合逻辑通常没有时钟引脚。
2.3 触发器与寄存器:数字电路的“记忆细胞”
触发器(Flip-Flop)是时序逻辑的基本单元。最常见的D触发器,它只在时钟上升沿(或下降沿)采样输入,然后保持住这个值。
多个D触发器并在一起,就构成了寄存器。比如一个8位寄存器,就是8个D触发器共享同一个时钟。
我在逆向一个老旧FPGA项目时,发现对方用了一个非常奇怪的移位寄存器结构。正常来说,移位寄存器就是串进并出或者并进串出。但他那个设计,中间插了好几个“幽灵”触发器——看起来没用,实际上是为了调整时序,让信号在特定时钟周期到达。如果你不懂触发器的建立时间和保持时间,你根本看不懂他为什么要这么干。
避坑指南:我曾经在分析一个高速接口时,忽略了触发器的建立时间约束,结果在仿真时一切正常,但实际芯片跑起来就出错。后来发现,对方的时钟树设计故意让某些触发器的时钟偏斜,导致采样错误。所以,逆向时不仅要看逻辑,还要关注时钟路径。
2.4 有限状态机基础:芯片的“大脑”
有限状态机(FSM)是数字电路中最常用的控制逻辑。它由状态寄存器、次态逻辑和输出逻辑三部分组成。
我习惯把FSM分为两类:
- Moore型:输出只取决于当前状态。稳定,但响应慢一拍。
- Mealy型:输出取决于当前状态和输入。响应快,但容易有毛刺。
在逆向中,识别FSM是关键一步。为什么?因为FSM往往代表了芯片的控制流程——比如协议解析、指令译码、加密状态切换。你找到了FSM,就找到了芯片的“大脑”。
下面这张图是我自己总结的FSM逆向分析流程,你可以参考一下:
实际逆向中,我见过最复杂的FSM有128个状态,用格雷编码实现。当时我花了整整三天才把状态转移图还原出来。但一旦画出来,整个芯片的工作模式就一目了然了。
经验之谈:如果你在网表中看到一组触发器,它们的输入来自同一个组合逻辑块,而且输出又反馈回去,十有八九就是FSM的状态寄存器。这时候,优先关注复位值——那往往是FSM的初始状态。
好了,这一章的内容就这些。数字电路基础是FPGA逆向的基石,别觉得简单就跳过。我见过太多人,一上来就想着破解加密、提取密钥,结果连基本的组合逻辑和时序逻辑都分不清,最后分析出来的东西漏洞百出。
把这些基础打牢,后面我们讲网表分析、时序逆向的时候,你才能跟得上。
公众号:蓝海资料掘金营,微信deep3321