怎么秒杀
- 提升植物攻击力,达到一击扣完僵尸血量
- 使僵尸血量直接归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内存浏览器按键功能
![850afca8a77df00c22f587ca08bde789.png](https://i-blog.csdnimg.cn/blog_migrate/89ff923af33cf0a73668ea4290f7b7fc.png)
- Toggle Breakpoint :下断点
- 运行:断下的地方继续运行
- Step Into:步入
- 步过:跳过,比如你跟数据时候,跟到了有CALL的地方,你不想跟进去,就可以点这个
- Step Out:跳出CALL,比如你跟数据时候,你觉得这个CALL里面没你想要的东西了。你就可以点一下直接跳过这个CALL。
僵尸血量寻找
打开CE,附加游戏。
先查找僵尸血量
第一步
等僵尸出现 --》选择数据类型四字节 --》 搜索未知值
![d504147266f2fff9a45c9f13a9d598ca.png](https://i-blog.csdnimg.cn/blog_migrate/239e112c3367b4f9850ffb8946c28ed9.jpeg)
第二步
在豌豆攻击到僵尸后,搜索减少的数值。因为我们现在不知道豌豆攻击一次扣多少血量,所以不能选择精确的减少数值。
![052f6f597c3fcead55d5979e0d374cef.png](https://i-blog.csdnimg.cn/blog_migrate/6981763da5f69f9617f105cead6f6130.jpeg)
第三步
重复第二步,直到搜索出来的值比较少,往下拉,查看哪个值比较像血量
![fbf7171af6e706a55a65e525208d75b4.png](https://i-blog.csdnimg.cn/blog_migrate/f3b7ffa9453ab6a6b40e0888f81e79db.jpeg)
尽量避免不要让僵尸那么快死亡,不然后续就比较麻烦。通常血量就是红框框柱的地方,但没打到僵尸时候,他不会是动态的,只有僵尸被攻击到,才会发生变化。
秒杀功能实现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 比较血量
![b98a02cd5b0180c56e7a78f3d5301429.png](https://i-blog.csdnimg.cn/blog_migrate/03771b43df32f64d1a7f69cf409ddc1b.jpeg)
会出现两个CMP, 我们重点关注
00531783 - 83 BD C8000000 00 - cmp dword ptr [ebp+000000C8],00 比较血量
这一个,因为他是在判断现在的血量是否等于 0.我们选择他,显示反汇编程序进入内存浏览器。
点击 CMP 那一段 ,快捷键F5对其下断
![7238d33b23b5ddd73627f72f33c556cc.png](https://i-blog.csdnimg.cn/blog_migrate/482d8020ce76ff891bcb8d62b84d5b07.jpeg)
让豌豆攻击一下僵尸,发现游戏断下了,回到CE。
点击 Step Into 跟一下
![c9834ac0348aa45756669db492a03095.png](https://i-blog.csdnimg.cn/blog_migrate/4b835ff0b833a2ebb642360dbf902dee.jpeg)
![5c02558bbaacb0fb73b0b2ddeaeeb124.png](https://i-blog.csdnimg.cn/blog_migrate/cde08d869c724475d4dbccd72bcacb22.jpeg)
但你一步一步跟下去时候会发现
执行到 jg 005317A9 后
mov ecx,[esp+24] 这一段会直接跳过,不执行,
跳到 pop edi 处
jg 005317A9 --》 pop edi
建议修改之前,先复制一下原指令。建议修改之前,先复制一下原指令。建议修改之前,先复制一下原指令。
现在开始,我们可以尝试着让 jg 不跳转 ,就是 nop 掉,转为空地址,看下会怎样。
![506f40aeced2762f026694e2b576ac8e.png](https://i-blog.csdnimg.cn/blog_migrate/bf50c9501502e1b34dd84d5506763030.jpeg)
Nop 后,等豌豆在攻击到僵尸,游戏断下,在重新 Step Into 跟下去,就会发现,被跳过的代码正常执行了。
把CMP 下了断点那处 在按 F5 取消断点,点击运行,回到游戏中就会发现,普通僵尸已经被秒杀。
头盔僵尸秒杀功能实现1
除了普通僵尸,还有带头盔的僵尸,当头盔僵尸出现时候,就发现秒杀功能失效了。
![c8fcba09d6f8fe57b4759bb282b52c77.png](https://i-blog.csdnimg.cn/blog_migrate/0e9007ff2023ce0e0c1bcd9798c8c902.jpeg)
重新对 CMP 那里下断,当豌豆攻击到头盔僵尸时候,会发现断不下来,说明这个CALL里面不是对他血量判断的,我们就跳出去进行跟。
首先等豌豆攻击到普通僵尸时,游戏断下。
在内存浏览器中点击 Step Out
![03a4bb0805b780b625a3b1c5c2d81945.png](https://i-blog.csdnimg.cn/blog_migrate/892a7daf9313b1c6903fe48ab5f6ee0b.jpeg)
跳出这个CALL
00531877 - 5F - pop edi
来到了这里。先运行游戏。并且把断点取消。
快捷键Ctrl +B 删除断点
![e41e5e9aaa903a16ed494c002204d741.png](https://i-blog.csdnimg.cn/blog_migrate/8690b1f7d8bd446f4adba50a3f26a5ae.png)
运行游戏后,在这个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 比较血量
下断,等豌豆攻击僵尸时,注意右下方堆栈窗口
![53c93c80a1cc5baa9b5ca58d602697f4.png](https://i-blog.csdnimg.cn/blog_migrate/3834c5fb071c664a52b97c2abd133e6e.jpeg)
注意返回地址的参数
双击进去
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时候,观察右方寄存器的值
![7370b09c50e4bf39ce6c3cbf5b937019.png](https://i-blog.csdnimg.cn/blog_migrate/3dec85b76d546045ca02c95442b75086.jpeg)
都是十六进制
先看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传进去
![84d4a12a581b3d0c3e516a14cba45da2.png](https://i-blog.csdnimg.cn/blog_migrate/43b3de82b4684c95c8a3573230b1a262.jpeg)
头盔僵尸秒杀功能实现2
继续在CMP处下断
0053185A - 83 BE C4000000 00 - cmp dword ptr [esi+000000C4],00 { 0 }
通过step into 跟进去
00531866 - E8 75F7FFFF - call 00530FE0 头盔僵尸血量CALL
会跟进这个call里面
![9c6512f8ad3266a7da55972d70980cc0.png](https://i-blog.csdnimg.cn/blog_migrate/706b8aec9ac847c44a50e96a881b493a.jpeg)
继续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] { 头盔僵尸现在的血量}
这里。观察右方的寄存器
![2b330cccb1627ea66dfa0edcd21c328a.png](https://i-blog.csdnimg.cn/blog_migrate/47196ac3f9a51015cc0c593c6a801da7.jpeg)
EDI = 00000172 十六进制转十进制 = 370
ECX = 0000014A 十六进制转十进制 = 330
既然知道存放头盔僵尸血量的地方,那么就可以进行秒杀处理了
秒杀处理1
可以对僵尸最大血量置0,然后让僵尸现在的血量指向存放最大血量的EDI
![8ae9587539ef3e997ee4fa657982bd31.png](https://i-blog.csdnimg.cn/blog_migrate/b00684b3392ff8cd4bdf62fbd9a815be.jpeg)
这样子只要一攻击,头盔僵尸就会被秒杀
秒杀处理2
第二种比第一种更简单。就是直接把当前血量置0
![be7c612fec1c315c1a0d596ec34442c6.png](https://i-blog.csdnimg.cn/blog_migrate/6fff580a8a9c231140819db6a15f86d7.jpeg)
也可以达到秒杀效果
结尾
植物大战僵尸的却很适合练手,每一次分析都会发现新的玩意,很有意思。
借用一句看到很不错的话:
技术不分对错.人性才分善恶.
学习逆向的人必须身心放正.
身心放正之人手握屠龙刀,也是保家卫民.