目标文件 D:\rxjh2025\client\YGOnline.exe · 静态逆向(pefile + capstone 32 位)。所有地址均为 VA(内存虚拟地址),基址 ImageBase = 0x00400000。
YBi.cfg 与 .aut 均为游戏原厂文件(非脚本生成);
游戏本体文本用 Big5 编码,而挂机助手插件的部分配置用 GBK。字符串在 exe 中整体混淆,无裸 GBK/Big5 明文。
| 功能 | 函数 VA | 大小 | 引用字符串 / 全局 | 说明 |
|---|---|---|---|---|
| .aut 加载 | 0x00A3EB90 | 0x2C0 | "%s\client\%s.aut" g:0x1821A70, 0x3BA1910 |
sprintf(根路径,账号名)→fopen→读版本字节0x6a(106)+ 8槽×0x5C4(1476)。调用者: 0xA2F288 |
| .aut 保存 | 0x00A448D0 | 0x120 | "%s\client\%s.aut" mode"wb"@0x1076F44 g:0x1821A70, 0x3BA1910 |
fopen "wb"→序列化→fwrite 0x2E20=11808B→fclose。被 7 个设置入口调用:0xA3FD7F 0xA400A1 0xA40D2E 0xA41121 0xA44D4D 0xA44DE5 0xA46036 |
| 块序列化 | 0x00A45870 | 0x5F0 | — | 填充 this+0x564(8 槽 ×1476 结构)。被保存函数 0xA448D0 内 0xA4496C 调用 |
| 序列化辅助 | 0x00A3AF80 | 0x70 | — | 读 this+0x343c / 0x3440 → 写 this+0x33b0 / 0x33b4(缓存字段) |
| .mhslot 加载 | 0x00A3EE50 | 0x1D0 | "%s.mhslot" g:0x39709F0 | 角色标记/装备槽存档读取 |
| .mhslot 保存 | 0x00A44860 | 0x70 | "%s.mhslot" g:0x39709F0 | 角色标记/装备槽存档写入 |
0x6A(1B) + 8 槽 × 0x5C4(1476B)。与 181 个 .aut 账号文件、0x3BA7C28 角色数组(步长 0x5C4)完全吻合。0x00A3F700 —— 助手中央命令/消息处理函数(主逻辑 size 0x2040,149 个内部 call)。
入口:mov eax,[ebp+8] → sub ecx,0xb → cmp [ebp-0x114],0x99 → ja 0xA41204
分发:movzx eax,byte ptr [edx+0xA41698] → jmp dword ptr [eax*4 + 0xA41588]
引用的标志性字符串:auto_play_on.bmp、auto_play.bmp、192.168.8.(IP 格式串)。
该函数的 this 经方法链传入(入口 mov [ebp-0xf8],ecx),内部引用全局 0x59200A4(主循环状态标志候选)。「开启挂机」即路由到某一 case 后设置对象内布尔成员。
| 窗口 / 按钮 | 函数 VA | 大小 | 特征字符串 |
|---|---|---|---|
| 主挂机窗口(play/stop/setup) | 0x00A2DCC0 | 0x1BB0 | auto_play.bmp / auto_stop.bmp / auto_setup.bmp / window_head.bmp |
| 扩展窗口(web/保存/退出) | 0x00A3C560 | 0x660 | auto_winEx_07.bmp / auto_save.bmp / auto_exit.bmp / web_btn_close.bmp |
| 设置按钮 | 0x00A46890 | 0x900 | auto_set_btn_click/over/n.bmp / system_select.bmp |
| 勾选框 | 0x00A47C70 | 0x440 | window_auto_check.bmp |
| 丹药窗口 | 0x00A480B0 | 0x490 | window_auto_dan.bmp |
| 物品窗口 | 0x00A48580 | 0x520 | window_auto_item.bmp |
| migo(宠物)窗口 | 0x00A48AA0 | 0x560 | window_auto_migo.bmp |
| 聊天 / 公会颜色窗口 | 0x00A46050 | 0x4B0 | window_auto_chat.bmp / munpa_color_save_*.bmp / close_btn_*.bmp |
| 聊天扩展窗口 | 0x00A49030 | 0xE70 | auto_winEx_06.bmp / auto_btn_chat_save/close/check.bmp |
| 选择/Buff 列表 | 0x00A2C8D0 | 0x800 | "SetSelectItem slot error" |
| Buff 列表 | 0x00A30480 | 0x420 | "AddBuffList slot error" |
| 掉落 Buff 列表 | 0x00A3AFF0 | 0x1B0 | "DeleteDropBuff slot error" |
| PK 日志 | 0x00A2FEA0 | 0x5E0 | pk_log.txt |
0x00A2D0D0(size 0x5B0,11 call)—— 引用 MAUC_YULGANG 与宏格式串 MG,%d,%s,... / BD,... / NT,... / DM,...,全局 0x183C538 / 0x39709F0 / 0x3BA1C18 / 0x3BA1DE8。疑似把助手设置编码成游戏宏命令发送。
四个小函数 0xA3B620 / 0xA3B6E0 / 0xA3B8B0 / 0xA3BBE0 均以 0x3BE3E68 为循环常量、循环上限 0x3A98=15000,与 movss xmm0,[0x107b820] 配合——疑似字符串/配置的解密或 CRC 校验例程(非指针)。
| 全局 VA | 类型 | 作用 | 出现 |
|---|---|---|---|
| 0x003B94788 | 读 | 助手管理器单例候选① | 0xA3C300 等 |
| 0x003B94798 | 读 | 助手管理器单例候选②(函数入口取 this) | 0xA35FA0 等 |
| 0x003B947B0 | 读 | 助手管理器单例候选③ | 0xA35FA0 等 |
| 0x003B947C0 | 读 | 助手管理器相关 | 0xA35FA0 等 |
| 0x0039709F0 | 存+读 | 玩家/角色对象单例(.mhslot/.aut 共用) | 0xA2D0D0/0xA3EE50/0xA44860 |
| 0x003BA1910 | 参 | 账号名字符串(sprintf 参数) | load/save |
| 0x001821A70 | 参 | 根路径/指针(sprintf 参数) | load/save |
| 0x0059200A4 | 读 | 主循环(0xA3F700)状态标志候选 | 0xA3F700 |
| 0x003BE3E68 | 值 | 混淆/校验种子常量(循环上限15000) | 0xA3B62x |
| 0x0011F4380 | 存+读 | GS 安全 cookie(每函数 prologue) | 全局 |
| 0x01076F44 | 串 | 模式串 "wb"(fopen) | 0xA448D0 |
| 0x00A41588 | 表 | 主分发跳转表(256×4) | 0xA3F700 |
| 0x003BA7C28 | 数组 | 角色槽位数组(步长 0x5C4,8 槽) | 逆向已知 |
静态结论:「开启挂机」不是一个独立的裸全局布尔,而是助手管理器对象内的成员字段,在点击 play 按钮 / 收到 start 命令时由 0xA3F700 的某个 case 写入。静态层面未出现单行 mov [ecx+off],1 的明确开关(标志位走成员写入或位域)。
给易语言外挂的落地思路:
[[0x3B94798]] 或 [[0x3B94788]](取 this 的全局)。易语言里即 读内存整数型(进程, 基址+偏移) 拿对象指针。this+offset 由 0 变 1)。0xA3F700 主分发(push 命令 ID=start 对应的 0x0B+idx),把 ecx 设为管理器 this——这是外挂「开启挂机 call」最典型的实现对齐方式。注:图片 723.jpg 经全盘检索未落盘到可读路径,无法直接读取其中地址;以上地图已覆盖助手模块全部汇编内存位置,供你对照图片中的偏移直接定位。