植物大战僵尸分析及游戏辅助Python实现
起因
网上已经有很多帖子分析植物大战僵尸冷却的。有的看不出是个什么逻辑,一会搜索1,一会搜索0的,脑子笨想不出来是什么门道。
没办法只能自己操刀按自己的想法分析看看了,就当学习。
更多资源请访问 大神论坛
准备工具
x32dbg
植物大战僵尸
Cheat Engine 7.1
过程
先把阳光数量变成可控的,阳光基址就不说怎么找了。其实不找也行只要把阳光变的多点就行,目的就是能随时用阳光。
按照网上的思路反复搜索1,搜索0的确是能做到无CD,但是看不出门道。换一个思路,冷却时间是最为直观的。就是种上植物之后,卡片会变成冷却状态,有一个冷却进度,如下图的豌豆射手。

所以目标就是先搜索出来记录这个冷却时间的地址。
这个冷却时间有两种可能,
种上植物后,程序设置一个冷却时间,之后慢慢的往下减,减到0冷却就没了。
种上植物后,程序将变量置0,开始计时,慢慢的增加,增加到某个阈值,就是无冷却了。(其实是这个)
搜索方法为了统一,不管它是增加计时,还是减数计时,搜索方法就一个。
搜索记录冷却时间的地址
搜索方法
搜索未知的初始值
冷却阴影变动,就再搜索变动了的数值
未发现第一格冷却计时地址,接着重复第2步
先用CE附加植物大战僵尸进程。
接着种上植物,CE搜索未知的初始值。
首次扫描

冷却阴影变动后按下图操作
再次扫描

一直重复再次扫描的步骤,慢慢的筛选,当一个冷却结束后,可以再种一个植物(必须是同一格)。
其实中间可以穿插一些未变动的数值搜索,这样可以更快的检索出结果来。
搜索结果

看动图可以种植的时候是0,有冷却时间的时候随时间增长。

很明显就是第一格的冷却时间,把他拉下来,右击后选择「找出是什么改写了这个地址」

记录下改写指令的汇编地址004B2FEA

实现无冷却
CE先使用一阶段,关掉CE,打开X32dbg附加植物大战僵尸

按下Alt+A附加上植物大战僵尸进程

Ctrl + g到跳转窗口,跳转到刚刚记录下来的004B2FEA地址。

跳转到地址004B2FEA指令处的分析。

// 伪代码大概就是这个意思
// …
coolDownTime++;
if ( coolDownTime > 当前植物的冷却需要的总时长) {
// 取消冷却
cancelCooling(当前植物);
}
// …
实现无冷却有一下两种方法。
方法一
nop掉004B2FF3跳转指令
// 改成这个样子
// …
coolDownTime++;
// 取消冷却
cancelCooling(当前植物);
// …

方法二
把比较换成与0比较
// 改成这个样子
// …
coolDownTime++;
if ( coolDownTime > 0) {
// 取消冷却
cancelCooling(当前植物);
}
// …

这样改过之后打上补丁玩个游戏就没意思了,可以用CE代码注入,实现动态修改。
这里只演示第二种方法,第二种会了第一种方法就是大同小异。
x32dbg剥离植物大战僵尸进程

换CE附加上植物大战僵尸进程,点击查看内存。

ctrl + g跳转到刚记录的004B2FEA指令地址(就是+1指令的地址)

实现的是第二种方法,所以我们选中下面这条指令
PlantsVsZombies.exe+B2FF0 - 3B 47 28 - cmp eax,[edi+28]

安装下面图片一步一步来



下面是生成出来的代码,没有任何改动

修改后的代码

[ENABLE]
//code from here to ‘[DISABLE]’ will be used to enable the cheat
alloc(newmem,2048)
label(returnhere)
label(originalcode)
label(exit)

newmem: //this is allocated memory, you have read,write,execute access
//place your code here

originalcode:
// cmp eax,[edi+28]
cmp eax, 0
jle PlantsVsZombies.exe+B3007

