|
|
Day 12 -- Lua 脚本与实战:从学徒到出院总结
Cheat Engine 从入门到住院 · Day 12
最后一天了。如果你一路跟到这里,恭喜——你已经从"什么是内存"的小白,成长为能写注入脚本、追踪多级指针、做敌我识别的 CE 用户了。
今天有两个任务:学习 CE 的 Lua 脚本引擎(最后一块拼图),然后做一个完整的系列回顾和实战指南。
━━━━━━━━━━━━━━━━━━━━
本文你将学到
CE 中 Lua 脚本的基本用法
Lua 和 Auto Assembler 的配合
用 Lua 实现复杂的修改逻辑
12 天所学技能的完整知识树
继续深入学习的路线图
阅读时间:15 分钟 | 实操时间:25 分钟 | 难度:进阶
━━━━━━━━━━━━━━━━━━━━
为什么需要 Lua
Auto Assembler 让你能写汇编代码注入游戏,但汇编语言有一个天然局限:它太"低级"了。
想在游戏里实现一个"按 F5 保存当前坐标,按 F8 传送回去"的功能?用纯汇编写,光是浮点数运算和条件判断就能让你怀疑人生。
Lua 是一种轻量级的脚本语言,CE 内置了完整的 Lua 引擎。用 Lua 你可以:
操作 CE 的 GUI 界面(自动化扫描、创建表单)
读写内存(和汇编等效,但语法更友好)
处理复杂逻辑(循环、条件、函数调用)
创建定时器和热键
和 Auto Assembler 脚本交互
━━━━━━━━━━━━━━━━━━━━
CE Lua 快速入门
打开 Lua 引擎
在 CE 主界面,菜单 Table → Show Cheat Table Lua Script,或按 Ctrl+Alt+L。
弹出 Lua 脚本编辑器。在这里写代码,点 Execute 执行。
基本内存操作
- -- 读取内存
- local value = readInteger(0x0A001018) -- 读取 4 字节整数
- local fvalue = readFloat(0x0A001018) -- 读取 Float
- local dvalue = readDouble(0x0A001018) -- 读取 Double
- local str = readString(0x0A001018, 20) -- 读取字符串(最多 20 字节)
- -- 写入内存
- writeInteger(0x0A001018, 99999) -- 写入整数
- writeFloat(0x0A001018, 100.0) -- 写入 Float
- writeDouble(0x0A001018, 100.0) -- 写入 Double
- writeString(0x0A001018, "Hello") -- 写入字符串
- -- 通过符号名操作(如果你在 AA 脚本中注册了符号)
- local addr = getAddress("playerHealth")
- writeInteger(addr, 99999)
复制代码
获取模块地址
- -- 获取模块基址
- local base = getAddress("Tutorial-x86_64.exe")
- -- 使用模块偏移
- local addr = getAddress("Tutorial-x86_64.exe+1A2B3C")
复制代码
指针解析
- -- 读取多级指针
- -- 等价于 [[[[base+0]+10]+14]+18]
- local base = getAddress("Tutorial-x86_64.exe+1A2B3C")
- local level1 = readQword(base) -- 读取 8 字节指针值
- local level2 = readQword(level1 + 0x10)
- local level3 = readQword(level2 + 0x14)
- local health_addr = level3 + 0x18
- local health = readInteger(health_addr)
- print("Health: " .. health)
复制代码
━━━━━━━━━━━━━━━━━━━━
实用 Lua 脚本示例
示例一:定时锁血
- -- 每 100 毫秒把血量写回 99999
- local timer = createTimer(nil)
- timer.Interval = 100
- timer.OnTimer = function(t)
- local addr = getAddress("Tutorial-x86_64.exe+1A2B3C")
- local ptr = readQword(addr)
- if ptr and ptr ~= 0 then
- writeInteger(ptr + 0x18, 99999)
- end
- end
- timer.Enabled = true
- -- 停止:timer.Enabled = false
复制代码
示例二:热键控制
- -- 按 F5 启用/禁用无敌模式
- local godmode = false
- local function toggleGodmode()
- godmode = not godmode
- if godmode then
- print("Godmode ON")
- -- 启用无敌的逻辑
- else
- print("Godmode OFF")
- -- 禁用无敌的逻辑
- end
- end
- -- 注册热键(VK_F5 = 116)
- local hotkey = createHotkey(toggleGodmode, VK_F5)
复制代码
示例三:自动扫描
- -- 用 Lua 自动执行一次扫描
- local scan = createMemScan(nil)
- scan.firstScan(
- soExactValue, -- 扫描类型
- vtDword, -- 值类型
- rtRounded, -- 舍入方式
- "100", -- 要搜索的值
- "", -- 第二个值(范围搜索用)
- 0, 0x7FFFFFFFFFFF, -- 搜索范围
- "", -- 保护标志
- fsmNotAligned, -- 对齐方式
- "1", -- 快速扫描对齐值
- true, -- 最后一位数字是否进行范围检查
- false, -- 百分比
- false -- 是否使用线程
- )
- scan.waitTillDone()
- print("Found: " .. scan.getAttachedFoundlist().Count)
复制代码
━━━━━━━━━━━━━━━━━━━━
Lua + Auto Assembler 联动
AA 脚本中可以嵌入 Lua 代码:
- {$lua}
- -- 这里是 Lua 代码
- local base = getAddress("Tutorial-x86_64.exe")
- return string.format("define(BASE,%X)", base)
- {$asm}
- // 现在可以在汇编中使用 BASE 符号
- // BASE 的值由 Lua 动态计算得出
复制代码 和标记用于在 AA 脚本中切换语言。Lua 代码的返回值会被当作 AA 指令处理。
这种联动的强大之处在于:你可以用 Lua 做复杂的计算和逻辑判断,生成 AA 代码。
━━━━━━━━━━━━━━━━━━━━
CE 的其他实用功能
在结束前,简要介绍几个我们系列中没有深入展开但很实用的 CE 功能:
Speedhack(变速)
CE 可以修改游戏的时间流速——加速或减速。对于需要等待的游戏机制很有用。
菜单 Edit → Settings → Speedhack,启用后在 CE 主界面右下角出现速度控制。
Trainer Maker
CE 可以把你的 Cheat Table 打包成独立的修改器,不需要安装 CE 就能使用。
菜单 File → Create generic trainer from cheat table。
Dissect Code
反汇编视图中,右键一个函数调用 → "Follow",可以跳转到函数内部。配合断点调试,可以深入分析游戏的代码逻辑。
Structure Compare
在 Structure Dissect 中,你可以同时打开玩家和敌人的结构体进行对比,快速找到它们之间的差异字段。
━━━━━━━━━━━━━━━━━━━━
12 天知识树总览
让我们回顾一下整个系列的知识体系:
- Day 1: 安装 CE,认识界面,附加进程
- Day 2: 精确数值扫描(Exact Value)
- Day 3: 未知初始值搜索(Unknown initial value + Changed/Unchanged)
- Day 4: 浮点数搜索(Float / Double)
- Day 5: 代码查找器(Find what writes/accesses)+ NOP
- Day 6: 单级指针(静态基址 + 偏移量)
- Day 7: 代码注入(Auto Assembler + JMP 跳板)
- Day 8: 多级指针(逐层追踪指针链)
- Day 9: 共享代码与敌我识别(条件注入)
- Day 10: 指针扫描(自动化指针链查找 + Rescan)
- Day 11: Auto Assembler 进阶(AOB 扫描 + Cheat Table)
- Day 12: Lua 脚本 + 系列总结
复制代码
按能力层级划分:
| 层级 | 技能 | 对应天数 |
|------|------|---------|
| 青铜 | 精确搜索、修改数值、冻结 | Day 1-2 |
| 白银 | 模糊搜索、浮点数、代码查找 | Day 3-5 |
| 黄金 | 指针、代码注入 | Day 6-7 |
| 铂金 | 多级指针、敌我识别 | Day 8-9 |
| 钻石 | 指针扫描、AA 进阶、Lua 脚本 | Day 10-12 |
━━━━━━━━━━━━━━━━━━━━
继续深入的方向
如果你想在逆向工程的路上继续走下去,这是一些推荐的方向:
方向一:游戏逆向进阶
学习 x86/x64 汇编语言(推荐资源:《Assembly Language for x86 Processors》)
了解 Windows PE 文件格式
学习使用 IDA Pro 或 Ghidra(专业反汇编工具)
研究游戏引擎的内部结构(Unity Mono、Unreal Engine)
方向二:安全研究
漏洞分析与利用(CTF 竞赛是很好的练习场)
恶意软件分析
软件保护与反逆向
方向三:工具开发
用 C/C++ 编写自己的内存修改工具
学习 Windows API(ReadProcessMemory、WriteProcessMemory)
开发游戏修改器 / Trainer
━━━━━━━━━━━━━━━━━━━━
法律与道德声明
在结束这个系列之前,再次强调:
本系列所有内容仅用于教育目的。所有演示基于 CE 自带的 Tutorial 程序。
不要使用 CE 修改在线/多人游戏。这违反用户协议,损害其他玩家的体验,某些地区还可能违法。
不要破解商业软件。这是侵犯知识产权的行为。
逆向工程的合法用途包括:安全研究、互操作性分析、教育学习、CTF 竞赛等。
CE 本身是合法的开源工具,问题在于使用方式。
知识本身没有善恶,关键在于你如何使用它。
━━━━━━━━━━━━━━━━━━━━
出院总结
12 天前你走进这间"手术室",手里连手术刀都不会拿。
现在你已经能:
在几百万个内存地址中精准定位目标数据
追踪多级指针找到数据的"永久住址"
阅读和修改游戏的汇编代码
编写注入脚本改变游戏逻辑
做敌我识别实现精确控制
用指针扫描自动化繁琐的工作
用 Lua 脚本实现复杂功能
从入门到住院,你走完了整条路。
现在,出院。
去做点有趣的事情吧——记住,只在允许的范围内。
━━━━━━━━━━━━━━━━━━━━
Cheat Engine 从入门到住院 · 全系列完结
感谢你的阅读。如果这个系列对你有帮助,欢迎转发给同样对逆向工程感兴趣的朋友。 |
|