当前位置: 首页 > news >正文

【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 Engine7.4

1️⃣ 脚本窗口

CE提供了三种跟脚本有关的窗口,默认打开的界面如下:
在这里插入图片描述
其中Auto assemble是功能最全,使用频率最高的窗口,可以执行汇编。
Lua ScriptLua 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

  1. Lua EngineAuto assemble窗口都需要通过Memory Viewer窗口菜单打开。
    而打开Memory Viewer窗口,需要点击主窗口的Memory View按钮,如下图所示:
    在这里插入图片描述
  1. Memory Viewer窗口中,通过Tools菜单,选择不同的按钮打开Lua EngineAuto assemble窗口。
    在这里插入图片描述
  1. 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_Page
  • CE官网教程-lua函数和类 https://wiki.cheatengine.org/index.php?title=Lua
  • CE的LUA脚本基础教程 https://www.bilibili.com/video/BV1kK411d7to

**ps:**文章中内容仅用于技术交流,请勿用于违规违法行为。

http://www.lryc.cn/news/42789.html

相关文章:

  • 【vue2】近期bug收集与整理02
  • 2. 01背包问题
  • 【Docker】CAdvisor+InfluxDB+Granfana容器监控
  • k8s 部署nginx 实现集群统一配置,自动更新nginx.conf配置文件 总结
  • 动态内存管理(上)——“C”
  • GPT-4发布,这类人才告急,大厂月薪10W+疯抢
  • MySQL数据库实现主主同步
  • JavaScript传参的6种方式
  • 蓝桥之统计子矩阵
  • Java的基础面试题
  • J1939故障码诊断说明
  • XCPC第十三站,贪心问题
  • 一文让你吃透 Vue3中的组件间通讯 【一篇通】
  • EVE遭遇大规模DDOS攻击,玩家和官方都傻眼了
  • 【数据结构】二叉树及相关习题详解
  • 锂电池充电的同时也能放电吗?
  • 通信工程考研英语复试专有名词翻译
  • 注意力机制(四):多头注意力
  • 【2023Unity游戏开发教程】零基础带你从小白到超神19——射线检测
  • 内存泄漏和内存溢出的区别
  • 文本三剑客之sed编辑器
  • 深度学习:GPT1、GPT2、GPT-3
  • 使用Docker 一键部署SpringBoot和SpringCloud项目
  • 【数据结构】用栈实现队列
  • [Netty源码] 服务端启动过程 (二)
  • Week 14
  • 【微信小程序】-- 使用 Git 管理项目(五十)
  • leetcode每日一题:134. 加油站
  • 开放式基金实时排行 API 数据接口
  • Android开发中synchronized的实现原理