最新博客链接

最近想学习一下 CE,刚好看见游戏库里装了 Kingdom Rush 就拿它来研究吧。这里写的东西,需要一些 Cheat Engine 的基础,可以看看教程。

这里主要是看写的注释,来理解脚本。(如果什么都不想看,可以直接复制粘贴 CE 自动汇编(AA)脚本)

我学习的链接:

你能学会的 Cheat Engine 零基础入门教程

Cheat Engine 基础教程 CE Tutorial | Ganlv's Blog

CE 教学实例应用-由浅入深学习游戏修改 [全十课]

参考链接:

Cheat Engine 官方 WIKI

x86 汇编指令列表

技术理解

我对一些用到的技术的简单理解:

  • 代码注入:在程序运行时,将自己写的代码,替换掉原有的代码
  • AOB:(Array Of Byte)在内存中搜索特定的一串数据,以决定注入代码的位置
  • 人造指针:单独找个地方,记录变量所在的地址

数据存储结构

数据在内存中的存储结构:

Cheat Engine 相关汇编知识

此脚本用到的 CE 汇编指令:

x86 汇编指令列表

命令例子 功能
mov ebx,0000FFFF Move,寄存器直接赋值
mov ebx,eax Move,将右边直接给左边
mov ebx,[eax] Move,将右边所指的值给左边。[ ]代表括号内的是指针,操作时,操作其指向的内存值
cmp ebx,eax Compare,比较两寄存器值,若相等则 ZF 位 置 1(左减右)
je <label> Jump if Equal, ZF = 1 时跳转,可跳转至标记段代码
jne <label> Jump if Not Equal, ZF = 0 时跳转,可跳转至标记段代码
jmp <label> Jump

此脚本用到的 CE 自动汇编函数:(Auto Assembler)

Cheat Engine 官方 WIKI

函数 参数 作用
alloc alloc(SymbolName, Size, AllocateNearThisAddress OPTIONAL) Allocates a memory block of Size bytes and defines the SymbolName in the script, pointing to the beginning of the allocated memory block.
dealloc dealloc(SymbolName) Deallocates a block of memory allocated with alloc.
label label(LabelName) Enables the word 'LabelName' to be used as a symbol.
aobScanModule aobScanModule(SymbolName, ModuleName, AOBString) 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.
registerSymbol 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.
unregisterSymbol unregisterSymbol(SymbolName) Removes a symbol from the user-defined symbol list. No error will occur if the symbol doesn't exist.

此脚本用到的 CE 汇编语言数据类型:

类型 占用空间
Bit(整型) 1 位
Byte(整型) 8 位(字节)
2 byte(整型) WORD(字)
4 Bytes(整型) DWORD(双字)
8 Bytes(整型) QWORD(四字)
Float(单浮点) DWORD(双字)
Double(双浮点) QWORD(四字)
String(字符串) 任意长度
Array of bytes(AOB) 任意长度

CE 常用寄存器:

The x86 architecture has 8 General-Purpose Registers (GPR)

x86 架构有 8 个通用寄存器(32 位系统)

"E" (for "extended"), 32 bits.

General-Purpose Registers:EAX, EBX, ECX, EDX, ESP, EBP, ESI, EDI

Cheat Engine 汇编代码

学过 CE 的,通过注释,应该能看懂