exit:
jmp returnhere

“PlantsVsZombies.exe”+B2FF0:
jmp newmem
returnhere:

[DISABLE]
//code from here till the end of the code will be used to disable the cheat
dealloc(newmem)
“PlantsVsZombies.exe”+B2FF0:
cmp eax,[edi+28]
jle PlantsVsZombies.exe+B3007
//Alt: db 3B 47 28 7E 12
接着就是分配到当前的CT表,保存完这个页面就可以关了。

在主界面就能看到刚刚保存的脚本

这样可以动态修改指令。勾上就是无冷却,取消就是正常代码。
第一种方法和第二种方法都可以实现,第一种方法留下自己实现吧。
看看效果

游戏,索然无味。
到这里还没有结束,不是为了实现冷却,而是尽量的多分析一下看看。
继续深入一点分析-挖掘基址
把刚刚汇编的地方还原,跳出当前函数看看上一层的逻辑。
断在004B2FEA之处后,先点击运行到返回 => 在单步步过一下 ( 或者双击右下角堆栈窗口的0019F9EC地址数据,也可以跳转到上一层逻辑)

上一层函数的逻辑

形成伪代码就是
// …
cardList = [豌豆射手, 向日葵, 樱桃炸弹 …]
cardCount = [eax + 24] // 当前可使用的植物卡片数量
count = 0 // xor ebx, ebx
if (cardCount > 0) {
do {
card = cardList[count];
handlerCard(card); // 最开始分析的call, 里面执行+1 重置冷却时间
count++;
} while(count < cardCount);
}
// …
逻辑大致是清晰了,现在找基址一下基址。现在关注一些上下文信息

汇编语句

00428E40 | 8B87 5C010000 | mov eax,dword ptr ds:[edi+15C] |
00428E46(断点处EIP) | 33F6 | xor esi,esi | esi = 0
00428E48 | 3958 24 | cmp dword ptr ds:[eax+24],ebx | [eax + 24] 是格子数量 最上面(xor ebx, ebx)
00428E4B | 7E 1B | jle plantsvszombies.428E68 | if
00428E4D | 8D49 00 | lea ecx,dword ptr ds:[ecx] |
00428E50 | 8D4403 28 | lea eax,dword ptr ds:[ebx+eax+28] | 这是数组
00428E54 | E8 57A10800 | call plantsvszombies.4B2FB0 | 刚刚分析的就是这个call
00428E59 | 8B87 5C010000 | mov eax,dword ptr ds:[edi+15C] |
00428E5F | 46 | inc esi | i++
00428E60 | 83C3 50 | add ebx,50 |
00428E63 | 3B70 24 | cmp esi,dword ptr ds:[eax+24] | esi < [eax + 24]
00428E66 | 7C E8 | jl plantsvszombies.428E50 |

寄存器信息

EAX : 19B9EC90
EBX : 00000000
ECX : 0000019E
EDX : 00000163
EBP : 0019FA5C
ESP : 0019F9F0
ESI : 1FF12C18
EDI : 200DB408
EIP : 00428E46
call plantsvszombies.4B2FB0需要传入植物卡片的地址([ebx+eax+28] ),eax是上下文提供的,ebx是偏移相当于高级语言中i++的作用。
现在eax的值不确定,有两种方法,
一个是向上看eax是谁给的,慢慢向上一层一层的找
使用CE搜索eax寄存器的值19B9EC90。(eax = [edi+15C], 搜索edi(200DB408)就行)
我选择第二种,因为第一种我试过了,不好使不方便。
第二种方式:x32dbg剥离植物大战僵尸进程。

换成CE加载,搜索edi寄存器的值200DB408(注意先勾上十六进制)

拉下来右键=>『找出是什么访问了这个地址』。

搜索ESI值0295B120

基址都记录下来吧,以后可能都会用到。(其实随便选一个就行)

