说是方便后人进一步研究。
本篇文章为逆向南科大二期宿舍门锁的过程记录,因为整个逆向的过程类似于实验,所以这里用实验的方式来规划这篇文章。
门锁系统是现代宿舍、办公楼等场景中常见的安防设备,其核心功能包括用户身份验证、状态指示和门锁控制等。
本实验的背景是 Freedorm 项目,这是一个专注于宿舍智能化的开源套件,通过改装传统宿舍门锁,实现 蓝牙靠近解锁、远程控制 等智能功能。为了支持这一套件的开发,我们需要对门锁系统的信号线和通信协议进行深入的逆向分析,明确门锁模块与门禁控制器的交互机制,并验证改装的可行性。
本次实验以南科大二期宿舍门锁为研究对象,采用逻辑分析仪和相关工具,对门锁的信号线功能及通信协议进行逆向分析。在此过程中,通过对关键信号线(D1、D0、LED、LOCK)的波形捕获与分析,尝试解密门锁模块与门禁控制器之间的交互机制,以及不同刷卡动作的反馈逻辑。
文章将围绕以下几个核心问题展开:
门锁信号线的基本功能是什么? 门锁模块和门禁控制器之间采用何种通信协议? 不同刷卡动作如何影响信号线的传输内容和门锁行为?
为了深入理解二期宿舍门锁的工作原理及其信号传输机制,本实验对门锁的硬件结构及信号交互进行逆向分析。以下为相关背景信息:
二期宿舍门锁是智能门禁系统的一部分,主要功能包括:
- 住户身份验证:通过 NFC 读取住户卡片信息,实现刷卡开门。
NFC(近场通信):一种短距离无线通信技术,用于卡片数据的读取
- 多种交互方式:支持校园卡、宿管卡(不支持按键密码)开门。
- 状态反馈:通过指示灯、蜂鸣器显示刷卡结果,并通过电机控制门锁的开关状态。
二期宿舍门锁的硬件结构设计结合了电子控制与机械操作,主要由以下模块组成:
-
电子控制模块
- 门锁的核心组件,主要负责:
- NFC 读卡模块 位于门锁的外部面板,用于读取用户校园卡、门禁卡等认证设备的信息。
- 数据处理:接收 NFC 模块读取的信息,通过信号线(D1、D0)传输至门禁控制器进行身份校验。
- 信号执行:根据门禁控制器返回的结果,控制机械模块执行开锁或关锁操作。
- 状态反馈:通过 LED 指示灯显示门锁状态(例如刷卡成功/失败),并通过蜂鸣器提供声音提示。
- 门锁的核心组件,主要负责:
-
机械模块
- 机械模块负责实现门锁的物理动作,具体包括:
- 门把手控制:通过电机驱动,解锁或锁定门把手,实现开门或锁门操作。
- 反锁功能:支持内部反锁机构,确保用户在内部能通过机械手动操作反锁装置。
- 锁芯动作:根据控制信号调整锁芯状态,保障门锁的安全性和操作便利性。
- 机械模块负责实现门锁的物理动作,具体包括:
-
通信接口
- 门锁通过一根 8pin 的 PH2.0 排线与外部系统通信
PH2.0 排线:一种常见的扁平电缆接口类型。
Freedorm 桥接板是一款用于信号截取的中间件硬件,功能包括:
逻辑分析仪是一种电子测试工具,用于捕捉和分析数字信号,核心功能包括:
- 信号采集:对多条信号线的状态进行高精度采样。
- 波形分析:实时显示信号的波形数据,用于解析数据协议。
- 协议解码:支持多种通信协议的解析,便于确认信号的时序和逻辑关系。 本实验使用 Pulseview 作为逻辑分析仪的上位机软件,采集并分析门锁信号线数据。
序号 | 器材名称 | 用途说明 |
---|---|---|
1 | 二期宿舍门锁 | 研究对象 |
2 | Freedorm桥接板 | 用来“截取”信号 |
3 | 逻辑分析仪 | 用来获取分析信号 |
4 | 数据线 | 用来连接逻辑分析仪和上位机电脑 |
5 | 杜邦线 | 用来模拟短接调试线 |
6 | 装有Pulseview的电脑 | Pulseview是开源逻辑分析仪上位机软件,用来分析信号 |
7 | 对应的门禁卡x3 | 用来执行刷卡成功动作 |
8 | 空白门禁卡 | 用来执行刷卡失败动作 |
9 | (optional) 宿管卡 | - |
-
准备以下器材:
- 门锁模块(实验对象)。
- Freedorm桥接板。
- 逻辑分析仪。
- 杜邦线(用于连接信号线和逻辑分析仪通道)。
- 电脑(安装 Pulseview 软件)。
- 电源适配器(提供 12V 电源)。
- 各种门禁卡(用户卡、宿管卡、空白卡等)。
-
按照以下步骤连接硬件:
- 将门锁模块的 8-pin PH2.0 排线连接到 Freedorm 桥接板。
- 使用杜邦线将桥接板上的信号线(D1、D0、LED、LOCK)连接到逻辑分析仪的输入通道(CH1~CH4)。
- 将逻辑分析仪连接到电脑的 USB 接口。
- 通过 12V 电源适配器为门锁模块供电,确保 GND 接地。
-
打开电脑上的 Pulseview 软件,确认逻辑分析仪已被正确识别。
-
使用万用表测量信号线的静态电平:
- 测量 D1、D0、LED、LOCK 四根信号线对 GND 的电压值。
- 记录每根信号线的电平值。
-
在 Pulseview 软件中设置通道:
- 将 CH1 设置为 D1,CH2 设置为 D0,CH3 设置为 LED,CH4 设置为 LOCK。
- 配置采样率为 1MHz,时基为 500ms/格。
- 在 Pulseview 软件中点击 开始捕获。
- 刷用户门禁卡,观察 D1 和 D0 的波形变化。
- 停止捕获并保存波形,命名为
data_user_success.sr
。 - 重复以下刷卡动作,逐一捕获波形并保存数据:
- 宿管卡 → 命名为
data_admin_success.sr
。 - 陌生人卡 → 命名为
data_stranger_fail.sr
。 - 空白卡 → 命名为
data_blank_fail.sr
。
- 宿管卡 → 命名为
- 准备杜邦线进行短接实验:
- 使用杜邦线将 D1 和 GND 短接,记录门锁是否有反应。
- 使用杜邦线将 D0 和 GND 短接,记录门锁是否有反应。
- 使用杜邦线将 LED 和 GND 短接,观察指示灯的颜色变化。
- 使用杜邦线将 LOCK 和 GND 短接,检查门锁是否开启。
- 对每次短接实验进行捕获,保存波形,命名规则为
data_{信号线名称}_short.sr
,例如:data_D1_short.sr
data_D0_short.sr
- 按以下组合进行刷卡动作验证:
- 短接信号线 + 刷用户卡:例如,短接 D1 和 GND 后刷用户卡。
- 短接信号线 + 刷宿管卡:例如,短接 D0 和 GND 后刷宿管卡。
- 捕获并保存每次组合实验的波形,命名规则为
data_{信号线名称}_{刷卡动作}.sr
,例如:data_D1_user.sr
data_D0_admin.sr
- 刷用户门禁卡,观察以下情况:
- 捕获 LED 信号,记录是否变为绿色或红色。
- 捕获 LOCK 信号,记录门锁是否开启。
- 刷宿管门禁卡,重复上述实验步骤。
- 刷陌生人门禁卡,重复上述实验步骤。
- 将所有捕获的波形数据保存到指定文件夹(如
reverse_engineering/data/
)。 - 确保所有文件按照命名规则整理:
data_{刷卡动作}_{反馈类型}.sr
- 例如:
data_user_success.sr
,data_stranger_fail.sr
- 打开 Pulseview 软件,加载捕获的波形数据文件。
- 使用以下步骤分析数据:
- 检查 D1 和 D0 的脉冲模式:
- 确定每次刷卡对应的二进制编码序列。
- 验证脉冲宽度是否为 200~250us,间隔是否为 2150us。
- 确认 LED 和 LOCK 的功能:
- 分析刷卡成功和失败时的 LED 和 LOCK 波形变化。
- 检查 D1 和 D0 的脉冲模式:
- 使用表格总结以下内容:
- 每种刷卡动作对应的反馈(门锁、LED 和蜂鸣器)。
- 信号线功能表:总结每根信号线的用途。
通过测量对GND电平,得到下表:
D1 | D0 | LED | LOCK | |
---|---|---|---|---|
颜色 | 白 | 绿 | 橙 | 黄 |
电平 | 5V | 5V | 3V3 | 3V3 |
通过执行刷卡动作,逻辑分析仪得到一些数据,命名规则为data_刷卡动作_对应反馈
。
刷卡动作有(比较感兴趣的进行了加粗):
admin
:宿管卡user
:本宿舍住户校园卡stranger
:陌生人校园卡touch_num
:点击门锁面板密码键盘数字键touch_ok
:点击门锁面板密码键盘确认键blank
:空白UFUID-IC卡miband9
:小米手环9模拟IC卡D1
: 短接D1和GNDD0
: 短接D0和GNDLED
: 短接LED和GNDLOCK
: 短接LOCK和GNDD1&user
: 短接D1和GND,刷本宿舍住户校园卡D0&user
: 短接D0和GND,刷本宿舍住户校园卡LED&user
: 短接LED和GND,刷本宿舍住户校园卡LOCK&user
: 短接LOCK和GND,刷本宿舍住户校园卡D1&admin
: 短接D1和GND,刷宿管卡D0&admin
: 短接D0和GND,刷宿管卡
对应反馈有:
success
:门打开fail
:门不打开blank
:没有反馈,门不打开locked
:门锁上了,刷卡刷不开
通过实验,得到每种刷卡动作的对应反馈表,如下表所示:
刷卡动作 | 门锁 | 面板LED | 蜂鸣器 | 反馈类型 |
---|---|---|---|---|
admin | 开,6s后锁上 | 持续6s绿色 | 长滴一声 | success |
user | 开,6s后锁上 | 持续6s绿色 | 长滴一声 | success |
stranger | 不开 | 红色闪烁3s | 长滴一声 | fail |
touch_num | 不开 | 无反应 | 短滴一声 | blank |
touch_ok | 不开 | 绿色闪烁5s | 默 | fail |
blank | 不开 | 无反应 | 默 | blank |
miband9 | 不开 | 无反应 | 默 | blank |
D1 | 不开 | 保持蓝色 | 默 | blank |
D0 | 不开 | 保持蓝色 | 默 | blank |
LED | 不开 | 蓝色变成绿色,并保持绿色 | 默 | blank |
LOCK | 常开 | 保持蓝色 | 默 | success |
D1&user | 不开 | 绿色闪烁一下,1s | 长滴一声 | locked |
D0&user | 不开 | 绿色闪烁一下,1s | 长滴一声 | lockde |
LED&user | 开,6s后锁上 | 持续6s绿色 | 长滴一声 | blank |
LOCK&user | 本来就是常开的 | 持续6s绿色 | 长滴一声 | success |
D1&admin | ||||
D0&admin |
有太多种可能的刷卡动作,因此选取了感兴趣的11个刷卡动作,用逻辑分析仪获取数据。 每个数据对应一个动作;有4个通道,对应D1、D0、LED、LOCK。储存在data文件夹下。
在开始分析数据之前,我们需要了解硬件的基本情况,会对数据分析有所帮助。
门锁模块的核心组件包括一颗 STM32f030C8T6 微控制器(主控芯片)、一颗丝印为 GT23SC5 的恩智浦 NFC 芯片(负责读取卡片信息),以及一颗 TI ULN2003A 七路反向器(推测用于处理信号线的数据接收与发送)。
首先查询制造商智慧赛宁的资料,也没有翻到相关的资料,只能自己动手了。
这一部分通过pcb板子上的丝印已经大概了解,8pin的ph2.0排线中,有两根线被剪断,分别是BUZ和SENSE,剩下的6根线分别是:GND、D1、D0、LED、LOCK、12V。
暂时不浪费时间在没用到的线(BUZ和SENCE)上和完全已知(12V和GND)的线上,我们只关注D1、D0、LED、LOCK这四根线。
通过查看按门板上数字的逻辑分析仪的数据 data_touch_num_1234567890#_blank,这个数据是我分别单独按了1
、2
、3
、4
、5
、6
、7
、8
、9
、0
、#
这11个数字键(没有按确认键*
)
得到波形和对应数字二进制编码如下:
数字键1
0001
:
数字键2
0010
:
数字键3
0011
:
数字键4
0100
:
如果你对二进制足够熟悉,那应该能看到这些数字都是从左到右(大端序)四位二进制编码
大端序:一种数据排列方式,最重要的位排在数据流的开头。
经过多次实验和统计,门板上的数字键的二进制编码如下:
门板按键 | 数字 | 二进制编码 |
---|---|---|
1 | 1 | 0001 |
2 | 2 | 0010 |
3 | 3 | 0011 |
4 | 4 | 0100 |
5 | 5 | 0101 |
6 | 6 | 0110 |
7 | 7 | 0111 |
8 | 8 | 1000 |
9 | 9 | 1001 |
0 | 0 | 0000 |
*(确定键) | 10 | 1011 |
# (不清楚功能) | 11 | 1010 |
所以D1和D0的功能确定了,D1是数据传输线,比特1;D0是数据传输线,比特0。
接下来我们来看看LED和LOCK这两根线的功能。
我们可以观察刷卡成功和失败的数据(data_user2_success.sr data_stranger_fail.sr):
回顾上面的刷卡动作-反馈类型对应表,刷卡成功后,LED保持绿色6s,门锁打开,6s后锁上。 于是初步猜测LED是控制门锁面板指示灯的。LOCK是控制门锁电机状态的,低电平打开门。 同样回顾上面的刷卡动作-反馈类型对应表,刷卡失败后,LED闪烁红色3s,门锁不打开,发出长滴一声。对应LED振荡3次,LOCK保持高电平。
所以我们可以初步确定LED和LOCK的功能,LED是控制门锁面板指示灯,LOCK是控制门锁电机状态,低电平门锁打开。
但是似乎LED还有更细节的功能,比如为什么有时候是低电平是绿色,有时候是红色呢?时间有限,我不去深究了。
总结来说,假如GND和12V这两根线完全就是提供电源,6根线的功能如下:
pcb丝印 | 信号线颜色 | 功能 |
---|---|---|
D1 | 白 | 数据传输线,比特1 |
D0 | 绿 | 数据传输线,比特0 |
LED | 橙 | 控制门锁面板指示灯 |
LOCK | 黄 | 控制门锁电机状态 |
GND | 黑 | 接地 |
12V | 红 | 12V电源 |
正如上面 所说,D1和D0分别是数据传输线,比特1和比特0。那么我们可以初步确定这是一种魔改的二进制通讯协议。
没有时钟信号,单次脉冲宽度200~250us,脉冲见间隔2150us,D1和D0不会同时出现脉冲,D1代表二进制1,D0代表二进制0,按照大端序(先出现的是MSB-最高有效位)的顺序传输二进制数据。
GPT说这不是一个标准的有规范的通讯协议,而是一种自定义的通讯协议,Freedorm项目的产品定义不需要用到这个通讯协议,所以这里我就不深究了。
在确定开门流程的细节之前,需要先了解一下门锁的工作架构。
经过我的观察,门锁的物理架构如下:
以下是基于数据和实验的猜测,没有找到任何资料交叉验证,可能有部分错误,抛砖引玉,仅供参考。
门锁模块本身是一个独立的模块,电源由外部12v供应,硬件主要包含NFC验证电路、电机,还有指示灯。
但是门锁模块本身不负责具体的住户身份校验,只负责执行开门和关门的操作。
具体的住户身份校验是由弱电井中的门禁控制器负责的,门禁控制器负责接收门锁模块的数据传输线(D1、D0)的数据,校验身份,然后通过LED和LOCK控制门锁模块的指示灯和电机。
然后门禁控制器接入网络,可以远程更新住户信息,也可以远程开门。
一个完整的开门流程如下:
- 住户刷卡
- 门锁模块通过NFC读取信息,将信息通过D1、D0传输给门禁控制器
- 门禁控制器校验信息,如果通过,通过LED和LOCK控制门锁模块的指示灯和电机
- 门锁模块执行开门操作
对应流程的逻辑分析仪数据为data_user2_success.sr:
通过分析6次重复刷卡数据data_user_6_success.sr,每一次刷卡成功的数据传输都是一样的,共34bit,所以我们可以初步确定这是在传输身份信息。
更进一步,分析了宿舍三位室友的刷卡数据,其中两位的验证信息只有一位不同,正好两位室友都没有补过卡,所以这两张卡都是开学一起被办理的,点到为止。
由于此次逆向的背景是Freedorm项目,目前为止已经得到想要的东西了,这部分留给对此更加感兴趣的人。
本实验对南科大二期宿舍门锁信号线进行了详细的逆向分析,通过实验和数据验证得出了以下结论:
-
信号线功能:
- D1 和 D0:为数据传输线,分别表示二进制
1
和0
,采用无时钟、自定义的二进制通信协议,数据以大端序(MSB 优先)传输,单次脉冲宽度为 200~250us,间隔为 2150us。 - LED 和 LOCK:分别控制门锁的指示灯和电机,LED 提供刷卡结果的状态反馈(绿色/红色),LOCK 控制门锁的开关状态(低电平解锁)。
- D1 和 D0:为数据传输线,分别表示二进制
-
通讯协议:
- 确定 D1 和 D0 的通信协议是一种非标准、自定义的二进制传输协议,不依赖时钟信号。
- 每次刷卡成功传输的数据长度为 34 位,包含用户的身份信息。
-
门锁与门禁控制器的交互流程:
- 门锁模块通过 NFC 读取卡片信息后,将数据通过 D1、D0 发送给门禁控制器。
- 门禁控制器完成身份校验后,通过 LED 和 LOCK 返回结果,控制门锁状态。
此次实验为进一步研究和改造门锁通信协议提供了基础,为 Freedorm 项目的功能扩展(如蓝牙解锁、远程控制)打下了坚实的技术依据。
实验结论和分析不仅适用于宿舍门锁,也可为其他类似设备的逆向工程提供参考。