好友
阅读权限10
听众
最后登录1970-1-1
|
本帖最后由 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 这里提供文件方便大伙进行学习
|
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|
|