CE训练教程进阶,步骤 9: 注入++

news2025/1/16 6:48:00

目录

一、找出存放四个玩家健康值的地址

二、找出修改数据的代码

三、找出是谁调用了修改指令

四、分析玩家的内存数据

五、注入修改代码

六、C语言代码注入


相对于前面8个步骤,步骤9稍微要难一点,所以单独写。

 步骤9是在步骤7的基础上,继续讲代码注入。但是它涉及到代码的细粒度区分,比如“攻击”时,上面4个玩家用到的都是同一段代码,这就需要通过代码去判断,什么时候是在攻击自己玩家(玩家1,玩家2),什么时候是在攻击敌方玩家。

一、找出存放四个玩家健康值的地址

精确查找,分别找出存放四个玩家健康值数据的地址,并双击添加到地址栏。注意查找时,数值类型要选单浮点,因为健康值为小数。当然,如果不知道数值是什么类型,也可以用"未知的初始值"查找,只是要麻烦一点

二、找出修改数据的代码

在四个玩家的地址上,右键选择“找出是什么改写了这个地址”后,再点击“攻击”该玩家,修改该玩家健康值的指令就会显示出来。

 最后会发现,攻击每个玩家时,调用的都是这条指令:

10002F25D - F3 0F11 43 08  - movss [rbx+08],xmm0

所以,我们不能直接修改这条指令,实现攻击己方玩家时健康值增加,攻击敌方玩家时健康值降低。

当然,我们说的仅仅是在“攻击”时,如果直接修改玩家的健康值,是可以成功的。

三、找出是谁调用了修改指令

我们需要用反汇编的方式,继续往前找,找出是谁调用了修改健康值的指令。

右键选择“找出指令访问的地址”:

 再分别攻击这四个玩家,四个玩家健康值地址就会显示出来。

 当然,如果我们只是找这个四个玩家健康值的地址,前面早就找出来了,根本不用这么麻烦。下面的步骤才是关键,那就是分析数据。

四、分析玩家的内存数据

选中四个玩家地址,然后右键选择“打开选中地址的分析数据”:

 上面界面选了后,会弹出一个框,点确定即可。

 

 然后给这个数据结构取一个名字:

 然后会弹出一个框,点击“yes”:

 

 这个结构的起始大小默认是4096,点击“ok”:

 

 然后这个数据分析的界面就出现了:

 上面这个界面,分别显示了4个玩家对应的内存数据,我们最开始就已经知道,Dave和Eric是一队,而HAL和KITT是另一个队的。通过上面的数据会发现,只有蓝色框框出的那行,比较符合这个规则。

那么这个界面的作用是什么?

1.找出区分队伍的数据地址偏移量,即+0014;

2.找出各玩家健康值的偏移量,即+0008。

五、注入修改代码

回到汇编界面,点击“自动汇编”:

先选择“CT表框架代码”:

 

 再选择“代码注入”,并填写地址:

 然后会生成一段模板代码,需要稍微改下:

[ENABLE]
//code from here to '[DISABLE]' will be used to enable the cheat
alloc(newmem,2048,"Tutorial-x86_64.exe"+2F25D) 
label(returnhere)
label(originalcode)
label(exit)

newmem:
  cmp [rbx+14],1//第1队玩家
  je team1
  cmp [rbx+14],2//第2队玩家
  je team2

team1:
  movss xmm0,[rbx+08]// [rbx+08]就是原健康值的地址,即攻击第1队玩家时健康值不变
  jmp originalcode

team2:
  movss xmm0,[value2]// 第2队敌方玩家的健康值为0
  jmp originalcode

value2:
  dd (float)0

originalcode:
movss [rbx+08],xmm0

exit:
jmp returnhere

"Tutorial-x86_64.exe"+2F25D:
jmp newmem
returnhere:
 
[DISABLE]
//code from here till the end of the code will be used to disable the cheat
dealloc(newmem)
"Tutorial-x86_64.exe"+2F25D:
movss [rbx+08],xmm0
//Alt: db F3 0F 11 43 08

 上面代码看起很多,实际只有中间那段是手写的,作用就是:

如果玩家是1队的,健康值不变;如果玩家是2队的,健康值设为0。

保存脚本,然后选择“文件”菜单中的“分配到当前CT表”:

回到CE主界面,激活自动汇编脚本:

 然后点击Tutorial-x86_64.exe的步骤9界面,点击“重新启动游戏并自动执行”,然后随便“攻击”一个玩家,就可以激活“下一步”按钮了。

