> 文章列表 > 【CE进阶】lua脚本使用

【CE进阶】lua脚本使用

【CE进阶】lua脚本使用

▒ 目录 ▒

    • 🛫 导读
      • 需求
      • 开发环境
    • 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提供了三种跟脚本有关的窗口,默认打开的界面如下:
【CE进阶】lua脚本使用
其中Auto assemble是功能最全,使用频率最高的窗口,可以执行汇编。
Lua ScriptLua Engine功能相对简单,就是执行lua,而且区别不是特别大。

  • Lua Engine窗口,目前小编只使用它做一些脚本的测试工作
  • Lua Script窗口,则基本是不使用。

Lua Script

从作弊引擎主窗体菜单Table中,选择Show Cheat Table Lua Script菜单,即可打开Lua Script窗口。
【CE进阶】lua脚本使用

该窗口输入命令,点击执行,会打开Lua Engine窗口,并将打印内存显示在Lua Engine窗口中。(总觉得这个窗口很鸡肋,执行print函数居然还得打开Lua Engine窗口)。
【CE进阶】lua脚本使用

Lua Engine

  1. Lua EngineAuto assemble窗口都需要通过Memory Viewer窗口菜单打开。
    而打开Memory Viewer窗口,需要点击主窗口的Memory View按钮,如下图所示:
    【CE进阶】lua脚本使用
  1. Memory Viewer窗口中,通过Tools菜单,选择不同的按钮打开Lua EngineAuto assemble窗口。
    【CE进阶】lua脚本使用
  1. Lua Engine窗口中,我们编写脚本,点击Execute,即可在Output栏目中看到执行的结果。
    本节内容,主要就是通过该窗口进行讲解的。
    【CE进阶】lua脚本使用

Auto assemble

Auto assemble窗口的打开方式跟Lua Engine一样,打开后,在窗口中需要先添加代码{$lua},表示之后的代码为lua代码,然后再输入lua脚本,执行后会弹出确认框,print语句的内容会输出到Lua Engine窗口。
【CE进阶】lua脚本使用

PS: Auto assemble功能十分复杂,会在以后讲解。

2️⃣ 全局变量

CE的Lua提供了4个全局变量,我们直接打印查看其内容。
【CE进阶】lua脚本使用

代码及含义如下:

-- 包含当前打开的进程的主模块名称(如果没有打开进程,返回的是空字符串)
print(process)
-- 包含启动作弊引擎的训练师路径(仅在作为训练器启动时设置)
print(TrainerOrigin)
-- 主作弊引擎 gui(跟函数getMainForm()的结果一样的)
print(MainForm)
-- 主作弊引擎 gui 的地址列表
print(AddressList)

3️⃣ 进程

当前打开的进程ID

当前打开的进程ID、当前位于顶部的进程的进程 ID
【CE进阶】lua脚本使用

系统的进程列表

返回包含窗口列表(PID - 进程名)的表
【CE进阶】lua脚本使用

代码及含义如下:

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 - 窗口标题)的表
【CE进阶】lua脚本使用

代码及含义如下:

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 的数目、当前打开的进程的线程列表、当前代码在主线程内运行
【CE进阶】lua脚本使用

代码及含义如下:

-- 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️⃣ 输入设备

当前是否按下指定的键、设置鼠标坐标、模拟鼠标左键按下松开
【CE进阶】lua脚本使用

代码及含义如下:


-- 如果当前按下指定的键,则返回 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颜色
【CE进阶】lua脚本使用

代码及含义如下:

print(getScreenHeight())     -- 主屏幕高
print(getScreenWidth())      -- 主屏幕宽
print(getWorkAreaHeight())   -- 主屏幕高(去除任务栏)
print(getWorkAreaWidth())    -- 主屏幕宽(去除任务栏)print(getScreenCanvas())     -- 可用于写入屏幕的 Canvas 对象
print(getPixel(10, 10))      -- 特定屏幕坐标处像素的 RGB 值

7️⃣ 剪贴板

将给定的文本写入剪贴板、从剪贴板读取文本
【CE进阶】lua脚本使用

代码及含义如下:

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:文章中内容仅用于技术交流,请勿用于违规违法行为。