耗材芯片研究纪要

范围:仅墨水 / 稀释剂耗材芯片的读取与识别 · 对象 D:\项目\ASM(雷丁科技「喷码控制系统 3.0 版」,安装目录 D:\LeiD)
2026-09-24 · 全静态分析(未运行程序、未连接设备)· 本文不含登录/账号相关内容

一、结论摘要

芯片的本质是"身份标签 + 编码",不是加密介质。
  1. 墨水与稀释剂各占一路独立读头,软件靠物理通道区分种类,不靠芯片里的字段;
  2. 读卡器一次读回 22 字节;主程序取其中 8 字节 作为 8 位「用户ID」;
  3. 厂家侧用 C:\Windows\Decode\Encode.exe 往芯片写编码,并把编码记入 C:\Windows\Decode\LDDataFile.db 的 EnCodeData 表;软件端据此比对放行;
  4. 不存在有效期/到期机制,不存在芯片内用量配额,不存在密码学密钥与挑战应答。

因此"必须用厂家提供的芯片"的根源是:厂家独家持有写卡工具(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.exe25 KB MFC 程序,依赖 VSNScd.dll;对话框标题 Decode001(与 C:\Windows\Decode\ 呼应)
主程序MainForm.exe取 8 字节 → 「用户ID」→ 校验 → 放行或报警
操作要点:把墨水的芯片放到稀释剂读头前,软件会把它当稀释剂。现场"认不出耗材"时,先查 ① 是否插错位置 ② 该路读头/串口是否通讯正常 ③ RfidDEV 型号配置,再怀疑芯片本身。

三、识别要素:22 字节 → 8 位「用户ID」

3.1 一次读回 22 字节

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 次),说明数据完整性校验确实存在。

3.2 主程序取 8 字节作为「用户ID」

%C %C %C %C %C %C %C %C              ← 8 个字节逐字节格式化成 8 个字符(MainForm.exe 0x016cde4 附近)

激活对话框(类 INPUTUID)的完整约束:

用户ID 必须是8位                    (@0x01681a4)
两次输入不一样,请重新输入            (@0x01681bc)
请输入UID:  /  请再次输入:
激活成功 / 设备已激活! / 设备未激活!
通讯故障无法处理,请在机器正常状态处理!    ← 前置条件:硬件必须通讯正常
校验强度:全 11 个模块的中 / 英 / 越三语字符串中,与「用户ID」内容相关的提示只有长度与两次一致两条, 没有任何「用户ID 无效 / 不存在 / 不匹配」的提示串。 → 高置信推断:该处只做格式校验(8 位 + 两次一致),不校验内容。 (不是断言;算法校验也可能不配独立提示串。要 100% 确认需反汇编激活函数。)

四、厂家侧写入工具链(本轮最关键的发现)

安装清单 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)
)
推断出的完整机制:
  1. 厂家在 C:\Windows\Decode\ 用 Encode.exe(依赖 sqlite3.dll + VSNScd.dll)往空白芯片写入编码;
  2. 同时把该编码写入 LDDataFile.db 的 EnCodeData 表(每行一个编码,最长 64 字符);
  3. 软件端 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_MixTempdouble 20.0 / 348.0 / 322.0停机混墨的温度与粘度阈值
Config\data2.bin80 字节,5 × 16,熵 5.09未破译字段呈"3 字节常量 + 1 字节变化",疑似计数快照
data2.bin 之外的 Config\*.txtcharge / 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 的取值; ② 每步都记录原始现象 + 截图/拍照;③ 不要改任何配置,只观察。

试验 1 — 原装芯片基线读数(最关键,优先做)

记录什么:完整 22 字节、字节之间的分组方式、是否有标签文字、读头指示灯状态、耗时。
意义:这一步直接拿到芯片的真实内容,22 字节的字段布局就能对上;两份数据对比可看出墨水/稀释剂编码的差异规律。

试验 2 — 异卡对比(区分"读不到"还是"不认")

试验 3 — 两路对调

把墨水芯片贴到稀释剂读头、稀释剂芯片贴到墨水读头,看界面状态项与报错如何变化。
预期:身份随读头走(墨水芯片被当成稀释剂)。若结果相反,则说明芯片内有种类字段——这会推翻本纪要的一个结论,很重要。

试验 4 — 拔掉一路读头

分别拔墨水读头、稀释剂读头的串口线,记录弹出的报错是 墨水RFID无法通讯 还是 溶剂RFID无法通讯。
意义:锁定串口号与读头的对应关系(同时可对照 串口1 配置项)。

试验 5 — 检查写卡工具链是否存在

dir C:\Windows\Decode
dir C:\Windows\Microsys.dll

试验 6 — 查看编码数据库内容

找到任一份 LDDataFile / LDDataFile.db(通常在 C:\Windows\Decode\ 或软件安装目录),用 SQLite 工具打开:

SELECT COUNT(*) FROM EnCodeData;              -- 编码总条数
SELECT * FROM EnCodeData ORDER BY id;          -- 全部编码
.schema                                        -- 确认表结构

重点看:Contend 字段的长度与格式(是 8 字符?16 字符?十六进制?)、 条数与现场在跑的墨水量是否吻合、是否有时间/顺序规律。
意义:这决定了"编码"到底是精确匹配白名单还是有范围的规则。

试验 7 — 检查配置与注册表里的芯片记录

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 是"首次登记"还是"每次覆盖"。

试验 8 — 换芯片的放行行为

用一支编码库里没有登记过的芯片换上,观察:是直接拒绝(报通讯错误)、还是读出号码但提示不符、 还是允许使用并自动登记(EnCodeData 新增一行)。这一条能定死"白名单"这个推断。

八、现场数据记录表(可直接打印填写)

8.1 基本信息

项目记录
机器序列号 / 生产线号
软件版本(关于界面)
RfidDEV 取值
串口1 取值 / 各串口号
墨水型号 / 稀释剂型号
读头外观丝印(型号、频段)
C:\Windows\Decode 是否存在

8.2 芯片读数记录(每张卡一行)

#种类
(墨水/稀释剂)
是否原装读头位置读出的 22 字节(十六进制)软件反应
1
2
3
4
5

8.3 字节逐位对照(找到 UID 与编码的分界后填写)

字节位置0-34-78-1112-1516-1920-21
原装墨水卡
原装稀释剂卡
差异/规律

8.4 编码数据库记录

项目记录
EnCodeData 总条数
Contend 长度范围 / 字符集
前 5 条原文
与现场耗材数量的对应关系

九、术语对照(避免混淆)

实际物料软件中文软件英文相关文件名
油墨 / 墨水墨水、墨水缸、墨水型号、墨水类型InkINKVOC 的 INK 部分
稀释剂 / 溶剂溶剂、稀释、稀释阀Make-Up / VOCINKVOC 的 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

十一、下一步建议

  1. 优先做试验 1:拿到原装墨水卡与稀释剂卡的 22 字节实际内容 —— 这是整个研究的地基。
  2. 再向厂家索取三样(这是"必须用厂家芯片"的根源,也是唯一能拿到写入侧的途径): C:\Windows\Decode\Encode.exe、LDDataFile.db(含全部编码记录)、 墨水/稀释剂芯片的型号规格(频段、芯片类型、22 字节字段定义)。
  3. 拿到 Encode.exe 后,可对其做与本次相同的静态分析(PE 结构、字符串、常量扫描), 判断编码是"纯编号"还是含有算法校验。
  4. 若需 100% 确认校验强度,可在有 Encode.exe / LDDataFile.db 的机器上反汇编 MainForm.exe 的激活函数(切入点:用户ID 必须是8位 字符串的交叉引用)。