{ Game   : Kingdom Rush.exe
Version:
Date : 2022-06-19
Author : Tsanfer 更改金钱、生命、星
(使用 AOB 和人造指针)
} [ENABLE] aobscanmodule(INJECT,lua51.dll,8B 29 8B 49 04 89 2C C2) // AOB 匹配入口
alloc(newmem,1024,INJECT) // 分配 1024 字节个内存,用于代码注入
alloc(man_pointer,24) // 动态分配内存,用于存放3个人造指针 // 注册全局符号
registersymbol(INJECT)
registersymbol(man_pointer) // 人造指针 // 声明标号
label(original_code)
label(return)
label(restore_reg)
label(check_is_gold)
label(check_is_gold_END)
label(check_is_live)
label(check_is_live_END)
label(check_is_star)
label(check_is_star_END) // 数据存储结构:
// 偏移 数据 变量类型
// 0 具体值 Double
// 8 指向值所属的公共结构 指针
// └─> 0
// 10 此公共结构的名称 字符串 // 程序执行顺序:(汇编代码如没有跳转,默认从上往下执行)
// INJECT -> newmem -> check_is_gold -> check_is_live
// -> check_is_star -> reset_reg -> original_code -> return // 注入代码段
newmem:
pushfd // 保存所有标志位
push eax // eax 压栈保存,为后续操作腾出一个寄存器
mov eax,[ecx+08] // 将当前值所属的公共类型所在的地址,给 eax // 判断此值的类型是否为金钱(player_gold)
check_is_gold:
cmp dword ptr [eax+10],'play' // 内存双字比较
jne check_is_gold_END // 如不匹配,则停止后续比较,跳到此比较的结尾
cmp dword ptr [eax+14],'er_g'
jne check_is_gold_END
cmp word ptr [eax+18],'ol' // 内存字比较
jne check_is_gold_END
cmp byte ptr [eax+1A],'d' // 内存字节比较
jne check_is_gold_END
mov [man_pointer],ecx // 匹配成功,将指向此值的指针保存在申请的内存中(制作人造指针)
check_is_gold_END: // 判断此值的类型是否为生命(lives)
check_is_live:
cmp dword ptr [eax+10],'live'
jne check_is_live_END
cmp byte ptr [eax+14],'s'
jne check_is_gold_END
mov [man_pointer+8],ecx // 将指针保存在第二个内存位置
// (64位系统的指针大小为 64 bit,每个内存地址大小为 8bit,则需要平移8个内存地址,8x8=64)
check_is_live_END: // 判断此值的类型是否为升级用的星(total_stars)
check_is_star:
cmp dword ptr [eax+10],'tota'
jne check_is_star_END
cmp dword ptr [eax+14],'l_st'
jne check_is_star_END
cmp word ptr [eax+18],'ar'
jne check_is_star_END
cmp byte ptr [eax+1A],'s'
jne check_is_star_END
mov [man_pointer+10],ecx
check_is_star_END: // 恢复临时使用的寄存器的值
restore_reg:
pop eax
popfd // 还原所有标志位
jmp original_code // 原始代码
original_code:
mov ebp,[ecx]
mov ecx,[ecx+04]
jmp return // 跳到返回 // 程序入口
INJECT:
jmp newmem
return: // 返回 [DISABLE]
// 还原代码
INJECT:
db 8B 29 8B 49 04 // 注销全局符号
unregistersymbol(INJECT)
unregistersymbol(man_pointer)
// 释放内存
dealloc(newmem)
dealloc(man_pointer) {
// ORIGINAL CODE - INJECTION POINT: lua51.dll+1BDA lua51.dll+1BBC: 23 48 08 - and ecx,[eax+08]
lua51.dll+1BBF: 6B C9 18 - imul ecx,ecx,18
lua51.dll+1BC2: 03 4D 14 - add ecx,[ebp+14]
lua51.dll+1BC5: 83 79 0C FB - cmp dword ptr [ecx+0C],-05
lua51.dll+1BC9: 75 3A - jne lua51.dll+1C05
lua51.dll+1BCB: 39 41 08 - cmp [ecx+08],eax
lua51.dll+1BCE: 75 35 - jne lua51.dll+1C05
lua51.dll+1BD0: 83 79 04 FF - cmp dword ptr [ecx+04],-01
lua51.dll+1BD4: 74 36 - je lua51.dll+1C0C
lua51.dll+1BD6: 0F B6 46 FD - movzx eax,byte ptr [esi-03]
// ---------- INJECTING HERE ----------
lua51.dll+1BDA: 8B 29 - mov ebp,[ecx]
lua51.dll+1BDC: 8B 49 04 - mov ecx,[ecx+04]
// ---------- DONE INJECTING ----------
lua51.dll+1BDF: 89 2C C2 - mov [edx+eax*8],ebp
lua51.dll+1BE2: 89 4C C2 04 - mov [edx+eax*8+04],ecx
lua51.dll+1BE6: 8B 06 - mov eax,[esi]
lua51.dll+1BE8: 0F B6 CC - movzx ecx,ah
lua51.dll+1BEB: 0F B6 E8 - movzx ebp,al
lua51.dll+1BEE: 83 C6 04 - add esi,04
lua51.dll+1BF1: C1 E8 10 - shr eax,10
lua51.dll+1BF4: FF 24 AB - jmp dword ptr [ebx+ebp*4]
lua51.dll+1BF7: 0F B6 46 FD - movzx eax,byte ptr [esi-03]
}

然后再手动添加 3 个人造指针的地址(man_pointer 和 man_pointer+8 和 man_pointer+10),就行了

Cheat Engine 使用界面:

本文由Tsanfer's Blog 发布!

