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

相关文章:

【CE进阶】lua脚本使用

▒ 目录 ▒🛫 导读需求开发环境1️⃣ 脚本窗口Lua ScriptLua EngineAuto assemble2️⃣ 全局变量3️⃣ 进程当前打开的进程ID系统的进程列表系统的顶部窗口列表4️⃣ 线程5️⃣ 输入设备6️⃣ 屏幕7️⃣ 剪贴板🛬 文章小结📖 参考资料&#x…...

【vue2】近期bug收集与整理02

⭐【前言】 在使用vue2构建页面时候,博主遇到的问题难点以及最终的解决方案。 🥳博主:初映CY的前说(前端领域) 🤘本文核心:博主遇到的问题与解决思路 ⭐数据枚举文件的使用 同后端那边发送请求的时,请求返…...

2. 01背包问题

文章目录QuestionIdeasCodeQuestion 有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。 第 i 件物品的体积是 vi ,价值是 wi 。 求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。 输出最大价值。 输入…...

【Docker】CAdvisor+InfluxDB+Granfana容器监控

文章目录原生命令 docker stats容器监控3剑客CIGCAdvisorInfluxDBGranfanacompose容器编排,一套带走新建目录新建3件套组合的 docker-compose.yml检查配置,有问题才有输出 docker-compose config -q启动docker-compose文件 docker-compose up -d测试浏览…...

k8s 部署nginx 实现集群统一配置,自动更新nginx.conf配置文件 总结

k8s 部署nginx 实现集群统一配置,自动更新nginx.conf配置文件 总结 大纲 1 nginx镜像选择2 创建configmap保存nginx配置文件3 使用inotify监控配置文件变化4 Dockerfile创建5 调整镜像原地址使用阿里云6 创建deploy部署文件部署nginx7 测试使用nginx配置文件同步&…...

动态内存管理(上)——“C”

各位CSDN的uu们你们好呀,今天,小雅兰的内容是动态内存管理噢,下面,让我们进入动态内存管理的世界吧 为什么存在动态内存分配 动态内存函数的介绍 malloc free calloc realloc 常见的动态内存错误 为什么存在动态内存分配 我们已…...

GPT-4发布,这类人才告急,大厂月薪10W+疯抢

ChatGPT最近彻底火出圈,各行各业都在争相报道,甚至连很多官媒都下场“跟风”。ChatGPT的瓜还没吃完,平地一声雷,GPT-4又重磅发布! 很多小伙伴瑟瑟发抖:“AI会不会跟自己抢饭碗啊?” 关于“如何…...

MySQL数据库实现主主同步

前言 MySQL主主同步实际上是在主从同步的基础上将从数据库也提升成主数据库,让它们可以互相读写数据库,从数据库变成主数据库;主从相互授权连接,读取对方binlog日志并更新到本地数据库的过程,只要对方数据改变,自己就…...

JavaScript传参的6种方式

JavaScript传参的方式1. 传递基本类型参数2. 传递对象类型参数3. 使用解构赋值传递参数4. 使用展开运算符传递参数5. 使用可选参数6. 使用剩余参数JavaScript是一门非常灵活的语言,其参数传递方式也同样灵活。在本篇文章中,会详细介绍JavaScript中的参数…...

蓝桥之统计子矩阵

