吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1320|回复: 9
上一主题 下一主题
收起左侧

[原创] 萌新学习记录:使用汇编查找植物大战僵尸各类基址

[复制链接]
跳转到指定楼层
楼主
reversestudent 发表于 2026-6-25 18:56 回帖奖励
本帖最后由 reversestudent 于 2026-7-1 18:28 编辑

前排声明,博主是0基础自学三个月的逆向实习生,刚刚学完了C++、汇编和逆向的一些知识,此贴仅当自己对汇编和x32dbg的学习经验记录,大神可以绕过,但是对于和我一样的小白我觉得还是比较有意义的。那我们第一项目肯定是要选择植物大战僵尸这款经典游戏来练手,那么对于查找阳光基址、植物卡槽和僵尸数组的方法,我看帖子和网上资料基本都是用CE的自动指针链查找的,自动找指针链这种方法不利于我们对汇编的的理解,而且也仅仅是针对阳光基址算是能用,对于卡槽和僵尸头部的地址的汇编寻找,网上的资料也比较少,博主为了汇编的学习和工具的熟悉,选择了用汇编来找各类基址。篇幅有限,今天先总结阳光基址汇编寻找,话不多说,接下来上图。

游戏版本:植物大战僵尸年度版(这个版本的基址不是经典版的基址)

工具:x32dbg、ida

一、阳光基址
1、使用CE加载进程,首次扫描50 --- 阳光变化后下一次搜索阳光值,这样我们就得到了阳光地址和数据,但是每次重启关卡或者游戏,地址都会变化,我们的目的是找到基址。接下俩将地址加入到地址栏,右键--查找哪些写入了此地址,再次种植植物改变阳光,就看到了阳光写入处的汇编代码:


2、可以看到在地址0043C0AF处,将ecx写入了eax + 5578处的内存中,这里汇编就类似于sun += 25 。那显而易见,ecx是新增的阳光值,eax是类似于游戏关卡的棋盘对象。这里我们要记住eax== 372BB398  我们的任务就要追eax是怎么来的,往前看 mov eax , [esi + 4]  , 将esi + 4地址处的内存数据赋予了eax。这里博主最开始陷入了第一个误区,也是大部分人的想法:那再追esi 是怎么来的就可以了。但是博主可能是由于自身对汇编和x32dbg远远没有那么熟练的原因,找了好几层都找不到,而且翻了很多层发现代码跑去了其他奇怪的地方,所以放弃了找esi,等以后熟悉了再按这个流程来试一遍。那换种思路,既然eax这个棋盘对象的值是esi + 4 处的数据赋予的,那我们打开x32dbg,附加进程,跑到0043C0AF,然后在下方内存空间中,按ctrl+G,在esi +4 处的地址,右键-硬件写入断点-四字节,看看这里是什么时候把eax写进去的,然后删除0043C0AF的软件断点,只保留硬件断点,一直按F9直到游戏运行,然后观察下方内存区域,此时写入了[esi + 4]




3、查看上方汇编,mov eax,dword ptr ds:[edx+868] 。这里要注意一点,这两张图的eax的值都是372BB398,也就是那可以推断出eax这个对象是edx + 868 处的数据,那edx 是比 eax 更大的一个对象,可以理解为edx就是游戏的主对象。再看上一行的 mov edx , ecx ,说明继续得找ecx的值,那我们可以看到00429c04地址这里,有高亮的mov ecx,dword ptr ds:[755F28]赋值。在x32dbg中,高亮显示的地址一般是静态地址,那我们这里就可以猜这运行时虚拟地址了,那链路就出来了,ecx = edx = [755F28] ,而 eax = [edx + 868],也就是说 eax = [ [755F28] +868 ] , 而第一张图阳光写入时是 eax + 5578 ,所以阳光基址 =  [[755F28] +868 ]+5578  。因为 755F28 是运行时地址,而模块基址是 400000:755F28 - 400000 = 355F28  ,那么PlantsVsZombies.exe+355F28 就是模块偏移形式。

5、这里我们来CE进行验证,打开CE后,主页面右下角有手动添加地址  -- 勾选指针 --添加后 , 修改阳光为9999,运行游戏  


发现成功修改阳光,阳光基址到此寻找结束



二、植物冷却基址
1、这一步需要想一下,当一个植物种下时,必定有一个属于自己的冷却值,那么这个冷却值会随着植物的冷却进度变大或者变小,那么我们的思路就出来,那就是首次扫描时选择未知初始值,然后种下植物后,选择变动的值,扫描后暂停一两秒,选择未变动的值再进行扫描(因为暂停时冷却肯定是不变的,这里是过滤一些时间等其他因素),然后继续选择变动的值一直循环。最后当植物冷却结束的一瞬间,选变动的值扫描,之后过一两秒再选择未变动的值。这是CE扫描的整体流程,符合我们的正常逻辑,大家稍一思索就能理解。但是在实际操作中,发现最后扫描出来的值还有不少,那我们就只能缩小范围,冷却值只会增大或者减小,将变动的值这个条件改成增大的值,我运气比较好,这个版本的冷却是增大的,直接就筛选出来了,如图:

种植植物时发现这个值会在植物种植的时候一直增大,然后增大到一定数值时归零,归零时冷却完成。

2、继续右键-查看哪些写入了此地址


3、打开x32dbg ,ctrl + G 搜索0049CDF9地址处,查看汇编逻辑
     
