C# 植物大战僵尸逆向之---Hook技术实现僵尸快速进攻的效果 (五)

C# 植物大战僵尸逆向之---Hook技术实现僵尸快速进攻的效果 (五)

 

本章说明:

  当然要实现僵尸快速进攻的效果有很几种实现方式,我们本章用Hook来实现该功能。

  利用Hook技术,可以不用找到僵尸进攻倒计时的基址,直接修改到僵尸出现倒计时的数据,从而达到僵尸快速进攻的效果。

  天上落阳光、向日葵生成阳光原理是一样的,都是有一个倒计时,我们都可以通过Hook来实现游戏中不停的落阳光效果。

 

前言:

  首先解释下什么是Hook(钩子), 通俗简单来讲,就是给目标进程的程序在内存中执行某段代码的时候,改变他的执行流程,就是Hook,利用该技术一般可以实现:

  1.通过Hook来回调目标进程的数据到本程序当中来,(说白了就是监听)

  2.可以给目标进程置入自己的代码去执行。

  

  简单画个图说明下吧:

  1. 程序正常是在内存中是按顺序依次去执行代码。

  

 

  2.举个例子,我们可以在目标程序代码B中置入个钩子,让目标程序在执行到代码B处时将这个程序的某个数据传给我们自己的程序。

  

 

  3.也可以改变目标程序的代码的执行流程。

  

 

 

 

   简单这样解释下基本就差不多了,更详细的可以网上看下其他文章。  接下来就开始操作

 

 

一、进入游戏,CE附加上游戏进程,开始搜索数据。

  1.首次搜索

  

 

 

 

 

  2.回到游戏后继续游戏,马上又切出来搜索减少的数据。来回往复

  

 

 

 

  3.最后,发现这条数据在一直减少,直到减少直0的时候,僵尸就出来了

   

  为了验证,你可以把它拉下来,然后锁定,你发现僵尸一直都不出来,就是对的地址

 

 

 

  4.右键这个地址,找出是谁写入这个地址。

  

  5.等到僵尸再次出现的时候,就会出现两条mov的操作。

  

 

 

 

   6.选中它,点击右侧显示反汇编程序,来到反汇编窗口。  对应代码处的地址就是内存地址了,这个地址只要程序不更新编译,是不会变的。

 

 

 

 

   7.在这句代码处右键  设置个断点。然后回到游戏,等待它再次执行

  

 

 

 

  8.当僵尸出现后,会发现程序已经断点拦截到了。我们可以看到eax寄存器的值是:B0B

  

 

 

 

   9.用计算器可以换算为10进制看看。 对应过来就是2827

 

 

   

 

 

 

  10.我们往下面执行一句。 会发现僵尸倒计时的时间又开始重新计算了

  

 

 

 

  也就是说,僵尸出现的时间是从这个eax寄存器的值放到僵尸出现倒计时的内存中的。   

    那么我们就可以从这儿下手了,我们可以将这个内存的倒计时给它每次都改为10毫秒,那么基本上这一批僵尸都会同时一起出现来进攻我们了。

      实现方式可以也像之前的文章去找到这个僵尸出现的基址+偏移定位到这个内存中,定时频繁的修改这个数值为10毫秒,就可以实现这一批僵尸同时进攻出现。

      但我们本章用Hook来实现这个功能。

 

  

 

 

二、Hook思路

  1.从上面看到僵尸出现倒计时的时间来自于eax寄存器, 那么我们可以可以给这个内存地址这儿植入Hook来修改eax寄存器的值。

  我们可以编写汇编代码为:

  mov eax,0x10

  mov [ebp+0x55b8],eax

  可以通过将这个代码置换到4201C9这个内存中,就可以实现每次都只需要16毫秒就刷新僵尸,几乎就是同时出现了。

  

  但是我们发现,它这段内存中,只有6个字节,我们自己的代码不够放到这儿。强行写入会替换掉程序下面的代码的对应的字节,从而影响程序本身的执行

  

 

   为了保持堆栈平衡,我们只能在这个游戏进程中申请一块新内存,植入我们的代码,执行后直接跳回到当前的下一句,就搞定了。

 

  2.将汇编代码转为机器码字节。

  

 

 

  3.封装Hook类

  

 

 

  4.编写C#程序安装Hook。    SuperHook这个类是我上面封装好的。后面在单独讲解。

 1         public static HookData Hookattack = null; //僵尸进攻加速Hook数据
 2 
 3         /// <summary>
 4         /// 僵尸进攻加速
 5         /// </summary>
 6         /// <param name="sender"></param>
 7         /// <param name="e"></param>
 8         private void check_attack_CheckedChanged(object sender, EventArgs e)
 9         {
10             if (check_attack.Checked)
11             {
12                 byte[] code = new byte[] { 184, 16, 0, 0, 0, 137, 133, 180, 85, 0, 0 };
13 
14                 SuperHook.PutHook(proId, "004201B1", CallBackattack, out HookJattack, 6, 2, code, false); //植入Hook
15             }
16             else
17             {
18                 SuperHook.SuspendHook(proId, "004201B1", Hookattack.SourceCodeData);  //暂停复原
19             }
20         }

  

 

 

   5.看下实现好的效果,我将阳光也给封装好了,原理是一样的 

     这时僵尸就是直接一群一起出来了。

  

 

 

  

 

posted @ 2022-05-08 20:53  阿东呢  阅读(576)  评论(0编辑  收藏  举报