Initial import of IC.Rebuild

This commit is contained in:
2026-10-13 22:55:05 +08:00
commit 16d61f7a5e
87 changed files with 17054 additions and 0 deletions
@@ -0,0 +1,94 @@
# 两份 I-Ching-GL DLL 对比分析
日期:2026-10-11。范围:用户提供的两份 DLL 的静态文件、程序集元数据、接口与关键方法体可读性。原件未修改,目标程序集未执行,插件运行代码及已部署 0.1.5 未改动。
## 身份和构建差异
| 项目 | I-Ching-GL.dll(第一份) | I-Ching-GL (2).dll(第二份) |
| --- | --- | --- |
| 大小 | 5,811,712 字节 | 7,894,528 字节 |
| 程序集 / 文件版本 | 0.1.6.6 | 0.1.6.6 |
| InformationalVersion | 0.1.6.6+6e402483b7b629bdd57821bb9f4eb9f08701de0e | 相同 |
| 目标 | .NET 10,AMD64 DLL | 相同 |
| Dalamud 引用 | 15.0.3.6 | 15.0.3.6 |
| FFXIVClientStructs 引用 | 7.56.2.9458 | 7.56.2.9418 |
| ECommons 引用 | 3.2.1.17 | 3.2.1.17 |
| MVID | 36234178-ce88-4985-a78c-d2148d83f493 | bdcb5604-0284-4e0f-b9c9-fcaa9694c9c8 |
| 顶层类型数 | 1,933 | 2,724 |
| 含嵌套类型数 | 2,024 | 2,833 |
| 全 ASCII 名称类型数 | 152 | 200 |
第一份 SHA256:`DA648072A2CE0856B4884A332EFAC063FC8F0E03236D7D4DBC9334BF0B2A2AA8`。
第二份 SHA256:`CE269139FDFDB136BE382E10BE78E6E0BC346DEB335E9D99DF2E80097BD76CBF`。
结论:不是重复文件,也不是仅改了文件名。尽管版本与构建标识相同,依赖及声明有实际差异。不能仅用文件更大、复制时间或共享版本号判断新旧顺序和修复情况。本机当前 FFXIVClientStructs 为 7.56.2.9136,与两份引用版本均不同。
## 已确认的声明差异
递归比较两份全 ASCII 名称类型的基类、接口、字段(含偏移/标志)、方法签名及声明标志,不比较不可读的方法实现。
第二份独有的命名类型包括:
- `NekoVerifierLib`:NekoVerifierMain、Service、VerifyWindow、VerifyClient、PlayerData 及协议类型等。
- `OtpNet`:HOTP/TOTP、密钥和时间校正相关类型。
- `RSAsharp`:RSA_PEM、RSA_Util。
- `DataSender` 和额外编译器生成类型。
第二份额外引用了 System.Net.Http、System.Security.Cryptography、System.Runtime.Numerics、System.Linq.Expressions、System.Text.Encoding.Extensions、Microsoft.Win32.Registry;第一份引用集合未包含这些程序集。
共有类型中可见差异只有四处:
1. `SamplePlugin.Plugin`:第二份多了静态 `PVPWhiteList` 字段及静态构造器。
2. `SamplePlugin.Windows.ConfigWindow`:第二份多了 `ExecuteBoardMarketInternal(string,string)` 方法声明。
3. ConfigWindow 的编译器生成类型:DrawCommandGenerator 相关成员编号由 77 变为 78。
4. PrivateImplementationDetails:第二份多了一项长度为 15 的静态数据声明。
命名表明第二份包含额外验证/密码相关组件及少量插件入口差异;仅凭声明不能确定其运行时是否被调用、传送什么数据、PVPWhiteList 的内容或作用,亦不能确定是原作者不同打包还是其他来源处理。类型数增加不等于增加同等数量的游戏功能。
## 重点功能对照
| 功能 | 两份 DLL 的可核实结果 | 对重建的意义 |
| --- | --- | --- |
| 14 目标半径 | ActorRadiusHook 的字段、方法、委托声明一致,Detour 为 float(ulong,byte) | 没有可读取的新落点公式,不能判断哪份修复了 16461 |
| 9 高度偏移 | YMove、两条移动委托、层数相关声明一致 | 无法从这两份确认偏移索引或调用后恢复行为;保持已要求的按钮交互 |
| 16 突进无位移 | 两份均保留旧五参数委托声明 | 不能替代当前已实测的六参数共用入口 |
| 8 状态处理 | StatusCheck、普通/GL 委托、结构布局声明一致 | 第二份未补出可读取的签名值或网络长度依据 |
| 其他 Hook 与配置 | 两份 SamplePlugin.Hook 类型(含嵌套声明)及 Configuration 没有上述元数据差异 | 声明相同不代表函数体相同,不足以回退已验证功能 |
两份都保留状态结构的旧声明矛盾:EntryData 偏移 20、固定 240 字节;条目声明 Size=8,但偏移 8 的 uint 字段占到 12 字节。它是插件声明,不是当前游戏包布局的可靠证明。8 继续保持未适配。
## 方法体可读性与独立检查
在相同的 21 个重点方法中:第一份 18 个读取错误、3 个明显可疑;第二份 19 个读取错误、2 个明显可疑。第二份曾有一个 CombineOffsets 方法被 Cecil 形式上解析成功,但 castclass、stsfld 和分支等指令缺少必须的操作数,不能作为有效 IL。审计脚本已增加缺失操作数检查。
另使用 .NET 自带 System.Reflection.Metadata/PEReader 独立读取方法头,避免仅凭 Cecil 报错下结论:
| 方法 | 第一份 | 第二份 |
| --- | --- | --- |
| SendNormalMoveDetour | Invalid method header: 0xD1 | Invalid method header: 0x55 |
| SendCombatMoveDetour | Invalid method header: 0xA1 | Invalid method header: 0xF1 |
| ActorRadiusDetour | 方法头可形式上解析为 20 字节,但 Cecil 无法解析其 IL | 方法头可形式上解析为 45 字节,但 Cecil 无法解析其 IL |
两份都存在大量非 ASCII 混淆名称、异常关键方法体以及相同业务名称但链接到不同随机程序集名的资源。整体表现与方法体保护/混淆一致;未确定具体保护方案,未证明每个异常的原因,也不能仅由此排除损坏。未将形式上能读到的随机 IL 当作有效算法,未执行初始化器。
## 当前能用与不能用的内容
可用:对照接口形状、结构声明、依赖版本、存在的功能类型和不同打包的差异。
尚不可用:还原 14 的半径/落点公式、确认 9 的具体写入顺序、取得 8 的可用原生签名和网络包边界、判断验证组件的真实运行行为。第二份没有解除这些限制。
本次以分析为止,当前 0.1.5 的运行逻辑与部署不变。14 的实际落点仍应以 16461 的现场复测为准。
## 证据文件与复现
- `2026-10-11-original-dll-metadata.json`:第一份重点接口及读取结果。
- `2026-10-11-original-dll-2-metadata.json`:第二份相同范围。
- `2026-10-11-two-dll-comparison.json`:两份程序集信息、可读类型完整声明和差异。
在工作区根目录执行:
```powershell
./IC.Rebuild/Tools/ManagedAudit/Audit.ps1 -AssemblyPath './IC/I-Ching-GL (2).dll' -OutputPath './IC.Rebuild/diagnostics/2026-10-11-original-dll-2-metadata.json'
./IC.Rebuild/Tools/ManagedAudit/Compare.ps1 -FirstPath './IC/I-Ching-GL.dll' -SecondPath './IC/I-Ching-GL (2).dll' -OutputPath './IC.Rebuild/diagnostics/2026-10-11-two-dll-comparison.json'
```