CE6.8 gTutorial STEP 1,2,3全集 简单破解教程
本帖最后由 vnetuser 于 2018-11-27 19:07 编辑# 前提
**本人刚接触CE 学了大概一周时间,一直在学习官方的tutorial,6.8新出了gTutorial 第一关就卡了很久,耗时一个周末的时间终于well done!便想着分享出来.有需要改进的地方,大家多多提携.**
------------
# Step 1 过关方法
###游戏说明:每5次射击你必须重新装填,在这个过程中目标会回复血量,尝试找到一种方法消灭目标。
### 过关思路:找到目标血量秒血(秒怪)或上调可射击次数(无限子弹)
####秒怪
(假设所有前戏都已经做足) 先找目标血量
0x1 CE中首次扫描.4字节,未知的初始值(Unknown Initial Value)
0x2 CE中再次扫描 未变动的数值(Unchanged value),可以多点几次.初次过滤一点点值
0x3 tTutorial中射击一次,看到目标减血后(子弹飞行中目标不减血的),再次扫描 减少的数值(Decreased Value)
0x4 ,当最后一发子弹射出后目标会恢复血量后,再次扫描 增加的数值(Increased Value)
0x5 一两轮过后剩余的结果值基本在个位数了.这时候直接操作gTutorial不断射击来观察列表中值的变化
0x6 其中有个值规律:100->76->52->28->4->100 这时基本可以锁定目标血量的地址并加入地址列表
0x7 A) 尝试修改血量为0,发射子弹..打不到目标[过关失败],修改血量为4 发射子弹
B) 地址列表中血量地址右键->找出是什么改写了这个地址(Find out what writes to this address),射击一次
找到对应指令后 显示反汇编程序(Show disassembler)
```
gtutorial-x86_64.exe+3B033 - mov ,edx { 目标血量赋值}
```
自动汇编(Auto assemble)代码注入(Code injection) 将上面的血量赋值为0
```
originalcode:
mov ,0
cmp qword ptr ,00
```
执行(Execute)并切换到gTutorial 发射子弹
#### 无限子弹
0x1 这里用1)中的方法 找了很久没有找到地址 .于是换了个思路.这里可能是计数已射击的次数的.那搜索方法与1)就反过来搜
0x2 CE中首次扫描.4字节,未知的初始值
0x2 CE中再次扫描 未变动的数值(Unchanged value),可以多点几次.初次过滤一点点值
0x3 tTutorial中射击一次,看到目标减血后(子弹飞行中目标不减血的),再次扫描 增加的数值
0x4 ,当最后一发子弹射出后目标会恢复血量后,子弹重新装填,再次扫描 减少的数值
0x5 一两轮过后剩余的结果值基本在个位数了.这时候直接操作gTutorial不断射击来观察列表中值的变化
0x6 其中有个值规律:0->1->2->3->4->0 这时基本可以锁定记录发射的地址并加入地址列表
0x7 地址列表中血量地址右键->找出是什么访问了这个地址(Find out what accesses this address),射击一次,找到关键代码
```
gtutorial-x86_64.exe+3C0D1 - cmp dword ptr ,05 { 判断发射数是否到5 }
```
显示反汇编程序(Show disassembler) 双击 修改汇编代码 将5改为50,确定(OK)
并切换到gTutorial 连续发射子弹
# Step 2 过关方法
###游戏说明:这两个敌人血厚,伤害高。过关提示/警告:敌人和玩家是相关联的。
### 过关思路:看游戏说明第一印象就是CE经典Tutorial里Step 9 的形象化,就按解Step 9的的方法来
#### 结构分析
0x1 找我方血量地址 CE中首次扫描.4字节,精确数值(Exact Value) 100
0x2 gTutorial射击后 我方中弹减血后CE里再次扫描 精确数值(Exact Value) 96 很快找到唯一地址.加入地址列表
0x3 找我方血量地址的偏移,地址列表中我方血量地址右键->找出是什么改写了这个地址,射击一下显示关键代码
```
gtutorial-x86_64.exe+3EE53 - sub ,edx
```
我方血量地址`0011E0E0`及偏移量`60`到手
0x4 找左前方的敌人1血量地址 CE中首次扫描.4字节,值大于...(Bigger than...) 100(如果敌人不满血了,就有未知的初始值来搜
0x5 gTutorial中瞄准左前敌人射击(射不中,就换个姿势再来一次,一直没办法中的话就去XX医院治治吧), 敌方中弹减血后(掉血不明显就多射几次)CE里再次扫描 减少的数值, gTutorial射击->CE扫描减少的数值 多来几次(如果结果还是较多的话.中间可以不射击 扫描未变动的数值加以过滤,将找到的地址加入地址列表,按0x3的方法找偏移.关键代码
```
gtutorial-x86_64.exe+3EE53 - sub ,edx
```
敌人1血量地址`0011E2C0`及偏移量`60`到手
0x6 同0x5找右前方敌人2 血量地址`0011E360`及偏移量`60`以及关键代码
```
gtutorial-x86_64.exe+3EE53 - sub ,edx
```
0x7 从上面的关键代码和偏移量可以看出这个同CE的经典Tutorial里Step 9是极其类似,那同样的用分析数据/结构(Dissect data/structures)来处理数据.找到我方与敌方的不同点
大致我们猜测 起始地址+60 为当前血量,+64为初始血量,+70或+78可能是队伍编号,做敌我双方识别的字段值挺多的.这里我用+70的0和1来做区分
0x8 内存浏览器(Memory Viewer)中上面的关键代码行(在血量地址的改写监听窗口.点击显示反汇编程序能快速选中),下面就是自动汇编环节,最终代码如下
```
//code from here to '' will be used to enable the cheat
alloc(newmem,2048,"gtutorial-x86_64.exe"+3EE53)
label(returnhere)
label(originalcode)
label(exit)
newmem: //this is allocated memory, you have read,write,execute access
//place your code here
cmp ,0
je exit
originalcode:
mov ,0//快速秒血
exit:
ret
add ,al
jmp returnhere
"gtutorial-x86_64.exe"+3EE53:
jmp newmem
nop
returnhere:
//code from here till the end of the code will be used to disable the cheat
dealloc(newmem)
"gtutorial-x86_64.exe"+3EE53:
sub ,edx
ret
add ,al
//Alt: db 29 50 60 C3 00 00
```
#### 一点小疑惑
减血代码中`sub ,edx` edx存放了不同队伍的子弹攻击力的值,由于对汇编的熟悉程序不够,没找到这个攻击力.edx在哪赋值的,各位可以指点一下
# Step 3 过关方法
###游戏说明:标记所有跳板为绿色可以解锁那扇门。注意:敌人会将你一击致命(然后就失败了)玩的愉快!提示:有很多解决方案。比如:找到与敌人的碰撞检测,或者Teleport(传送),或者飞行,或者...。
### 过关思路:实施说能过这一关.实属侥幸,一开始的思路是找到平台是否为绿的FLAG来解锁门,但我不会遍历呀(怎么破,怎么破).那就手动一个个的改,后面怪物堵门的解决方案第一反应就是传送,什么碰撞检测.有点高深了.还没学会
#### 开门
0x1 找我认为的第一个跳板的Flag,我猜想的是红变绿是 0->1 最后什么也没扫到.
0x2 那换个思路吧 未知的.变化的扫,步骤是CE中首次扫描.4字节 未知的初始值,gTutorial中跳上我认为的第一个跳板变绿后再次扫描 变动的数值,,gTutorial中跳下来撞怪物自杀,第一个跳板变红后(注意一定等变红,不是死亡,我们搜的是跳板的变动.不是人物的变动)再次扫描 变动的数值循环几次扫描 ,中间再穿插几次未变动的值进行搜索,
0x3 最后一堆大结果,,感觉进不下去了 ,但偶然发现第一页有个数值的变动是1->2->1->2这样有规律的变动,先把这地址记录到地址列表,准备用第二个来验证是不是flag是1,2的变化时,这个数值变成了3.继续跳下个跳板,数值变成了4.这...这..突然想到会不会这个是值是记录已经变绿的跳板数(前面的所有所有操作方向错了),但我只跳了3个呀,怎么会是多一个呢,仔细看游戏原来特么的最下面的一个全窗口宽度的绿色也算是1个..那直接改值吧改成100 ,门果然开了.然后怪物去堵门了.能开这个门纯属意外
#### 传送
0x1 人物在最下面的一个跳板上左右移动来找横向坐标点就行了,通常是左移坐标-1,右移坐标+1
0x2 CE中首次扫描.4字节 未知的初始值 gTutorial中左移一下 CE中再次扫描 减少的值, gTutorial中右移一下 CE中再次扫描 增加的值,中间穿插几次 再次扫描 未变动的数值,最后结果 扫描失败
0x3 好吧换个类型扫描单浮点数,CE中首次扫描.4字节 未知的初始值 gTutorial中左移一下 CE中再次扫描 减少的值, gTutorial中右移一下 CE中再次扫描 增加的值,中间穿插几次 再次扫描 未变动的数值,最后能找到唯一值,稍微验证一下就是我们要的横向坐标点,加入地址列表
0x4 我们左右移动下看看大概的坐标范围(小心怪物碰到就GAME OVER),全屏的坐标范围应该是-1~1之间,修改值为1 ,
0x5 此刻应该有掌声
#### 无敌
碰撞检测这个我还不会,马上去学习下解迷宫的,然后回来尝试下.能搞定就补充上
#### 飞行
这个就更高深了,需要解决重力问题,等待大神来指点
# 知识储备
+ [【原创】CE教程:基础篇](https://www.52pojie.cn/thread-691615-1-1.html)
+ [【原创】CE教程:实战篇](https://www.52pojie.cn/thread-692068-1-1.html)
+ [【原创】CE教程:一个简单的迷宫游戏](https://www.52pojie.cn/thread-726154-1-1.html)
# 附件
gTutorial程序https://pan.baidu.com/s/1bljvtzE1fLxe66FVgZqFZQ 提取码: 7du8
# 未完待续
* 有不明白的,直接留言,我尽量回复你
* 有其他过关方法,直接留言,我会补充完善进来
* 有{:1_899:} 地图遍历怪或找CALL方面的教程{:1_899:} ,能分享的私信我
* 有免费评分的,来走一波,码字是真的累 她家的小帅哥 发表于 2018-11-29 11:10
有个很简单的问题想问下,减60是为了防止前面的血量也显示出来,楼主怎么确定是60之后的就是正确的呢?因为 ...
(由于本身汇编不是很精通,说一下我的个人理解,仅供参考)正如你所说的.血量如果在人物属性的结构刚好是最后一个字段值的话.那血量后的数据应该都是无用的.可能全是00,也可能是乱七八糟的无序数据..那如何确定后面的值能不能用.那就体现了CE里分析数据/结构(Dissect data/structures)这个工具的优势了.在这里我们可以对数据进行横向对比.数据列越多对比效果越明显 有个很简单的问题想问下,减60是为了防止前面的血量也显示出来,楼主怎么确定是60之后的就是正确的呢?因为我昨天没看教程之前一直选的前10里面的,所以错了很多次。 感谢楼主,收藏学习! 本帖最后由 kkzdq 于 2018-11-25 23:43 编辑
额恩继续学习 大佬,求份CE教学资料 学习了,不错啊 小白一脸膜拜 谢谢分享哦!~ 不错的新手教程,支持一下 gtutorial里面有D3D相关的实验么?似乎不是官方的出的?