ET199加密锁改客户号与ATR模拟:可复现的调试路径

发布时间:2026/10/2 4:04:18
ET199加密锁改客户号与ATR模拟:可复现的调试路径 简介这份资源围绕ET199智能电子锁的客户号与ATR值修改及模拟操作展开面向门禁系统开发者、智能卡调试人员及具备一定嵌入式基础的技术爱好者用于解决更换锁所有者、调整权限配置或适配新智能卡类型时的参数改写需求。压缩包共37个文件约10.79MB以C/C源码、头文件、工程配置与编译产物为主包含h、cpp、c等源文件sln、vcxproj、vcproj等工程文件以及lib、dll、exe、hex、bin等库与固件文件另附manifest、htm等辅助说明便于直接编译调试。目前已有775人学习下载。资源提供了客户号与ATR的定位修改思路、硬件接入与软件工具配合方式、备份验证流程以及模拟ET199响应行为的实现参考适合在合法授权下研究锁具参数改写与智能卡识别机制的技术人员对照使用。1. ET199 改客户号与 ATR 模拟一张锁卡背后的可复现路径手里拿到一张 ET199 加密锁客户号被写死、ATR 应答固定、换台机器就报错这是很多做工业软件授权迁移的人都会撞上的场景。ET199 是早期常见的 USB 加密锁方案配套的 ATRAnswer To Reset复位应答决定了主机识别这把锁的身份特征而客户号则绑定了授权归属。所谓「改客户号」「模拟 ET199」本质是两件事一是把锁内可写的客户标识改成目标值二是让上位机在握手阶段收到与目标锁一致的 ATR 序列。热词里反复出现的「锁」「改号」「ATR」正好对应这条链路的三段识别、写入、验证。这篇笔记面向需要复现 ET199 改号与 ATR 模拟的工程师从协议层拆到命令层给出可抄作业的步骤、参数和踩坑记录不涉及任何绕过授权的用途只讨论自有设备与合法授权范围内的调试。2. ET199 的识别链路ATR、客户号与锁状态到底谁管谁2.1 ATR 在复位阶段决定了什么ET199 插入主机后上位机先发复位信号锁返回一串字节这就是 ATR。它通常包含协议类型、历史字节和校验信息。上位机驱动会拿这串字节和内置模板比对匹配不上就直接判定「非本品牌锁」。所以改客户号之前必须先确认 ATR 是否可改、改哪几个字节。常见做法是先用读卡器抓一次原始 ATR存成十六进制串再逐字节对照目标锁的 ATR。注意 ATR 里的历史字节往往带厂商编码这部分如果被固件写死就只能靠模拟层在传输时替换而不是改锁内存储。2.2 客户号存在哪可写区与只读区的边界客户号一般落在锁内的一块配置区可能是 EEPROM 也可能是带写保护的 Flash 段。判断方法很直接用厂商工具读一次配置区记下偏移尝试写入一个测试值再读回。如果读回变了说明可写如果写命令返回错误码或读回不变说明该段被锁。血泪经验是很多 ET199 变种的客户号区和授权计数区相邻写客户号时如果长度算错会顺手把计数区覆盖锁直接报废。所以写之前一定先做全量备份把整块配置区 dump 出来。2.3 锁状态为什么有的锁改完就「锁死」热词里「锁」出现频率极高这里说的锁状态指锁内的一次性写保护位或授权绑定标志。ET199 有些批次在出厂时把配置区设为写保护一旦触发就不可逆。判断锁状态可以看写命令的返回码也可以看配置区某个标志位。如果标志位显示已保护改号这条路就走不通只能转向模拟方案不改锁改上位机看到的应答。这也是「模拟 ET199」这个方向存在的现实原因。2.4 最小识别流程的复现步骤下面这段 Python 用 pyserial 和基础串口读写演示如何抓取一次 ATR 并解析关键字节。实际硬件可能是读卡器或带 USB 转串口的锁座端口号按系统实际改。import serial import time # 打开锁对应的串口波特率按读卡器手册常见 9600 或 115200 ser serial.Serial(COM3, 9600, timeout1) def reset_and_read_atr(): # 发送复位指令不同读卡器指令不同这里用常见 0x00 0xFF 触发 ser.write(bytes([0x00, 0xFF])) time.sleep(0.05) # 读取返回ATR 长度不定先读 32 字节 raw ser.read(32) return raw atr reset_and_read_atr() print(ATR hex:, atr.hex().upper()) # 解析前两字节通常是 TS 和 T0历史字节从 T0 低四位决定 ts atr[0] t0 atr[1] hist_len t0 0x0F print(TS:, hex(ts), T0:, hex(t0), 历史字节长度:, hist_len) print(历史字节:, atr[2:2hist_len].hex().upper())逻辑说明复位后读到的字节流里TS 表示初始字符T0 的高四位指示后续接口字节低四位指示历史字节长度。参数上timeout 设 1 秒是防止读卡器没响应时卡死sleep 0.05 秒是给锁复位留时间太短会读到空。失败时先看端口是否被占用再看波特率是否匹配最后确认读卡器是否需要额外握手命令。这一步拿到的 ATR 是后续改号和模拟的基准务必存文件。3. 改客户号从备份到写入的完整命令链3.1 先备份整块配置区改号前不备份等于没有后悔药。ET199 的配置区通常可以通过读命令按页读出常见页大小 16 或 32 字节。下面脚本按页 dump 并保存为二进制文件方便后续比对和回滚。import serial ser serial.Serial(COM3, 9600, timeout1) def read_page(page_addr, page_size16): # 构造读页命令具体命令码按锁手册这里用 0x30 示意 cmd bytes([0x30, (page_addr 8) 0xFF, page_addr 0xFF, page_size]) ser.write(cmd) return ser.read(page_size) with open(et199_backup.bin, wb) as f: for addr in range(0, 0x400, 16): # 假设配置区 1KB data read_page(addr) if len(data) ! 16: print(读取异常地址:, hex(addr), 长度:, len(data)) break f.write(data) print(备份完成)逻辑说明page_addr 是页起始地址page_size 要和锁手册一致写错会读到错位数据。命令码 0x30 只是示意实际以你手上锁的协议文档为准。备份文件要保留原始十六进制视图后面改号时只改目标偏移其余字节原样写回。如果读取过程中长度不足说明通信不稳或地址越界先解决通信再继续。3.2 定位客户号偏移的三种方法第一种是差异法拿一把已知客户号的锁和一把目标锁各 dump 一份逐字节比对差异处大概率就是客户号区。第二种是字符串法客户号如果是 ASCII直接在 dump 里搜可见字符串。第三种是写测试法在疑似区域写一个独特值读回确认。三种方法结合用最稳。注意有些客户号是加密存储或带校验直接改明文会导致校验失败这时要连校验字节一起算。3.3 写入客户号并校验确认偏移后构造写命令。下面示例把偏移 0x20 处的 8 字节客户号改成目标值写完后立即读回校验。import serial ser serial.Serial(COM3, 9600, timeout1) def write_page(page_addr, data): # 写页命令命令码 0x40 示意数据长度需与页大小一致 cmd bytes([0x40, (page_addr 8) 0xFF, page_addr 0xFF]) data ser.write(cmd) return ser.read(2) # 返回状态码 def read_page(page_addr, page_size16): ser.write(bytes([0x30, (page_addr 8) 0xFF, page_addr 0xFF, page_size])) return ser.read(page_size) # 读取原页只改客户号部分 page bytearray(read_page(0x20)) new_customer bCUST2024 # 8 字节目标客户号 page[0:8] new_customer status write_page(0x20, bytes(page)) print(写状态:, status.hex()) # 读回校验 verify read_page(0x20) print(校验:, verify[0:8])逻辑说明写命令通常返回状态码0x00 或 0x90 表示成功其他值要查手册。参数上客户号长度必须和原字段一致多写少写都会破坏相邻数据。校验步骤不能省读回不一致说明写保护未解除或命令码不对。如果写状态返回错误先检查锁状态标志再确认是否需要对配置区先发解锁命令。3.4 写保护与解锁命令的常见形态部分 ET199 在写配置区前需要先验证口令或发解锁序列。常见形态是先写一个口令到指定地址再在限定时间内发写命令。口令可能是固定值也可能由客户号派生。如果手册没写可以用逻辑分析仪抓一次厂商工具的通信看它在写之前发了什么。注意抓包只用于自有设备调试不要用于未授权场景。4. ATR 模拟不改锁也能让上位机认账4.1 模拟层的两种落点ATR 模拟有两种做法一是在读卡器固件层拦截并替换返回字节二是在上位机驱动层挂钩把读到的 ATR 改成目标值。前者对硬件有要求后者更通用但需要处理驱动签名和兼容性。常见做法是用一个中间层串口转发程序主机以为在跟锁通信实际中间层按规则改写 ATR 和后续应答。这种方式不改锁适合锁已写保护的情况。4.2 串口转发模拟的最小实现下面是一个串口转发骨架把真实锁的 ATR 替换成目标 ATR其余数据透传。实际部署时中间层要接两个串口或一个虚拟串口对。import serial # 真实锁端口和上位机端口虚拟串口对可用 com0com 等工具创建 real_lock serial.Serial(COM4, 9600, timeout0.1) upstream serial.Serial(COM5, 9600, timeout0.1) TARGET_ATR bytes.fromhex(3B 12 34 56 78 90 00) # 目标 ATR按实际填 def forward(): # 上位机到锁方向透传 if upstream.in_waiting: real_lock.write(upstream.read(upstream.in_waiting)) # 锁到上位机方向拦截复位应答 if real_lock.in_waiting: data real_lock.read(real_lock.in_waiting) if data.startswith(b\x3B): # 检测到 ATR 起始 upstream.write(TARGET_ATR) else: upstream.write(data) while True: forward()逻辑说明TARGET_ATR 要和目标锁完全一致包括校验字节。转发循环里用 in_waiting 做非阻塞读避免卡死。参数上timeout 设 0.1 秒是平衡实时性和 CPU 占用。失败时先确认虚拟串口对是否配对再看 ATR 检测条件是否命中有些锁的 ATR 起始字节不是 0x3B要按实际改。4.3 模拟方案的边界与风险模拟层能解决识别问题但解决不了锁内授权计算。如果上位机后续还要用锁内密钥做运算单纯改 ATR 会在下一步失败。所以模拟前要确认上位机的校验深度只比 ATR还是还要读客户号、做挑战应答。只比 ATR 的场景模拟成本最低深度校验的场景要么改锁要么在中间层完整实现协议。这里没有银弹先摸清校验链路再选方案。5. 避坑与排查改号模拟中最容易翻车的五件事5.1 写客户号后锁完全不响应现象写命令返回成功但重新插拔后锁无应答。原因写入长度覆盖了相邻的配置或校验区导致固件启动校验失败。解决用备份文件整块回写恢复原状下次写之前严格按字段长度操作写完立即读回全页比对。5.2 ATR 替换后上位机仍报错现象中间层已返回目标 ATR上位机还是提示设备不匹配。原因上位机不只比 ATR还比了客户号或后续握手字节。解决用抓包工具记录完整通信看它在 ATR 之后还发了什么、期待什么把模拟层扩展到后续应答。5.3 写保护标志误判现象读到的标志位显示未保护但写命令一直失败。原因标志位可能有多个或者解锁命令没发。解决对照手册确认所有保护位抓一次厂商工具的写流程看解锁序列是否遗漏。5.4 串口转发丢字节现象模拟层运行一段时间后上位机随机报错。原因转发循环里读和写没有做缓冲高波特率下丢数据。解决加大读取缓冲用线程分别处理两个方向或者降低波特率测试。参数上timeout 和 read 大小要匹配实际流量。5.5 备份文件不可用现象想回滚时发现备份文件读不回去。原因备份时页地址或页大小和实际不符文件内容错位。解决备份后立即做一次回写测试确认能恢复备份文件保留多份记录当时的端口参数和命令码。6. 进阶用校验和反推客户号编码规则改号做到后面会遇到客户号不是明文而是带校验或加密的情况。这时可以固定其他字节只变客户号观察校验字节的变化用几组样本反推规则。常见是简单累加和或 CRC8。下面这段代码演示用多组样本暴力匹配校验算法。import itertools samples [ (bCUST0001, 0x3A), (bCUST0002, 0x3B), (bCUST0003, 0x3C), ] def checksum_sum(data): return sum(data) 0xFF def checksum_xor(data): r 0 for b in data: r ^ b return r for name, func in [(sum, checksum_sum), (xor, checksum_xor)]: ok all(func(s[0]) s[1] for s in samples) print(name, 匹配 if ok else 不匹配)逻辑说明samples 里是客户号和对应校验字节先用常见算法试。如果都不匹配可能是 CRC 或带密钥的算法需要更多样本或抓取写入过程。参数上样本要覆盖不同字符避免巧合。反推出规则后改号时连校验一起算才能通过上位机验证。我自己的习惯是每次动锁之前先做三件事备份、抓包、记录参数。这三样齐了翻车也能救回来。ET199 这类老锁的资料散、批次杂别信单一来源的手册以实测为准。希望帮到你。本文还有配套的精品资源点击获取

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询