• 植物大战僵尸:实现全屏爆炸


    植物大战僵尸这款游戏可以说是很多90后的回忆了,基本上只要是90后或多或少的都接触过,而玩游戏与制作辅助是两个概念,今天我将给大家分享一些游戏辅助方面的制作技巧,之所以使用植物大战僵尸这款游戏是因为游戏简单容易分析,且不需要考虑驱动保护版权等相应的问题,这里我会把我的分析思路分享出来,来供大家参考。

    本次实验目标是实现远程种植,要实现这个功能我们就需要找到植物的种植Call,种植Call什么时候会触发呢?当我们种植植物的时候必定会触发种植Call,那么此时我们只要遍历出植物的种植过程即可,通过CE我们找到拿起植物的关键代码,我们可以猜测植物拿起来这个动作之后应该就是种植了,只要我们能够找到控制拿起植物的代码,那么距离种植Call应该不会太远,先来说一下植物种植遍历技巧,此处就不演示了。

    打开游戏并开启新关卡 -> 然后在CE中首次扫描 -> 扫描未知初始化数值
    回到游戏 -> 拿起向日葵(不要种) -> CE搜索变动的数值 -> 回到游戏(不要动) -> 搜索未变动的数值
    回到游戏 -> 放下向日葵(右键) -> 拿起豌豆射手 -> CE搜索变动的数值 -> 以此循环直到找到为止

    通过使用上方查找技巧循环查找游戏数据,最后你可以看到如下图所示的7个内存地址,这个内存地址的默认数值是4294967295,找到后直接将其加入到地址栏中。

    为了提高查找精度缩小出错的概率,我们手动拿起不同的植物,豌豆射手向日葵樱桃炸弹,并观察CE中两个地址的变化,会发现地址栏中的两个地址是从0、1、2有顺序的变化的,如下图当拿起樱桃炸弹时这个值变为了2,而该植物的编号正是2

    我们在037C07C4这个内存地址上右键选择,查找访问地址,然后回到游戏手动种植一个豌豆射手,此时地址表中会出现两条汇编指令,这两条指令正是我们种植植物时所访问的指令,我们直接记下这两条指令所对应的地址00410AC1/004123AC

    接着我们以同样的方法,在037C07C8这个内存地址上查找访问代码,然后再次回到游戏中种植一个植物,此时地址表中会出现三条汇编指令,由于我们并不知道到底哪一条指令附近存在种植Call,所以最稳妥的办法就是直接记下这三条指令00410A91/0041239A/00488DE5的内存地址,后期逐步分析。

    上方我们一共找到了5条可疑的汇编指令,其实这里有一个排除技巧,因为这几条指令都是在植物种植以后出现的,又因为种植植物这个动作肯定有参数的传递,而正常情况下参数的传递都会使用堆栈或寄存器传递,观察上图可发现Mov eax,[eax+28]这条指令是将内存地址中的数据取出来赋值给寄存器,那么下一步很可能就是通过寄存器传递参数以作为Call的参数使用,而紧随其后的Mov [ecx+28],eax则是即将eax的值赋给一个内存地址,很明显不会是调用Call之前的动作。

    通过经验排查,这五个地址中最有可能是种植Call的地址有两个,分别是00410AC100410A91这两个都是将数据从内存取出来并放入寄存器,下一步可能就是压入堆栈并调用Call了,我们直接通过X64dbg定位到这两处位置分别下好断点。

    然后回到游戏,并拿起一颗太阳花并种下,此时我们可发现X64dbg正好断在了00410A91的位置,而紧随其后的就是一个Call,我们直接单步F8跟随并记下其压入的参数,其中经过测试我已经备注好了关键位置。

    最后,我们可以通过注入器远程注入观察效果,需要注意的是push ebp里面的地址是动态地址,而针对这种动态地址的找法我在上一节逆向植物的相关内容中已经总结过了,此处就直接跳过吧。

    上图中我们可以通过给寄存器压入不同的参数,从而实现任意位置的种植,由于这里是直接调用了种植Call并没有经过原程序的判断逻辑,因此种植并不会消耗任何的阳光,更不会存在冷却周期这个概念,因为我们是直接调用的功能。

    最后我们的任务是通过编程实现远程注入,如下代码我想不用我多解释了吧,通过循环填充实现全屏爆炸。

    void FullBlast()
    {
    	DWORD addr = 0x0040D120;
    	for (int x = 0; x < 5; x++)
    	{
    		for (int y = 0; y < 9; y++)
    		{
    			__asm
    			{
    				pushad
    					mov esi, dword ptr ds:[0x006a9ec0]
    					mov esi, dword ptr ds:[esi + 0x768]
    					push 0xfffffff
    					push 0x2
    					mov eax, x
    					push y
    					push esi
    					call addr
    				popad
    			}
    		}
    
    	}
    }
    

    代码编译的时候必须选择Release版本,Debug版本会插入检测指令导致堆栈失衡,此代码在Xp系统下会崩溃,只能在Win7或Win10上运行,此处我在Win10上测试效果如下,不过不推荐这样玩,实在是没意思了,感觉屏幕都在颤抖。

    至此我们的植物大战僵尸分析就到此结束了,其他的比如植物无敌,植物攻击加速等,就留一个作业,大家开动脑筋看能不能自己实现,回顾前面所讲的外挂制作技巧,你是否已经完全理解了呢?如果你能够吃透这些基础知识,那么相信你可以做出植物无敌,攻击加速等其他变态功能,其实逆向就是一个思路的问题,大家要多去思考,多去尝试,相信你会成功的!

    原创作品:转载请加出处,您添加出处,是我创作的动力!

  • 相关阅读:
    [asp.net core]SignalR一个例子
    [Asp.net core]bootstrap分页
    ${pageContext.request.contextPath}无法解析
    [Java web]Spring+Struts2+Hibernate整合过程(2)
    [Java web]Spring+Struts2+Hibernate整合过程
    java.lang.IllegalStateException: Failed to load ApplicationContext
    [Struts2]配置文件
    unihtmlmemo使用
    ADO序列
    variant和rawbytestring相互转换
  • 原文地址:https://www.cnblogs.com/LyShark/p/11983503.html
Copyright © 2020-2023  润新知