1. 逆向工程前的准备工作
当我第一次拆开伊士顿ED6000电梯的主控板时,那个被打磨掉型号的MCU芯片就给了我一个下马威。这种工业控制器通常采用STM32F1系列芯片,但具体型号需要通过引脚定义和外围电路来反推。以下是逆向前的必要准备:
1.1 硬件拆解要点
使用防静电手套和精密螺丝刀套装拆卸主控板时,要注意以下几点:
- 先拍照记录所有连接器的位置和方向
- 用标签纸标记每根线缆的接口定义
- 特别关注板载调试接口(通常为4-6pin的SWD/JTAG)
重要提示:拆卸过程中若发现防拆标签,应立即停止操作。本文仅讨论合法维保场景下的技术研究。
1.2 固件提取方法
针对STM32F107芯片,可以通过以下两种方式提取固件:
- SWD调试接口:使用ST-Link V2编程器连接SWCLK、SWDIO、GND三根线
- Bootloader模式:短接BOOT0引脚后通过UART使用stm32flash工具读取
提取命令示例:
bash复制stm32flash -r firmware.bin /dev/ttyUSB0 -b 115200
2. 协议逆向分析实战
2.1 CAN总线数据解析
原始数据帧0x18EF0501 [00 00 03 E8 00 64]的解析需要结合电梯控制协议:
- 0x18EF0501:CAN标识符(包含源/目标地址)
- 03 E8:对应十进制1000,表示以毫米为单位的位移
- 00 64:速度值,需要按小端格式解析
改进后的解析代码应加入校验机制:
python复制def parse_speed(can_data):
if len(can_data) != 6:
raise ValueError("Invalid CAN frame length")
speed_raw = (can_data[4] << 8) | can_data[5]
if speed_raw > 0x7FFF: # 检查符号位
speed_raw -= 0x10000
return speed_raw / 100.0 # 转换为m/s
2.2 密钥算法漏洞分析
逆向发现的密钥生成函数存在严重设计缺陷:
c复制uint16_t gen_key(uint8_t* seed) {
uint16_t key = 0;
for(int i=0; i<6; i++){
key = (key << 3) | (seed[i] & 0x07);
key ^= 0x55AA; // 固定密钥导致可预测性
}
return key & 0x7FFF;
}
攻击者可利用以下特征进行破解:
- 固定异或值0x55AA降低了熵值
- 仅取每个字节的低3位(损失5位信息)
- 输出限制在15位(最高位强制清零)
3. 安全参数修改规范
3.1 运动参数约束
配置文件中关键参数的安全范围:
| 参数名 | 推荐值 | 危险阈值 | 单位 |
|---|---|---|---|
| accel_limit | 1.0-1.2 | >1.5 | m/s² |
| jerk_limit | 2.0-3.0 | >3.5 | m/s³ |
| door_delay | 1500-2500 | <800 | ms |
参数验证脚本增强版:
bash复制#!/bin/bash
# 参数安全校验工具
validate_params() {
local accel=$1
local jerk=$2
# 基本范围检查
if (( $(echo "$accel > 1.5 || $jerk > 3.5" | bc -l) )); then
echo "ERROR: 超出绝对安全限值"
return 1
fi
# 组合效应检查
local product=$(echo "$accel * $jerk" | bc -l)
if (( $(echo "$product > 3.6" | bc -l) )); then
echo "WARNING: 参数组合风险系数过高"
return 2
fi
return 0
}
3.2 动态补偿算法解析
STM32F107实现的载荷补偿算法包含:
- 称重传感器数据滤波(移动平均窗口=8)
- 加速度前馈补偿公式:
code复制F_comp = m_est * (a_desired + g*sinθ) - 钢丝绳弹性形变补偿:
- 使用振动传感器FFT分析
- 重点监测5-15Hz频段能量
4. 逆向工程中的经验技巧
4.1 固件分析技巧
使用IDA Pro时的实用方法:
- 重命名关键函数:
- sub_8000A34 → can_parse_frame
- sub_8001B28 → motor_control
- 创建结构体定义:
c复制struct MotorParams { int16_t target_speed; uint16_t acceleration; uint8_t control_mode; }; - 交叉引用追踪:通过关键字符串(如"OverSpeed!")定位校验函数
4.2 现场调试要点
进行电梯控制系统调试时:
- 必须准备紧急停止装置
- 使用隔离电源供电(防止接地回路干扰)
- CAN总线监听建议:
- 终端电阻匹配(120Ω)
- 采样点设置在75%-80%位时间
- 波特率优先尝试500kbps
5. 系统安全加固建议
5.1 协议层改进
针对已发现的安全漏洞建议:
- 密钥算法升级:
- 改用HMAC-SHA256
- 增加随机盐值
- 设置动态过期时间
- 数据帧增加:
- 滚动计数器防重放
- CRC32完整性校验
- 时间戳验证
5.2 硬件防护措施
物理层面的安全增强:
- 启用STM32的读保护(RDP)Level 1
- 添加调试接口检测电路
- 关键参数存储使用独立EEPROM
- 程序校验和检查
配置RDP的命令示例:
bash复制st-flash --reset write firmware.bin 0x08000000
st-flash --reset opt byteset 0x1FFFF800 0xAA55A55A
在实际维保工作中,我强烈建议建立参数修改的双人确认制度。曾经有个案例,工程师误将加速度单位从m/s²改为cm/s²,导致电梯启动时产生剧烈抖动。这类系统级参数的修改必须慎之又慎,最好先在离线仿真环境中验证。
