▒ 目录 ▒🛫 导读需求开发环境1️⃣ 脚本窗口Lua ScriptLua EngineAuto assemble2️⃣ 全局变量3️⃣ 进程当前打开的进程ID系统的进程列表系统的顶部窗口列表4️⃣ 线程5️⃣ 输入设备6️⃣ 屏幕7️⃣ 剪贴板🛬 文章小结📖 参考资料
🛫 导读
需求
CE作为游戏逆向中的头把交椅,本身含有大量功能,其中脚本就是其特色之一。 CE脚本,基于lua,所以一定要有lua相关基础,相关知识参考lua官网文档:https://www.lua.org/docs.html CE脚本在lua基础上添加了很多额外的东西,用于制作辅助工具,今天我们就是针对这些扩展进行介绍,了解CE所提供的各种功能。
开发环境
版本号描述文章日期2023-03-操作系统Win11 - 21H2 - 22000.1335Cheat Engine7.4
1️⃣ 脚本窗口
CE提供了三种跟脚本有关的窗口,默认打开的界面如下: 其中Auto assemble是功能最全,使用频率最高的窗口,可以执行汇编。 Lua Script和Lua Engine功能相对简单,就是执行lua,而且区别不是特别大。
Lua Engine窗口,目前小编只使用它做一些脚本的测试工作Lua Script窗口,则基本是不使用。
Lua Script
从作弊引擎主窗体菜单Table中,选择Show Cheat Table Lua Script菜单,即可打开Lua Script窗口。
该窗口输入命令,点击执行,会打开Lua Engine窗口,并将打印内存显示在Lua Engine窗口中。(总觉得这个窗口很鸡肋,执行print函数居然还得打开Lua Engine窗口)。
Lua Engine
Lua Engine和Auto assemble窗口都需要通过Memory Viewer窗口菜单打开。 而打开Memory Viewer窗口,需要点击主窗口的Memory View按钮,如下图所示:
在Memory Viewer窗口中,通过Tools菜单,选择不同的按钮打开Lua Engine和Auto assemble窗口。
在Lua Engine窗口中,我们编写脚本,点击Execute,即可在Output栏目中看到执行的结果。 本节内容,主要就是通过该窗口进行讲解的。
Auto assemble
Auto assemble窗口的打开方式跟Lua Engine一样,打开后,在窗口中需要先添加代码{$lua},表示之后的代码为lua代码,然后再输入lua脚本,执行后会弹出确认框,print语句的内容会输出到Lua Engine窗口。
PS: Auto assemble功能十分复杂,会在以后讲解。
2️⃣ 全局变量
CE的Lua提供了4个全局变量,我们直接打印查看其内容。
代码及含义如下:
-- 包含当前打开的进程的主模块名称(如果没有打开进程,返回的是空字符串)
print(process)
-- 包含启动作弊引擎的训练师路径(仅在作为训练器启动时设置)
print(TrainerOrigin)
-- 主作弊引擎 gui(跟函数getMainForm()的结果一样的)
print(MainForm)
-- 主作弊引擎 gui 的地址列表
print(AddressList)
3️⃣ 进程
当前打开的进程ID
当前打开的进程ID、当前位于顶部的进程的进程 ID
系统的进程列表
返回包含窗口列表(PID - 进程名)的表
代码及含义如下:
pTable = getProcesslist()
-- print在这里无法直接打印出table对象,所以通过string.format将其格式化为字符串。
print(string.format("pTable[idx] = %s", pTable))for k, v in pairs(pTable) doprint("key: ".. k)print(string.format("v = %s", v))
end
系统的顶部窗口列表
返回包含窗口列表(PID - 窗口标题)的表
代码及含义如下:
pTable = getWindowlist()
-- print在这里无法直接打印出table对象,所以通过string.format将其格式化为字符串。
print(string.format("pTable[idx] = %s", pTable))for k, v in pairs(pTable) doprint("key: ".. k)print(string.format("v = %s", v))
end
4️⃣ 线程
CPU 的数目、当前打开的进程的线程列表、当前代码在主线程内运行
代码及含义如下:
-- CPU 的数目
print(getCPUCount())-- 用当前打开的进程的线程列表填充列表对象
local l = createStringlist()
getThreadlist(l)
for i = 1, l.Count doprint(l[i - 1])break -- 打印一个就退出循环
end-- 如果当前代码在主线程内运行,则返回 true
print(inMainThread() and "true" or "false") --: Returns true if the current code is running inside the main thread (6.4+)
5️⃣ 输入设备
当前是否按下指定的键、设置鼠标坐标、模拟鼠标左键按下松开
代码及含义如下:
-- 如果当前按下指定的键,则返回 true
print(isKeyPressed(VK_LWIN) and "true" or "false")if true then-- 设置鼠标坐标setMousePos(340, 440)-- 模拟鼠标左键按下mouse_event(MOUSEEVENTF_LEFTDOWN)sleep(20)-- 模拟鼠标左键松开mouse_event(MOUSEEVENTF_LEFTUP)
endprint(getMousePos()) -- 返回鼠标的 X 和 Y 坐标
6️⃣ 屏幕
屏幕长宽、坐标RGB颜色
代码及含义如下:
print(getScreenHeight()) -- 主屏幕高
print(getScreenWidth()) -- 主屏幕宽
print(getWorkAreaHeight()) -- 主屏幕高(去除任务栏)
print(getWorkAreaWidth()) -- 主屏幕宽(去除任务栏)print(getScreenCanvas()) -- 可用于写入屏幕的 Canvas 对象
print(getPixel(10, 10)) -- 特定屏幕坐标处像素的 RGB 值
7️⃣ 剪贴板
将给定的文本写入剪贴板、从剪贴板读取文本
代码及含义如下:
print("readFromClipboard() = " .. readFromClipboard())
writeToClipboard("khz... 2023-3-20")
print("readFromClipboard() = " .. readFromClipboard())
🛬 文章小结
print在Lua Engine窗口中无法直接打印出table对象,所以通过string.format将其格式化为字符串。print无法打印bool类型值,可以通过and or形式的三位运算符进行显示。
除了上面的函数,CE还提供了很多其他方法:
内存类型转换汇编消息:outputDebugString、showMessage快捷键:shortCutToText、textToShortCut加速:speedhack_setSpeed、speedhack_getSpeed
📖 参考资料
CE官网教程 https://wiki.cheatengine.org/index.php?title=Main_PageCE官网教程-lua函数和类 https://wiki.cheatengine.org/index.php?title=LuaCE的LUA脚本基础教程 https://www.bilibili.com/video/BV1kK411d7to
**ps:**文章中内容仅用于技术交流,请勿用于违规违法行为。