CE自动汇编之AOB注入

news2024/11/25 23:41:43

目录

一、什么是AOB注入?

二、什么时候使用AOB注入?

三、代码注入

四、全部注入

五、“全部注入”和“AOB注入”的分别

六、代码注入与AOB注入的区别


CE自动汇编的模板中,有三种注入代码的方式:

第一种是代码注入,就是训练教程中的步骤7所示。

一、什么是AOB注入?

AOB(Array of Bytes)是一系列唯一的字节数组,除了我们的指令能在内存中生成这些字节数组外,内存中的其它任何地方都不会再有这样的字节。这将有助于作弊者在游戏重新启动后,通过查找这些字节码,再次准确的提取那些动态地址。

二、什么时候使用AOB注入?

比如写了一个作弊器,但是游戏版本更新了,很有可能出现,涉及到作弊的那段游戏代码本身没有变化,但代码在内存中的位置却可能会变动的情况。这个时候,是不是又要重新去寻找一遍代码地址?

如果采用AOB注入的方式,则不需要再重新寻找地址了,因为它是通过代码在内存中的字节码来寻找地址。

自动汇编的界面如下,可以在“模板”中选择“AOB注入”:

我们还是拿训练教程的步骤7作为例子:

 找到修改代码后,选择“自动汇编”中的“AOB”注入:

 完整的代码如下:

[ENABLE]

aobscanmodule(INJECT,Tutorial-x86_64.exe,83 AE E0 07 00 00 01) // should be unique
alloc(newmem,$1000,INJECT)

label(code)
label(return)

newmem:

code:
  //sub dword ptr [rsi+000007E0],01
  add dword ptr [rsi+000007E0],02  // 增加2
  jmp return

INJECT:
  jmp newmem
  nop 2
return:
registersymbol(INJECT)

[DISABLE]

INJECT:
  db 83 AE E0 07 00 00 01

unregistersymbol(INJECT)
dealloc(newmem)

这个代码稍微复杂了一点,先看第一行代码:

aobscanmodule(INJECT,Tutorial-x86_64.exe,83 AE E0 07 00 00 01) // should be unique

这里面的"83 AE E0 07 00 00 01"就是sub指令行在内存中的字节码,虽然是模板里面可以自动生成,但是我们也可以手动确认下,可以在“Memory Viewer”界面内找到这个字节码:

 然后,在CE主界面,搜索16进制数据,先选择“数值类型”为字节数组,才能选择扫描类型。

另外,一定不要勾选“可写”类型,要取消选择(表示不可写)或像设为“方框”,表示可不可写无所谓。

 aobscanmodule函数表示在模块中搜索,第一个参数是搜索结果(如果有的话)的别名,当标签使用,第二个参数是要搜索的模块,第三个参数就是要搜索的字节码。

脚本命令registersymbol和unregistersymbol,前者是说将目标注册成一个全局符号,一旦注册,无论是其他脚本还是CE地址列表,都可以直接用这个注册的符号来表示这个地址,后者则表示取消注册符号。

需要注意的是在DISABLE部分,这里直接用了“db 83 AE E0 07 00 00 01”来还原,而非汇编指令。本质上来说,“db 83 AE E0 07 00 00 01”字节码代表的意思和下面的代码意思一样:

"Tutorial-x86_64.exe"+2DB57:
sub dword ptr [rsi+000007E0],01

 那为什么不用上面的汇编指令来替换呢?其实是可以这么做的,但是一般来说,用字节码更好。

要知道,同样的汇编代码,可能会因为不同的汇编器而生成不同的字节代码。平时无所谓,像这种通过AOB来定位的方式,如果我们激活脚本,然后关闭脚本,一旦在代码还原时生成了不同的字节码,则脚本就无法再次激活了。所以直接写回原来的机器码是更好的选择。实际上,任何时候这都是个更好的选择。 

最后,将sub改成add后,点击“文件”中的“分配到当前的CT表”,我们可以观察激活这段汇编脚本前后的变化情况。

激活前:

 激活后:

 

 可以看出,“INJECT”标签已经代替了“Tutorial-x86_64.exe”模块。

三、代码注入

代码注入,前面文章已经讲了,这里直接贴代码:

[ENABLE]
alloc(newmem,2048,"Tutorial-x86_64.exe"+2DB57) 
label(returnhere)
label(originalcode)
label(exit)
 
newmem: //this is allocated memory, you have read,write,execute access
//place your code here
jmp returnhere
 
originalcode:
//sub dword ptr [rsi+000007E0],01
add dword ptr [rsi+000007E0],02  // 增加2
 
