ce 内置教程 9 第八关 注入 共用代码
代码注入 共用代码
四个玩家,他们都是同一个结构体,减血的代码是共用的,如果我们把减血代码用空指令替换,那么所有人的血都不会减少了。
当然了,我们可以找我们自己血量的基址,然后锁定他们,但是防止不了极端情况下敌人一下秒人,毕竟锁定是高频率的修改数值而已。那么为了达到无敌的状态,我们需要使让我们减血的代码失效。
减血代码是共用的,所以就要找到区分敌人和队友的方法。这就要看游戏关于人物的结构体是怎么区分的了,那么怎么知道人物的结构体张什么样子呢?
1 找人物的结构体
首先先找到4个人的血量地址。
选择一个,找出是什么改写了该地址。
我们知道这个减血代码是共用的(你也可以看看其他三个人,容易发现都是这个代码)
找出这个指令所访问的地址。
分别攻击一下4个人,让他出现。
选中出现的4个地址,然后点分析地址数据
可以很容易的发现4个人对应的结构体。
+04是血量,float类型的
+10是可以用来区分队伍的一个4字节整数
+15是他们的名字
同时更好理解减血命令 mov [ebx+04], eax中的+04了吧。
那么思路就来了:
对减血命令进行代码注入,判断+10是1还是2,1就不执行减血指令,2就执行。
2 代码注入
点到指令上 ctrl+a自动汇编
点模板-CT表框架代码
点模板-代码注入
生成模板代码
代码修改如下:
[ENABLE]
//code from here to '[DISABLE]' will be used to enable the cheat
alloc(newmem,2048)
label(returnhere)
label(originalcode)
label(exit)
newmem: //this is allocated memory, you have read,write,execute access
//place your code here
cmp [ebx+10],1 //和1 进行比较
ja originalcode //如果大于1,那么就是敌人,返回原代码减血去就好了
fldz //将整数搞成浮点数
jmp returnhere //返回
originalcode:
mov [ebx+04],eax
fldz
exit:
jmp returnhere
"Tutorial-i386.exe"+288D9:
jmp newmem
returnhere:
[DISABLE]
//code from here till the end of the code will be used to disable the cheat
dealloc(newmem)
"Tutorial-i386.exe"+288D9:
mov [ebx+04],eax
fldz
//Alt: db 89 43 04 D9 EE
然后点“重新启动游戏并自动执行”即可过关。