设备与封禁
设备指纹与封禁
客户端生成硬件、复合与候选指纹,服务端只对精确硬件指纹封禁;弱指纹、候选与 IP 只记录不自动封。
封禁在插件里只做后端:证据、注册表、命令与落盘。它不是反作弊,而是一个「把这个设备挡在门外」 的辅助信号;真正的接入点(登录/注册)在项目自己的登录层。
证据
FCrossingDeviceEvidence
HardwareKey 硬件指纹(精确封禁用)
CompositeKey 复合指纹(换硬件后仍可能相似)
Candidates[] 候选集合(只记录)
Platform Win64 / Android / ...
Version 指纹算法版本(CRSDEV/1)
bWeak 弱指纹标记(不参与永久封)HardwareKey 是对一组稳定硬件信号做的 SHA-256,由 UCrossingDeviceFingerprintLibrary 在客户端生成;
CompositeKey 混入更多可变信号,用来在人工审查时关联。算法从 TFAC_FUCLB 的指纹逻辑移植。
注册表
UCrossingDeviceRegistrySubsystem (仅服务端)
启动时读 Saved/CrossingNet/Devices.json
每次注册写回(临时文件 + rename,原子替换)| 能力 | 说明 |
|---|---|
RegisterEvidence | 记录这台设备最近一次登录的账号、IP、时间 |
IsDeviceBanned | 按硬件指纹判断 |
BanDevice / UnbanDevice | 封/解,带时长、原因、操作人 |
WasDeviceBanned | 历史记录 |
| 候选指纹 | 只记录,不自动封 |
客户端启动时不会初始化注册表:IsServerSide 检查挡住,控制台命令在客户端也直接拒绝。
命令
CrossingNet.DeviceBan <deviceKey|playerGuid> [minutes] [reason]
CrossingNet.DeviceUnban <deviceKey>
CrossingNet.DeviceInfo <deviceKey|playerGuid>
CrossingNet.DeviceList [banned]minutes=0 是永久;默认只封精确硬件指纹,不动候选。
策略边界
| 规则 | 理由 |
|---|---|
| 弱指纹不得永久封 | 换内存条就换指纹,永久封会误伤 |
| 候选指纹只记录 | 相似不等于同一个人,进人工审查 |
| IP 只记录不自动封 | 共享出口一封一大片 |
| 指纹不是反作弊 | 客户端生成的证据可以被伪造,它只提高换号成本 |
| 拒绝点在项目登录层 | 插件只在 Banned(4004)时给出信号 |
已知限制
- 指纹由客户端生成,改客户端就能伪造;不要当唯一依据
- 跨进程一致性依赖大厅与房间读到同一份
Devices.json - 没有「按设备限制并发登录」规则,只做封禁判断
- 仓库层尚未做跨进程验证