C# 植物大战僵尸逆向之---实现豌豆秒杀僵尸 (编写植物大战僵尸辅助 三)

C# 植物大战僵尸逆向之---实现豌豆秒杀僵尸 (编写植物大战僵尸辅助 一)

 

本章说明:

  工具:CE7.3 + ollydbg反汇编工具

  功能:实现植物秒杀僵尸的功能

 

演示:

 

 

 

一、找出植物打僵尸时的给僵尸扣血的地址来源。

    思路是这样: 要实现秒杀僵尸,那么我们要先找到这个僵尸的血量,然后根据豌豆每打一次僵尸,僵尸会减血多少,我们也就知道豌豆的攻击力是多少。

 

  1.上手,打开CE 添加上植物大战僵尸的进程。

  然后,我们最开始也是不知道僵尸的血是多少,我们需要选择为未知的初始值。

  

 

 

  2.在游戏中种植一颗豌豆射手,来攻击僵尸,当攻击到僵尸的一瞬间,我们就暂停游戏。

    然后切换到CE 选择为减少的数值,点再次扫描。 过滤出不要的内存地址

    

 

 

 

 

 

 

   多往复几次,知道筛选出数据不够多的时候,就差不多了。注意别打僵尸打死了。。。

 

 

 

  最后只剩100多条数据了,我们发现这个是最像的。 其他那些数值都是乱七八糟的值,完全不像是僵尸的血量。

 

 

 

我们来实验一下看,会发现,每次豌豆攻击到僵尸的时候, 130就会-20.。 那么就基本上可以确定了。

 

 

   豌豆射手的默认功力为20,  接下来就需要找到豌豆射手这攻击力20是存在内存中哪个地方的, 我们找到存放豌豆射手伤害的内存地址,修改它伤害的值,改为9999 那基本上就是秒杀了。

 

二、通过OD来附加植物大战僵尸进程,通过反汇编来找到豌豆射手的伤害地址。

  找到植物大战僵尸的进程。点附加

 

 

  然后相关数据就被载入进来了。

  

  1.窗口模块截图:

 

 

 

  2.在od中下入断点。  OD 在命令框输入 hw 2D8A8E80 (僵尸血量的内存地址)  然后回车。   

 

  我这儿先通过修改地址修改数值 把僵尸的血量改为9980了,  因为等会还要调试的,不然给这僵尸打死了,不好测试。

 

  

 

 

 

 

  3.查看断点是否成功。

  

 

 

 

   4. 断点下入成功,我们回到游戏,继续让植物打僵尸。发现OD中断点已经拦截下来了, 游戏就会卡主。

  

 

 

   5.确定到程序已经进入到这儿,找对地方后,放开断点,让程序继续走起来。   F9也可

  

 

 

 

 

        6.我们需要往上走,找到这段汇编代码的程序头那儿。

  

 

 

   

  7.在函数开头那儿下入一个断点,我们需要重堆栈来分析 这个函数是从哪个地址跳过来的。

 

  点中这一行按F2下入断点, 下入断点后 地址会变红。  

  

 

  切回游戏,让植物攻击僵尸, OD就已经命中断点了。 

  

 

 

 

   我们这时候查看堆栈窗口 

  

 

 

   接着对着堆栈窗口的这行,右键 跟随到数据窗口

  

 

 

   就会到相应的内存地址去

  

 

 

   8. 从内存窗口往上翻,查看是哪里在call这个函数。

  

 

 

 

   跟随到相应的汇编代码地址去

  

 

 

  点击确定后,汇编窗口会移动到这个地方来,就是call 我们刚才那个函数的地址。

 

   

 

  在这儿下入断点,让植物攻击僵尸查看下寄存器的数据。  发现EAX、EDX、EBP寄存器都是00000014 它这是16进制的,对应10进制就是20. 

  这20就是豌豆的伤害值。 但是我们不知道到底哪个才是。

  

 

 

 

   9.接下来我们从这继续往上找,先继续到这个函数的头部,查看下入断点,让植物攻击下僵尸,断下来看看寄存器的值。

  

 

 

   当程序执行到这个函数的头部时, 我们发现EDX寄存器的值14 (16进制)豌豆射手的伤害已经存在了,说明这个伤害值还来自外部,我们还要继续往外面追溯。  

  程序已经断点到这儿了,我们直接查看堆栈窗口。

  

 

 

   照样在堆栈这条数据右键跟随到数据窗口 ,查看内存中的值。

  往上走会找到一个call,会看到是哪个地方在call当前这个函数。

  

 

 

   

  跳转到对应的汇编窗口去。

  

 

 

 

  

 

   跳转到这儿后,我们往上看汇编代码, 看有没有哪里在给 EDX寄存器赋值的操作。    发现就在跳转到这里来上几句 就在给edx寄存器赋值。  我们在那句下入断点。

  

 

 

  切回游戏,让植物攻击僵尸。  然后命中给edx赋值这句代码的 断点

  

 

   我们往下执行一句,在看寄存器有什么变化。

  

 

   好,到这儿我们就能确定了。

  EDX寄存器的值是豌豆射手伤害赋值的最起始地方。

  然后 看这句代码 

  0047D483 . 8B148D 18A974>mov edx,dword ptr ds:[ecx*4+0x74A918]

   ECX寄存器的值是0  空的。 *4  那自然也等于0 。  然后 0+0x74A918偏移地址。 从这个内存中取的值就是豌豆射手的伤害。

  代码中0x74A918是直接写死的,不是从某个寄存器地址中去获取的。  那么这个地址就=基址了。  我们也不需要在往上追了。

  我们拿出0x74A918这个地址到CE去。 手动添加地址,看下是不是20.

  

 

  找对了。是20.  我们点确定,然后把它值修改为9999试下看,

  

 

 

  确定后回到游戏,种豌豆试试看, 直接瞬秒僵尸

  

 

 

   二、基址也有了。我们开始编写C#代码实现秒杀僵尸。

  

        /// <summary>
        /// 豌豆射手秒杀
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void check_seckill_CheckedChanged(object sender, EventArgs e)
        {
            if (check_seckill.Checked)
            {
                EastDrive.DriverWrite.WriteMemoryInteger(proId, 0x74A918, 9999);
            }
            else
            {
                EastDrive.DriverWrite.WriteMemoryInteger(proId, 0x74A918, 20);  //还原豌豆射手默认20伤害
            }
        }

 

 

  

posted @ 2022-05-05 16:41  阿东呢  阅读(1382)  评论(0编辑  收藏  举报