首页
社区
课程
招聘
[原创]Cheat Engine gtutorial-i386闯关记 第二关
发表于: 2019-2-18 09:59 4561

[原创]Cheat Engine gtutorial-i386闯关记 第二关

2019-2-18 09:59
4561

保存脚本,然后点击AA窗口File--"Assign to current cheat table",将脚本分配到Cheat Table中,然后激活脚本,返回到游戏中,验证我们能不能击毁目标:

第一击:

    进入第二关后会看到如下界面:
第二关简直丧心病狂,除了要1vs2,电脑攻高血厚(攻击力和血都是玩家的2倍);更要命的玩家一次只能攻击一个目标,但是会同时受到2个目标的还击,躲都躲不了。换句话说,除非改代码,否则根本无法过关。如果Freeze玩家HP,侥幸干掉一个目标,剩下的一个目标瞬间能灭掉玩家,不管玩家有多少血。估计是作者直接把玩家的HP清零了。(顺带一提,如果读者自己扫描几次游戏,会发现玩家的HP是100,2个电脑玩家的HP是200;玩家的每次攻击造成电脑-1HP,而电脑造成玩家-2HP)。这一关的提示让我想起Cheat Engine官网上的一篇教程:Find the team id in the player structure
    这一关玩家的HP有精确的数值,所以"Scan Type"改成"Exact Value"即可。玩家挨几次打,马上能定位存放玩家血量的变量,将该变量加入Cheat Table后,右键"Find out what writes to this address",然后切换进游戏,让玩家再被打一顿,就会显示修改玩家HP的代码了:

    在教程Find the team id in the player structure 中间接的提到,有些游戏可能会设计如下形式的扣血函数:

int DecreaseHP(RoleObj*);
当玩家(假设为PlayerObj,继承自RoleObj)或者电脑(假设为CPUObj,同样继承自RoleObj)掉血时,会把PlayObj和RoleObj传递给DecreaseHP函数,由该函数完成扣血功能。借助这个思路,让我假设指令

gtutorial-i386.exe+34B70 - 29 50 50              - sub [eax+50],edx
就是DecreaseHP函数中完成扣血的指令。根据这样的假设,当电脑收到攻击后也会执行这条指令,在此设置断点,我们不就可以查看并比对PlayObj和CPUObj的内存布局了?CE提供了较为简便的方法实现上诉目的:
1).在"Memory Viewer"窗口指令"gtutorial-i386.exe+34B70 - 29 50 50              - sub [eax+50],edx"处右键--选择"Find out what address this instruction access",点击该菜单项后会弹出"Changed Address by xxxx"窗口:
2).返回到游戏,让玩家和2个CPU都掉血,然后查看窗口中的内存项,由于在游戏中我们修改了3个对象的血量,所以窗口中有3个记录项。全选这3个记录项,右键选择"Open dissect data with selected address",这时CE会问一堆问题,一路勾选确定最终打开数据解析窗口:
大家注意到偏移窗口中偏移0x50和0x54这两行数据没?这是整个窗口中为数不多的看着有点意义的数值。结合反汇编代码,我们可以断定对象首地址的偏移为0x50处为角色当前HP值,而偏移0x54处为角色MAX HP值。有了MAX HP这个依据,我们就可以在AA("Auto assemble")窗口中区分当前修改的是玩家还是CPU。
回到Memory Viewer窗口,准备编写注入脚本,选中"sub [eax+50],edx"指令,点击菜单项Tools--"Auto assemble"--Template--"AOB injection",下面的代码片是我的注入脚本:
define(symbol, 29 50 50 C3 00 00)

[ENABLE]
aobscanmodule(INJECT,gtutorial-i386.exe,29 50 50 C3 00 00) // should be unique
assert(INJECT, symbol)
alloc(newmem,$1000)

label(cmpEnd)
label(code)
label(return)

newmem:
  cmp [eax+54],(int)100
  jnz CPURole
  mov edx, (int)0
  jmp cmpEnd

CPURole:
  cmp [eax+54],(int)200
  jnz cmpEnd
  mov edx (int)200
cmpEnd:

code:
  sub [eax+50],edx
  ret 
  add [eax],al
  jmp return

保存脚本,然后点击AA窗口File--"Assign to current cheat table",将脚本分配到Cheat Table中,然后激活脚本,返回到游戏中,验证我们能不能击毁目标:

第一击:

第二击,通关:


int DecreaseHP(RoleObj*);
当玩家(假设为PlayerObj,继承自RoleObj)或者电脑(假设为CPUObj,同样继承自RoleObj)掉血时,会把PlayObj和RoleObj传递给DecreaseHP函数,由该函数完成扣血功能。借助这个思路,让我假设指令

gtutorial-i386.exe+34B70 - 29 50 50              - sub [eax+50],edx
就是DecreaseHP函数中完成扣血的指令。根据这样的假设,当电脑收到攻击后也会执行这条指令,在此设置断点,我们不就可以查看并比对PlayObj和CPUObj的内存布局了?CE提供了较为简便的方法实现上诉目的:
1).在"Memory Viewer"窗口指令"gtutorial-i386.exe+34B70 - 29 50 50              - sub [eax+50],edx"处右键--选择"Find out what address this instruction access",点击该菜单项后会弹出"Changed Address by xxxx"窗口:
2).返回到游戏,让玩家和2个CPU都掉血,然后查看窗口中的内存项,由于在游戏中我们修改了3个对象的血量,所以窗口中有3个记录项。全选这3个记录项,右键选择"Open dissect data with selected address",这时CE会问一堆问题,一路勾选确定最终打开数据解析窗口:
大家注意到偏移窗口中偏移0x50和0x54这两行数据没?这是整个窗口中为数不多的看着有点意义的数值。结合反汇编代码,我们可以断定对象首地址的偏移为0x50处为角色当前HP值,而偏移0x54处为角色MAX HP值。有了MAX HP这个依据,我们就可以在AA("Auto assemble")窗口中区分当前修改的是玩家还是CPU。
回到Memory Viewer窗口,准备编写注入脚本,选中"sub [eax+50],edx"指令,点击菜单项Tools--"Auto assemble"--Template--"AOB injection",下面的代码片是我的注入脚本:
define(symbol, 29 50 50 C3 00 00)

[ENABLE]
aobscanmodule(INJECT,gtutorial-i386.exe,29 50 50 C3 00 00) // should be unique
assert(INJECT, symbol)
alloc(newmem,$1000)

label(cmpEnd)
label(code)
label(return)

newmem:
  cmp [eax+54],(int)100
  jnz CPURole
  mov edx, (int)0
  jmp cmpEnd

CPURole:
  cmp [eax+54],(int)200
  jnz cmpEnd
  mov edx (int)200
cmpEnd:

code:
  sub [eax+50],edx
  ret 
  add [eax],al
  jmp return

保存脚本,然后点击AA窗口File--"Assign to current cheat table",将脚本分配到Cheat Table中,然后激活脚本,返回到游戏中,验证我们能不能击毁目标:

第一击:

第二击,通关:


gtutorial-i386.exe+34B70 - 29 50 50              - sub [eax+50],edx
就是DecreaseHP函数中完成扣血的指令。根据这样的假设,当电脑收到攻击后也会执行这条指令,在此设置断点,我们不就可以查看并比对PlayObj和CPUObj的内存布局了?CE提供了较为简便的方法实现上诉目的:
1).在"Memory Viewer"窗口指令"gtutorial-i386.exe+34B70 - 29 50 50              - sub [eax+50],edx"处右键--选择"Find out what address this instruction access",点击该菜单项后会弹出"Changed Address by xxxx"窗口:

[峰会]看雪.第八届安全开发者峰会10月23日上海龙之梦大酒店举办!

收藏
免费 1
支持
分享
最新回复 (2)
雪    币: 403
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
等更新
2019-2-18 10:53
0
雪    币: 802
活跃值: (4433)
能力值: ( LV12,RANK:260 )
在线值:
发帖
回帖
粉丝
3
DWwinter 等更新[em_41]
已更
2019-2-20 18:49
0
游客
登录 | 注册 方可回帖
返回
//