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