D:\项目\ASM(雷丁科技「喷码控制系统 3.0 版」,安装目录 D:\LeiD)C:\Windows\Decode\Encode.exe 往芯片写编码,并把编码记入
C:\Windows\Decode\LDDataFile.db 的 EnCodeData 表;软件端据此比对放行;因此"必须用厂家提供的芯片"的根源是:厂家独家持有写卡工具(Encode.exe)与编码库(LDDataFile.db),
而不是芯片里有什么无法伪造的密码学。本目录只包含"读"的一半(RFReader.exe),不含"写"的一半。
| 环节 | 组件 | 证据 |
|---|---|---|
| 芯片 | 墨水盒 / 稀释剂盒上的 RFID 标签 | 界面项 墨水RFID / 溶剂RFID;报错 Ink RFID cannot communicate… / VOC RFID cannot communicate… |
| 读头 | 两路独立 | RFReader.exe 的 PDB:E:\雷丁\武汉_克通\RFID版本\RFReader - 双路读取新\Release\RFReader.pdb |
| 串口层 | VSNScd.dll | 仅导出 4 组:OpenSerial/2/3/4、CloseSerial/2/3/4、SendDataToSerial/2/3/4、SetCallbackFunc/2/3/4;类 CSerialPort,用 COM%d |
| 通道分配 | 墨水读头 / 稀释剂读头 / 喷头主板 / 外部告警 | 两条独立报错 + 外部告警输出串口无法打开;配置项 串口1、RfidDEV |
| 读卡工具 | RFReader.exe | 25 KB MFC 程序,依赖 VSNScd.dll;对话框标题 Decode001(与 C:\Windows\Decode\ 呼应) |
| 主程序 | MainForm.exe | 取 8 字节 → 「用户ID」→ 校验 → 放行或报警 |
RfidDEV 型号配置,再怀疑芯片本身。
RFReader.exe 偏移 0x3d30 有一整条十六进制转储格式串:
%02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X
连续 22 个 %02X。推测结构(待实测验证):4 字节 UID + 16 字节数据块 + 2 字节校验。
主程序内存在标准 CRC-32 表(多项式 0xEDB88320,出现 1 次),说明数据完整性校验确实存在。
%C %C %C %C %C %C %C %C ← 8 个字节逐字节格式化成 8 个字符(MainForm.exe 0x016cde4 附近)
激活对话框(类 INPUTUID)的完整约束:
用户ID 必须是8位 (@0x01681a4) 两次输入不一样,请重新输入 (@0x01681bc) 请输入UID: / 请再次输入: 激活成功 / 设备已激活! / 设备未激活! 通讯故障无法处理,请在机器正常状态处理! ← 前置条件:硬件必须通讯正常
安装清单 Uninstall.ini(Actual Installer 7.6.0.0 生成,UTF-8,452 条文件记录)显示,
安装包会把一组文件放到 C:\Windows\ 下 —— 这组文件不在本目录里:
#392 C:\Windows\Decode\Encode.exe ← 编码 / 写卡程序 #393 C:\Windows\Decode\LDDataFile.db ← 编码数据库(SQLite) #394 C:\Windows\Decode\sqlite3.dll ← SQLite 运行库 #395 C:\Windows\Decode\VSNScd.dll ← 串口层(写卡同样需要串口) #396 C:\Windows\Microsys.dll ← 授权库(主程序调用,导出 GetUseDaySum)
本目录里的 LDDataFile 本身就是 SQLite 库,表结构为:
CREATE TABLE EnCodeData ( id INTEGER PRIMARY KEY AUTOINCREMENT, Contend VARCHAR(64) )
C:\Windows\Decode\ 用 Encode.exe(依赖 sqlite3.dll + VSNScd.dll)往空白芯片写入编码;LDDataFile.db 的 EnCodeData 表(每行一个编码,最长 64 字符);MainForm.exe 读卡取到编码,与 EnCodeData 记录对应,才认定是合法耗材。| 文件 | 解出内容 | 说明 |
|---|---|---|
| PLUG 安装目录("插件"参数) | [2024, 6, 1, 1, 0, 0, 0, 69471516, 1] | 日期 + 4 字节 UID 0x04240D1C + 状态。全盘按字节搜索确认该号码只出现在这一处 |
| INKVOC INK + VOC | [0,0,0,0, 2024,1,28,13,36,5, 6, 0] | 前 16 字节预留 ID 域(空)+ 首次记录时间 + 计数(墨水与稀释剂合计) |
| LDDataFile SQLite 3,12 KB | 表 EnCodeData,本拷贝内为空 | 编码记录库;空库意味着这份拷贝未登记过任何编码 |
| Config\StopVis_MixTemp | double 20.0 / 348.0 / 322.0 | 停机混墨的温度与粘度阈值 |
| Config\data2.bin | 80 字节,5 × 16,熵 5.09 | 未破译字段呈"3 字节常量 + 1 字节变化",疑似计数快照 |
| data2.bin 之外的 Config\*.txt | charge / vis1240 / vis601 / visT06 | 按机型的充电与粘度标定表(Config\vis601.txt、visT06.txt、vis1240.txt 由主程序按型号选载) |
| 机制 | 结论 | 依据 |
|---|---|---|
| 芯片写入的到期 / 有效期 | 不存在 | 中 / 英 / 越三语检索 过期·到期·有效期·期限·保质期·expire·expiry·validity·shelf 全部 0 命中(仅 Indy 库自带 TTL expired,无关) |
| 芯片内用量配额 / 剩余次数 | 不存在 | 无配额字段;且有 泵归零 与 耗材归零 两个可人工清零的计数器 |
| AES / DES / SHA / MD5 / RC4 / 非对称 | 不存在 | 全部算法常量与查表零命中;唯一原语是标准 CRC-32 |
| Mifare 扇区密钥(KeyA/KeyB) | 未发现 | 无 6 字节密钥常量 |
| 芯片内型号 / 有效期字段 | 未发现 | 卡种类由物理通道决定 |
~Config.vsn 中 [Others] RfidDEV 与 串口1 的取值;
② 每步都记录原始现象 + 截图/拍照;③ 不要改任何配置,只观察。
RFReader.exe 单独运行(它用同一串口层 VSNScd.dll,对话框标题 Decode001)。记录什么:完整 22 字节、字节之间的分组方式、是否有标签文字、读头指示灯状态、耗时。
意义:这一步直接拿到芯片的真实内容,22 字节的字段布局就能对上;两份数据对比可看出墨水/稀释剂编码的差异规律。
墨水RFID无法通讯 → 读头读不到(物理/协议不兼容);
② 能读出字节 → 读头兼容,问题在编码比对。把墨水芯片贴到稀释剂读头、稀释剂芯片贴到墨水读头,看界面状态项与报错如何变化。
预期:身份随读头走(墨水芯片被当成稀释剂)。若结果相反,则说明芯片内有种类字段——这会推翻本纪要的一个结论,很重要。
分别拔墨水读头、稀释剂读头的串口线,记录弹出的报错是 墨水RFID无法通讯 还是 溶剂RFID无法通讯。
意义:锁定串口号与读头的对应关系(同时可对照 串口1 配置项)。
dir C:\Windows\Decode dir C:\Windows\Microsys.dll
C:\Windows\Decode\ 存在:立刻记录 Encode.exe 的版本信息、以及 LDDataFile.db 的大小与修改时间。
这是厂家侧的写卡工具,是本研究的核心目标。找到任一份 LDDataFile / LDDataFile.db(通常在 C:\Windows\Decode\ 或软件安装目录),用 SQLite 工具打开:
SELECT COUNT(*) FROM EnCodeData; -- 编码总条数 SELECT * FROM EnCodeData ORDER BY id; -- 全部编码 .schema -- 确认表结构
重点看:Contend 字段的长度与格式(是 8 字符?16 字符?十六进制?)、
条数与现场在跑的墨水量是否吻合、是否有时间/顺序规律。
意义:这决定了"编码"到底是精确匹配白名单还是有范围的规则。
type D:\LeiD\PLUG (十六进制块,看第 28-31 字节的 4 字节 UID) type D:\LeiD\INKVOC (十六进制块,看前 16 字节是否已写入 ID) reg query HKCU\Software /s /f RFID reg query HKLM\SOFTWARE /s /f RFID
换上一支新墨盒后再看 PLUG 是否变化——可确认 UID 是"首次登记"还是"每次覆盖"。
用一支编码库里没有登记过的芯片换上,观察:是直接拒绝(报通讯错误)、还是读出号码但提示不符、
还是允许使用并自动登记(EnCodeData 新增一行)。这一条能定死"白名单"这个推断。
| 项目 | 记录 |
|---|---|
| 机器序列号 / 生产线号 | |
| 软件版本(关于界面) | |
RfidDEV 取值 | |
串口1 取值 / 各串口号 | |
| 墨水型号 / 稀释剂型号 | |
| 读头外观丝印(型号、频段) | |
C:\Windows\Decode 是否存在 |
| # | 种类 (墨水/稀释剂) | 是否原装 | 读头位置 | 读出的 22 字节(十六进制) | 软件反应 |
|---|---|---|---|---|---|
| 1 | |||||
| 2 | |||||
| 3 | |||||
| 4 | |||||
| 5 |
| 字节位置 | 0-3 | 4-7 | 8-11 | 12-15 | 16-19 | 20-21 |
|---|---|---|---|---|---|---|
| 原装墨水卡 | ||||||
| 原装稀释剂卡 | ||||||
| 差异/规律 |
| 项目 | 记录 |
|---|---|
EnCodeData 总条数 | |
Contend 长度范围 / 字符集 | |
| 前 5 条原文 | |
| 与现场耗材数量的对应关系 |
| 实际物料 | 软件中文 | 软件英文 | 相关文件名 |
|---|---|---|---|
| 油墨 / 墨水 | 墨水、墨水缸、墨水型号、墨水类型 | Ink | INKVOC 的 INK 部分 |
| 稀释剂 / 溶剂 | 溶剂、稀释、稀释阀 | Make-Up / VOC | INKVOC 的 VOC 部分 |
INKVOC = INK + VOC = 墨水 + 稀释剂 的合计记录,这也是两者"成对管理"的证据。
| 结论 | 证据位置 |
|---|---|
| 一次读回 22 字节 | RFReader.exe 偏移 0x3d30(连续 22 个 %02X) |
| 两路独立读头 | RFReader.exe PDB:…\RFID版本\RFReader - 双路读取新\Release\RFReader.pdb |
| 8 位用户ID 与两条校验 | MainForm.exe 0x01681a4 / 0x01681bc / 0x016cde4;类名 INPUTUID |
| 厂家写卡工具链 | Uninstall.ini 第 392–396 条(C:\Windows\Decode\…) |
| 编码表结构 | LDDataFile(SQLite)→ EnCodeData(id, Contend varchar(64)) |
| 4 字节 UID 落盘 | PLUG 第 28–31 字节 = 0x04240D1C |
| CRC-32 存在 | MainForm.exe 内含多项式 0xEDB88320 的标准查表 |
| 安装信息 | Uninstall.ini [General]:AppName=喷码控制系统、InstallDir=D:\LeiD |
C:\Windows\Decode\Encode.exe、LDDataFile.db(含全部编码记录)、
墨水/稀释剂芯片的型号规格(频段、芯片类型、22 字节字段定义)。Encode.exe 后,可对其做与本次相同的静态分析(PE 结构、字符串、常量扫描),
判断编码是"纯编号"还是含有算法校验。Encode.exe / LDDataFile.db 的机器上反汇编
MainForm.exe 的激活函数(切入点:用户ID 必须是8位 字符串的交叉引用)。