exit:
jmp returnhere
 
"Tutorial-x86_64.exe"+2DB57:
jmp newmem
nop 2
returnhere:
 
[DISABLE]
dealloc(newmem)
"Tutorial-x86_64.exe"+2DB57:
sub dword ptr [rsi+000007E0],01

四、全部注入

“全部注入”的方式其实和AOB是差不多的,见下列代码:

define(address,"Tutorial-x86_64.exe"+2DB57)
define(bytes,83 AE E0 07 00 00 01)

[ENABLE]

assert(address,bytes)
alloc(newmem,$1000,"Tutorial-x86_64.exe"+2DB57)

label(code)
label(return)

newmem:
  add dword ptr [rsi+000007E0],2

code:
  //sub dword ptr [rsi+000007E0],01
  jmp return

address:
  jmp newmem
  nop 2
return:

[DISABLE]

address:
  db bytes
  // sub dword ptr [rsi+000007E0],01

dealloc(newmem)

五、“全部注入”和“AOB注入”的分别

//全部注入

define(address,"Tutorial-x86_64.exe"+2DB57)
define(bytes,83 AE E0 07 00 00 01)

assert(address,bytes)

//AOB注入

aobscanmodule(INJECT,Tutorial-x86_64.exe,83 AE E0 07 00 00 01) // should be unique

。。。

registersymbol(INJECT)

可以看出,“全部注入”加了一句assert,它的意思是先要判断下,address与bytes要相同,才执行后面的代码。另外,AOB注入会增加一个全局符号INJECT。

六、代码注入与AOB注入的区别

1.代码注入与AOB注入的主要区别是,寻址方式不同:

//代码注入

alloc(newmem,2048,"Tutorial-x86_64.exe"+2DB57) 

//aob注入

aobscanmodule(INJECT,Tutorial-x86_64.exe,83 AE E0 07 00 00 01) // should be unique
alloc(newmem,$1000,INJECT)

可以看出,“代码注入”直接使用"Tutorial-i386.exe"+2DB57,而AOB是通过搜索其对应的字节码来定位。

2.还原方式不一样:

//代码注入,还原代码

[DISABLE]
dealloc(newmem)
"Tutorial-x86_64.exe"+2DB57:
sub dword ptr [rsi+000007E0],01

//AOB注入,还原代码

[DISABLE]

INJECT:
  db 83 AE E0 07 00 00 01

unregistersymbol(INJECT)
dealloc(newmem)

AOB注入通过程序代码的字节码还原。

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

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

相关文章

Qt使用数据库模型中的删除详解

以下使用 QSqlTableModel 模型,使用tableView显示内容 以下为界面: 这里主要介绍删除操作: 删除一行为: int rowui->tableView->currentIndex().row();//获取行号model->revertRow(row);//删除该行model->submitAll(…

git 关于分支和仓库的理解

何时需要initgit init//初始化本地仓库.git目录如果初始化就会在当前文件夹中出现.git的目录,该目录默认是隐藏的,需要关闭显示隐藏文件才能看到。执行完git init命令后,当前目录就成为了工作区(工作区可以理解为操作本地仓库的车…

MyBatis-Plus知识快速入门

文章目录1.MyBatis-Plus简介2.入门案例2.1开发环境2.2创建测试数据库和表2.3创建SpringBoot工程2.4创建实体类以及lombok的使用2.5添加mapper2.6加入日志功能3.基本的CRUD3.1BaseMapper3.2插入3.3删除3.4修改3.5查询4.通用Service4.1创建Service接口和实现类5.常用注解5.1Table…

“华为杯”研究生数学建模竞赛2005年-【华为杯】A题:城市出租车交通规划综合模型(附获奖论文和matlab代码)

赛题描述 A: Highway Traveling time Estimate and Optimal Routing Ⅰ Highway traveling time estimate is crucial to travelers. Hence, detectors are mounted on some of the US highways. For instance, detectors are mounted on every two-way six-lane highways o…

springboot 分布式全局唯一id的生成-雪花算法snowflake

一 背景描述 1.1 问题产生 在分布式系统中,怎么使用全局唯一id? 在分布式是,微服务的架构中,或者大数据分库分表中,多个不同节点怎么保持每台机器生成的主键id不重复,具有唯一性? 方案1&…

【算法基础】归并排序(原理、过程、例题、代码)

一、归并排序原理 1. 算法介绍 归并排序是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有…

力扣 2309. 兼具大小写的最好英文字母