PlantsVsZombies.exe+3794F8
PlantsVsZombies.exe+37959C
PlantsVsZombies.exe+379670
PlantsVsZombies.exe+379618

组合分析使用基址 // 猜测 CARDS { // .... int count; // +0x24 Card list[X]; // +0x28 每个Card大小为0x50 // 后面分析这个数组好像是固定长度 控制 [CARDS + 0x24] 可以扩容和减少格数 // 设置超过数组的 size 就会程序异常 // ..... }

//植物卡片对象 地址
CARDS = [[[PlantsVsZombies.exe+379618] + 0x868] + 0x15C]
//植物卡片个数 可以实现扩容和减少格数
[CARDS + 0x24]
// 第N格植物卡片地址 N > 0
[0x50 * N + CARDS + 0x28]
// 第N格植物卡片地址 N > 0 冷却记录
[0x50 * N + CARDS + 0x28 + 0x24]
// 第N格植物卡片地址 N > 0 冷却时间
[0x50 * N + CARDS + 0x28 + 0x28]
// 模块起始地址
00400000 - PlantsVsZombies.exe
有了这些分析就可以写代码了。
Python 实现辅助
下面放一部分,具体的全部代码可以看附录里面的代码,大多读写内存的操作都是封装的Win32Api(还不如用C++写)

省略 …

pid = get_pid(“PlantsVsZombies.exe”)
print("PlantsVsZombies.exe 进程id: " + str(pid))
processHandle = open_process(pid)

def showCard(processHandle):
count = plant_cards_count(processHandle)
os.system(“cls”)
x = PrettyTable([“格子”, “当前冷却时间”, “总时间”])
for n in range(count):
plant_info = get_plant_n(processHandle, n)
x.add_row([n+1, plant_info[“cooling”], plant_info[“cool_time”]])
title = “阳光:{}”.format(getSunCount(processHandle))
print(x.get_string(title=title))

def drawTable():
while True:
showCard(processHandle)
time.sleep(1)

滚动滚轮

def on_scroll(x, y, dx, dy):
# dy == -1 下滑
# dy == 1 上滑
sunCount = getSunCount(processHandle)
setSunCount(processHandle, sunCount + (5 * dy))

省略 …

效果:向上滚动滚轮增加阳光,向下滚动滚轮减少阳光(注意动态中阳光的变化)。可以看到有几个格子,冷却时间,总时间。

修改的功能就只有一个阳光,其他的就不写了,写多了也没意义,现在不会还有人玩这游戏的吧哈哈

