ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2022-05-08 21:01:01  阅读:228  来源: 互联网

标签:倒计时 僵尸 eax 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.看下实现好的效果,我将阳光也给封装好了,原理是一样的 

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

  

 

 

  

 

标签:倒计时,僵尸,eax,C#,代码,---,Hook,内存
来源: https://www.cnblogs.com/Csharp-jd/p/16246869.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有