.版本 2 '═══════════════════════════════════════════════════════ ' 大列表诊断(只读,不发任何命令) ' 目的:一次性判定 #全局大列表基址 该怎么用(直接用?还是要解引用一层?) ' ' 用法:进游戏 → 手动打开一次内挂丸面板(看一眼那个按钮)→ 跑本子程序 ' 看日志里哪一组的「非0数」> 0,那就是正确的取法。 '═══════════════════════════════════════════════════════ .子程序 大列表诊断 .局部变量 静态池, 长整数型 .局部变量 甲, 长整数型 .局部变量 基址绝对, 长整数型 .局部变量 等待秒数, 整数型 ' 等游戏挂上(全局_进程句柄 不为 0),最多等 40 秒 等待秒数 = 0 .判断循环首 (全局_进程句柄 = 0 且 等待秒数 < 40) 延迟 (1000) 等待秒数 = 等待秒数 + 1 处理事件 () .判断循环尾 () .如果真 (全局_进程句柄 = 0) 写日志 (“等了 40 秒还是没挂上游戏,先解决这个再跑诊断” + #换行符) 返回 () .如果真结束 静态池 = 进制_十六到十 (“3C35758”) + 进制_十六到十 (“400000”) ' = 0x03C35758(.data 静态全局) 甲 = #全局大列表基址 写日志 (“── 大列表诊断 ──” + #换行符) 写日志 (“常量 #全局大列表基址 = ” + 到文本 (甲) + “ (16进制 ” + 进制_十到十六 (甲, ) + “)” + #换行符) 写日志 (“静态 0x03C35758 = ” + 到文本 (静态池) + #换行符) 写日志 (“该静态处当前值 = ” + 到文本 (内存_读整数型 (全局_进程句柄, 静态池)) + #换行符) 写日志 (“────────────────────────────────────” + #换行符) ' 关键:甲组之前拿 RVA 当绝对地址读,读的是错的地方。 ' 模块基址 0x400000 + 0x3835758 = 0x7C35758 = 130242392 基址绝对 = 进制_十六到十 (“400000”) + 甲 写日志 (“常量换算成绝对地址 0x7C35758 = ” + 到文本 (基址绝对) + #换行符) 写日志 (“该绝对地址处的当前值 = ” + 到文本 (内存_读整数型 (全局_进程句柄, 基址绝对)) + #换行符) 写日志 (“────────────────────────────────────” + #换行符) 试扫 (全局_进程句柄, 甲, “甲:常量直接用(旧,已知无效)”) 试扫 (全局_进程句柄, 基址绝对, “戊:常量+基址0x400000”) 试扫 (全局_进程句柄, 内存_读整数型 (全局_进程句柄, 基址绝对), “己:常量+基址再解引用”) 试扫 (全局_进程句柄, 内存_读整数型 (全局_进程句柄, 甲), “乙:常量解引用一次(旧)”) 试扫 (全局_进程句柄, 静态池, “丙:静态0x3C35758直接用(旧)”) 试扫 (全局_进程句柄, 内存_读整数型 (全局_进程句柄, 静态池), “丁:静态0x3C35758解引用(旧)”) 写日志 (“诊断结束。” + #换行符) .子程序 试扫 .参数 句柄, 整数型 .参数 基址, 长整数型 .参数 标签, 文本型 .局部变量 S, 整数型 .局部变量 控件, 整数型 .局部变量 功能号, 整数型 .局部变量 名称, 文本型 .局部变量 计数, 整数型 .局部变量 打印数, 整数型 计数 = 0 打印数 = 0 S = 0 .判断循环首 (S < 3000) 控件 = 内存_读整数型 (句柄, 基址 + S × 4) .如果真 (控件 > 0 且 控件 ≠ 65535) 计数 = 计数 + 1 .如果真 (打印数 < 6) 功能号 = 内存_读整数型 (句柄, 控件 + 进制_十六到十 (“364”)) 名称 = 编码_BIG5到简体 (内存_读文本型 (句柄, 控件 + 进制_十六到十 (“368”))) 写日志 (“ ” + 标签 + “ | 槽” + 到文本 (S) + “ | 控件=” + 到文本 (控件) + “ | 功能号=” + 到文本 (功能号) + “ | 名称=” + 名称 + #换行符) 打印数 = 打印数 + 1 .如果真结束 .如果真结束 S = S + 1 .判断循环尾 () 写日志 (“>>> ” + 标签 + “ → 前3000槽里非0控件数 = ” + 到文本 (计数) + #换行符)