.版本 2 '════════════════════════════════════════════════════════════════════════ ' 开关小助手 · 精易模块版(不用大漠、不用自写 API) ' ' 依赖:精易模块 + 汇编支持库 ' ' 对照替换(把你原来 DM 那段直接换掉): ' DM.dm.ReadIntAddr (hwnd, addr) → JS_读整数 (进程ID, addr) ' DM.dm.ReadStringAddr (hwnd, addr) → JS_读文本 (进程ID, addr) ' DM.dm.AsmClear / AsmAdd / AsmCall → 裸汇编块(注入进程内直接 call) ' ' 调用: ' 开关小助手 (主线程编号, 31) 开 ' 开关小助手 (主线程编号, 32) 关 '════════════════════════════════════════════════════════════════════════ '────────────────────────────────────────────────────────────────────── ' 兼容层:模块命令名写在这两行里,版本不对只改这里 '────────────────────────────────────────────────────────────────────── .子程序 JS_读整数, 整数型 .参数 进程ID, 整数型 .参数 地址, 整数型 返回 (内存.读整数 (进程ID, 地址)) ' 老版精易:内存_读整数型 (进程ID, 地址) .子程序 JS_读文本, 文本型 .参数 进程ID, 整数型 .参数 地址, 整数型 .局部变量 缓冲, 字节集 缓冲 = 内存.读字节集 (进程ID, 地址, 64) ' 老版精易:内存_读字节集 (进程ID, 地址, 64) 返回 (BIG5_GBK (取字节集部分 (缓冲, 1, 取字节集长度 (缓冲) - 1))) '────────────────────────────────────────────────────────────────────── ' 主子程序 '────────────────────────────────────────────────────────────────────── .子程序 开关小助手, 逻辑型 .参数 主线程编号, 整数型 .参数 状态, 整数型 ' 31=开 32=关 .局部变量 进程ID, 整数型 .局部变量 游戏基址, 整数型 .局部变量 CALL地址, 整数型 .局部变量 控件地址, 整数型 .局部变量 ECX, 整数型 .局部变量 功能号, 整数型 .局部变量 控件名称, 文本型 游戏基址 = 到整数 (“400000”) ' YGOnline.exe ImageBase,无 ASLR 恒定 CALL地址 = 到整数 (“682880”) ' 小助手命令执行器 0x682880 .如果真 (CALL地址 < 到整数 (“200000”)) ' 表里填 RVA 的话自动补基址 CALL地址 = CALL地址 + 游戏基址 .如果真结束 进程ID = 进程_名取ID (“YGOnline.exe”) .如果真 (进程ID = 0) 调试输出 (“进程没找到”) 返回 (假) .如果真结束 .如果 (状态 = 31) 控件名称 = “啟動內掛丸” .否则 控件名称 = “停止內掛丸” .如果结束 控件地址 = 取助手控件 (主线程编号, 进程ID, 控件名称) .如果真 (控件地址 ≤ 0) 调试输出 (“控件没找到:” + 控件名称) 返回 (假) .如果真结束 功能号 = JS_读整数 (进程ID, 控件地址 + 到整数 (“364”)) ' +0x364 功能号 ECX = JS_读整数 (进程ID, 控件地址 + 4) ' this = 控件对象 + 4 调试输出 (“功能号=” + 到文本 (功能号) + “ ECX=” + 到文本 (ECX)) ' 注意:必须 mov eax / call eax 间接调用 ' 直接写 call 绝对地址会编成 E8 rel32,跨模块偏移算不准 push 0 ' 附参数,先压 push 功能号 ' 命令字,后压 → 落在 [ebp+8] mov ecx, ECX ' thiscall:ecx = this mov eax, CALL地址 call eax ' FF D0 处理事件 () 返回 (真) '────────────────────────────────────────────────────────────────────── ' 遍历控件池找按钮 '────────────────────────────────────────────────────────────────────── .子程序 取助手控件, 整数型 .参数 主线程编号, 整数型 .参数 进程ID, 整数型 .参数 按钮名称, 文本型 .局部变量 N, 整数型 .局部变量 控件对象, 整数型 .局部变量 读取值, 文本型 .局部变量 池基址, 整数型 池基址 = JS_池基址 (主线程编号) ' ← 换成你自己的取池基址代码 .计次循环首 (到整数 (“3A98”), N) 控件对象 = JS_读整数 (进程ID, 池基址 + (N - 1) × 4) .如果真 (控件对象 > 0 且 控件对象 ≠ 65535) ' 第一层:功能号 .如果真 (JS_读整数 (进程ID, 控件对象 + 到整数 (“364”)) = 按钮名称取编号 (按钮名称)) ' 第二层:名称二次确认 读取值 = JS_读文本 (进程ID, 控件对象 + 到整数 (“368”)) .如果真 (读取值 = 按钮名称) 返回 (控件对象) .如果真结束 .如果真结束 .如果真结束 处理事件 () .计次循环尾 () 返回 (0) '────────────────────────────────────────────────────────────────────── ' 按钮名 → 功能号 '────────────────────────────────────────────────────────────────────── .子程序 按钮名称取编号, 整数型 .参数 按钮名称, 文本型 .如果真 (按钮名称 = “啟動內掛丸”) 返回 (49) .如果真结束 .如果真 (按钮名称 = “停止內掛丸”) 返回 (50) .如果真结束 .如果真 (按钮名称 = “設定內掛丸”) 返回 (50) ' 原样保留,若和"停止"冲突改成 51 试 .如果真结束 .如果真 (按钮名称 = “關閉內掛丸”) 返回 (50) ' 原样保留,若和"停止"冲突改成 51 试 .如果真结束 返回 (0)