六、C语言代码注入

直接修改汇编代码,需要对汇编指令相当熟悉才可以,而且逻辑稍微复杂一点,修改起来会相当繁琐。比较幸运的是,在CE中,居然可以直接使用C语言的代码来编写。

下面我用C语言来实现一个功能,那就是:

攻击己方玩家时,健康值减少10;而攻击敌方玩家时,健康值减少100。

[ENABLE]
//code from here to '[DISABLE]' will be used to enable the cheat
alloc(newmem,2048,"Tutorial-x86_64.exe"+2F25D) 
label(returnhere)

{$c}
// {$c} 表示c语言代码块,可以定义我们需要调用的函数。
void SetHP(void* hpBase)
{
   if(*(int*)(hpBase+0x14)!=1){
     *(float*)(hpBase+0x8)=*(float*)(hpBase+0x8)-100; //攻击敌方玩家,健康值减少100。
   }else{
     *(float*)(hpBase+0x8)=*(float*)(hpBase+0x8)-10; //攻击己方玩家,健康值减少10。
   }
}
{$asm}//c代码块结束

newmem:
// 注意这是里用的是ccode,hpBase代表参数名,rbx代表参数值
{$ccode hpBase=rbx}
  SetHP(hpBase);
{$asm}
  jmp returnhere

"Tutorial-x86_64.exe"+2F25D:
jmp newmem
returnhere:
 
[DISABLE]
//code from here till the end of the code will be used to disable the cheat
dealloc(newmem)
"Tutorial-x86_64.exe"+2F25D:
movss [rbx+08],xmm0

上面代码总体来说,比汇编代码要容易读一些,也精简了不少,实现效果如下:

最后再说一点,关于movss指令:

MOVSS,Move scalar single precision floating-point value between XMM registers or between an XMM register and memory.

存放float类型的数据大多是xmm寄存器,而movss指令(SSE指令集之一)则用来移动单精度float类型的数据。

参考文章:

【CheatEngine基础教程】拾遗篇 - 哔哩哔哩

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Flowable进阶学习(六)网关

文章目录排他网关案例:并行网关案例:包容网关案例:事件网关网关(gateway)用来控制流程的流向。来实现复杂的审批流程。网关的分类包括:排他网关、并行网关、包容网关、事件网关。排他网关 exclusive gateway也成为异域网关XORgat…

Python数据可视化之图表组成元素

1.1绘制 matplotlib 图表组成元素的主要函数matplotlib 是如何组织内容的?在一个图形输出窗口中,底层是一个 Figure实例,我们通常称之为画布,包含一些可见和不可见的元素。在画布上,自然是图形,这些图形就是…

Allegro如何自动居中走线操作指导

Allegro如何自动居中走线操作指导 Allegro支持自动将走线居中到两个孔的中间,避免手动去调整的麻烦,类似下图 具体操作如下 点击Spread Between VoidsOptions选择需要居中走线的层面,并且Void clearance输入0

OpenGL ES着色器语言(GLSL ES)规范 ——上篇

文章目录前言OpenGL ES基础一段基本的着色器代码大小写和分号数据值类型、命名规范、类型转换运算符矢量和矩阵矢量和矩阵类型矢量构造、访问矩阵构造、访问矢量矩阵运算规则特殊类型—结构体和数组结构体数组取样器总结前言 着色器语言通过控制GPU来进行前端图形的渲染&#…

《深入浅出计算机组成原理》学习笔记 Day10

浮点数与定点数1. 浮点数的不精确性2. 定点数的表示3. 浮点数的表示参考1. 浮点数的不精确性 32 比特只能表示 2 的 32 次方个不同的数,差不多是 40 亿个。如果表示的数超过能表示总的个数,那么就会有两个不同的数的二进制表示是一样的。计算机就会不知…

【深度学习炼丹】不平衡样本的处理

目录:不平衡样本的处理一、前言二、数据层面处理方法2.1 数据扩充2.2 数据(重)采样2.3 类别平衡采样三、算法(损失函数)层面处理方法3.1 Focal Loss3.2 损失函数加权四、参考资料一、前言 在机器学习的经典假设中往往…

VMWare 移动Linux CentOS 7虚拟机后连不上网怎么办

研究hadoop的时候发现虚拟机太大了,于是把3台节点的虚拟机剪切粘贴到移动硬盘上,但是出现了上不了网的问题 VMWare 移动Linux CentOS 7虚拟机后连不上网,ifconfig命令只出现lo不出现有IP地址的ens33,jps命令也出现了jps command …

