前提
本人刚接触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 发射子弹[Well done!]
B) 地址列表中血量地址右键->找出是什么改写了这个地址(Find out what writes to this address),射击一次
找到对应指令后 显示反汇编程序(Show disassembler)
gtutorial-x86_64.exe+3B033 - mov [rax+70],edx { 目标血量赋值}
自动汇编(Auto assemble)代码注入(Code injection) 将上面的血量赋值为0
originalcode:
mov [rax+70],0
cmp qword ptr [rax+68],00
执行(Execute)并切换到gTutorial 发射子弹[Well done!]
无限子弹
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 [rbx+6C],05 { 判断发射数是否到5 }
显示反汇编程序(Show disassembler) 双击 修改汇编代码 将5改为50,确定(OK)
并切换到gTutorial 连续发射子弹[Well done!]
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 [rax+60],edx
我方血量地址0011E0E0
及偏移量60
到手
0x4 找左前方的敌人1血量地址 CE中首次扫描.4字节,值大于...(Bigger than...) 100(如果敌人不满血了,就有未知的初始值来搜
0x5 gTutorial中瞄准左前敌人射击(射不中,就换个姿势再来一次,一直没办法中的话就去XX医院治治吧), 敌方中弹减血后(掉血不明显就多射几次)CE里再次扫描 减少的数值, gTutorial射击->CE扫描减少的数值 多来几次(如果结果还是较多的话.中间可以不射击 扫描未变动的数值加以过滤,将找到的地址加入地址列表,按0x3的方法找偏移.关键代码
gtutorial-x86_64.exe+3EE53 - sub [rax+60],edx
敌人1血量地址0011E2C0
及偏移量60
到手
0x6 同0x5找右前方敌人2 血量地址0011E360
及偏移量60
以及关键代码
gtutorial-x86_64.exe+3EE53 - sub [rax+60],edx
0x7 从上面的关键代码和偏移量可以看出这个同CE的经典Tutorial里Step 9是极其类似,那同样的用分析数据/结构(Dissect data/structures)来处理数据.找到我方与敌方的不同点
大致我们猜测 起始地址+60 为当前血量,+64为初始血量,+70或+78可能是队伍编号,做敌我双方识别的字段值挺多的.这里我用+70的0和1来做区分
0x8 内存浏览器(Memory Viewer)中上面的关键代码行(在血量地址的改写监听窗口.点击显示反汇编程序能快速选中),下面就是自动汇编环节,最终代码如下
[ENABLE]
//code from here to '[DISABLE]' 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 [rax+70],0
je exit
originalcode:
mov [rax+60],0//快速秒血
exit:
ret
add [rax],al
jmp returnhere
"gtutorial-x86_64.exe"+3EE53:
jmp newmem
nop
returnhere:
[DISABLE]
//code from here till the end of the code will be used to disable the cheat
dealloc(newmem)
"gtutorial-x86_64.exe"+3EE53:
sub [rax+60],edx
ret
add [rax],al
//Alt: db 29 50 60 C3 00 00
一点小疑惑
减血代码中sub [rax+60],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 [Well done!]此刻应该有掌声
无敌
碰撞检测这个我还不会,马上去学习下解迷宫的,然后回来尝试下.能搞定就补充上
飞行
这个就更高深了,需要解决重力问题,等待大神来指点
知识储备