ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

IC逆向工程全解析:从物理层到LLM辅助RTL恢复的实战指南

IC逆向工程全解析:从物理层到LLM辅助RTL恢复的实战指南 1. 从一篇综述说起IC逆向到底在逆什么第一次看到“IC逆向综述”这个题目很多人脑子里冒出来的画面可能是拿显微镜对着芯片一层层磨、拍照、拼图最后把版图还原出来。这个印象不算错但只覆盖了IC逆向的一小部分。真正意义上的IC逆向是一整套从物理对象出发、逐层抽象、最终还原出可理解、可验证、可复用的设计信息的方法体系。它横跨器件物理、图像处理、电路分析、逻辑综合、形式验证最近几年还大量引入了机器学习和LLM辅助分析。TCHES是硬件安全领域的顶刊之一能在这个刊物上发逆向综述说明这个方向已经从“手工作坊”走向了系统化、方法论的阶段。我自己的从业经历里接触过netlist恢复、FPGA位流逆向、以及用LLM辅助RTL语义推断的项目踩过的坑和总结出来的经验正好可以借这个题目系统梳理一遍。这篇文章适合几类人看做硬件安全的、做FPGA开发的、做EDA工具的、以及想了解LLM在硬件领域怎么落地的。不管你是刚入门还是已经做过几个逆向项目我都会把核心原理、实操步骤、参数选择、避坑经验讲清楚让你能直接抄作业。2. IC逆向的整体技术栈与思路拆解2.1 逆向的三个抽象层级IC逆向不是单一技术而是一条从低到高的抽象链。我习惯把它分成三层物理层芯片开盖、逐层去钝化、SEM/光学成像、图像拼接。这一层解决的是“看到什么”。电路层从图像里提取晶体管、连线、通孔恢复门级网表。这一层解决的是“连成什么”。逻辑层从门级网表推断功能模块、状态机、数据通路甚至恢复RTL语义。这一层解决的是“干什么用”。三层之间不是简单叠加而是每往上一层信息量指数级增加不确定性也指数级增加。物理层是确定性的图像拍到了就是拍到了电路层开始有歧义比如两条线交叉到底连不连逻辑层几乎全是概率推断同一个网表可能有多种功能解释。注意很多人一上来就想直接做逻辑层恢复结果连门级网表都没搞干净后面全是空中楼阁。我的建议是先把物理层和电路层做扎实逻辑层才有意义。2.2 为什么FPGA逆向和ASIC逆向要分开讲ASIC逆向面对的是定制版图每个晶体管都是手工画的规整性差但一旦恢复出来功能是确定的。FPGA逆向面对的是位流和可配置逻辑块规整性极强但位流格式是厂商私有的而且不同型号差异巨大。我做过一个项目目标是恢复某国产FPGA的位流到网表映射。难点不在于逻辑本身而在于位流里哪些bit控制LUT、哪些控制布线、哪些控制IO完全没有公开文档。我们最后是靠大量已知电路做差分对比才把关键字段定位出来。这个过程和ASIC逆向完全不同ASIC逆向是“从图到网表”FPGA逆向是“从bit到配置”。2.3 LLM在逆向流程里能干什么LLM不是万能的但在逆向流程里有几个明确的切入点网表语义标注给一个门级网表让LLM猜每个子模块的功能比如“这是计数器”“这是状态机”“这是CRC”。RTL风格恢复把扁平网表转成带always块、case语句的可读RTL。文档和日志分析逆向过程中会产生大量工具日志、错误信息LLM可以快速定位关键行。测试向量生成根据推断出的功能生成激励向量去验证假设。但LLM的局限也很明显它不懂电路时序不懂物理约束容易产生“看起来合理但实际错误”的推断。所以我的做法是LLM只做候选生成最终验证必须靠仿真和形式化工具。3. 核心细节解析与实操要点3.1 物理层从开盖到图像拼接的关键参数物理层的第一步是样品制备。开盖方式有等离子刻蚀、化学腐蚀、机械研磨选择取决于封装类型和后续成像需求。我一般优先用等离子刻蚀因为对金属层损伤小但设备贵化学腐蚀便宜但容易过腐蚀把细线吃掉。成像方面光学显微镜分辨率有限先进工艺节点必须上SEM。SEM拍出来的图是灰度图金属线、多晶硅、氧化层对比度不同需要调加速电压和探测器类型。我常用的参数是加速电压1-5kV工作距离5-10mm二次电子探测器。电压太高会穿透多层太低则充电严重。图像拼接是另一个坑。SEM视场小一张芯片要拍几千张图拼接时如果对准不准后面提取的连线全是断的。我的经验是重叠区域至少20%用SIFT特征做粗对齐再用互相关做精对齐。拼接完还要做畸变校正因为SEM图像边缘有桶形畸变。参数推荐值说明加速电压1-5 kV太高穿透太低充电工作距离5-10 mm影响景深和分辨率重叠率≥20%保证拼接精度畸变校正多项式模型边缘畸变必须校正3.2 电路层网表提取的自动化与人工校验从图像到网表核心是图像分割和连通域分析。金属线、通孔、晶体管都要分别提取。金属线用阈值分割加形态学操作通孔用圆形检测晶体管用模板匹配。这一步现在有很多自动化工具但完全自动的结果通常不能直接用必须人工校验。我做过一个统计自动化工具提取的网表平均有5%-10%的连线错误主要是交叉点误判和通孔漏检。人工校验的方法是把提取的网表反标回图像用不同颜色显示肉眼找异常。这个步骤很枯燥但省不掉。实操心得校验时优先看电源和地网络因为这两个网络连接最多一旦出错影响最大。另外时钟网络也要重点检查时钟错了后面全错。3.3 逻辑层从网表到RTL的语义恢复逻辑层恢复是逆向里最像“侦探”的部分。给你一个门级网表没有注释没有模块划分你要推断出功能。传统方法是做模式匹配比如识别出触发器组加反馈逻辑就是状态机识别出加法器树就是累加器。但这种方法只能覆盖常见结构遇到自定义逻辑就失效。LLM的引入改变了这个局面。我把网表转成结构化文本比如用Verilog的门级描述然后让LLM做功能标注。实测下来对于计数器、移位寄存器、简单状态机LLM的准确率能到80%以上。但对于复杂数据通路准确率掉到50%以下而且它经常“编”出不存在的行为。我的做法是LLM生成候选功能列表然后我用仿真去验证每个候选。验证通过的保留不通过的丢弃。这样虽然慢但可靠。另外LLM对网表的规模很敏感超过几千个门它就开始丢信息。所以大网表要先做划分分块喂给LLM。3.4 FPGA位流逆向的特殊性FPGA位流逆向和ASIC逆向最大的区别是ASIC逆向是“恢复”FPGA逆向是“解码”。位流是厂商定义的二进制格式里面每个字段对应一个配置位。你要做的是找到字段和配置的映射关系。常用方法是差分分析设计两个电路只有一个配置不同比如一个用LUT实现与门一个实现或门然后对比位流差异。差异的bit就是控制LUT功能的字段。重复这个过程就能把大部分字段定位出来。我做过一个项目用了大约200个差分对才把主要字段定位完。这个过程很耗时但一旦完成后面就是查表。需要注意的是不同批次的芯片位流格式可能微调所以定位结果要定期验证。4. 实操过程与核心环节实现4.1 一个完整的ASIC逆向案例从图像到网表我拿一个实际做过的小规模ASIC为例工艺是180nm规模大约5000门。目标是恢复门级网表并验证功能。第一步是开盖和成像。用等离子刻蚀去掉封装露出芯片表面。然后用SEM拍顶层金属加速电压3kV工作距离8mm重叠率25%。一共拍了1200张图拼接后得到一张8000x6000的全景图。第二步是图像分割。金属线用自适应阈值分割因为不同区域亮度不均。通孔用Hough圆检测半径范围设5-15像素。晶体管用模板匹配模板是从已知单元库生成的。分割完做连通域分析得到节点和边。第三步是网表生成。把节点和边转成SPICE网表然后用工具做逻辑优化去掉冗余。这一步得到的网表大约有8000个门比原始设计多因为有些逻辑被重复提取。第四步是人工校验。把网表反标回图像逐区域检查。发现大约300处错误主要是交叉点误判。修正后网表降到5200门接近原始规模。第五步是功能验证。用原始设计的测试向量跑仿真对比输出。一开始不匹配排查发现是时钟树恢复错了修正后完全匹配。注意这个案例里最耗时的不是成像而是人工校验。1200张图拼接加校验花了大约两周。所以如果要做逆向预算里一定要留足人工时间。4.2 FPGA位流逆向的差分分析实操FPGA位流逆向的核心是差分分析。我以LUT功能定位为例讲一下具体步骤。首先准备一个基准设计比如一个简单的与门输入a和b输出y。综合、布局布线、生成位流。然后修改设计把与门改成或门其他不变。再生成位流。对比两个位流差异的bit就是控制LUT功能的字段。重复这个过程覆盖所有LUT输入组合和功能。我用了大约64个差分对才把4输入LUT的所有功能字段定位完。每个差分对生成一次位流大约5分钟加上对比分析总共花了大约8小时。定位完LUT再定位布线。布线字段更多因为FPGA的布线资源很丰富。我的方法是固定逻辑只改布线比如把输出从左边IO改到右边IO对比位流差异。这个过程用了大约300个差分对花了三天。最后是IO和时钟字段。IO字段相对简单因为IO数量有限。时钟字段复杂一些因为涉及全局时钟网络。我用了大约50个差分对。字段类型差分对数量耗时LUT功能648小时布线3003天IO304小时时钟501天4.3 LLM辅助RTL恢复的实操流程LLM辅助RTL恢复我的流程是这样的第一步把门级网表转成结构化文本。我用的是自定义格式每个门一行格式是“门类型 输入 输出”。比如“AND a b y”。第二步把文本分块。每块不超过2000个门因为LLM上下文有限。分块时尽量保持功能完整性比如一个状态机不要拆开。第三步给LLM提示。提示里包含任务描述、输出格式要求、以及一些示例。我用的提示是“以下是一个门级网表请推断每个子模块的功能输出JSON格式包含模块名、功能描述、置信度。”第四步收集LLM输出做交叉验证。同一个网表我用不同的提示模板跑三次取一致的结果。不一致的标记为待验证。第五步仿真验证。对每个推断的功能生成测试向量跑仿真。通过的保留不通过的丢弃。这个流程里LLM的准确率大约70%但经过仿真验证后最终准确率能到95%以上。剩下的5%是复杂控制逻辑需要人工分析。实操心得LLM对网表的命名很敏感。如果网表里的信号名是a、b、cLLM很难推断如果信号名是clk、rst、dataLLM准确率明显提高。所以逆向时如果能恢复出有意义的信号名对LLM帮助很大。5. 常见问题与排查技巧实录5.1 图像拼接错位怎么办图像拼接错位是物理层最常见的问题。表现是拼接缝处线条断开或错位。原因通常是重叠率不够、特征点太少、或者图像畸变没校正。排查步骤先检查重叠率如果低于15%重新拍。然后检查特征点数量如果每张图少于50个特征点说明图像纹理太弱需要调整SEM参数比如提高对比度。最后检查畸变校正如果边缘线条弯曲说明畸变模型不对需要重新标定。我的经验是拼接前先做一次全局粗对齐用低分辨率图像快速估计偏移然后再做精对齐。这样能避免局部最优。5.2 网表提取后仿真不匹配怎么查仿真不匹配是电路层和逻辑层的常见问题。表现是输出和预期不符。排查思路是从底层往上层查。先查电源和地确保没有短路或断路。然后查时钟确保时钟树正确。然后查复位确保复位逻辑正确。最后查数据通路逐级对比。我遇到过一个案例仿真不匹配查了两天最后发现是一个通孔漏检导致两条线短接。所以通孔检测的参数要调好宁可多检不可漏检。5.3 LLM推断结果不稳定怎么办LLM推断结果不稳定同一个网表跑两次结果不同。原因是LLM有随机性温度参数没设好。解决方法是把温度设成0或者设成很小的值比如0.1。另外提示模板要固定不要每次改。如果还是不稳定就多跑几次取多数结果。还有一个技巧给LLM提供上下文比如告诉它这是某个类型的电路比如“这是一个通信接口电路”LLM的推断会更稳定。5.4 FPGA位流差分分析找不到差异怎么办差分分析找不到差异通常是设计没真正改变或者位流生成工具有优化把差异抹掉了。排查步骤先确认设计真的改了比如综合后的网表确实不同。然后确认布局布线没被优化比如关掉工具的优化选项。最后确认位流生成没做压缩或加密。我遇到过一个案例差分分析找不到差异最后发现是工具把两个设计优化成了同一个网表。关掉优化后差异就出来了。问题可能原因解决方法拼接错位重叠率低、特征少、畸变提高重叠率、调SEM参数、重标定仿真不匹配电源、时钟、复位、通孔逐层排查、调通孔检测参数LLM不稳定温度高、提示不固定温度设0、固定提示、多跑取多数差分无差异设计没改、工具优化确认网表、关优化、关压缩5.5 逆向项目的法律和伦理边界做逆向项目法律和伦理边界必须清楚。我的原则是只做自己拥有的芯片或者有明确授权的芯片。不做商业芯片的逆向除非是安全研究且符合当地法律。逆向结果不用于侵权只用于学习、安全评估、或者兼容性开发。另外逆向过程中产生的数据要妥善保管不要泄露。特别是如果逆向的是安全芯片数据泄露可能造成严重后果。6. 工具选型与效率提升的实战建议6.1 图像处理工具怎么选图像处理工具我推荐ImageJ加Python。ImageJ做交互式分割和可视化很方便Python做批处理和自动化。OpenCV是必须的形态学操作、连通域分析、模板匹配都用它。如果做SEM图像拼接可以用AutoStitch或者自己写。自己写的话用OpenCV的SIFT加RANSAC做对齐然后用多频段融合做拼接。6.2 网表分析工具怎么选网表分析我推荐用Yosys。Yosys是开源的支持多种网表格式能做逻辑优化、技术映射、形式验证。另外ABC是Yosys内置的逻辑优化工具很好用。如果做形式验证可以用SymbiYosys它是Yosys的形式验证前端。如果做仿真可以用Icarus Verilog或者Verilator。6.3 LLM工具怎么选LLM工具我推荐用本地部署的开源模型比如Llama或者Qwen。原因是逆向数据通常敏感不适合传到云端。本地部署可以用Ollama或者llama.cpp硬件要求不高一张消费级显卡就能跑。如果做批量推断可以用vLLM做推理加速。如果做微调可以用LoRA用少量逆向数据微调能显著提高准确率。6.4 效率提升的几个技巧第一个技巧是自动化流水线。把开盖、成像、分割、网表生成、校验串成流水线中间结果自动传递。这样能省大量手工操作时间。第二个技巧是并行处理。图像拼接、网表提取、LLM推断都可以并行。用多进程或者多机器能大幅缩短时间。第三个技巧是增量分析。不要每次从头做把中间结果缓存起来只处理变化的部分。比如差分分析只对比变化的bit不用全量对比。实操心得逆向项目里时间主要花在人工校验和调试上。所以工具选型的第一原则是“可调试”而不是“全自动”。一个能让你快速定位问题的工具比一个全自动但出错找不到原因的工具价值大得多。7. 逆向与正向的边界从恢复网表到理解设计做逆向做久了会有一个体会逆向的终点不是网表而是理解。网表只是中间产物真正有价值的是对设计意图的理解。这也是为什么LLM在逆向里越来越重要因为LLM擅长从结构推断意图。但LLM的推断需要验证验证需要正向知识。所以做逆向的人最好也有正向设计经验。知道一个电路通常怎么设计逆向时就能更快定位关键结构。我自己的经验是逆向一个通信接口电路如果我知道UART、SPI、I2C的典型结构就能很快识别出状态机和移位寄存器。如果我不知道就要从头分析慢很多。所以如果你要做逆向建议先补正向知识。看一些经典电路设计比如CPU、DMA、中断控制器。这些知识在逆向时非常有用。8. 写在最后几个踩过的坑和真实体会第一个坑是低估了样品制备的难度。第一次做逆向以为开盖很简单结果把芯片磨穿了样品报废。后来才知道开盖要控制研磨速率用显微镜实时观察看到金属层就停。第二个坑是忽略了图像畸变。第一次拼接没做畸变校正结果提取的网表全是错的。后来加了畸变校正准确率大幅提高。第三个坑是LLM的幻觉。第一次用LLM做RTL恢复它编了一个不存在的状态机我差点信了。后来加了仿真验证才避免错误。第四个坑是法律边界。有一次差点做了不该做的芯片幸好提前查了法律及时停手。所以做逆向法律意识必须强。最后分享一个小技巧逆向时先做小规模、已知功能的电路验证流程和工具。等流程跑通了再做大规模、未知功能的电路。这样能避免一开始就陷入细节浪费大量时间。这个方向后续还可以扩展的地方很多比如用LLM做跨层次推断从版图直接推断RTL比如用强化学习做自动网表校验比如用图神经网络做网表功能分类。这些方向我都试过一些有的有效有的还在探索。如果你也在做类似的事情欢迎交流。
返回列表