================================================================
 安生云盾 · 客户端套件（32位/64位 双位数，解压即用）
================================================================

本套件只有一种接入方式：改地址模式（不注入）
  玩家端文件里不会出现你的真实服务器IP；把登录器/游戏配置里的服务器地址
  改成后台分配的【接入IP】即可（本地代理同时监听你原来的端口，一般只改IP）。
  因为不注入，兼容 HShield 等会拦截注入的反外挂。

为什么需要 32 位组件：DNF / 传奇等客户端多是【32位】程序，64位组件注不进去、
也跑不起来。加盾工具会自动识别游戏exe位数并选用对应组件。

--------------------------------------------------------------
 一、目录内容（解压后直接双击工具就能用）
--------------------------------------------------------------
加盾工具-自动识别位数.exe  ★ 打包工具(双击运行, 自动识别32/64位)
面板地址配置               已内置在工具里(https://safe.ansng.cn/api.php), 没有配置文件
launcher.exe / launcher32.exe   64位 / 32位 启动器(玩家双击的那个)
agent.exe  / agent32.exe        64位 / 32位 本地代理(启动器自动拉起)
acclient32.exe             32位封挂客户端(可选, 见封挂系统)
说明.txt                   本文件
hook32/hook32.c            旧版32位 Hook 源码(历史留存, 现在不再使用)
launcher32/ agent32/ acclient32/ 加盾工具-双位数/   各组件源码(go)
发布包-客户端32位.zip       以上全部的整包(备份用)

--------------------------------------------------------------
 二、怎么用
--------------------------------------------------------------
双击 加盾工具-自动识别位数.exe → 输入面板账号密码(可记住) → 把游戏程序放进它旁边的「加盾包」文件夹 → 回车直接在文件夹里生成盾文件(不再打 zip)。
（工具会把后台【全部规则】打进包里，不用挑端口、不用选模式。）

生成后的包内文件: 游戏exe + 游戏名【盾】.exe(启动器, 带游戏图标) + agent.exe
+ shield.ini(加密配置) + 使用说明.txt。
整个文件夹直接发给玩家，双击「游戏名【盾】.exe」进游戏（启动器自动起本地代理，
游戏退出后本地代理自动关闭）。

你需要做的（只做一次）：把你自己登录器/游戏配置里的服务器地址改成工具给出的
【接入IP】。工具窗口会打印逐条对照：
    接入端口 10000  <- 你的 1.1.1.1:7000   (可只改IP: 登录器里用 7000 端口也行)
    接入端口 10001  <- 你的 2.2.2.2:7000  【端口重复, 这条只能用接入端口】
端口重复(同一个账号里两条规则用了同一端口、不同服务器IP)的那几条必须用接入端口。

--------------------------------------------------------------
 三、客户后台改端口，不用重新发包（热更新）
--------------------------------------------------------------
本地代理启动时会用包内的代理账号向面板拉一次最新规则（之后每5分钟一次）。**以面板为准**：
  · 客户在后台【加了端口/加了新服务器】→ 玩家重开一次启动器就生效，不用重新发包；
  · 客户在后台【删掉端口 / 改了端口或服务器】→ 同样生效：本地代理会**停掉那个旧端口的监听**
    （正在游戏的玩家不会被踢，只是这个端口不再接受新连接），老包里的旧配置不会再"复活"；
  · 面板连不上 / 玩家断网 → 自动用包内配置，不影响进游戏；
  · 续费、到期、流量、踢下线 本来就在节点侧实时生效(≤60秒)，与包无关。

--------------------------------------------------------------
 三之二、出问题怎么看（本地代理日志）
--------------------------------------------------------------
本地代理会在游戏目录写一份 shield_agent.log（**每次启动重写**；**日志里不会出现任何玩家/源机IP**：
游戏服IP/节点IP 一律显示成 x.x.x.x，只有 127.x 接入IP 和端口号），内容形如：
    接入 127.0.100.89:10000 TCP -> 游戏服 8188
    接入 127.0.100.89:8188  TCP -> 游戏服 8188
    [连接] 端口 8188 <- 127.0.0.1:59733
    [热更新] 已同步面板配置: 3 条规则, 新增监听 1 个端口
排查口径：
  · 日志里有 "接入 127.0.100.x:那个端口" → 盾这边已就绪；玩家还连不上 = 游戏端/登录器
    里的地址没改到接入IP（DNF 的登录服和频道服是两个地方，都要改）；
  · 日志里根本没那个端口 → 是面板规则/包的问题（用新工具重新打包即可，现在默认全带）；
  · 日志里 "TCP监听 ... 失败: ..." → 那个端口在玩家电脑上被别的程序占用了。
另外：启动器窗口在游戏退出时会自动看一眼日志 —— 如果**本次一条连接记录都没有**，
会直接提示「本次没有检测到流量经过盾: 请确认登录器/游戏里的服务器地址已改成盾的接入IP」，
玩家（或你远程看一眼截图）就能自己判断是"地址没改"而不是"盾坏了"。


--------------------------------------------------------------
 三之三、玩家IP 在哪里看
--------------------------------------------------------------
· 面板「在线玩家」列表里显示的就是**玩家的公网IP**（由盾节点侧统计，玩家本机直连盾节点，
  节点天然能看到），查人/封人/日志统计都用这里，不需要任何额外配置。
· 你的**游戏服务器本身**看到的连接来源是**盾机出口IP**（每次连接随机），这是隐藏源站的必要代价；
  如果游戏服确实需要自己识别玩家IP（服务端要做白名单/封禁），请联系商家评估——
  不同服务端的支持情况差别很大，「同一个端口既监听又发布」的服务端（很多 DNF 端就是这样）通常做不到。

--------------------------------------------------------------
 三之四、桌面快捷方式
--------------------------------------------------------------
启动器每次启动都会检查玩家**桌面**上有没有同名快捷方式, 没有就自动创建一个
(指向启动器本身、用游戏图标) —— 玩家下次直接双击桌面图标即可, 不用再进游戏目录找。
快捷方式只在"没有"的时候创建, 已有就不动它; 创建失败不影响游戏。

--------------------------------------------------------------
 三之五、远程更新(给玩家端推补丁, 不用重发包)
--------------------------------------------------------------
客户后台 →【远程更新】里填一条**补丁 ZIP 直链**(你自己传网盘/服务器)和一个**版本标识**(如 v2), 打开开关即可:
· 玩家端启动器每次启动会问一次面板, 发现版本变了就**自己下载 → 解压覆盖 → 删掉压缩包 → 自动重启盾程序**, 玩家什么都不用做;
· 下载走**你自己的地址**, 不占我们节点带宽, 也**不计你的流量**; 不限大小;
· **只支持 ZIP**; 直链必须是"点开就直接下载"的地址(网盘分享页/需要点按钮的页面不行, 后台的"只检测链接"能帮你判断);
· 更新包里的路径照着加盾包文件夹写(比如 data\xxx.pak), 包根目录直接放文件也行;
· 包里的 **启动器 / agent.exe / shield.ini / Hook DLL 会被自动跳过**(盾自己的文件不允许被补丁覆盖); 内容跟本地一模一样的文件也不会白写一遍;
· **每次改了压缩包内容, 记得把版本标识改一下**(v2→v3), 否则玩家端以为已是最新, 不会重新下载;
· 正在被游戏占用的文件(登录器/主程序)这次会跳过并提示"下次启动自动更新", 不会报错、也不会卡住进游戏;
· 链接坏了/下不完整 也不会影响玩家进游戏, 启动器打印一行提示后照常启动。
--------------------------------------------------------------
 四、实测记录（2026-09-26 本地全链路, 脚本 .build/e2e_addr.sh / e2e_dup.sh）
--------------------------------------------------------------
链路: 32位测试游戏 -> 启动器 + 本地代理(127.0.100.x) -> 节点SOCKS5 -> 模拟游戏服
· 打个包就能连: 登录器只改IP、端口沿用源机端口 → 连接成功, 游戏收到
  游戏侧收到正常回包(链路完整) ✓
· 【关键】包打好之后，客户又在后台加了一个端口(21002) → 玩家没换包,
  重开启动器后连新端口一样通(热更新) ✓
· 面板停掉时，老端口照常能连(包内配置兜底)、本地代理不退出 ✓
· 端口重复场景: 两台源机都用 7000 → 工具提示并给出各自接入端口,
  重复端口不监听(避免串线), 两条规则分别正确转发到各自源机 ✓
· 包内校验: 不含 Hook DLL、shield.ini 无明文源机IP、使用说明无源机IP/端口 ✓
· 面板回归: 118 项全绿; client_cfg 接口错密钥被拒 ✓

--------------------------------------------------------------
 五、DNF 特别注意
--------------------------------------------------------------
1. 游戏目录里如果有 HShield（AhnLab HackShield）文件夹/进程，本模式不注入，不受影响；
   若仍报错，先确认 HShield 没有妨碍本地代理(把整个游戏目录加白名单)。
2. DNF 会连"登录服 + 频道服"多个端口：后台规则里把这些端口都加上即可，
   加完不用重新发包（热更新），玩家重开启动器生效。
3. 位数自查（把路径换成游戏主程序）：
   powershell -NoProfile -Command "$p='游戏.exe'; $b=[IO.File]::ReadAllBytes($p); $o=[BitConverter]::ToInt32($b,0x3C); 'Machine=0x{0:X4}' -f [BitConverter]::ToUInt16($b,$o+4)"
   0x014C=32位  0x8664=64位

--------------------------------------------------------------
 六、注意
--------------------------------------------------------------
· 老版本用 Hook 注入的加盾包不受影响，仍可继续用；但新工具不再生成注入模式的包。
· 本地自测时源机(游戏服)IP 不要填 127.0.0.1，用公网IP更直观。
· 本地代理启动时需要访问面板做热更新；若你的面板要求 HTTPS，请确认服务器证书正常
  （拉不到只会退回包内配置，不会影响进游戏）。
================================================================

--------------------------------------------------------------
 附、系统兼容性(Win7 / Win8 / Win10 / Win11)
--------------------------------------------------------------
本套件里的所有 Windows 程序都使用 Go 1.20 编译 —— 这是**最后支持 Windows 7 / 8 / Server 2008-2012 的版本**
(Go 1.21 起编译出的程序依赖 Win10 才有的 bcryptprimitives.dll, 在 Win7 上会直接启动失败)。
实测确认: launcher / agent 的 PE 子系统版本 = 6.1(Win7), 不依赖任何 Win10 专有 DLL。
· Win7 建议打齐 SP1 与补丁(Win7 自带 TLS 1.0, 面板是 HTTPS, 打齐补丁后 TLS 1.2 也正常);
· 64 位系统优先用 launcher.exe/agent.exe(64位), 32 位系统或 32 位游戏用 launcher32/agent32;
· 加盾工具(打包用)同样支持 Win7。