大神论坛 史上最全植物大战僵尸分析及游戏辅助Python实现相关推荐

  1. 肿瘤/非肿瘤/单基因/单细胞/非编码:史上最全生信分析攻略!!!

    解读生信之美,探讨每篇文献背后的逻辑 非肿瘤专栏:条条大路通罗马 1.4+非肿瘤生信分析+铁死亡/焦亡/自噬/代谢/免疫的万能钥匙 短评:适合一些热门机制如铁死亡/焦亡/自噬等在非肿瘤疾病中的研究 2 ...

  2. 史上最全的程序猿工具集(辅助工具、开发工具、技术栈、学习网站、博客论坛)

    您的关注,是我前进的最大动力,各位老铁,看完收藏一波,你值得拥有 前言 在平时的开发工作中我们需要使用到很多的工具来辅助我们的开发,也经常会查阅很多的网站来收集资料.下面具体总结一下开发过程中的一些工 ...

  3. 大满足!史上最全|托盘类自动化立体库视频合集

    大家好,我是智能仓储物流技术研习社,社长老K.上篇介绍了自动化立体库的起源.发展过程和各种应用,具体见文章:    自动化立体库的前世今生 文章中附有各种种类的立体库的视频,由于微信文章的最多出现3个 ...

  4. 史上最全金融产品架构分析二:证券公司

    Part.2   证券公司 1.证券公司的主要业务范围有哪些? 投资银行业务,目前国内证券公司的投资银行业务主要是证券承销业务,即证券发行代理业务,指证券公司接受发行人的委托,借助自己的经营网点和信誉 ...

  5. 史上最全鱼骨图分析法

    本文总共分为三大部分:鱼骨图分析法.5why分析法.鱼骨图绘制:希望大家能够从中获益,并且将其运用在自己的生活和工作中,以下为今天的干货篇: 小编寄语 项目管理优秀书籍推荐,需要的同学可留言

  6. 史上最全金融产品架构分析四:信托公司

    1.业务种类 ​ 信托业可以经营的业务项目依<信托投资公司管理办法>法可分为如下: (1)受托经营资金信托业务.即委托人将自己合法拥有的资金,委托信托投资公司按照约定的条件和目的,进行管理 ...

  7. Python爬虫人工智能大数据全栈视频史上最全合辑教程分享!

    Python爬虫人工智能大数据全栈视频史上最全合辑教程分享! 毫无疑问Python是这两年最火的编程语言,不仅容易上手,且在多个行业都可应用.尤其今年人工智能及大数据的发展,Python将会展现更多的 ...

  8. 史上最全AI开源项目集结,近万篇附代码的论文分门别类整理好

    点上方蓝字计算机视觉联盟获取更多干货 在右上方 ··· 设为星标 ★,与你不见不散 这个资源一经分享出来,Twitter的评论区就成了"大型英文赞美词汇堆叠现场",几千人争相转发点 ...

  9. Redis分布式锁(图解 - 秒懂 - 史上最全)

    文章很长,而且持续更新,建议收藏起来,慢慢读! 高并发 发烧友社群:疯狂创客圈(总入口) 奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : 极致经典 + 社群大片好评 < Java 高并发 三 ...

  10. 大数据开发工程师基本功修炼之史上最全Linux学习笔记(建议)

    我正在参加年度博客之星评选,请大家帮我投票打分,您的每一分都是对我的支持与鼓励. 2021年「博客之星」参赛博主:Maynor大数据 (感谢礼品.红包免费送!) https://bbs.csdn.ne ...

最新文章

  1. 2017年重要数据安全事件解读
  2. Design Pattern----06.Creational.Singleton.Pattern (Delphi Sample)
  3. linux下添加用户并赋予root权限
  4. 学号20145332 《信息安全系统设计基础》实验四 驱动程序设计
  5. 常用的adb命令收集
  6. mysql装完后navicat无法连接_重装mysql后导致Navicat连接失败
  7. mysql语法学习(一)__Instances__表
  8. mac vagrant 虚拟机nfs挂载点
  9. matlab 过度曝光,MATLAB:补偿图像处理中的过度曝光/过饱和度
  10. 新浪微博登陆以及发送微博(附python源码)
  11. Django+nginx+uwsgi+ubuntu18.04网站部署
  12. python读取csv时keyerror_python – 错误:pandas hashtable keyerror
  13. mac下nginx搭建
  14. Tomcat服务器时间不正确
  15. grub 与grub2
  16. html 文本位置中心,html – 元素内的文本位置
  17. iOS之iCloud云存档实现笔记
  18. 《凤凰架构》读书笔记
  19. python读取手机短信信息_python 自动获取手机短信验证码
  20. 赶集网mysql36条军规_赶集网MySQL的36条军规

热门文章

  1. 虚拟机VMware的下载、安装与卸载
  2. 演示u盘启动盘装系统教程
  3. 关于csdn 博客图片无法加载的问题!
  4. weadmin3.0版本安装过程
  5. start()和run()方法的区别
  6. python爬取微博评论_详解用python写网络爬虫-爬取新浪微博评论
  7. gps校正 android,通过GPS时间同步Android设备?
  8. 涛思数据与优锘科技达成战略合作,可视化携手大数据引领物联网科技创新
  9. 服务器虚拟内存设置在什么盘,虚拟内存设置在哪个磁盘呢
  10. 曝猛! 许多行情软件自带的SAR指标是错的