样例说明 满足条件的子矩阵一共有 19 , 包含: 大小为 11 的有 10 个。 大小为 12 的有 3 个。 大小为13 的有 2 个。 大小为 14 的有 1 个。 大小为 21 的有 3 个。 前缀和二维数组 前缀和暴力搜索 import java.util.*; public class Main{private static int ans0;pub…...

Java的基础面试题

一.java基础1.JDK和JRE有什么区别?JDK是java开发工具包,JRE是java运行时环境(包括Java基础类库,java虚拟机)2.和equals的区别是什么?比较的是两者的地址值,equals比较的是两者的内容是否一样3.两…...

J1939故障码诊断说明

1:1939整体协议说明 这里主要说明1939不同的协议,对应不同的网络分层 注意了,这里只进行文档解析说明,具体查看去搜素协议的关键字进行理解 2:DMx和FMI 说明 想知道每个代号的具体含义,可以去 saeJ1939…...

XCPC第十三站,贪心问题

一.区间选点 我们采取这样的策略来选点:step(1)将区间按照右端点的大小从小到大排序;step(2)从前往后依次枚举每个区间,如果当前区间中已经包含点,直接pass,否则选当前区…...

一文让你吃透 Vue3中的组件间通讯 【一篇通】

文章目录前情回顾前言1. 父组件 > 子组件通讯传递2. 子组件 > 父组件通讯传递3. 爷孙组件,后代组件通讯数据总结前情回顾 在本专栏前一章节中,我为大家带来了 Vue3 新特性变化上手指南 的归纳梳理,主要介绍了 Vue3 的 Proxy 响应式原理…...

EVE遭遇大规模DDOS攻击,玩家和官方都傻眼了

如果你恰好是一名《星战前夜》(EVE)的国际服玩家(虽然这个几率很小),又恰好因为疫情一直待在家里,那你就真是倒霉透顶了。因为从1月底开始,EVE的服务器就一直受到大规模的DDOS攻击,而…...

【数据结构】二叉树及相关习题详解

新年新气象! 祝大家兔年 财源滚滚! 万事胜意! 文章目录前言1. 树的一些基础概念1.1 树的一些基本概念1.2 树的一些重要概念2. 二叉树的一些基本概念2.1 二叉树的结构2.2 两种特殊的二叉树3. 二叉树的性质4. 二叉树的存储5. 二叉树的基本操作5.1 构造一棵二叉树5.2 二叉树的遍历…...

锂电池充电的同时也能放电吗?

大家应该都有这样经历,我们的手机在充电的同时也能边使用,有的同学就会说了,这是因为手机电池在充电的同时也在放电。如果这样想我们可能就把锂电池类比了一个蓄水池,以为它在进水的同时也能出水,其实这个比喻是错误的…...

通信工程考研英语复试专有名词翻译

中文英文频分多址Frequency Division Multiple Access码分多址Code Division Multiple Access时分多址Time Division Multiple Access移动通信mobile communication人工智能artificial intelligence水声通信Middle-Range Uwa Communication正交频分复用Orthogonal frequency di…...

注意力机制(四):多头注意力

专栏:神经网络复现目录 注意力机制 注意力机制(Attention Mechanism)是一种人工智能技术,它可以让神经网络在处理序列数据时,专注于关键信息的部分,同时忽略不重要的部分。在自然语言处理、计算机视觉、语…...

【2023Unity游戏开发教程】零基础带你从小白到超神19——射线检测

文章目录 射线检测从某点发射一条射线从摄像机发射一条射线射线检测 游戏中的红外线,默认肉眼是看不到的,从某个初始点开始,沿着特定的方向发射一条不可见且无限长的射线,通过此射线检测是否有任何模型添加了Collider碰撞器组件。一旦检测到碰撞,停止射线继续发射。 碰撞检…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云

目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问&#xff08;基础概念问题&#xff09; 1. 请解释Spring框架的核心容器是什么&#xff1f;它在Spring中起到什么作用&#xff1f; Spring框架的核心容器是IoC容器&#…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama&#xff08;有网络的电脑&#xff09;2.2.3 安装Ollama&#xff08;无网络的电脑&#xff09;2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

MySQL JOIN 表过多的优化思路

当 MySQL 查询涉及大量表 JOIN 时&#xff0c;性能会显著下降。以下是优化思路和简易实现方法&#xff1a; 一、核心优化思路 减少 JOIN 数量 数据冗余&#xff1a;添加必要的冗余字段&#xff08;如订单表直接存储用户名&#xff09;合并表&#xff1a;将频繁关联的小表合并成…...