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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/3223.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

算法的时间复杂度和空间复杂度

目录 1 如何衡量一个算法的好坏 2.时间复杂度 2.1 时间复杂度的概念 2.2 大O的渐进表示法 2.3常见代码举例 2.3.1 Func2 O(N) 2.3.2 Func3 O(MN) 2.3.3 Func4 O(1) 2.3.4 Func5 strchr O(N) 2.3.5 Func6 冒泡排序 O(N^2) 2.3.6 Func7 二分…

菜鸟刷题Day6

⭐作者:别动我的饭 ⭐专栏:菜鸟刷题 ⭐标语:悟已往之不谏,知来者之可追 一.链表内指定区间反转:链表内指定区间反转_牛客题霸_牛客网 (nowcoder.com) 描述 将一个节点数为 size 链表 m 位置到 n 位置之间的区间反转…

如何用深度强化学习做单元测试代码生成

设计一个用强化学习来生成单元测试代码的系统需要考虑以下几个方面: Agent:强化学习算法中的智能体,它需要接收当前环境状态,根据策略选择相应的动作并执行。 State:描述当前环境状态的特征。在这个问题中&#xff0c…

电脑长按电源键强行关机,对SSD有伤害吗?SSD 掉盘之殇

说到“按住电源键强制关机”的操作,想必大家都不会陌生,毕竟在电脑蓝屏或者电脑死机的时候,我们总是束手无策。而且,身边的人在遇到同样的情况时,往往都是选择长按电源键强制关机,所以当我们遇到同样的情况…

【算法】回溯法详解

一、概述 回溯法在包含的所有可能解的解空间树中,从根节点出发,按照深度有限的策略进行搜索,对于解空间树的某个结点,如果该节点满足问题的约束条件,则进入该子树继续进行搜索,否则将以该节点为根节点进行…

【算法】一文详解贪心法

一、概述 贪心法将一个复杂问题分解为一系列较为简单的局部最优解,每一步都是对当前解的一个扩展,直到获得问题的完全解。贪心法的典型应用时求解最优化问题,而且即使是非最优解,最终得出的解也和最优解比较近似 1.1 贪心法设计…

【多线程】常见的锁策略

✨个人主页:bit me👇 ✨当前专栏:Java EE初阶👇 ✨每日一语:老当益壮,宁移白首之心;穷且益坚,不坠青云之志。 目 录🏳️一. 乐观锁 vs 悲观锁🏴二. 普通的互斥…

清晰概括:进程与线程间的区别的联系

相关阅读: 🔗通俗简介:操作系统之进程的管理与调度🔗如何使用 jconsole 查看Java进程中线程的详细信息? 目录 一、进程与线程 1、进程 2、线程 二、进程与线程之间的区别和联系 1、区别 2、联系 一、进程与线程 …

程序员接私活一定要知道的事情,我走的弯路你们都别走了

文章目录前言一、程序员私活的种类1.兼职职位众包2.自由职业者驻场3.项目整包二、这3种私活可以接1.有熟人2.七分熟的项目3.需求明确的项目三、这3种私活不要接1.主动找上门的中介单2.一味强调项目简单好做3.外行人给你拉的项目四、接单的渠道1.线下渠道2.线上渠道3.比较靠谱的…

计网之HTTP协议和Fiddler的使用

文章目录一. HTTP概述和fidder的使用1. 什么是HTTP2. 抓包工具fidder的使用2.1 注意事项2.2 fidder的使用二. HTTP协议格式1. HTTP请求格式1.1 基本格式1.2 认识URL1.3 方法2. 请求报头关键字段3. HTTP响应格式3.1 基本格式3.2 状态码一. HTTP概述和fidder的使用 1. 什么是HTT…

cpu中缓存简介

一级缓存是什么: 一级缓存都内置在CPU内部并与CPU同速运行,可以有效的提高CPU的运行效率。一级缓存越大,CPU的运行效率越高,但受到CPU内部结构的限制,一级缓存的容量都很小。 CPU缓存(Cache Memory&#xf…

【设计模式】23种设计模式之七大原则

【设计模式】23种设计模式之七大原则什么是设计模式的原则1、单一职责原则基本介绍案例分析注意事项2、接口隔离原则基本介绍案例分析代码实现3、依赖倒转原则基本介绍案例分析依赖传递的三种方式注意事项4、里氏替换原则关于继承性的思考和说明基本介绍案例分析5、开闭原则ocp…

冲击蓝桥杯-并查集,前缀和,字符串

目录 前言 一、并查集 1、并查集的合并(带路径压缩) 2、询问是否为同一个集合 3、例题 二、前缀和 1 、前缀和是什么 2、经典题目 三- 字符串处理 1、字符串的插入 2、字符串转化为int类型 3、字符反转 前言 并查集合前缀,字符串…

Python让ChatGPT全自动改写生成文章教程

ChatGPT是一个在自然语言处理领域非常先进的文本生成模型,它能够产生高质量、连贯的文章。它受到了广泛的关注,因为它可以自动生成大量的文本,从而减轻了人工写作的负担。怎么使用chatgpt批量改写文章?最简单的方式就是找到一家接…

「Vue面试题」vue要做权限管理该怎么做?如果控制到按钮级别的权限怎么做?

文章目录一、是什么二、如何做接口权限路由权限控制菜单权限方案一方案二按钮权限方案一方案二小结参考文章一、是什么 权限是对特定资源的访问许可,所谓权限控制,也就是确保用户只能访问到被分配的资源 而前端权限归根结底是请求的发起权,…

刷题之最长公共/上升子序列问题

目录 一、最长公共子序列问题(LCS) 1、题目 2、题目解读 ​编辑 3、代码 四、多写一题 五、应用 二、最长上升子序列问题(LIS) 1、题目 2、题目解读 3、代码 四、多写一道 Ⅰ、题目解读 Ⅱ、代码 一、最长公共子序列问题&…

刷题训练营之栈与队列

文章目录前言一、用队列实现栈1.题目介绍2.思路3.代码二、用栈实现队列1.题目介绍2.思路3.代码前言 本题是在栈与队列的基础上,为巩固两者而出的题,所以基本是在实现了栈与队列的基础上做的,如果没有栈与队列的基础,请看我之前的…

Nginx的漏洞浮现

本文参考https://vulhub.org/#/environments/nginx/nginx_parsing_vulnerability/环境搭建均是采用docker拉取环境请移步到参考。一、Nginx的配置错误案列1. CRLF注入漏洞配置错误文件error1.confrootubuntu-virtual-machine:/vulhub/vulhub-master/nginx/insecure-configurati…

数据结构中的堆

一、树的重要知识点 节点的度:一个节点含有的子树的个数称为该节点的度(有几个孩子)叶节点或终端节点:度为0的节点称为叶节点;如上图:B、C、H、I...等节点为叶节点(0个孩子)非终端节点或分支节点…

css实现炫酷充电动画

先绘制一个电池&#xff0c;电池头部和电池的身体 这里其实就是两个div&#xff0c;使用z-index改变层级&#xff0c;电池的身体盖住头部&#xff0c;圆角使用border-radius完成 html部分,完整的css部分在最后 <div class"chargerBox"><div class"ch…