题目 给你一个由英文字母组成的字符串 s ,请你找出并返回 s 中的 最好 英文字母。返回的字母必须为大写形式。如果不存在满足条件的字母,则返回一个空字符串。 最好 英文字母的大写和小写形式必须 都 在 s 中出现。 英文字母 b 比另一个英文字母 a 更…

前端食堂技术周刊第 68 期:Astro 2.0、Nuxt v3.1.0、Bun v0.5、TS 实现 Stage 3 Decorators 提案

美味值:🌟🌟🌟🌟🌟 口味:萝卜牛腩煲 食堂技术周刊仓库地址:https://github.com/Geekhyt/weekly 本期摘要 Astro 2.0Nuxt v3.1.0Bun v0.5TS 实现 Stage 3 Decorators 提案Turbore…

【算法突击】排序算法系列(一) | 程序员面试 | 冒泡排序 | 快速排序 | 归并排序

【排序算法】 冒泡排序 | 快速排序 | 归并排序 文章目录【排序算法】 冒泡排序 | 快速排序 | 归并排序1. 冒泡排序1.1 核心思想1.2 代码实现2. 快速排序2.1 核心思想2.2 时间复杂度2.2 代码实现3. 归并排序3.1 核心思想3.2 时间复杂度3.3 代码实现1. 冒泡排序 1.1 核心思想 将…

【接口自动化】接口间参数传递的一种解决方案

本文转载自:接口间参数传递的一种解决方案 做过接口自动化测试的同学肯定都熟悉在全链路测试过程中,很多业务场景的完成并非由单一接口实现,而是由很多接口组成的一条链路实现。例如你在淘宝上购物场景。 不同于单接口测试,这种链…

2 线性模型

文章目录一般流程问题引入数据集与测试集过拟合与泛化开发集监督学习和非监督学习问题分析训练集、验证集、测试集模型设计模拟训练过程课程代码课后习题代码课程来源: 链接文档参考: 链接以及 BirandaのBlog!一般流程 对于一般的线性模型来…

微信小程序 Springboot校园招聘求职系统

基于微信小程序的校园求职系统的设计基于现有的手机,可以实现首页、个人中心、岗位类型管理、用户管理、企业管理、招聘信息管理、应聘信息管理、系统管理等功能。方便用户对首页、招聘信息、我的等详细的了解及统计分析 一个基本的程序包含app.json、project.confi…

谈谈SpringBoot(二)

1. Spring Boot缓存 1.1 JSR-107 Spring从3.1开始定义了org.springframework.cache.Cache 和org.springframework.cache.CacheManager接口来统一不同的缓存技术; 并支持使用JCache(JSR-107)注解简化我们开发。 Cache接口为缓存的组件规范定义…

day23|93.复原IP地址、78.子集、90.子集II

93.复原IP地址 有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 . 分隔。 例如:"0.1.2.201" 和 "192.168.1.1" 是 有效 IP 地址,但是 &q…

layui框架学习(2:颜色、图标、动画)

B站教学视频中对Layui的颜色没有专门介绍,而Layui官方教程中虽然有颜色章节,但也只是简单介绍了基色调、辅色调、中性的颜色的概念及用途,最后说明layui 内置了七种背景色,以便用于各种元素中,如:徽章、分割…

Go语言基础入门第二章

Go语言环境安装 下载地址:https://golang.google.cn/dl/ 下载完安装包直接安装即可,安装完毕后,打开cmd控制台,输入”go version“查看是否安装成功以及对应安装版本。 配置环境变量Go语言需要一个安装目录,还需要一个…

Spring Cloud_Eureka服务注册与发现

目录一、Eureka基础知识1.什么是服务治理2.什么是服务注册3.Eureka两组件二、单机Eureka构建步骤1.IDEA生成eurekaServer端服务注册中心2.服务提供者3.服务消费者代码链接 https://github.com/lidonglin-bit/cloud 一、Eureka基础知识 1.什么是服务治理 SpringCloud封装了Ne…

金融风控09

迁移学习 为什么要? 源域样本与目标域样本分布有区别,目标域样本量不够 平时建模用的迁移学习场景 1、新开某个消费分期场景样本量少,需要用其他场景的数据建模 2、业务被迫停滞3个月再重启,大部分训练样本比较老旧&#xff…

含分布式光伏的配电网集群划分和集群电压协调控制(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

激光在大气中传输特性

在光纤通信中,单模光纤在波长1.55μm窗口具有巨大的潜在带宽和极低的损耗,传输数字信号的容量已能达到10Tb/s,每信道光源功率仅需1mW左右,无中间放大的距离超过100km。而且,光纤作为光波导,红外…