.版本 2 '══════════════════════════════════════════════════════════════════ ' 开关内挂丸(精易模块版) 2026-09-25 ' 纯精易模块:只用 内存_读整数型 / 置入代码,无大漠、无 API 调用 '══════════════════════════════════════════════════════════════════ ' ▎★ 本次最大的纠错:点按钮走的根本不是 0x682880 ' ' 前面几版一直在 0x682880「命令执行器」上打转,那是另一个函数, ' 它分派出的 cmd 0x31/0x32 handler 是 0x683834 / 0x683E29, ' 而 0x683834 第一句就读 [0x3C441BC + 0x54C0] → 0/-1 都踩 64KB 禁区 → 必崩。 ' 这恰好反证了:**点按钮不该走那条路**。 ' ' 真正点按钮的路径(来源:助手验证_极简版_易语言.txt v3.2,实机已验证): ' 助手窗口 = [[NPC基址] + 0x414] ' 打开内挂丸面板后才会写入 ' 按钮 = [助手窗口 + 偏移] ' 3938=开始挂机 393C=停止挂机 ' 父窗口 = [按钮 + 4] ' 点击 = push 0 → push 命令ID → push 0x3F4 ' → ecx = 父窗口 → call [父窗口虚表 + 4] ' (父窗口虚表 = 0x10A20F8,槽1 = 0xA3F3D0,0x3F4 分支调用 0xA3F700) ' ' ▎机器码字节规则(v3.2 踩过的坑,照抄别改) ' 104 = 0x68 = push imm32 → { 104, 244, 3, 0, 0 } = push 0x3F4 ✓ ' 106 = 0x6A = push imm8 → { 106, 49 } = push 0x31 开始挂机 ✓ ' 若把 0x31 写成 104 形式(68 31 00 00 00)会把下一条吃掉,整段错位 ✗ ' ' ▎★ 死规矩:父窗口 必须是第一个局部变量 ' 机器码 mov ecx,[ebp-4] 取的就是第一个局部变量,顺序变了就取错值。 ' 要加新局部变量,请把 父窗口 放最前面,其余往后排。 ' ' ▎用法 ' 开关内挂丸 (31) 开(开始挂机) ← 走实机验证过的路径 ' 开关内挂丸 (32) 关(停止挂机) '══════════════════════════════════════════════════════════════════ ' ──────────────────────────────────────── ' 开关内挂丸:31 = 开 32 = 关 ' ──────────────────────────────────────── .子程序 开关内挂丸, 逻辑型, 公开, 31开 32关 .参数 状态, 整数型, , 31是开 32是关 .局部变量 父窗口, 整数型 ' ★ 必须第一个,别挪位 .局部变量 助手窗口, 整数型 .局部变量 按钮, 整数型 .局部变量 偏移, 整数型 ' 助手窗口内偏移:3938 = 开始挂机(0x31) 393C = 停止挂机(0x32) .如果 (状态 = 31) 偏移 = 3938 .否则 偏移 = 393C .如果结束 助手窗口 = 内存_读整数型 (全局_进程句柄, 内存_读整数型 (全局_进程句柄, #NPC基址值) + 十六到十 (“414”)) .如果真 (助手窗口 = 0 或 助手窗口 = -1) 写日志 (自定义时间 () + “内挂丸失败【助手窗口未创建,先在游戏里打开内挂丸面板】” + #换行符) 返回 (假) .如果真结束 按钮 = 内存_读整数型 (全局_进程句柄, 助手窗口 + 偏移) .如果真 (按钮 = 0 或 按钮 = -1) 写日志 (自定义时间 () + “内挂丸失败【按钮=0 助手窗口=” + 到文本 (助手窗口) + “】” + #换行符) 返回 (假) .如果真结束 父窗口 = 内存_读整数型 (全局_进程句柄, 按钮 + 4) .如果真 (父窗口 = 0 或 父窗口 = -1) 写日志 (自定义时间 () + “内挂丸失败【父窗口=0】” + #换行符) 返回 (假) .如果真结束 写日志 (自定义时间 () + “链路【窗口=” + 到文本 (助手窗口) + “ 按钮=” + 到文本 (按钮) + “ 父窗口=” + 到文本 (父窗口) + “ 虚表=” + 十到十六 (内存_读整数型 (全局_进程句柄, 父窗口)) + “】” + #换行符) ' ── 点击机器码:push 0 / push 命令ID / push 0x3F4 / ecx=父窗口 / call [虚表+4] ── .如果 (状态 = 31) 置入代码 ({ 96 }) ' 60 pushad 置入代码 ({ 106, 0 }) ' 6A 00 push 0 lParam 置入代码 ({ 106, 49 }) ' 6A 31 push 0x31 开始挂机 置入代码 ({ 104, 244, 3, 0, 0 }) ' 68 F4 03 00 00 push 0x3F4 msg 置入代码 ({ 139, 77, 252 }) ' 8B 4D FC mov ecx,[ebp-4] 父窗口 置入代码 ({ 139, 17 }) ' 8B 11 mov edx,[ecx] 置入代码 ({ 255, 82, 4 }) ' FF 52 04 call [edx+4] → 0xA3F3D0 置入代码 ({ 97 }) ' 61 popad .否则 置入代码 ({ 96 }) 置入代码 ({ 106, 0 }) 置入代码 ({ 106, 50 }) ' 6A 32 push 0x32 停止挂机 置入代码 ({ 104, 244, 3, 0, 0 }) 置入代码 ({ 139, 77, 252 }) 置入代码 ({ 139, 17 }) 置入代码 ({ 255, 82, 4 }) 置入代码 ({ 97 }) .如果结束 写日志 (自定义时间 () + “内挂丸【” + 到文本 (状态) + “】命令已发出” + #换行符) 返回 (真) ' ──────────────────────────────────────── ' 通用:点助手窗口里任意偏移的按钮 ' 实测可用的偏移(v3.2 已验证): ' 3938 开始挂机(0x31) 393C 停止挂机(0x32) ' 37F8 设置(0x33) 37FC 关闭窗口(0x34) ' 3940 保存(0x35) 3800 取消(0x36) ' 39E8 弹窗确定(0xA3) 39EC 弹窗取消(0xA4) ' 用法: 内挂丸_点按钮 ("3938") 开 ' 内挂丸_点按钮 ("393C") 关 ' ──────────────────────────────────────── .子程序 内挂丸_点按钮, 逻辑型, 公开, 传助手窗口内偏移(十六进制文本) .参数 偏移文本, 文本型 .局部变量 父窗口, 整数型 ' ★ 必须第一个 .局部变量 助手窗口, 整数型 .局部变量 按钮, 整数型 .局部变量 偏移, 整数型 助手窗口 = 内存_读整数型 (全局_进程句柄, 内存_读整数型 (全局_进程句柄, #NPC基址值) + 十六到十 (“414”)) .如果真 (助手窗口 = 0 或 助手窗口 = -1) 写日志 (自定义时间 () + “点按钮失败【助手窗口未创建】” + #换行符) 返回 (假) .如果真结束 按钮 = 内存_读整数型 (全局_进程句柄, 助手窗口 + 十六到十 (偏移文本)) .如果真 (按钮 = 0 或 按钮 = -1) 写日志 (自定义时间 () + “点按钮失败【” + 偏移文本 + “ 处按钮=0】” + #换行符) 返回 (假) .如果真结束 父窗口 = 内存_读整数型 (全局_进程句柄, 按钮 + 4) .如果真 (父窗口 = 0 或 父窗口 = -1) 写日志 (自定义时间 () + “点按钮失败【父窗口=0】” + #换行符) 返回 (假) .如果真结束 置入代码 ({ 96 }) 置入代码 ({ 106, 0 }) 置入代码 ({ 106, 49 }) ' 默认 push 0x31,按需改这里 置入代码 ({ 104, 244, 3, 0, 0 }) 置入代码 ({ 139, 77, 252 }) 置入代码 ({ 139, 17 }) 置入代码 ({ 255, 82, 4 }) 置入代码 ({ 97 }) 写日志 (自定义时间 () + “点按钮【” + 偏移文本 + “】已发出” + #换行符) 返回 (真)