谢谢各位的支持,祝论坛越办越好!!!
ggsuper
2018.1.7
前文中更改攻击速度采用的是修改植物攻击间隔时间的方法,经过修改可以明显加快植物攻击速度,修改方法是在004838D1处 mov ecx, dword ptr [ebx+5C]修改为mov ecx,22(最小值)。
存在问题为经手工多次测试,22是可修改的最小值,再小则植物不攻击。
此次修改目标为继续加快植物攻击速度。
三、实现
为找出攻击动画计时数据,需要选择攻击动作较明显的植物进行分析。此处选择“西瓜投手”作为目标查找攻击计时数据,因为西瓜投手攻击前有明显的蓄力动作,如下图。待投出的西瓜有一个由最低点到最高点然后投出的动画过程,当西瓜位于最低点时,CE搜索未知初始值,由最低点到最高点的过程中多次搜索减少的值。此处攻击动作很快,CE搜索时可将游戏速度降低(CE自带变速功能,也可用变速齿轮等其它工具)。
得到结果如下(西瓜投手位置变了是因为上一张图里的僵尸被玩死了,重开了一局):
得到结果如下(西瓜投手位置变了是因为上一张图里的僵尸被玩死了,重开了一局):
得到的结果较多,可以继续搜索减少结果排除干扰,此处也可以分析确定1E833080为攻击动画计时,锁定该值后植物攻击无子弹。OD数据窗口找到该地址,下硬件访问断点。断在下图处:
得到的结果较多,可以继续搜索减少结果排除干扰,此处也可以分析确定1E833080为攻击动画计时,锁定该值后植物攻击无子弹。OD数据窗口找到该地址,下硬件访问断点。断在下图处:
代码清单如下:
00488AAC 8B83 90000000 mov eax, dword ptr [ebx+90]
00488AB2 |. 85C0 test eax, eax
00488AB4 0F84 44050000 je 00488FFE
此处进行分析,首先是把
00488AB4 处 je 改为 jne,取消硬件访问断点,F9运行,观察发现植物只有攻击动作,无子弹,未能得到加速效果。
那么换个思考角度,考虑程序如何使用该计时数据。猜测程序可能是不断将计时数据与一个固定数值比较,若等于该值则跳转到攻击实现。
在计时数据上下硬件访问断点,F9运行,观察程序中与计时数据比较的语句。
清单如下:
第一处:
00488B65 |> 83BB 90000000>cmp dword ptr [ebx+90], 0
00488B6C |0F85 8C040000 jnz 00488FFE
上面的代码判断计时数据是否为0,将下面的跳转取反,发现植物攻击无子弹,看下一处。
00488FF4 |> \C783 90000000>mov dword ptr [ebx+90], 1
00488FFE |> 5F pop edi ; 1E7BCD68
00488FFF |. 5E pop esi
00489000 |. 5B pop ebx
00489001 |. 8BE5 mov esp, ebp
00489003 |. 5D pop ebp
00489004 \. C2 0400 retn 4
上面的代码无跳转,看下一处。
00488CD2 |> \83BB 90000000>cmp dword ptr [ebx+90], 1 ; Default case of switch 00488AF3
00488CD9 ^ 0F85 86FEFFFF jnz 00488B65
上面的代码判断计时数据是否为1,将下面的跳转取反,发现植物攻击一次会发射多发子弹。如下图:
结合在《植物大战僵尸更改植物攻击速度(一)》中的方法,将
004838D1处 mov ecx, dword ptr [ebx+5C]修改为 mov ecx,1 。效果图如下:
四、小结
思路决定出路。逆向时不能见到call就想跟进,分析时一条路不通就换一条路,也许就会柳暗花明。
谢谢各位的支持,祝论坛越办越好!!!
ggsuper
2018.1.7
代码清单如下:
00488AAC 8B83 90000000 mov eax, dword ptr [ebx+90]
00488AB2 |. 85C0 test eax, eax
00488AB4 0F84 44050000 je 00488FFE
此处进行分析,首先是把
00488AB4 处 je 改为 jne,取消硬件访问断点,F9运行,观察发现植物只有攻击动作,无子弹,未能得到加速效果。
00488AAC 8B83 90000000 mov eax, dword ptr [ebx+90]
00488AB2 |. 85C0 test eax, eax
00488AB4 0F84 44050000 je 00488FFE
此处进行分析,首先是把
00488AB4 处 je 改为 jne,取消硬件访问断点,F9运行,观察发现植物只有攻击动作,无子弹,未能得到加速效果。
那么换个思考角度,考虑程序如何使用该计时数据。猜测程序可能是不断将计时数据与一个固定数值比较,若等于该值则跳转到攻击实现。
在计时数据上下硬件访问断点,F9运行,观察程序中与计时数据比较的语句。
清单如下:
第一处:
00488B65 |> 83BB 90000000>cmp dword ptr [ebx+90], 0
00488B6C |0F85 8C040000 jnz 00488FFE
上面的代码判断计时数据是否为0,将下面的跳转取反,发现植物攻击无子弹,看下一处。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!