怎么秒杀
- 提升植物攻击力,达到一击扣完僵尸血量
- 使僵尸血量直接归0
什么是CALL指令
按照我的理解
汇编中的CALL指令,就像C语言调用函数一样
豌豆攻击函数(攻击伤害,攻击对象)
0053186D - 7E 08 - jle 00531877
0053186F - 53 - push ebx 0
00531870 - 50 - push eax 14
00531871 - 56 - push esi 1AC252E0
00531872 - E8 59FAFFFF - call 005312D0 豌豆攻击CALL
如果要使用豌豆攻击call,首先就要先传入他的三个值。
怎么看一个CALL要传入几个值,我是通过这个CALL上面 push 指令,比如上面那个
CALL 005312D0 上面 先是三个push ,然后才有 jle 这些其他指令,所以这个call 是有三个值的。
其余的可以通过百度搜索。
了解CE内存浏览器按键功能

- Toggle Breakpoint :下断点
- 运行:断下的地方继续运行
- Step Into:步入
- 步过:跳过,比如你跟数据时候,跟到了有CALL的地方,你不想跟进去,就可以点这个
- Step Out:跳出CALL,比如你跟数据时候,你觉得这个CALL里面没你想要的东西了。你就可以点一下直接跳过这个CALL。
僵尸血量寻找
打开CE,附加游戏。
先查找僵尸血量
第一步
等僵尸出现 --》选择数据类型四字节 --》 搜索未知值

第二步
在豌豆攻击到僵尸后,搜索减少的数值。因为我们现在不知道豌豆攻击一次扣多少血量,所以不能选择精确的减少数值。

第三步
重复第二步,直到搜索出来的值比较少,往下拉,查看哪个值比较像血量

尽量避免不要让僵尸那么快死亡,不然后续就比较麻烦。通常血量就是红框框柱的地方,但没打到僵尸时候,他不会是动态的,只有僵尸被攻击到,才会发生变化。
秒杀功能实现1
将这个地址添加到列表中,对其进行查找访问,可以使用快捷键F5。
005312FE - 8B BD C8000000 - mov edi,[ebp+000000C8]
0052D71B - 8B B0 C8000000 - mov esi,[eax+000000C8]
00531319 - 89 BD C8000000 - mov [ebp+000000C8],edi
0052A527 - 39 8B C8000000 - cmp [ebx+000000C8],ecx
00531783 - 83 BD C8000000 00 - cmp dword ptr [ebp+000000C8],00 比较血量

会出现两个CMP, 我们重点关注
00531783 - 83 BD C8000000 00 - cmp dword ptr [ebp+000000C8],00 比较血量
这一个,因为他是在判断现在的血量是否等于 0.我们选择他,显示反汇编程序进入内存浏览器。
点击 CMP 那一段 ,快捷键F5对其下断

让豌豆攻击一下僵尸,发现游戏断下了,回到CE。
点击 Step Into 跟一下


但你一步一步跟下去时候会发现
执行到 jg 005317A9 后
mov ecx,[esp+24] 这一段会直接跳过,不执行,
跳到 pop edi 处
jg 005317A9 --》 pop edi
建议修改之前,先复制一下原指令。建议修改之前,先复制一下原指令。建议修改之前,先复制一下原指令。
现在开始,我们可以尝试着让 jg 不跳转 ,就是 nop 掉,转为空地址,看下会怎样。

Nop 后,等豌豆在攻击到僵尸,游戏断下,在重新 Step Into 跟下去,就会发现,被跳过的代码正常执行了。
把CMP 下了断点那处 在按 F5 取消断点,点击运行,回到游戏中就会发现,普通僵尸已经被秒杀。
头盔僵尸秒杀功能实现1
除了普通僵尸,还有带头盔的僵尸,当头盔僵尸出现时候,就发现秒杀功能失效了。

重新对 CMP 那里下断,当豌豆攻击到头盔僵尸时候,会发现断不下来,说明这个CALL里面不是对他血量判断的,我们就跳出去进行跟。
首先等豌豆攻击到普通僵尸时,游戏断下。
在内存浏览器中点击 Step Out

