.版本 2 '════════════════════════════════════════════════════════ ' 内挂丸开关(定案版 v2 2026-09-25) ' 池基址 0x03C35758 = 63133528 ' 功能号 49 = 啟動內掛丸 50 = 停止內掛丸 ' ecx = 控件对象本身(不是 控件对象+4) ' CALL = 0x682880 + 0x400000 ' 用法: 开关内挂丸 (31) 开 ' 开关内挂丸 (32) 关 '──────────────────────────────────────────────────────── ' 实测记录: ' · 进程A:槽1376=49、槽1377=50、槽362=50 ' · 进程B:只剩 槽5131=50,开关位0,类型24 ' → 槽位每次启动都变,且面板没打开过时 49 不会出现 '════════════════════════════════════════════════════════ .子程序 开关内挂丸, 逻辑型 .参数 状态, 整数型 ' 31=开 32=关 .局部变量 句柄, 整数型 .局部变量 池基址, 整数型 .局部变量 CALL地址, 整数型 .局部变量 S, 整数型 .局部变量 控件, 整数型 .局部变量 功能号, 整数型 .局部变量 开关位, 整数型 .局部变量 计数49, 整数型 .局部变量 计数50, 整数型 句柄 = 全局_进程句柄 池基址 = 63133528 ' 0x03C35758 CALL地址 = 到整数 (“682880”) + 到整数 (“400000”) ' 0x482880 .如果真 (状态 = 31) 功能号 = 49 .否则 功能号 = 50 .如果真结束 写日志 (“── 开关内挂丸 目标功能号=” + 到文本 (功能号) + “ ──” + #换行符) ' ── 先摸底:池里到底有没有 49 / 50 ── 计数49 = 0 计数50 = 0 S = 0 .判断循环首 (S < 14998) 控件 = 内存_读整数型 (句柄, 池基址 + S × 4) .如果真 (控件 > 0 且 控件 ≠ 65535) .如果真 (内存_读整数型 (句柄, 控件 + 860) = 49) ' 0x364 计数49 = 计数49 + 1 .如果真结束 .如果真 (内存_读整数型 (句柄, 控件 + 860) = 50) 计数50 = 计数50 + 1 .如果真结束 .如果真结束 S = S + 1 .判断循环尾 () 写日志 (“摸底:49(启动) × ” + 到文本 (计数49) + “ 50(停止) × ” + 到文本 (计数50) + #换行符) .如果真 (状态 = 31 且 计数49 = 0) 写日志 (“✗ 池里没有 49(啟動內掛丸),说明内挂丸面板从没打开过。” + #换行符) 写日志 (“ 请先在游戏里手动点开一次內掛丸界面,再回来调用。” + #换行符) 返回 (假) .如果真结束 S = 0 .判断循环首 (S < 14998) ' 池容量 0x3A98 控件 = 内存_读整数型 (句柄, 池基址 + S × 4) .如果真 (控件 > 0 且 控件 ≠ 65535) .如果真 (内存_读整数型 (句柄, 控件 + 860) = 功能号) ' 0x364 功能号 写日志 (“命中 槽” + 到文本 (S) + “ 控件=” + 到文本 (控件) + #换行符) 开关位 = 内存_读整数型 (句柄, 控件 + 13513) ' 0x34C9 开关位 写日志 (“开关位=” + 到文本 (开关位) + “(启动指令要求为 0,非 0 会被静默忽略)” + #换行符) .如果真 (功能号 = 49 且 开关位 ≠ 0) 写日志 (“已经是开启状态,命令不发” + #换行符) 返回 (假) .如果真结束 ' ── 汇编支持库 ── push 0 ' 附参数,先压 push 功能号 ' 命令字,后压 → 落在 [ebp+8] mov ecx, 控件 ' ecx = 控件对象本身,不要 +4 mov eax, CALL地址 call eax ' 必须间接调用,不能写 call 绝对地址 写日志 (“命令已发出” + #换行符) 返回 (真) .如果真结束 .如果真结束 S = S + 1 .判断循环尾 () 写日志 (“没找到功能号 ” + 到文本 (功能号) + “ 的控件。” + #换行符) 写日志 (“检查:1) 游戏是否进到角色 2) 内挂丸面板是否打开看一眼过” + #换行符) 返回 (假) '════════════════════════════════════════════════════════ ' 扫描内挂丸控件(增强版 v2) ' 一次跑完输出三块: ' ① 全池有效控件数(判断池有没有初始化) ' ② 功能号直方图(出现 ≥2 次的,找 49/50 在哪儿附近) ' ③ 49/50 控件的完整详情 ' 只读,不发命令 '════════════════════════════════════════════════════════ .子程序 扫描内挂丸 .局部变量 句柄, 整数型 .局部变量 池基址, 整数型 .局部变量 S, 整数型 .局部变量 控件, 整数型 .局部变量 功能号, 整数型 .局部变量 开关位, 整数型 .局部变量 类型字, 整数型 .局部变量 计数, 整数型, , "256" .局部变量 非0数, 整数型 .局部变量 I, 整数型 .局部变量 次数, 整数型 .局部变量 槽号, 整数型 句柄 = 全局_进程句柄 池基址 = 63133528 非0数 = 0 写日志 (“── 扫描内挂丸控件(增强版)──” + #换行符) ' ── 第一遍:统计 ── S = 0 .判断循环首 (S < 14998) 控件 = 内存_读整数型 (句柄, 池基址 + S × 4) .如果真 (控件 > 0 且 控件 ≠ 65535) 功能号 = 内存_读整数型 (句柄, 控件 + 860) ' 0x364 非0数 = 非0数 + 1 .如果真 (功能号 ≥ 0 且 功能号 < 256) 计数[功能号] = 计数[功能号] + 1 .如果真结束 .如果真结束 S = S + 1 .判断循环尾 () 写日志 (“① 全池有效控件数 = ” + 到文本 (非0数) + “ 池容量 14998” + #换行符) I = 0 .判断循环首 (I < 256) 次数 = 计数[I] .如果真 (次数 > 1) 写日志 (“ 功能号 ” + 到文本 (I) + “ × ” + 到文本 (次数) + #换行符) .如果真结束 I = I + 1 .判断循环尾 () 写日志 (“② 功能号 49 = ” + 到文本 (计数[49]) + “ 个(啟動內掛丸)” + “ 50 = ” + 到文本 (计数[50]) + “ 个(停止內掛丸)” + #换行符) ' ── 第二遍:列详情 ── 写日志 (“③ 49/50 控件详情:” + #换行符) 槽号 = 0 .判断循环首 (槽号 < 14998) 控件 = 内存_读整数型 (句柄, 池基址 + 槽号 × 4) .如果真 (控件 > 0 且 控件 ≠ 65535) 功能号 = 内存_读整数型 (句柄, 控件 + 860) ' 0x364 .如果真 (功能号 = 49 或 功能号 = 50) 开关位 = 内存_读整数型 (句柄, 控件 + 13513) ' 0x34C9 类型字 = 内存_读整数型 (句柄, 控件 + 8) ' 0x008 写日志 (“ 槽” + 到文本 (槽号) + “ 控件=” + 到文本 (控件) + “ 功能号=” + 到文本 (功能号) + “ 开关位=” + 到文本 (开关位) + “ 类型=” + 到文本 (类型字) + #换行符) .如果真结束 .如果真结束 槽号 = 槽号 + 1 .判断循环尾 () 写日志 (“扫描结束。” + #换行符)