这里发现inc [esi+24],那我们就知道这是刚才说的增大的那个冷却值,那就可以直接确定,这里的ESI是种植植物的卡槽对象,24是冷却偏移。那我们的主要目标就是寻找esi是怎么来的,向上查看汇编,发现这个函数开头到现在没有ESI的赋值,那就说明是上一层传过来的,那我们点击右下角的栈最上面的返回地址,返回到上一层继续找ESI的值。

4、OK,我们只上去一层就看到了明显的循环结构,而且这里lea esi , [eax+ebp+28],这句汇编等同于 esi = eax + ebp + 28。那我们的追踪就从esi变到了找eax和ebp,ebp在下面有add ebp,50,那eax上面有 mov eax ,[ebx+15c]。这里比较重要,这个EBX的值在右上方可以看到,这个值其实是在你找阳光基址的时候就看到过的当时的eax的值,也就是当前的棋盘对象,都是372BB398。那我们就知道了,当前棋盘对象+15C就是eax,结合下面的循环,eax就是植物整体的卡槽栏对象,所以[[00755F28] + 868] = 当前棋盘对象,[[[00755F28] + 868] + 15C] = 卡槽栏对象。下面的ebp加50在循环里,可以分析出是植物卡槽大小。


那这里其实总结一下就可以得出来了:
游戏主对象 = [00755F28]
当前关卡对象 = [游戏主对象 + 0x868]
卡槽栏对象 = [当前关卡对象 + 0x15C]
单个卡槽对象 = 卡槽栏对象 + 0x28 + 卡槽编号 × 0x50
冷却值地址 = 单个卡槽对象 + 0x24


合并一下:冷却值地址 =[[[00755F28] + 0x868] + 0x15C]+ 0x4c+卡槽编号 × 0x50

5、CE验证
将值改到比较大的值,例如9999并且锁定,植物就可以实现无冷却了。





三、僵尸头部数组地址

这部分内容我看论坛里已经有类似的帖子了,这里不过多赘述。我寻找的基本流程和上面找阳关时候一样,记住当前寄存器的值,一步一步向上找这个值就可以,我贴几张我学习过程中觉得重要的地方吧



在CE找到击中僵尸的汇编后,一路找到这里。之前的过程很简单,到这里我觉得很有学习价值,第一张图我们从47D410出来后,发现我们要追
通EDX的值。在47C447这里,我们发现了 mov edx,eax。那eax哪来的呢,这里eax的值就是call函数的返回值,那我们就记住了,以后追寄存器数值的过程中,遇到EAX一定要注意,在stdcall调用约定下CALL函数会改变EAX的值。那我们进47C130函数以后,按CTRL+F9,到函数末尾,上一个条件断点,看看eax的值是不是等于你要找的那个值,如果断到了,那我们就可以向上找EAX啦。那我们继续往上找,在47C15E这里,我们发现了xor eax,eax,这里异或成了0,在16C这里写入了[esp+14],我们从下找上来后刚要找[esp+14],好了,那我们就知道去428500这里找了,进去以后就是明显的僵尸数组了,这里就不贴图了,算是给大伙留的一个小尾巴吧哈哈~主要学的是思路,想实操的话下面有链接,大伙可以自己动手试试


过网盘分享的文件:PlantsVsZombies.exe
链接: https://pan.baidu.com/s/1MIZaCsaj4joAAMJMbkvHAQ?pwd=qf4b 提取码: qf4b     这里提供文件方便大伙进行学习

1782894745328.png (791.24 KB, 下载次数: 0)

1782894745328.png

免费评分

参与人数 5威望 +1 吾爱币 +24 热心值 +4 收起 理由
Hmily + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
xmztz + 1 + 1 我很赞同!
3y3s + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
laozhang4201 + 1 + 1 热心回复!
2022313 + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

沙发
SoarNut 发表于 2026-6-26 22:25
同样小白路过,收藏吃灰,现在出差,回家再研究
3#
XuanRanDev 发表于 2026-6-27 00:20
当初我最开始学Windows逆向的时候也是拿pvz练手的,还做了一套完成的软件,监听某音弹幕/礼物 实现自动的效果 比如放僵尸和植物
4#
XTDR12 发表于 2026-6-27 09:41
感谢博主分享的思路有空的时候研究一下,赞
5#
whatdos 发表于 2026-6-27 13:13
工具:win32dbg、ida
6#
Sabiduria 发表于 2026-6-27 16:20
同样小白路过,你写的我看明白很多,谢谢,共同进步
7#
3y3s 发表于 2026-6-27 18:27
XuanRanDev 发表于 2026-6-27 00:20
当初我最开始学Windows逆向的时候也是拿pvz练手的,还做了一套完成的软件,监听某音弹幕/礼物 实现自动的效 ...

是用监听弹幕和礼物的方式来影响游戏程序吗?
8#
zdyzzgdnnyx 发表于 2026-6-27 22:25
我也是被esi搞怕了,后来才知道是因为这个esi和别的不一样,和指针有关
9#
qaz737 发表于 2026-6-30 10:40
感谢博主分享的思路有空的时候研究一下
10#
xuexiba 发表于 2026-6-30 18:17
支持楼主,尤其是学习3个月就有非常清晰的问题分析逻辑。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - 52pojie.cn ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2026-7-16 22:53

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表