跳出这个CALL
00531877 - 5F - pop edi
来到了这里。先运行游戏。并且把断点取消。
快捷键Ctrl +B 删除断点

运行游戏后,在这个CMP 中 按 F5 下断点,看下能不能断下
00531838 - 83 BE D8000000 00 - cmp dword ptr [esi+000000D8],00 { 0 }
当豌豆攻击到头盔僵尸时,会发现断下了。
按 步过 慢慢跟下去。会发现
0053183F - 74 15 - je 00531856
0053186D - 7E 08 - jle 00531877
这两个地方,都会跳过中间的代码,直接运行到下面,和上面普通僵尸的很像。可以按照刚才处理普通僵尸的试试,对其跳转设置成不跳转。
最后发现
0053186D - 7E 08 - jle 00531877
处理这一段才有用
将其Nop 掉
Nop 大法果然好用。
秒杀功能实现2
除了把判断跳转Nop 。
还可以把豌豆攻击力修改实现秒杀功能
回到一开始普通僵尸判断血量的地方
00531783 - 83 BD C8000000 00 - cmp dword ptr [ebp+000000C8],00 比较血量
下断,等豌豆攻击僵尸时,注意右下方堆栈窗口

注意返回地址的参数
双击进去
00531872 - E8 59FAFFFF - call 005312D0
00531877 - 5F - pop edi
会来到这个地址
按照上面的经验,也是找一个CMP 指令进行下断分析
0053185A - 83 BE C4000000 00 - cmp dword ptr [esi+000000C4],00 { 0 }
我选了这个。
断下后,按Step Into 一路跟下去,
来到那个CALL时候,观察右方寄存器的值

都是十六进制
先看EAX
EAX = 000000014 十六进制转成十进制 = 20
细心的会发现,豌豆攻击普通僵尸,每一下就是扣血20.那不放大胆猜测,这里的EAX就是 豌豆的攻击力。
怎么改
0053186F - 53 - push ebx
00531870 - 50 - push eax
00531871 - 56 - push esi
00531872 - E8 59FAFFFF - call 005312D0
寄存器的EAX的值,就是通过 push eax 传进去的。
那么熟悉hook 的可以通过 hook 传进去。但是懒人有懒人的法
观察右方寄存器。ESI,EDI等的值都非常大。我们可以 将 push eax 修改成 push esi传进去

头盔僵尸秒杀功能实现2
继续在CMP处下断
0053185A - 83 BE C4000000 00 - cmp dword ptr [esi+000000C4],00 { 0 }
通过step into 跟进去
00531866 - E8 75F7FFFF - call 00530FE0 头盔僵尸血量CALL
会跟进这个call里面

继续Step into 跟下去。来到
00530FEF - C7 45 54 19000000 - mov [ebp+54],00000019 { 25 }
00530FF6 - 8B BD D4000000 - mov edi,[ebp+000000D4] { 头盔僵尸最大血量}
00530FFC - 8B 8D D0000000 - mov ecx,[ebp+000000D0] { 头盔僵尸现在的血量}
这里。观察右方的寄存器

EDI = 00000172 十六进制转十进制 = 370
ECX = 0000014A 十六进制转十进制 = 330
既然知道存放头盔僵尸血量的地方,那么就可以进行秒杀处理了
秒杀处理1
可以对僵尸最大血量置0,然后让僵尸现在的血量指向存放最大血量的EDI

这样子只要一攻击,头盔僵尸就会被秒杀
秒杀处理2
第二种比第一种更简单。就是直接把当前血量置0

也可以达到秒杀效果
结尾
植物大战僵尸的却很适合练手,每一次分析都会发现新的玩意,很有意思。
借用一句看到很不错的话:
技术不分对错.人性才分善恶.
学习逆向的人必须身心放正.
身心放正之人手握屠龙刀,也是保家卫民.