我们的思维是-找到植物数-找当僵尸血量-判断植物数<5-写入魅惑代码。
我们先找出植物的数量的基址 我这儿找出的是 [6a9ec0+768+bc] 这个右键访问 然后CE一层一层的往上扫描就可以了。这个就不多做演练了。
我们搜索僵尸的血量
搜索出来以后我们右键访问是谁访问了该地址
[Asm] 纯文本查看 复制代码 00412E99 - 03 86 C8000000 - add eax,[esi+000000C8]
005312FE - 8B BD C8000000 - mov edi,[ebp+000000C8]
0052D71B - 8B B0 C8000000 - mov esi,[eax+000000C8]
00531319 - 89 BD C8000000 - mov [ebp+000000C8],edi
0052A4E6 - 8B B3 C8000000 - mov esi,[ebx+000000C8]
0052A527 - 39 8B C8000000 - cmp [ebx+000000C8],ecx
00531783 - 83 BD C8000000 00 - cmp dword ptr [ebp+000000C8],00
第一条我们不考虑,因为一直在进行内存操作,我们选下面一条
[Asm] 纯文本查看 复制代码 005312FE - 8B BD C8000000 - mov edi,[ebp+000000C8]
反汇编查看
[mw_shl_code=asm,true]je PlantsVsZombies.exe+1312FE
push 00
mov eax,ebp
call PlantsVsZombies.exe+130950
mov edi,[ebp+000000C8]
mov eax,ebp
mov [esp+14],edi
call PlantsVsZombies.exe+12D710
[/mw_shl_code]
这儿是把当前僵尸的血量传递给edi
老方法,申请一个内存
现在我们就要写汇编了,首先跳到我们申请的内存
汇编大概如下:
[Asm] 纯文本查看 复制代码 mov edi, dword [ebp+0x000000C8] //还原HOOK的代码
//以下是取植物的数量
mov ebx, dword [0x006A9EC0] 把基址传递给 ebx
mov ebx, dword [ebx+0x00000768] //在把基址+768传递给ebx
mov ebx, dword [ebx+0x000000BC] //最后把 基址+768+bc传递给ebx 至此整取就完成了
cmp ebx, 0x06 判断 ebx
jc label1 小于 则跳到label1
jnbe label2 大于则 跳到label2
//上面的理解是 当植物小于6的时候执行我们的写入的汇编代码,否则就跳回原代码去执行
label1:
mov byte [ebp+0x000000B8], 0x01 // ebp+b8 是僵尸是否被魅惑,可以看作是一个逻辑判断 0=假 1=真
label2:
mov ecx, 0x00531304
jmp ecx
现在写入到我们申请的内存里面
进游戏看效果
植物小于6 那么触发我们的代码 目前子弹没击中僵尸的状态
只要是僵尸受到伤害以后
为了不是很变态,我们才增加植物数量的判断,大于6 我们就恢复原代码去执行了。目前这个是普通僵尸的地址,需要别的大家可以去练练手 方式方法一样
往期帖子;
植物大战僵尸之种植植物调用僵尸CALL
植物大战僵尸之植物被咬反增阳光
植物大战僵尸之这豌豆有毒啃着啃着就炸了
植物大战僵尸阳光开局9990
|