CE作为游戏逆向中的头把交椅,本身含有大量功能,其中脚本就是其特色之一。
CE脚本,基于lua,所以一定要有lua相关基础,相关知识参考lua官网文档:https://www.lua.org/docs.html
CE脚本在lua基础上添加了很多额外的东西,用于制作辅助工具,今天我们就是针对这些扩展进行介绍,了解CE所提供的各种功能。
| 版本号 | 描述 | |
|---|---|---|
| 文章日期 | 2023-03- | |
| 操作系统 | Win11 - 21H2 - 22000.1335 | |
| Cheat Engine | 7.4 | |
CE提供了三种跟脚本有关的窗口,默认打开的界面如下:
其中Auto assemble是功能最全,使用频率最高的窗口,可以执行汇编。
Lua Script和Lua Engine功能相对简单,就是执行lua,而且区别不是特别大。
Lua Engine窗口,目前小编只使用它做一些脚本的测试工作Lua Script窗口,则基本是不使用。
从作弊引擎主窗体菜单
Table中,选择Show Cheat Table Lua Script菜单,即可打开Lua Script窗口。
该窗口输入命令,点击执行,会打开
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窗口的打开方式跟Lua Engine一样,打开后,在窗口中需要先添加代码{$lua},表示之后的代码为lua代码,然后再输入lua脚本,执行后会弹出确认框,print语句的内容会输出到Lua Engine窗口。
PS:
Auto assemble功能十分复杂,会在以后讲解。
CE的Lua提供了4个全局变量,我们直接打印查看其内容。
代码及含义如下:
-- 包含当前打开的进程的主模块名称(如果没有打开进程,返回的是空字符串)
print(process)
-- 包含启动作弊引擎的训练师路径(仅在作为训练器启动时设置)
print(TrainerOrigin)
-- 主作弊引擎 gui(跟函数getMainForm()的结果一样的)
print(MainForm)
-- 主作弊引擎 gui 的地址列表
print(AddressList)
当前打开的进程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
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+)
当前是否按下指定的键、设置鼠标坐标、模拟鼠标左键按下松开
代码及含义如下:
-- 如果当前按下指定的键,则返回 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 坐标
屏幕长宽、坐标RGB颜色
代码及含义如下:
print(getScreenHeight()) -- 主屏幕高
print(getScreenWidth()) -- 主屏幕宽
print(getWorkAreaHeight()) -- 主屏幕高(去除任务栏)
print(getWorkAreaWidth()) -- 主屏幕宽(去除任务栏)print(getScreenCanvas()) -- 可用于写入屏幕的 Canvas 对象
print(getPixel(10, 10)) -- 特定屏幕坐标处像素的 RGB 值
将给定的文本写入剪贴板、从剪贴板读取文本
代码及含义如下:
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
**ps:**文章中内容仅用于技术交流,请勿用于违规违法行为。