vnetuser 发表于 2018-11-25 22:16

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:} ,能分享的私信我
* 有免费评分的,来走一波,码字是真的累

vnetuser 发表于 2018-11-29 16:53

她家的小帅哥 发表于 2018-11-29 11:10
有个很简单的问题想问下,减60是为了防止前面的血量也显示出来,楼主怎么确定是60之后的就是正确的呢?因为 ...

(由于本身汇编不是很精通,说一下我的个人理解,仅供参考)正如你所说的.血量如果在人物属性的结构刚好是最后一个字段值的话.那血量后的数据应该都是无用的.可能全是00,也可能是乱七八糟的无序数据..那如何确定后面的值能不能用.那就体现了CE里分析数据/结构(Dissect data/structures)这个工具的优势了.在这里我们可以对数据进行横向对比.数据列越多对比效果越明显

她家的小帅哥 发表于 2018-11-29 11:10

有个很简单的问题想问下,减60是为了防止前面的血量也显示出来,楼主怎么确定是60之后的就是正确的呢?因为我昨天没看教程之前一直选的前10里面的,所以错了很多次。

fhyz 发表于 2018-11-25 22:49

感谢楼主,收藏学习!

kkzdq 发表于 2018-11-25 23:42

本帖最后由 kkzdq 于 2018-11-25 23:43 编辑

额恩继续学习

吾2PJ小子 发表于 2018-11-26 00:05

大佬,求份CE教学资料

快乐王子 发表于 2018-11-26 08:54

学习了,不错啊

A494306040 发表于 2018-11-26 09:14

小白一脸膜拜

dszbox 发表于 2018-11-26 09:29

谢谢分享哦!~

gunxsword 发表于 2018-11-26 09:59

不错的新手教程,支持一下

arryboom 发表于 2018-11-26 11:14

gtutorial里面有D3D相关的实验么?似乎不是官方的出的?

cy5520 发表于 2018-11-26 14:35

页: [1] 2 3
查看完整版本: CE6.8 gTutorial STEP 1,2,3全集 简单破解教程