目录

一、什么是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],01add dword ptr [rsi+000007E0],02  // 增加2jmp returnINJECT:jmp newmemnop 2
return:
registersymbol(INJECT)[DISABLE]INJECT:db 83 AE E0 07 00 00 01unregistersymbol(INJECT)
dealloc(newmem)

这个代码稍微复杂了一点.

1.aobscanmodule命令

Auto Assembler aobScanModule(SymbolNameModuleNameAOBString)

Scans the memory used by the module ModuleName for a specific byte pattern defined by AOBString and sets the resulting address to the symbol SymbolName.

上面英文已经讲得比较清楚了,就是扫描AOBString这个16进制字节数组,将扫描到的数据的地址存入SymbolName。

具体来说,看程序第一行代码:

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命令在模块中搜索,第一个参数INJECT是搜索结果的别名,当标签使用,第二个参数是要搜索的模块,第三个参数就是要搜索的字节码。

2.alloc

alloc(newmem,$1000,INJECT)

注意,上面$1000代表16进制0x1000,转换成10进制就是4096.

3.registersymbol

Auto Assembler registerSymbol(SymbolName)

Adds a symbol to the user-defined symbol list so cheat tables and the memory browser can use that name instead of an address.

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

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

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

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

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

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

激活前:

激活后:

从效果上看,“INJECT”全局符号就相当于C语言的宏,和“代码注入”中的“Tutorial-x86_64.exe+2DB57 ”是一样的,但是后面的地址却变成了"E9 A4 24 FC FF",这个就是jmp指令的地址。所以最后【DISABLE】关闭脚本时,要把地址还原:

INJECT:
  db 83 AE E0 07 00 00 01

三、代码注入

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

[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 returnhereoriginalcode:
//sub dword ptr [rsi+000007E0],01
add dword ptr [rsi+000007E0],02  // 增加2exit:
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],2code://sub dword ptr [rsi+000007E0],01jmp returnaddress:jmp newmemnop 2
return:[DISABLE]address:db bytes// sub dword ptr [rsi+000007E0],01dealloc(newmem)

这里面多了一个assert。

Auto Assembler assert(AddressArrayOfBytes)

Will check the memory address for the given bytes. If the address's memory is not what is defined by the array of bytes given, the auto assemble script will not execute.

assert起一个检查的作用,检查address和ArrayOfBytes是否一样,不一样就不执行后面的代码。

五、“全部注入”和“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注入通过程序代码的字节码还原。

参考文章:

https://wiki.cheatengine.org/index.php?title=Auto_Assembler:Commands

CE自动汇编之AOB注入相关推荐

  1. C语言人造指针,CE自动汇编:AA引擎通用DLL

    CE自动汇编直译器: AA引擎 各语言通用DLL - aa_engine.dll 三个函数, 原型如下: 1). 运行CE AA脚本 bool AutoAssemble(HANDLE hProcess ...

  2. 逆向入门(三) CE自动汇编后保存CT表并生成exe修改器

    目录 一.背景 二.寻找基地址 三.代码注入 四.生成可执行文件 一.背景 背景:修改QT编译完成的软件的tab页,让其中的一个页面点击失效. 实现程度:因为目前操作的是tabbar 的槽函数.所以会 ...

  3. 易语言游戏基址内存数据CEAA自动汇编脚本注入及CALL的调用

    对于汇编基础稍弱的同学来说,CEEAA自动汇编是一个部错的选择,以CE为工具,以脚本注入为主,采用CEAA自动汇编,利于易语言调用自动 汇编脚本注入游戏,实战了各种汇编技巧,易语言注入调用汇编的各种方 ...

  4. 自动汇编转c语言,【转载】CE教程之自动汇编

    简单来解释就是,在不考虑组译器的情况下(实际上修改游戏的话也不需要关注这个),可以理解为,我们的CPU在处理程序时所用的低级机器语言就是汇编. 很不幸的是,汇编不愧为低级语言,学习起来极其复杂,我周围 ...

  5. CEAA自动汇编脚本常用命令

    LABEL(标签名):让标签名可以被当作一个地址使用. ALLOC(分配的内存标签名, 字节数):使用方式同LABEL,同时分配内存,指向被分配的内存地址. ALLOC(分配的内存标签名, 字节数, ...

  6. 一步一步手绘Spring DI运行时序图(Spring 自动装配之依赖注入)

    相关内容: 架构师系列内容:架构师学习笔记(持续更新) 一步一步手绘Spring IOC运行时序图一(Spring 核心容器 IOC初始化过程) 一步一步手绘Spring IOC运行时序图二(基于XM ...

  7. C语言人造指针,易语言置入CE自动脚本游戏修改模块源码

    模块名称:游戏修改模块 V1.0 模块 MD5:8ffd2ec390f0b7f21fef94012b4f1484 模块大小:0.07296371459961 MB(74.71484375 KB) 在A ...

  8. 植物大战僵尸:学会使用人造指针

    通过向游戏中注入一段特殊的汇编代码,实现自动获取动态地址,省略找基址的麻烦.该方法适用于游戏基址层数过多无法直接获取到基址,游戏根本无法找到基址. 1.打开CE工具并附加游戏进程,首先通过遍历的方式找 ...

  9. CheatEngine

    这题我最后一关没有做出来,所以直接引用pcat的(侵删) 1.准备CheatEngine5.6.1版本(其他版本也可以),为了方便,我就在xp里运行. 分别打开CheatEngine和题目的Virtu ...

最新文章

  1. c++把数组所有元素剔除_C语言基础之数组,第一节,C语言必学知识点剖析
  2. mysql批量导入 导出数据_MySQL批量导入导出数据
  3. 面向对象设计原则之开闭原则
  4. 定制Spring Data JPA存储库
  5. Vue路由开启keep-alive缓存页面
  6. 字符串分割与存入List集合
  7. 从零开始学视觉Transformer(2):图像与Transformer基础
  8. 【转】Maven实战(八)---模块划分
  9. 微信小程序-携带参数的二维码条形码生成
  10. Excel案例-杜邦分析法
  11. MATLAB图像处理(均值滤波)
  12. [教程]黑莓终极中文混刷教程 终身受用
  13. c++获取umg ue_UE4中UMG与C++交互 页面文本修改
  14. 数字图像处理 - 投影重建图像(一)雷登变换和傅里叶切片
  15. [IPhone] 如何将制作图片放大缩小的动作
  16. 万能通用!权限系统就该这么设计!
  17. JESD22-A103E.01:2021 High Temperature Storage Life, 高温贮存寿命规范标准 , 最新版2021年刚刚发行
  18. win10右键卡顿原因_win10系统右键卡顿的解决方法
  19. UE5 Oculus Quest 2 VR中设置手柄摇杆移动蓝图
  20. photon 服务器操作系统,[专栏作家] Photon Server之Photon Control服务器控制界面

热门文章

  1. 区块链治理:用编程迎接未来
  2. python四级是什么水平_大学英语四级相当于高考什么水平
  3. matplotlib只显示部分横坐标刻度,隐藏部分横坐标刻度
  4. oa系统用什么云服务器,oa系统怎么选云服务器
  5. 疫情之后,教育的生死淘汰赛
  6. 《面向对话的融入交互信息的实体关系抽取》--中文信息学报
  7. 【Bugfix系列】/usr/bin/ld: cannot find -lxxx 的解决办法
  8. 华为g9一直显示服务器错误,华为G9青春版失败变砖开不了机了怎么办_G9青春版救砖方法...
  9. python学习(一)
  10. 计算机考研就业率,21考研同学需谨慎,三个专业就业率持续走低,包括热门计算机专业...