植物⼤战僵⼫修改笔记(Steam)
植物⼤战僵⼫修改笔记(Steam)还是错过的爱情
1. 基础修改
基址寻就不详细记录了,基址有四个
0x00731C50 0x00731CDC 0x00731D08 0x00731DA0
其他记录详细请见
PVZSteam.MSTT 和 PlantsVsZombiesSteam.CT
2. 关于当前地图信息搜索
⾸先有个地图基本信息,也就是基于哪张基本地图制作的关卡,
0草地 1夜晚 2泳池 3雾 4屋顶 5夜晚屋顶
可⽤⼯具MemoryBlockCompare搜索出来
其次,是每⾏的属性,出僵⼫的时候⽤于检测
每⾏属性 0裸地1草地 2⽔路
最后每个⼟地块都有⾃⼰的类型
1草地 2裸地 3⽔池
不过这⾥注意的是,这⾥不是 types[X][Y]⽽是types[⾏][列]
4byte*6row*9col
3. CALL_成就
通过存档指针中的成就,⽤CE定位,OD分析得出
mov eax,[00731C50]
push0//种类
push1//为1有声⾳和提⽰,0则没有
lea edx,[esp]
push edx
push eax
lea ecx,[esp+C]
call0045BC00
add esp,8
4. CALL_掉落
通过可点击物品的数量+1,⽤CE定位,OD分析得出,除了个别CALL,下同
mov ecx,[00731C50]
mov ecx,[ecx+868]
push3//0从坐标落下1从坐标缓慢落下2从后⽅跳出3从后⽅快速跳出4直接收集5稍后⾃动收集6从屏幕右侧直接蹦出7在卡槽栏后同
push3//1银币2⾦币3钻⽯4太阳5⼩太阳6⼤太阳7卡⽚8奖杯9铲⼦10图鉴11钥匙12花瓶13⽔壶14三明治15遗书16消
失17花苗礼盒18⾦币带19礼盒(不消失)20⾦币带(不消失)21银奖杯22⾦奖杯23巧克⼒24巧克⼒(不消失)25礼品盒(⼩游戏)26礼品盒(解密模式)27礼品盒(⽣存模式)
push118//Y坐标
push118//X坐标
push118//X坐标
call0040FF90//CALL驾考新规
5. CALL_植物
mov eax,[00731C50]
mov eax,[eax+868]
push-1//标志位参数
push3//种类
push2//Y坐标
push eax//战场基址
mov eax,1//X坐标
call004105A0//CALL
6. CALL_僵⼫_墓碑全体出僵⼫&⽔草僵⼫
最后⼀⼤波僵⼫的时候,才会调⽤这个CALL
这个CALL不仅仅是墓碑出僵⼫,最后⼀⼤波僵⼫都是这个
mov edi,[00731C50]
mov edi,[edi+868]
cmp edi,0
call004161f0//CALL
7. ⼤嘴花快速吞噬修改
计算机病毒的传播途径通过植物状态指针变化,定位到相应的代码
00467709 - 8B 47 3C - mov eax,[edi+3C]
此代码读取到植物状态
在之后,有判断该状态的值
分别为1 A B D E
为1的时候是待命状态
为A的时候为开始张嘴动作,张嘴完毕后将状态改为B
为B的时候,开始咀嚼动作,并将状态改为D
为D的时候,要等咀嚼动作完毕,开始吞咽动作,并将状态改为E 为E的时候,要等吞咽动作完毕,恢复待命动作,并将状态改为1 8. CALL_通关
通关CALL寻⽐较恶⼼~….真的⽐较恶⼼
⾸先,先通关所有基础关卡(即通了基础50关,从头循环)
再通关⼀个基础关卡,会调出⼀个钱袋⼦,⿏标点击后
会弹出5个⾦币,此时在可点击物+1的代码出下断
外CALL,每层CALL下断,删除轮询的CALL(就是啥时候都会断下来的)
从外层CALL对跳转记录分析
对过关物品和普通物品进⾏跳转区别
出关键跳转
在关键跳转后分析代码,关键CALL
这个关键CALL也⽐较恶⼼,耐⼼就能得到
其中⼀个⽅法可以把关键跳后⾯的所有CALL都nop掉
⼀个⼀个恢复,即可轻松到~
9.倭⽠全屏攻击解析
(1) 通过倭⽠检测僵⼫在附近,开始攻击动画
(2) 获取攻击动画并在初始化处下断点
(3) 在断点处上⽅到关键跳转
(4) 在跳转上⽅到设置跳转标志的CALL
电脑网速太慢怎么办(5) 进⼊CALL在循环处分析是否在同⼀⾏,是否在附近,是在前还是在后
(6) 修改关键跳转实现倭⽠全屏攻击,但是倭⽠只能实际攻击到本⾏第⼀个僵⼫
(7) 继续通过僵⼫⾎量分析,查看所有都是正常情况下哪⾏代码修改了僵⼫⾎量并下断
(8) 断下后查看外层CALL,到循环即为循环判断僵⼫是否在攻击范围内
(9) 通过不在同⼀⾏和正常2种对⽐分析,出关键跳转并修改,即达到了倭⽠全屏攻击伪代码
If 场上有没有僵⼫
Ret
片段描写Else
If 和倭⽠不在同⼀⾏
Ret
Else
If 不在倭⽠附近
Ret
Else
If在倭⽠前⽅
向前跳
Else
向后跳
Endif
计算落地坐标并消灭在范围内的僵⼫
Endif
End if
End if
9. 樱桃攻击全屏
⾸先通过僵⼫是否消失定位到OD
从OD外CALL
⼀直到外CALL在循环中
查看有什么跳转跳过外CALL,进⾏分析即可
把关键跳转nop掉即完成樱桃全屏攻击
10. CALL_GameOver
[[00731c50]+91C]游戏场景 0游戏读取 1开始界⾯ 2游戏准备界⾯ 3种植界⾯ 4GameOver 5通关界⾯ 6通关⾳乐界⾯ 7选关界⾯
通过游戏场景的切换到相应的代码
⽤CE定位,OD跟踪,到相应CALL即可
11. 解决种植僵⼫崩溃问题
这个问题也是⽐较恶⼼的事情,从我10年开始研究pvz,这个问题⼀直没有被很好地解决过。
⼏个⽉前想起这个事情,稍微的分析了⼀下,原因在于种植僵⼫的时候,由于资源未载⼊⽽导致的程序崩溃。
但是后来⼀直未作研究,最近⼜想起这事,最终得到解决,⽅法如下。
⾸先不做任何修改的情况下,游戏⾃⾝有个解决⽅法,就是打开僵⼫的CG,也就是打开僵⼫的相册,再种植僵⼫就不会出现任何问题。
也就是说当打开CG的时候,资源就加载到内存中了,这样就不会出现种植了僵⼫却不到资源引起的崩溃。
⾸先,读取资源肯定要⽤到CreateFileA或CreateFileW,先打开CG的index,再⽤OD对这两个函数下断。点开View Zombies。
此时已经断下,打开堆栈,最外层CALL下断,取消CFA和CFW断点,运⾏,发现每次都会断下,则关掉游戏,重新对CFA和CFW下断,此时到第⼆层CALL,发现也是每次都断下,但是多运⾏⼏次后就不会再断下了,也就是说,资源已经加载到内存中了,浏览附近代码
方安娜回应与李易峰恋情传闻
发现上⾯这个jnz能跳过这个CALL,运⾏后发现,⼀开始不跳,多运⾏计次后就会⼀直跳过,所以这个jnz就是关键跳。
此时重新运⾏游戏,并在此CALL下断分析,发现这个CALL没有push参数,却有ecx作为参数,ecx是僵⼫id。最终调⽤这个CALL即可把僵⼫信息加⼊到内存中。
12. 解决种植植物CALL出现崩溃问题
这个问题也⽐较恶⼼,⽐种植僵⼫CALL还恶⼼。
不过最近弄出了解决僵⼫CALL崩溃的问题,就趁热打铁,把植物CALL崩溃⼀并解决了。
⽅法同上,只不过有个⼩问题,是这样⼦的,假如已经通关了(是基础的50关),在启动游戏的时候,绝⼤部分的植物资源已经加载到了内存中,所以,⽤打开CG的⽅式下CreateFileA或CreateFileW断点有时会断不下来,如果出现这样的情况,⽤以下⽅法可以完美解决,不过先要到⼏个指针。第⼀个指针是关卡指针,第⼆个指针是基础通关次数指针(每通关⼀次所有基础关卡,这指针内容会+1),删除所有存档,重启游戏,新建⼀个⽤户,把基础通关次数指针改为1,关卡指针改为2.进⼊帮助再返回,就会有个CG本了,打开CG本,但是先别点击浏览植物,此时⽤OD下CFA或CFW断点即可断下。
这⾥和僵⼫CALL不同的是,这个关键CALL不是在第⼆层,需要耐⼼的⼀下,CALL的上⽅也是⼀个数组形式的判断,还有个push 0,最后还有个寄存器赋值。具体代码如下
分析这个CALL也很简单,简单调⽤即可,不过要注意寄存器和push参数就⾏。
13. CALL_钉耙_随机⾏固定第七列
这个虽然思路很简单,但是CALL的定位⽐较难.
可以⽤存档指针中,钉耙数量-1来定位
也可以⽤特殊物品数量+1来定位
但是最终发现,特殊物品+1的外层就是钉耙数量-1
那么特殊物品+1的就是特殊物品放置CALL
但是特殊物品放置CALL单独调⽤是没效果的
因为这个CALL就是⽤来申请(这个词⽤的有点不对感觉,因为PVZ的内存都是线性申请好的)和初始化做相关记录的,并不是真正的或者说是完整的特殊物品放置CALL
那么钉耙CALL应该是在钉耙数量-1的外层,但是从钉耙数量-1的CALL头看起,它读取了存档指针,⼜读取了是否买了钉耙或者说钉耙剩余量,然后做了⽐较判断
也就是说,不管怎么调⽤,除⾮⾃⼰重写部分代码,是跳不过钉耙数量-1的.从外层CALL分析,很容易调⽤这个CALL
14. CALL_钉耙_坐标
从上图可看到,钉耙个数-1的下⾯就是特殊物品CALL
但是在13的时候我分析过,这个CALL仅仅是⽤来初始化相关内存的,并没有真正的种植钉耙
那⼀个蛋疼的事情就发⽣了,下⾯的所有代码就是种植钉耙的剩余代码,没得办法,只能原模原样的抄了.
发布评论