软件破解逆向安全之初识HOOK
什么是HOOK?这是逆向工程里的一个大块,我在这里几句话是一定说不清楚的,如果大家想深入了解,可以去学习一下。我这里简单说一下,hook,中文就是钩子的意思,简单理解为勾住一切事物,来实现我们想要的功能。外挂中的体现:实时读取数据(例如坐标),修改数据,不执行某处代码,过检测等等。
HOOK的方式可以分为:
直接修改,间接修改(找到空白地址写入自己想要执行的数据,原地址的区域做跳转,空白地址出跳转),直接修改。
接下来我们还是通过植物大战僵尸作为今天的实例,我们要做的是种植物而不掉阳光。
首先我们通过ce找出阳光的第一层偏移
我们看一下阳光减少什么访问了这个地址,
之前说过mov esi,[]是非常值得我们关注的地方,看一下地址
之前说过mov esi,[]是非常值得我们关注的地方,看一下地址
到OD里去跟踪427681这个地址看看附近是什么样的代码。
我们可以看到我们把阳光的值给了esi,然后进行了个比较,这个应该是判断阳光的值够不够买植物,如果够,下面的sub就是减少阳光,所以我们要hook此处,这里直接给nop掉就好。
我么种植物去试试
这样我们就实现了种植植物不减阳光了,哈哈哈哈哈。
除了这种方式,我们还可以修改内存地址数据或者远程汇编方式进行HOOK,接下来大家可以试试hook增加阳光100,动起手来非常有意思的。
接下来我们通过间接修改来实现一击必杀,原理就是修改数据。
我们先了解一下在游戏中对象的概念。在游戏里,很多物体都可以叫做一个对象,一个人,一个武器都可以。我们实现一击必杀的原理是什么呢?可以改枪械的威力,对象的血量,或者对象受到攻击的位置,不同游戏描述可能不一样但是原理都是一样的。
再次请出我们的受害者植物大战僵尸,我们这回要先找到对象(这里是僵尸)血量发生变化的滴地方,搜索到时候我们是这个思路,植物打到搜减少,没打到搜不变,僵尸血量应该在0-1000之间,我们不断去搜索一下
最后发现了这个,观察了一下,很明显最后一个是僵尸的血量,每次豌豆打会掉20血。我们接着去看看什么地方访问了这个地址。
发现有很多,我们记录一下这里的地址,去od里看看那里可以进行HOOK。我们可以猜测一下减血的代码,应该是先一个sub,然后一个mov赋值,看看能不能找到。跟进第一个地址:发现不是很像我们的猜测,也没什么好改的,看下一个,也没什么,但我们看到54d0c4的时候发现不一般。发现和我们想象的差不多啊,我们在这里下个断点,看看各个寄存器的值是什么。植物快打到僵尸的时候断了下来看下面可以知道,减数是20,被减数是110,很明显是豌豆的攻击力和僵尸血量,下面call上面的mov就是把血量赋值给对象,这样我们一击必杀的思路就有了,直接hook54d0ba地址,赋值直接给0。这时候我们可能就会想直接把ebp改成0,你可以试试改了之后的效果,程序会直接崩掉。所以我们这里需要简介hook,找到一个00 00 00 00。。。的地址空间,我们在那里进行0的赋值,跳到那里再跳回来,这样就实现了我们的hook。我们在这里找到一块,先把54d0ba处的代码改为jmp 此处,然后我们把mov dword ptr ds:,0写到这里,再写一个jmp 54d0ba下面自动填充nop的地址,这样我们就已经hook完成了
接下来我们试试是不是碰一下僵尸就死。这样就成功了,哈哈哈哈哈。
我们也许会有这样一个疑问,我们只改了一个僵尸的地方为什么全部的僵尸全是一击必杀呢?因为我们改的是一个对象,而所有的僵尸在游戏里都是一个对象,都要经过这一块的代码处理,所以我们改了一处就相当于改了所有的僵尸。
我们注重的是原理,理解了植物大战僵尸,其他的游戏也都是差不多的,多多练习,我们有一天会驰骋于游戏之中的,当然这不是我们的目的。
楼主高明!学习了 学习学习 感谢分享学习一下 谢谢楼主,这个方法好用 好难啊,没有汇编基础,哭 感谢楼主分享,深刻学习 感谢楼主分享,深刻学习 踩坑...等有时间了就来学习下 学习了,网上系统学习的资料多数是收费的~