docs:补上 90CN.dll 自校验 CRC 工具的文档说明
- 新增 docs/客户端补丁与CRC校验.md:SelfCrcSlot 结构、CRC32 算法与种子坑、 槽位为什么只在 .data/.rdata 里找、info/verify/patch 用法与退出码、 build_90cn.ps1 集成、与「服务端 DLL 指纹」的区别、六类故障排查 - 新增 client-patch/tools/README.md:脚本清单与常用命令速查 - docs/README.md:文档索引与上手路径补一条 - 根 README:关键设计说明补「客户端自校验(CRC32)」小节,文档索引补一行 - 90CN.cpp:清掉过期的重复注释(旧的 patch_selfcrc.py / .text 段说法),与实现对齐
This commit is contained in:
1 parent
9bdaf28683
commit
da502b3524
5 files changed
+174
-8
No files matched your search
@@ -13159,16 +13159,11 @@ static bool VerifyBoundMoviePresent()
|
||||
|
||||
// ── 自校验(self-integrity-crc)────────────────────────────────────────
|
||||
//
|
||||
// 构建后由 patch_selfcrc.py 把自身 .text 段的 CRC32 写进 g_selfCrcExpected。
|
||||
// 运行时重新读取磁盘上的本 DLL,算 .text 段 CRC 并比对:
|
||||
// 任何字节被改动(比如 patch 掉校验分支)→ CRC 不符 → 客户端无法启动。
|
||||
// 占位初值必须是 0xC0DEC0DE,脚本靠它定位写入位置。
|
||||
// ── 自校验(self-integrity-crc)────────────────────────────────────────
|
||||
//
|
||||
// 构建后由 patch_dll_crc.py 写入两个字段:
|
||||
// 构建后由 tools/patch_dll_crc.py 写入两个字段:
|
||||
// offset = 本结构 expected 字段在文件中的绝对偏移
|
||||
// expected = 整个文件的 CRC32(计算时跳过 [offset, offset+4),避免自指)
|
||||
// 运行时重新读盘、用同样规则重算并比对;任何字节被改动 → 不符 → 客户端无法启动。
|
||||
// 占位初值必须是 0xC0DEC0DE,脚本靠它定位写入位置(详见 docs/客户端补丁与CRC校验.md)。
|
||||
static struct SelfCrcSlot {
|
||||
// volatile:这三个字段只由构建后脚本改文件字节,代码里从不写。
|
||||
// 不加 volatile 时 /O2 会把 offset/expected 当常量折叠成 0,补丁写对了也读不到。
|
||||
@@ -14996,7 +14991,7 @@ DWORD WINAPI InstallTransportWorkerInner(void*)
|
||||
bool tclsInstalled = InstallTclsCompatibility();
|
||||
LogLine("TCLS early bootstrap result=%d", tclsInstalled);
|
||||
|
||||
// 自校验:本 DLL 的 .text 段 CRC 必须与构建时写入的值一致。
|
||||
// 自校验:本 DLL 整个文件的 CRC32 必须与构建时写入的值一致。
|
||||
if (!VerifySelfIntegrity()) {
|
||||
LogLine("self crc check failed: terminating client");
|
||||
MessageBoxW(nullptr,
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
# client-patch/tools
|
||||
|
||||
编译与构建后处理脚本。完整说明见 [docs/客户端补丁与CRC校验.md](../../docs/客户端补丁与CRC校验.md)。
|
||||
|
||||
| 文件 | 用途 |
|
||||
|------|------|
|
||||
| `build_90cn.bat` | 双击入口,转调下面的 ps1 |
|
||||
| `build_90cn.ps1` | MSBuild 编 `Release\|Win32` → 收集产物 → 调 `patch_dll_crc.py` 写自校验 CRC;`-SkipCrc` 可跳过(仅调编译用,别拿去发布) |
|
||||
| `patch_dll_crc.py` | 补齐 / 校验 `90CN.dll` 自校验 CRC32 |
|
||||
|
||||
## 常用命令
|
||||
|
||||
```bash
|
||||
# 编 DLL 并自动补 CRC
|
||||
powershell -NoProfile -ExecutionPolicy Bypass -File build_90cn.ps1
|
||||
|
||||
# 只处理已有的 DLL
|
||||
python patch_dll_crc.py info <dll> # 看节表与槽位
|
||||
python patch_dll_crc.py verify <dll> # 校验当前 CRC
|
||||
python patch_dll_crc.py patch <dll> # 重写 CRC(-o 可输出到副本)
|
||||
```
|
||||
|
||||
退出码:`0` 通过 / `1` 校验失败或找不到槽位 / `2` 用法错误。
|
||||
|
||||
> ⚠️ 改完 DLL 除了补 CRC,还要**重编服务端**——`DNF90Server.exe` 在编译期绑定了 DLL 的 SHA-256,指纹不配套会被拒绝连接。
|
||||
Reference in new issue
Block a user