第二章 原厂PLC的“黑匣子”解密:如何在没有图纸和密码的情况下,逆向分析老程序逻辑

说实话,干我们这行,最怕的不是设备有多老,而是原厂跑路了,图纸丢了,密码还锁死了。

你想想看,一台用了十几年的设备突然趴窝,老板催着你赶紧改,结果你连程序都读不出来。那种感觉,就像医生面对一个昏迷的病人,却连病历都找不到。我遇到过好几次这种情况,最夸张的一次,是一台德国进口的包装机,原厂都倒闭十年了,PLC还是加密的。嗯,今天我就把压箱底的经验掏出来,聊聊怎么搞定这些“黑匣子”。

2.1 先别急着拆,摸清“敌情”最重要

拿到一台老设备,我的习惯是——先看,不动手。围着设备转三圈,把能看到的都记下来。

  • PLC品牌和型号:三菱FX系列?西门子S7-200?还是更老的欧姆龙C系列?不同品牌,破解思路完全不同。
  • CPU模块上的指示灯:RUN灯亮不亮?ERR灯闪几下?这能告诉你PLC是不是在正常运行。
  • 有没有存储卡或EPROM:很多老设备为了防丢程序,会插一个只读的EPROM芯片。如果有,恭喜你,程序大概率还在。
  • 通讯口类型:是RS232的9针口,还是RS422的圆口?或者是早期的编程口?这决定了你用什么线缆去连。
我的小技巧:拿手机把所有铭牌、接线端子、模块排列顺序都拍下来。尤其是那些贴纸下面盖着的拨码开关,我曾经因为没拍,后来拆了机才发现拨码位置变了,折腾了半天。

2.2 密码破解:从“软”到“硬”的三种思路

密码是绕不过去的坎。但别慌,密码不是铁板一块。我一般按这个顺序来试:

2.2.1 软破解:利用软件漏洞或默认密码

很多老PLC的密码保护,其实形同虚设。比如三菱FX系列,早期版本有个著名的“漏洞”——你只要用编程软件新建一个空工程,然后选择“从PLC读取”,软件会先弹窗让你输密码,你点取消,它反而会继续读。为什么会这样?因为软件的逻辑是先读程序,再校验密码,你取消校验,程序已经读上来了。

再比如西门子S7-200的老版本,密码是明文存储在程序块里的。你用十六进制编辑器打开上传的“.mwp”文件,直接搜索“password”字符串,后面跟着的就是密码。我试过好几次,百试百灵。

// 示例:用十六进制编辑器搜索S7-200的.mwp文件
// 搜索关键词:PASSWORD
// 找到类似:PASSWORD:12345678 这样的明文

2.2.2 硬破解:读取EPROM或存储芯片

如果软破解不行,那就得动硬件了。很多老PLC的程序是存在一个可插拔的EPROM芯片里的。你把它拔下来,用编程器读出来,就能得到完整的程序文件。但这里有个坑——EPROM芯片的型号很多,比如27C256、27C512,你得先确认型号,再找对应的编程器适配座。

警告:EPROM芯片对静电非常敏感。我建议你操作前先摸一下接地金属,放掉身上的静电。我曾经因为没注意,直接用手捏芯片引脚,结果读出来的数据全是乱码,白忙活了一下午。

2.2.3 终极手段:监控CPU总线

如果以上都不行,那就只能上逻辑分析仪了。PLC在运行时,CPU会不断地从存储器里读取指令。你只要把逻辑分析仪的探头夹在CPU和存储器之间的数据总线上,抓取一段运行时的波形,然后根据CPU的指令集手册,反推出来程序逻辑。这个方法技术门槛高,但确实能搞定最顽固的“黑匣子”。

2.3 逆向分析:没有梯形图,怎么读懂逻辑?

程序读出来了,但可能是一堆机器码,或者没有注释的指令表。这时候,逆向分析就开始了。我的做法是:

  1. 先找输入输出点:对照你之前拍的接线图,把程序里的X点(输入)和Y点(输出)对应到实际的传感器和执行器上。比如X0是启动按钮,Y0是主电机。
  2. 再找关键中间继电器:老程序里,M点(辅助继电器)往往代表状态机。比如M0是待机,M1是运行,M2是报警。你把这些状态找出来,程序的骨架就有了。
  3. 最后分析时序:用T(定时器)和C(计数器)来推断动作的先后顺序。比如T0 K100,代表延时10秒,那这10秒里发生了什么?

核心思路:不要试图逐行读懂所有指令。你只需要搞清楚“什么条件触发什么动作”就行。说白了,就是画一张输入到输出的逻辑映射表。

2.4 实战案例:一台三菱FX2N的“黑匣子”破解

我记得有一次,客户一台用了20年的注塑机,PLC是FX2N,密码忘了,图纸也丢了。我按上面的步骤来:

  • 第一步,软破解。试了默认密码和软件漏洞,没用。这台PLC的固件版本比较新,漏洞被堵上了。
  • 第二步,硬破解。拆开PLC,发现程序存在一个28脚的EPROM里。型号是27C256。我用编程器读出来,得到一个二进制文件。
  • 第三步,转换。用三菱的软件,把这个二进制文件转换成指令表。虽然全是LD、AND、OUT这些指令,没有注释,但至少能看了。
  • 第四步,逆向。我对照着设备上的按钮和指示灯,把X0到X7、Y0到Y7全部标出来。然后发现,程序里有个M100,只要它一接通,Y0就输出。而M100的接通条件是X1和X2同时为ON。我一看设备,X1是安全门开关,X2是急停复位。哦,原来这就是安全连锁逻辑。

就这样,花了大概半天时间,我把整个程序的核心逻辑都反推出来了。后来用新PLC重写程序时,我直接照着这个逻辑映射表来写,一次调试通过。

2.5 避坑指南:这些坑我替你踩过了

我曾经... 因为太相信编程器读出来的数据,直接拿来用,结果发现PLC运行异常。后来才发现,EPROM芯片的校验位和实际数据位顺序是反的。所以,读出来的数据一定要和PLC实际运行时的状态做交叉验证。比如,你强制一个输出点ON,看看程序里对应的Y点是不是真的变了。

注意:有些老PLC的程序是带“加密狗”的。你即使读出了程序,换到另一台同型号的PLC上,也运行不了。因为程序里会检查一个特定的硬件ID。遇到这种情况,你只能老老实实重写程序,或者把原PLC的CPU板整个移植到新设备上。

逆向分析老程序,说白了就是一场侦探游戏。耐心、细心,再加上一点运气,没有解不开的“黑匣子”。