使用 Cheat Engine 修改 Kingdom Rush 中的金钱、生命、星的更多相关文章

  1. Cheat Engine 修改汇编指令

    打开游戏 扫描阳光 扫描过程就不讲了 找到阳光的地址 显示反汇编 找到使阳光减少的反汇编代码 空指令替换 将阳光减少汇编指令,用空指令替换.这样阳光就不再减少了 指令替换 也可以将汇编指令修改,减少变 ...

  2. ce游戏内存修改器(Cheat Engine)

    ce修改器(Cheat Engine)一款专门修改内存修改编辑的游戏工具它包括16进制编辑,反汇编程序,内存查找工具新版6.1 版的CE与6.0 最大的区别就是添加了修改器制作工具,比之前 5.6.1 ...

  3. (外挂破解)Cheat Engine(内存修改工具)V6.2中文版软件介绍

    Heat Engine是一款内存修改编辑工具,Cheat Engine允许你修改你的游戏,所以你将总是赢.它包括16进制编辑,反汇编程序,内存查找工具.与同类修改工具相比,它具有强大的反汇编功能,且自 ...

  4. [Kingdom Rush]团队分享:如何做塔防手游

    转自:http://www.gamelook.com.cn/2015/03/207324 GameLook报道/2014年11月,乌拉圭开发商Ironhide Studios发布的<Kingdo ...

  5. Cheat Engine TUTORIAL 教程 (8个步骤)

    https://www.cnblogs.com/ae6623/archive/2011/04/16/4416874.html https://www.52pojie.cn/thread-828030- ...

  6. Cheat Engine 入门操作

    Cheat Engine(简称CE,中文名-作弊引擎),用于查找.修改内存数据,是游戏逆向的基础工具. 本文仅介绍基础操作. 1.打开进程 运行游戏程序,并将CE附加到进程 2.寻找数据地址,并修改数 ...

  7. cheat engine lua

    function CEButton1Click(sender) local x = getProperty(CETrainer.CEEdit1,"Text")--这句很重要,获取文 ...

  8. Cheat Engine 6.8 设置中文

    下载翻译文件包 https://cheatengine.org/downloads.php 下载后解压到 "Cheat Engine 6.8.3\languages" 下面 修改 ...

  9. Cheat Engine 基本用法

    打开游戏 当前血量2620 打开Cheat Engine 扫描2620 掉点血 再次扫描2600 此时,会根据第一次扫描结果,再次扫描 扫描成功 将数据放到修改区,点击箭头 修改数据 双击Value进 ...

随机推荐

  1. MySQL基础之写表(创建表)

    我的博客 工具 市面上的SQL可视化工具不少,我一般常用的主要就是这两个. 当然,IDEA也是集成了数据库可视化功能的.除了这些,还有DBeaver.SQLyog等等. 我比较喜欢DataGrip,我 ...

  2. Spring从入门到源码(一)

    Spring 1.什么是框架? 人话就是:方便干活,架子有了,直接拿来用就完事了. spring,springmvc,mybatis三大开框架 2.架构的演变过程 单一应用架构 垂直应用架构 分布式服 ...

  3. Springboot中整合knife4j接口文档

    在项目开发过程中,web项目的前后端分离开发,APP开发,需要由前端后端工程师共同定义接口,编写接口文档,之后大家都根据这个接口文档进行开发. 什么是knife4j 简单说knife4j就swagge ...

  4. Django视图函数:CBV与FBV (ps:补充装饰器)

    CBV 基于类的视图  FBV 基于函数的视图 CBV: 1 项目目录下: 2 urlpatterns = [ 3 path('login1/',views.Login.as_view()) #.as ...

  5. Linux 运维请务必收藏~ Nginx 五大常见应用场景

    关注「开源Linux」,选择"设为星标" 回复「学习」,有我为您特别筛选的学习资料~ Nginx 是一个很强大的高性能 Web 和反向代理服务,它具有很多非常优越的特性,在连接高并 ...

  6. 详解Kubernetes存储体系

    Volume.PV.PVC.StorageClass由来 先思考一个问题,为什么会引入Volume这样一个概念? " 答案很简单,为了实现数据持久化,数据的生命周期不随着容器的消亡而消亡. ...

  7. 老生常谈系列之Aop--CGLIB动态代理的底层实现原理

    老生常谈系列之Aop--CGLIB动态代理的底层实现原理 前言 上一篇老生常谈系列之Aop--JDK动态代理的底层实现原理简单讲解了JDK动态代理的实现,动态代理常用实现里面的双子星还有另一位--CG ...

  8. 北航内核操作系统-lab0

    1.lab0环境介绍. 2.进入实验界面. 3.进入实战测试. 任务要求: 3.1编写斐波那契数列. 3.2编写Makefile脚本. Makefile介绍: make命令执行时,需要一个 Makef ...

  9. Docker容器的数据卷

    一.数据卷概念 1.数据卷是宿主机中的一个目录或文件 2.当容器目录和数据卷目录绑定后,对方的修改会立即同步 3.一个数据卷可以被多个容器同时挂载 4.一个容器也可以挂载多个数据卷 简单理解:有点类似 ...

  10. mysql 主从数据同步配置

    一主一从,单向同步 master 数据库的数据变更单向同步到 slave 数据库 互为主从,双向同步 master 数据库的数据变更同步到 slave 数据库,slave 数据库的数据边同步到 mas ...