机器学习模型搭建与评估

模型搭建和评估第三章 模型搭建和评估--建模模型搭建任务一:切割训练集和测试集任务二:模型创建任务三:输出模型预测结果第三章 模型搭建和评估-评估模型评估任务一:交叉验证任务二:混淆矩阵任务三:ROC曲线…

python爬虫学习笔记-mysql数据库介绍下载安装

数据库概述 为什么要使用数据库? 那我们在没有学习数据库的时候,数据存放在json或者磁盘文件中不也挺好的嘛,为啥还要学习数据库? 文件中存储数据,无法基于文件直接对数据进行操作或者运算,必须借助python将…

IDEA搭建Finchley.SR2版本的SpringCloud父子基础项目-------Ribbon负载均衡

1.概念 Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具。简单的说,Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起。Ribbon客户端组件提供一系列完善的配…

Python闭包与闭包陷阱

1 什么是闭包 在 Python 中,闭包是一种特殊的函数,它能够记住它所在的环境(也称作上下文)。这意味着闭包能够访问定义它的作用域中的变量。闭包通常用于封装数据和提供对外部访问的接口。 在 Python 中使用闭包有以下几点好处&a…

数据库和SQL概述

数据库和SQL概述 数据库的好处 实现数据的持久化使用完整的管理系统统一管理,易于查询 常用的一些名称缩写 DB:数据库(Database):存储数据的“仓库”。它保存了一系列有组织的数据DBMS:数据库管理系统(Database Management Sy…

离线用户召回定时更新

3.6 离线用户召回定时更新 学习目标 目标 知道离线内容召回的概念知道如何进行内容召回计算存储规则应用 应用spark完成离线用户基于内容的协同过滤推荐 3.6.1 定时更新代码 完整代码 import os import sys # 如果当前代码文件运行测试需要加入修改路径,否则后面…

游戏启动器:LaunchBox Premium with Big Box v13.1

LaunchBox知道您会喜欢的功能,具有风格的游戏启动器,我们最初将 Launchbox 构建为 DOSBox 的一个有吸引力的前端,但它现在拥有对现代游戏和复古游戏模拟的支持。我们让您的所有游戏看起来都很漂亮。 整理您的游戏收藏 我们不仅漂亮&#xff…

基于微信小程序奶茶店在线点餐下单系统

奶茶在线下单系统用户端是基于微信小程序端,管理员端是基于web端,基于java编程语言,mysql数据库,idea工具开发,用户微信端可以注册登陆小程序,查看奶茶详情,搜索下单奶茶,在线奶茶评…

CSS @property(CSS 自定义属性)

CSS property(CSS 自定义属性)参考描述propertyHoudiniproperty兼容性描述符规则syntax扩展initial-valueinherits示例描述符的注意事项使用 JavaScript 来创建自定义属性CSS 变量与自定义属性重复赋值过渡简单的背景过渡动画更复杂的背景过渡动画错误示…

【ARM体系结构】之数据类型约定与工作模式

1、RISC和CISC的区别 1.1 RISC : 精简指令集 使用精简指令集的架构:ARM架构 RISC-V架构 PowerPC架构 MIPS架构ARM架构 :目前使用最广泛的架构,ARM面向的低端消费类市场RISC-V架构 :第五代,精简指令集的架构&#xff…

这样定义通用人工智能

🍿*★,*:.☆欢迎您/$:*.★* 🍿 正文 人类解决问题的途径,大体可以分为两种。一种是事实推理,另一种是事实验证。 为什么只是两种分类,因为根据和环境的交互与否。 事实推理解释为当遇到事件发生的时候,思考的过程。可以使用概率模型,或者更复杂的模型(目前没…

Out of Vocabulary处理方法

Out of Vocabulary 我们在NLP任务中一般都会有一个词表,这个词表一般可以使用一些大牛论文中的词表或者一些大公司的词表,或者是从自己的数据集中提取的词。但是无论当后续的训练还是预测,总有可能会出现并不包含在词表中的词,这…

(教程)如何在BERT模型中添加自己的词汇(pytorch版)

来源:投稿 作者:皮皮雷 编辑:学姐 参考文章: NLP | How to add a domain-specific vocabulary (new tokens) to a subword tokenizer already trained like BERT WordPiece | by Pierre Guillou | Medium https://medium.com/pi…