【CE进阶】lua脚本使用

▒ 目录 ▒🛫 导读需求开发环境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:**文章中内容仅用于技术交流,请勿用于违规违法行为。

Back to top: