HOOK:钩子
外挂中的体现:挂钩代码,实现读取实时数据
HOOK方式:
地址
- 直接修改
- 间接修改
找到空白地址区域写入自己想要执行的过程的数据
原地址的区域跳转
空白地址跳转回去
3、直接读取
今天的主要任务是找出阳光值减少的函数
在运行的这时候一定要运行处阳光减少的步骤,不然不会得出减少的进程
找到减少的进程:
EAX=00000032
EBX=00000032
ECX=FFFFFFC9
EDX=FFFFFFFF
ESI=00000032
EDI=1CF8ED18
EBP=1CF8ED18
ESP=0019FB70
EIP=0041BA67
指针基址可能是 =1CF8ED18
0041BA5F - int 3
0041BA60 - push esi
0041BA61 - mov esi,[edi+00005560] //这里就是关键代码处
0041BA67 - mov edx,edi
0041BA69 - call 0041B980
然后我们就可以打开od来看看运行的具体流程

加入进程后,运行,然后跳转到上面发现的关键地址,然后然后设置断点,验证。
然后分析下面的代码
发现减少阳光值的地方
修改这个地方就可以实现阳光值不减少。
接下来展示“秒杀”功能
为了实现秒杀,我们就需要找到是如何计算怪兽的血量的。如果我们能够直接修改怪兽的血量,那我们攻击的时候就可以达到“死亡”的目的。
因此,我们首先应该寻找计算血量的代码处
我们用CE这个工具查看调用计算血量的内存地址
我们运行游戏直到第一个怪兽出现
我们让豌豆射手打在怪兽身上,然后搜索减少的量
由于结果还比较多。我们猜测血量不会超过1000,因此我们再缩短一下范围
现在任然还有很多符合条件的结果
因此我们继续寻找减少的结果
这下只有7个符合我们条件的值。因此我们可以再看结果,从而确定是哪一个函数俩决定的。
多次测试发现是这个。在豌豆射手射击下,每一次是减少20。分别冲130、110、90。于是我们看是那些调用了这个。
这里注意的是,我们在用这个工具查看的时候我们需要豌豆再一次打击到怪物身上才能够让工具捕捉到。
内存地址如下:
00412E99 - 03 86 C8000000 - add eax,[esi+000000C8]
005312FE - 8B BD C8000000 - mov edi,[ebp+000000C8]
0052D71B - 8B B0 C8000000 - mov esi,[eax+000000C8]
00531319 - 89 BD C8000000 - mov [ebp+000000C8],edi
0052A527 - 39 8B C8000000 - cmp [ebx+000000C8],ecx
00531783 - 83 BD C8000000 00 - cmp dword ptr [ebp+000000C8],00
这时,我们就需要用ollydbg来查看函数位置。
我们查看到这里的时候我们就发现一些有意思的地方。
这里就是我们要找的地方。
那我们怎样实现秒杀呢。
看看汇编代码,发现最后
00531319 89BD C8000000 mov dword ptr ss:[ebp+0xC8],edi
这里是结果的地方,我们只需要让edi中的值小于20 便能够秒杀。
我们就采用hook‘的方式来实现
当然有人肯定会想直接修改edi,当我们直接修改的时候,就会触发程序的保护措施。
因此我们只能够间接修改
我们找到空白的地方’
修改成上面的这样。然后我们就可以取消断点,然后运行看看我们是不是秒杀。
但是我们又发现一个问题就是,不同的僵尸可能计算血量的函数不一样。我们实验的只是最初级的僵尸。在运行过程中我们发现浅一点的僵尸并不能够实现秒杀。故猜测采用了另外的函数来计算。但是分析方法是一样的。