|
吾爱游客
发表于 2018-1-27 14:04
植物大战僵尸更改植物攻击速度一、实验目标
加快植物攻击速度。
效果如下图:
二、实验环境
操作系统:win7 64位
目标程序:植物大战僵尸2010年度版
使用工具:OllyICE、CE
CE修改器链接:https://pan.baidu.com/s/1o7tpowU 三、实验流程 (一)分析思路
以豌豆射手为例,观察发现,射手每隔一段时间发射一次。假设存在发射间隔计时数据,CE搜索该计时数据,具体方法在《植物大战僵尸更改阳光产出速度》一文中有体现,此处不赘述,然后用OD修改。 (二)CE找出攻击时间间隔
找到发射间隔计时数据地址如下:
(三)OD分析相关代码
OD命令行输入dd 1E623B38 ,并在数据窗口中该地址处下硬件写入断点,F9运行,断在减少攻击间隔计时数据语句处,如下:
分析断点附近语句,先将计时数据减1,再赋值给eax,然后test判断eax是否为0。取消硬件断点,手动将计时数据改为0,F9运行,回到游戏发现射手发射子弹,短时间多次修改计时数据为0,发现射手攻速明显加快。或可以在跳转语句 004838BD地址处F2下断点,断下时手动修改Z标志位为1,使跳转实现也可,效果相同。可以确定的是 004838BD地址的跳转语句是关键跳转。 最初考虑将4838BD处语句改为xor eax,eax使eax清0,或者可以修改4838C4处语句为jle,以实现跳转。修改后发现植物不再攻击,具体原因不明,这对僵尸来说是个好消息。此路不通,于是决定到关键跳转下面的攻击处理程序中进行分析。清单如下:
- 004838C4 /0F8F D3000000 jg 0048399D ; 植物攻击跳转,eax=0时植物攻击
- 004838CA |6A 0F push 0F
- 004838CC |E8 EF031100 call 00593CC0
- 004838D1 |8B4B 5C mov ecx, dword ptr [ebx+5C] ; 攻击加速改为mov ecx,22(不能再小了)
- 004838D4 |29C1 sub ecx, eax
- 004838D6 |8B43 24 mov eax, dword ptr [ebx+24]
- 004838D9 |83C4 04 add esp, 4
- 004838DC |894B 58 mov dword ptr [ebx+58], ecx ; 射手时间初始赋值
- 004838DF |83F8 12 cmp eax, 12
- 004838E2 |75 0A jnz short 004838EE
- 004838E4 |E8 C7F9FFFF call 004832B0
- 004838E9 |. |E9 AF000000 jmp 0048399D
- 004838EE |> |83F8 1D cmp eax, 1D
- 004838F1 |. |75 0C jnz short 004838FF
- 004838F3 |. |8BF3 mov esi, ebx ; Case 1D of switch 004838DF
- 004838F5 |. |E8 06FEFFFF call 00483700
- 004838FA |. |E9 9E000000 jmp 0048399D
- 004838FF |> |83F8 1C cmp eax, 1C
- 00483902 |. |75 6B jnz short 0048396F
- 00483904 |. |8B53 1C mov edx, dword ptr [ebx+1C] ; Case 1C of switch 004838DF
- 00483907 |. |6A 01 push 1
- 00483909 |. |52 push edx
- 0048390A |. |53 push ebx
- 0048390B |. |E8 10F6FFFF call 00482F20
- 00483910 |. |8B03 mov eax, dword ptr [ebx]
- 00483912 |. |8B80 44090000 mov eax, dword ptr [eax+944]
- 00483918 |. |8BB3 98000000 mov esi, dword ptr [ebx+98]
- 0048391E |. |8B78 08 mov edi, dword ptr [eax+8]
- 00483921 |. |E8 EA53F9FF call 00418D10
- 00483926 |. |8BB3 94000000 mov esi, dword ptr [ebx+94]
- 0048392C |. |894424 0C mov dword ptr [esp+C], eax
- 00483930 |. |8B03 mov eax, dword ptr [ebx]
- 00483932 |. |8B88 44090000 mov ecx, dword ptr [eax+944]
- 00483938 |. |8B79 08 mov edi, dword ptr [ecx+8]
- 0048393B |. |E8 D053F9FF call 00418D10
- 00483940 |. |8B7424 0C mov esi, dword ptr [esp+C]
- 00483944 |. |6A 14 push 14
- 00483946 |. |56 push esi
- 00483947 |. |8BF8 mov edi, eax
- 00483949 |. |E8 224D0100 call 00498670
- 0048394E |. |68 BCE07200 push 0072E0BC ; ASCII "anim_head_idle"
- 00483953 |. |8BCE mov ecx, esi
- 00483955 |. |C746 10 00000>mov dword ptr [esi+10], 0
- 0048395C |. |E8 7F4C0100 call 004985E0
- 00483961 |. |D947 08 fld dword ptr [edi+8]
- 00483964 |. |D95E 08 fstp dword ptr [esi+8]
- 00483967 |. |D947 04 fld dword ptr [edi+4]
- 0048396A |. |D95E 04 fstp dword ptr [esi+4]
- 0048396D |. |EB 2E jmp short 0048399D
- 0048396F |> |83F8 1A cmp eax, 1A
- 00483972 |. |75 1D jnz short 00483991
- 00483974 |. |8B43 3C mov eax, dword ptr [ebx+3C] ; Case 1A of switch 004838DF
- 00483977 |. |83F8 20 cmp eax, 20
- 0048397A |. |75 08 jnz short 00483984
- 0048397C |. |8B53 1C mov edx, dword ptr [ebx+1C]
- 0048397F |. |6A 00 push 0
- 00483981 |. |52 push edx
- 00483982 |. |EB 13 jmp short 00483997
- 00483984 |> |83F8 1E cmp eax, 1E
- 00483987 |. |75 14 jnz short 0048399D
- 00483989 |. |8B43 1C mov eax, dword ptr [ebx+1C]
- 0048398C |. |6A 01 push 1
- 0048398E |. |50 push eax
- 0048398F |EB 06 jmp short 00483997
- 00483991 |8B4B 1C mov ecx, dword ptr [ebx+1C]
- 00483994 |6A 00 push 0
- 00483996 |51 push ecx
- 00483997 |53 push ebx
- 00483998 |E8 83F5FFFF call 00482F20 ; 射手攻击call
上面的清单中有很多call ,在第2行 004838CA 语句处按F2断点,回到游戏,植物攻击时则会断在此处,一路F8下来,发现完成攻击动作只用到了2个call,1个是第3行的call,另一个是第69行的call。分析第3行的call的压栈参数,不像是攻击call,略过。那么只剩下69行的call,在此call处下断,见下图:
分析此call参数,ecx比较特别,向上寻找可以修改ecx值的合适位置,在004838D1处 mov ecx, dword ptr [ebx+5C]修改为mov ecx,22 (泪奔,经手工多次测试,22是可修改的最小值,再小则植物不攻击)。
四、小结
分析过程中遇到许多情况,整体流程不明晰,很大程度上靠运气。修改后效果如下:
最后祝吾爱越做越好,站长越长越帅
|
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|