1. 从一篇综述说起:IC逆向到底在逆什么
第一次看到“IC逆向综述”这个题目,很多人脑子里冒出来的画面大概是:拿一块芯片,磨掉封装,放在显微镜下拍照,然后一层层扒开金属布线,最后把电路图抄出来。这个印象不算错,但只覆盖了整条链路里最“体力活”的那一段。真正让IC逆向这件事在学术界和工业界都持续有热度的,是它背后那套从物理结构一路还原到功能语义的完整推理链条,以及这套链条在安全审计、供应链验证、教学研究里的现实价值。
TCHES(IACR Transactions on Cryptographic Hardware and Embedded Systems)是硬件安全方向的顶会级期刊,它上面出现的逆向类综述,通常不会只停留在“怎么拍照、怎么腐蚀”这种工艺层面,而是会把逆向拆成几个层次:图像采集与预处理、版图重建、网表提取(netlist extraction)、门级/寄存器传输级抽象、功能语义恢复。每一层都有各自的难点,也各自对应不同的工具链和方法论。这篇综述的价值就在于,它把这条链路上散落的方法系统性地串了起来,并且指出了当前哪些环节已经相对成熟、哪些环节仍然是靠人肉和经验的“手艺活”。
我自己接触逆向相关工作的起点其实挺偶然的。早些年做FPGA安全评估的时候,需要验证一个第三方IP核里有没有藏后门,手头只有烧录文件和少量文档,没有源码。那时候才意识到,逆向不只是“破解”,它更像是一种在信息不对称条件下重建信任的手段。你拿到的可能是一块芯片、一个bitstream、一份网表,甚至只是一堆显微图像,而你要回答的问题是:它到底做了什么,有没有做它不该做的事。
这篇文章我想按自己的理解,把IC逆向这条链路拆开讲清楚。重点会放在几个地方:逆向的整体流程设计逻辑、netlist提取这个核心环节的实操要点、FPGA场景下逆向与LLM结合的新趋势,以及实际做的时候容易踩的坑。适合对硬件安全、芯片验证、FPGA开发感兴趣,但还没系统接触过逆向的读者,也适合已经做过一些逆向、想看看别人怎么组织流程的人。
2. 逆向流程的整体设计与思路拆解
2.1 为什么逆向要分层,而不是一步到位
很多人一开始会想,既然目标是拿到电路功能,那直接看图像不就行了。问题在于,现代芯片的金属层数动辄十几层,特征尺寸到了纳米级,一张显微图里可能包含几百万个晶体管。人眼根本不可能直接从图像跳到功能。所以逆向必须分层,每一层把上一层的复杂度降下来,同时把信息抽象成下一层能处理的表示形式。
这个思路和编译器很像。编译器不会从源代码直接跳到机器码,中间要经过词法分析、语法分析、中间表示、优化、代码生成。逆向则是反过来:从物理图像出发,经过版图、网表、门级网表、RTL,最后到行为级描述。每一层都是一种“表示”,而逆向的核心工作就是在相邻两层之间建立可靠的映射关系。
分层还有一个现实原因:不同层对应的工具和技能完全不同。图像处理靠的是计算机视觉和材料学知识,版图重建靠的是几何算法,网表提取靠的是图论和模式识别,功能恢复则更接近程序理解和形式化方法。一个人很难同时精通所有层,所以实际项目里往往是团队协作,或者至少是分阶段推进。
2.2 逆向目标的差异决定了流程取舍
不是所有逆向都要求还原到RTL。如果你的目标只是确认某个模块是不是AES加密电路,那可能做到门级网表、识别出S盒结构就够了。如果你的目标是找出一个隐藏的触发条件,那可能需要做到寄存器传输级甚至行为级,才能理解状态机的跳转逻辑。
这就引出一个关键判断:在开始逆向之前,必须先明确你要回答什么问题。这个问题决定了你需要还原到哪一层,也决定了你在每一层愿意投入多少资源。我见过一些项目,团队一上来就追求“全芯片完整还原”,结果做了几个月还在处理图像拼接,真正关心的安全属性反而没验证。反过来,如果目标明确,很多时候可以在中间层就停下来,用统计特征或结构模式匹配来回答问题。
从综述的角度看,TCHES这类工作通常会按“目标—方法—评估”三个维度来组织。目标维度包括知识产权验证、后门检测、供应链信任、学术研究等;方法维度就是前面说的分层;评估维度则涉及准确率、召回率、可扩展性、人工介入程度。这个三维框架很实用,你在设计自己的逆向流程时可以直接套用。
2.3 自动化与人工的边界在哪里
逆向领域一个绕不开的话题是自动化程度。图像采集和预处理现在自动化程度很高,版图重建也有不少成熟算法,但到了网表提取和功能恢复,人工仍然占很大比重。原因在于,这两层涉及大量语义判断,而语义判断很难用固定规则覆盖。
举个例子,标准单元库里的单元是有限的,理论上可以用模板匹配来自动识别。但实际芯片里会有大量自定义单元、模拟模块、存储器阵列,这些结构没有统一模板,必须靠人去看、去猜、去验证。再往上,功能恢复更是如此:同样一个门级网表,可能是加法器,也可能是比较器的一部分,具体是什么取决于上下文。这种上下文推理目前还是人的强项。
不过这个边界正在移动。近几年LLM的进展让很多人开始尝试用大模型辅助网表理解和功能推断。这个方向后面会专门讲,这里先埋个伏笔:LLM在逆向里的角色,目前更像是“加速人类推理的助手”,而不是“替代人类判断的引擎”。
3. 核心细节解析与实操要点
3.1 图像采集:一切从一张好图开始
逆向的第一步是拿到高质量的芯片图像。这一步的成败直接决定后面所有环节的上限。图像采集的核心矛盾是分辨率和视场的权衡:你要看清最小特征,就必须用高倍率,但高倍率下视场很小,一块芯片可能要拍几千甚至几万张图,然后再拼接。
实际操作中,常用的手段是光学显微镜和扫描电子显微镜(SEM)配合使用。光学显微镜用于低倍率全局定位,SEM用于高倍率细节采集。如果是多层金属芯片,还需要逐层去处理,每去一层拍一层,最后得到一组按深度排列的图像栈。
这里有几个实操要点值得注意。第一,去层工艺要均匀。如果去层不均匀,同一层里有的区域已经露出来,有的区域还盖着,后续图像配准会非常痛苦。第二,图像重叠率要足够。拼接算法通常需要相邻图像有30%以上的重叠,重叠不够会导致拼接缝处出现错位。第三,记录元数据。每张图的倍率、位置、层号、拍摄时间都要记清楚,否则后期根本对不上。
提示:图像采集阶段最容易被低估的是存储和算力。一块中等规模芯片的全层图像栈,轻松就能到TB级别。提前规划好存储方案和拼接用的计算资源,比事后补救省事得多。
3.2 版图重建:从像素到几何
拿到图像栈之后,下一步是把像素级的图像转换成几何化的版图表示。这一步的核心任务包括:图像配准、拼接、去噪、二值化、轮廓提取、多边形拟合。
图像配准是难点之一。不同层之间、同一层不同图之间,都可能存在平移、旋转、缩放甚至非线性形变。常用的方法是基于特征点的配准,比如SIFT、SURF这类算法,再配合RANSAC做鲁棒估计。如果形变比较复杂,可能还需要用薄板样条或者光流法做非刚性配准。
二值化和轮廓提取相对成熟,但也不是无脑调参就行。芯片图像里经常有光照不均、边缘模糊、噪声干扰的问题,直接全局阈值化往往效果很差。实践中更常用的是自适应阈值或者基于深度学习的分割方法。轮廓提取之后,多边形拟合的精度直接影响后续网表提取的准确性,所以这一步的参数需要根据实际特征尺寸仔细调。
3.3 网表提取:逆向链路里最硬的一环
网表提取是整条链路里技术含量最高、也最考验经验的一环。它的目标是从版图几何中识别出晶体管、连线、通孔,进而构建出电路连接关系。输出通常是一个SPICE格式或者类似格式的网表,描述器件和节点之间的连接。
这一步的难点在于,版图里的几何图形和电路里的器件并不是一一对应的。同一个晶体管在不同工艺下可能呈现不同的几何形状,同一个连线在不同层里可能通过多个通孔连接。更麻烦的是,很多结构是“上下文相关”的:一段多晶硅在这个位置是栅极,在另一个位置可能只是走线。要正确识别,必须结合局部几何特征和全局连接关系。
实际操作中,网表提取通常分几个子步骤:器件识别、端口识别、连线追踪、网表生成。器件识别可以用模板匹配或者机器学习分类器;端口识别需要理解器件的物理结构;连线追踪本质上是在图结构上做连通性分析;网表生成则是把前面几步的结果组织成标准格式。
这里分享一个我踩过的坑。早期做网表提取的时候,我过于依赖模板匹配,结果遇到自定义单元就完全失效。后来才明白,模板匹配只适合标准单元库覆盖的部分,对于非标准结构,必须结合几何规则和电气规则做推理。比如,两个相邻的多晶硅条如果间距小于某个阈值,很可能是同一个晶体管的两个栅,而不是两个独立器件。这种规则需要从工艺文档和实际样本里慢慢积累。
3.4 从网表到功能:语义恢复的挑战
拿到门级网表之后,下一步是恢复功能语义。这一步的目标是回答“这个电路是做什么的”。对于小规模电路,可以靠人工分析;对于大规模电路,必须借助自动化工具和启发式方法。
常用的手段包括:结构模式匹配(比如识别出加法器、乘法器、寄存器堆的典型结构)、数据流分析(追踪信号从输入到输出的传播路径)、控制流分析(识别状态机和有限状态机)。这些方法各有局限,实践中往往是组合使用。
一个关键观察是,功能恢复的难度和电路的“规整程度”强相关。像处理器、加密电路这类高度规整的设计,结构模式很明显,恢复起来相对容易。而像模拟混合信号电路、自定义加速器这类设计,结构不规则,恢复起来就非常困难。这也是为什么很多逆向工作会选择特定类型的电路作为目标,而不是追求通用性。
4. 实操过程与核心环节实现
4.1 一个简化但完整的逆向流程
为了让大家对整条链路有更具体的感知,我这里用一个简化的例子走一遍流程。假设我们有一块小规模数字芯片,目标是确认它里面是否包含一个特定的加密模块。
第一步是图像采集。用SEM在合适倍率下拍摄全芯片图像,记录每张图的位置和层号。如果是多层芯片,逐层去层并拍摄。
第二步是图像预处理和拼接。用特征点配准把相邻图像对齐,用多频段融合或者泊松融合做拼接,得到每层的完整图像。
第三步是版图重建。对每层图像做二值化、轮廓提取、多边形拟合,得到几何化的版图表示。
第四步是网表提取。识别晶体管和连线,构建连接关系,输出门级网表。
第五步是功能分析。在网表上做结构模式匹配,寻找加密模块的典型特征,比如S盒、轮函数、密钥调度结构。
第六步是验证。把识别出的模块和已知参考实现做对比,确认功能一致性。
这个流程看起来线性,实际做的时候经常要回退。比如网表提取阶段发现某些区域识别不清,可能要回到图像采集阶段重新拍。所以实际项目里,流程更像是迭代的,而不是一次性的。
4.2 关键参数的选择与计算
在图像采集阶段,倍率的选择需要根据最小特征尺寸来定。假设芯片工艺是28nm,最小特征尺寸大约是28nm。如果SEM在某个工作距离下的分辨率是2nm,那么理论上倍率只要保证每个特征至少覆盖几个像素即可。实际中为了保证识别可靠性,通常会让最小特征覆盖5到10个像素。这样算下来,视场大小和拍摄张数就可以估算出来。
在网表提取阶段,连通性分析的阈值需要根据工艺参数来定。比如,两个金属图形如果间距小于设计规则里的最小间距,它们很可能是连通的;如果大于某个阈值,则很可能是断开的。这个阈值不能拍脑袋定,必须参考工艺文档和实际样本。
在功能恢复阶段,模式匹配的相似度阈值也需要调。阈值太高会漏检,太低会误检。实践中常用的是在标注样本上做ROC分析,选一个平衡点。
4.3 FPGA场景下的逆向特殊性
前面讲的流程主要针对ASIC。FPGA场景下的逆向有它自己的特点。FPGA的bitstream是配置信息,逆向bitstream的目标是恢复出它实现了什么逻辑。这和ASIC逆向有相似之处,也有明显差异。
相似之处在于,两者都需要从低层表示恢复到高层功能。差异在于,FPGA的底层结构是已知的:查找表、触发器、布线资源、IO块,这些在文档里都有描述。所以FPGA逆向的难点不在于识别底层结构,而在于理解bitstream如何映射到这些结构,以及这些结构如何组合成高层功能。
实际做FPGA逆向时,常用的方法包括:bitstream解析(理解配置帧格式)、资源映射分析(确定哪些LUT和触发器被使用)、布线分析(追踪信号路径)、功能推断(根据LUT内容和连接关系推断逻辑功能)。这个过程和ASIC逆向相比,少了很多图像处理和几何重建的环节,但多了对配置格式和工具链的理解要求。
注意:FPGA逆向涉及的知识面和ASIC逆向差别很大。如果你是从ASIC逆向转过来的,需要补FPGA架构和工具链的课;反过来也一样。不要假设两者可以无缝迁移。
5. LLM在IC逆向里的角色与边界
5.1 为什么LLM会被引入逆向流程
LLM进入逆向领域,本质上是因为逆向里有大量“非结构化推理”任务,而这些任务恰好是LLM擅长的。比如,给定一段网表描述,判断它可能实现什么功能;给定一组几何特征,判断它属于哪类器件;给定一个状态转移图,推断它的控制逻辑。这些任务传统上靠人工经验,现在可以尝试用LLM来加速。
另一个驱动因素是逆向数据的稀缺性。高质量的逆向标注数据很难获取,而LLM可以在少量样本甚至零样本条件下给出合理猜测。这对于探索性分析特别有价值:你可以先用LLM快速筛一遍,把明显不相关的部分排除掉,再集中精力分析可疑区域。
5.2 当前可行的LLM辅助方式
目前比较务实的LLM辅助方式有几种。第一种是网表摘要与解释:把门级网表转换成文本描述,让LLM生成功能摘要。这种方式适合快速理解大规模电路的粗粒度结构。第二种是模式识别辅助:把局部几何或连接模式描述给LLM,让它判断可能对应的器件或功能。第三种是逆向流程编排:用LLM做任务规划和工具调用,比如根据当前进展决定下一步该做图像增强还是网表分析。
需要强调的是,这些方式目前都还是“辅助”性质。LLM的输出需要人工验证,不能直接作为最终结论。原因很简单:LLM没有物理世界的 grounding,它对芯片的理解完全来自训练数据里的文本描述,而芯片的物理细节和电气特性很难用文本完整表达。
5.3 LLM辅助逆向的局限与风险
LLM在逆向里的局限主要有几个方面。第一是幻觉问题:LLM可能会给出看似合理但实际上错误的功能推断,而且往往很自信。第二是上下文长度限制:大规模网表动辄几十万门,远超当前LLM的上下文窗口,必须做摘要或分块,而摘要过程本身会丢失信息。第三是缺乏验证手段:LLM给出的推断需要额外的验证步骤,而验证本身可能和重新分析一样耗时。
风险方面,最需要警惕的是过度依赖。我见过一些尝试,团队把LLM的输出直接当成分析结果,跳过了验证环节,最后发现推断完全错误。逆向的本质是建立可信的证据链,LLM可以是链条里的一环,但不能替代整条链。
6. 常见问题与排查技巧实录
6.1 图像拼接错位怎么办
图像拼接错位是逆向里最常见的问题之一。表现是拼接缝处出现明显断裂或重影。排查思路如下:先检查重叠率是否足够,如果重叠率低于20%,拼接算法很难找到可靠对应点;再检查图像质量,如果某张图模糊或者曝光过度,特征点提取会失败;最后检查配准模型,如果芯片有非线性形变,刚性或仿射模型可能不够,需要换非刚性模型。
6.2 网表提取漏识别怎么定位
网表提取漏识别通常表现为某些节点悬空或者某些器件缺失。定位方法是:先在版图上标记出可疑区域,然后回到图像层看这些区域的几何特征是否清晰;如果几何清晰但识别失败,说明识别规则或模板需要更新;如果几何本身模糊,说明图像采集阶段需要改进。
6.3 功能推断出现多义性怎么处理
功能推断的多义性是指同一段网表可能对应多种功能解释。处理方法是引入额外约束:比如结合芯片的整体架构、结合已知的输入输出行为、结合工艺库信息。如果约束仍然不足以消歧,可能需要做动态分析或者形式化验证来确认。
| 常见问题 | 可能原因 | 排查方向 | 解决思路 |
|---|---|---|---|
| 图像拼接错位 | 重叠率不足、图像质量差、形变模型不当 | 检查重叠率、图像清晰度、配准残差 | 提高重叠率、重拍、换非刚性配准 |
| 网表漏识别 | 模板不覆盖、几何模糊、规则过严 | 定位可疑区域、回看图像 | 更新模板、改进采集、放宽规则 |
| 功能多义 | 上下文不足、结构不典型 | 引入架构约束、行为约束 | 动态分析、形式化验证 |
| LLM推断错误 | 幻觉、上下文丢失 | 人工复核、交叉验证 | 不直接采信、多方法交叉 |
6.4 几个独家避坑技巧
第一个技巧是先做小范围试点。不要一上来就全芯片铺开,先选一个功能明确的区域做完整流程,验证工具链和参数,再推广到全芯片。第二个技巧是保留中间结果。每一步的输出都要存好,因为逆向经常需要回退,没有中间结果就得重做。第三个技巧是建立自己的样本库。把每次逆向遇到的典型结构、典型问题、典型解法记录下来,时间长了就是最宝贵的资产。
7. FPGA与逆向结合的一些实战观察
FPGA在逆向领域其实有两个角色。一个是被逆向的对象,比如分析第三方bitstream;另一个是逆向的工具平台,比如用FPGA加速图像处理或网表分析。这两个角色都值得展开。
作为被逆向对象,FPGA的bitstream逆向在安全评估里很常见。评估目标是确认bitstream里有没有未声明的功能,比如隐藏的调试接口、未授权的数据通路。这类逆向通常从bitstream格式解析开始,然后做资源映射和布线分析,最后做功能推断。难点在于,不同厂商、不同系列的FPGA配置格式差异很大,而且很多细节没有公开文档,需要靠实验和逆向工程慢慢摸索。
作为工具平台,FPGA在逆向里的价值主要体现在加速。图像处理和网表分析都是计算密集型任务,用FPGA做硬件加速可以显著缩短处理时间。比如,图像配准里的特征点提取和匹配,用FPGA并行化之后,速度可以比CPU实现快一个数量级。网表分析里的图算法,也可以用FPGA做定制加速。
这里分享一个实际观察:FPGA加速逆向工具的开发门槛不低,因为你需要同时懂逆向算法和FPGA设计。但一旦做出来,收益很大,尤其是对于需要反复迭代的逆向项目。我见过一些团队,前期花几周做FPGA加速,后期节省的时间是几倍甚至十几倍。
8. 我对IC逆向这件事的一些个人体会
做了这些年逆向相关的工作,最大的体会是:逆向的难点从来不是某一个单点技术,而是如何把整条链路串起来,并且在每个环节都保持足够的可信度。图像处理、版图重建、网表提取、功能恢复,每一环都有成熟方法,但把它们组合成一个可靠流程,需要大量的调试和验证。
另一个体会是,逆向和正向设计是互补的。做过逆向的人,对设计的理解往往更深刻,因为他见过各种实现方式,知道哪些设计决策会带来哪些后果。反过来,做过正向设计的人,做逆向时更容易理解设计者的意图,推断功能时更有方向感。
LLM的引入给逆向带来了新的可能性,但也带来了新的风险。我的建议是,把LLM当成一个知识渊博但容易自信犯错的助手,用它来加速探索,但不要用它来替代验证。逆向的最终结论必须建立在可验证的证据上,而不是模型的输出上。
最后再分享一个小技巧:如果你刚开始接触逆向,不要从最复杂的芯片入手。找一块结构简单、文档相对完整的芯片,把整条流程走一遍,哪怕结果不完美,你也会对每个环节的难点有直观感受。这种感受是看多少篇综述都换不来的。