▒ 目录 ▒
- 🛫 导读
- 需求
- 开发环境
- 1️⃣ 脚本窗口
- Lua Script
- Lua Engine
- Auto assemble
- 2️⃣ 全局变量
- 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.1335 | |
Cheat Engine | 7.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
窗口中。(总觉得这个窗口很鸡肋,执行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) do
print("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) do
print("key: ".. k)
print(string.format("v = %s", v))
end
4️⃣ 线程
CPU 的数目、当前打开的进程的线程列表、当前代码在主线程内运行
代码及含义如下:
-- CPU 的数目
print(getCPUCount())
-- 用当前打开的进程的线程列表填充列表对象
local l = createStringlist()
getThreadlist(l)
for i = 1, l.Count do
print(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)
end
print(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_Page
- CE官网教程-lua函数和类 https://wiki.cheatengine.org/index.php?title=Lua
- CE的LUA脚本基础教程 https://www.bilibili.com/video/BV1kK411d7to
**ps:**文章中内容仅用于技术交流,请勿用于违规违法行为。