逆向实用干货分享,Hook技术第一讲,之Hook Windows API

             逆向实用干货分享,Hook技术第一讲,之Hook Windows API

作者:IBinary
出处:http://www.cnblogs.com/iBinary/
版权所有,欢迎保留原文链接进行转载:)

一丶什么是Hook,以及Hook能干啥

首先这一个小标题主要介绍神马是Hook,如果知道的,则不用看了.

这里我偷袭啊懒,贴出Hook的意思  https://baike.baidu.com/item/%E9%92%A9%E5%AD%90%E7%A8%8B%E5%BA%8F

Hook,英文单词中成为钩子,铁钩的意思,在我们编程中就是挂钩的意思

我们要HookApi,则是要把这个API进行挂钩,让其执行我们的代码,然后执行完我们的代码之后,在执行API的代码,当然执行不执行使我们说了算.

二丶Hook API的原理,以及思路

现在我们要知道我们要怎么Hook API

假设我们程序现在要调用一个MessageBox函数,那么我们把这个API Hook了,变为我们的API去执行,执行完我们的代码之后再去执行它的的函数.

具体看下我们的草图:

其实相当于就是我们在这个API之前,跳转到我们的函数执行了,然后跳转之后,我们执行完毕之后,可以选择是否在跳转回去,但是这里注意,跳转回去则跳转到msg的return处位置即可.

eax可以给一个值,让它返回.

利用这个技术,我们可以监控API,比如应用程序会调用loadLibrary,那我们把它Hook了,把Dll路径改成我们的,那加载的就是我们的dll了,当然 Hook的API很多,因为只要是Windows的API都能HOOK

因为JMP的时候占五个字节,而WindowsAPI也是头部弄了五个字节,猜想可能是Windows自己留作Hook的.

三丶Hook的步骤(Hook自己)

首先说下步骤

/*
思路:
    我们要获取MessageBoxA的函数地址,在获取之前我们要进行下面几个步骤
1.调用GetModuleHandlle,获取Dll模块(user32.dll的)的基地址
2.通过基地址,调用GetProcAddress获得Msg的函数地址
3.修改Msg函数地址的保护属性,调用virtualProtect
4.重定位跳转地址 Dest - MsgCode = offset -5
    jmp 跳转到这个偏移即可
5.跳转回来的时候则是 dest + offset + 5 = Msgcode +5的位置

*/

看上面,很晕,一步一步代码实现.

注意: 这里只是简单实现,并且说下思路,代码复制过去你不能运行,因为比如下方,我写 offset g_szUser32...等等的,

其实都是在.const中定义的,最下面会贴出完整代码,那么是可以运行的.

第一步,获得Msg的地址,首先调用GetModuleHandle

;1.获得Msg的地址,先调用GetmoudulHandle
    invoke GetModuleHandle,offset g_szUser32        ;获得模块地址   mov @hUserHand,eax                     ;返回值给局部变量保存;其中g_szUser32在常量区是 user32.dll的字符串

第二步:通过模块地址,获得Msg函数的地址

invoke GetProcAddress,@hUserHand,offset g_szMsgName
mov @MsgProcAddrs,eax;代码同上

第三步:修改Msg函数地址的内存保护属性,方便一会我们把JMP的二进制写进去好修改

invoke VirtualProtect,@MsgProcAddrs,1000h,PAGE_EXECUTE_READWRITE,addr @hOldProtect修改大小是1000(4096)个字节权限是    可读可写可执行是否保存旧的权限属性: 是 ,这里必须保存,虽然你不用,否则API会失败还有就是,因为要保存以前的,所以我们必须把地址给他,要加上Addr才可以

第四步: OD查看Msg位置,寻找5个字节位置

这个时候我们可以在我们的代码中写个int 3,打开的时候OD会断下,我们在GetprocAddress的位置下断点,

看下获取到的Msg的地址是多少

我们在反汇编窗口中跟随到Msg的位置.

可以看到上图的位置,刚好五个字节, mov edi,edi是没用的指令,但是windows还是保留了

也就是说可能就是以为了自己去监控API留下的.那么这个时候我们可以在这个位置,写入

JMP的指令  JMP  我们的API位置

我们如果跳转到我们API的位置后,执行的代码前边这三条还是这个,因为一会我们还要在跳转到当前的MSG + 5

的位置处继续执行,(当然,随你便,你也可以跳转到Msg的Return位置)

第五步: 写入Jmp,JMP到我们的函数的位置

首先我们知道 JMP的二进制是 E9

所以我们要 E9  xxxxxx   xxx使我们函数的地址

但是JMP 的时候,这个地方是个偏移

那么我们要JMP到我们函数的偏移位置,就要进行地址重定位了.

怎么重定位,很简单,小学数学

计算Msg的下一条执行的位置

code + offset = dest  当前的Msg的下条位置计算 带入则是  7595FDAE + 5 = 7595FDB3 也正好是我们跳转回来的位置

计算跳转到我们函数地址

dest - code = offset  目标地址我们知道,就是我们的函数地址,开始跳转的地址也知道了,所以带入带

我们的函数地址 - Code(当前的Msg地址) = offset 偏移,那么 JMP 这个偏移即可.

定义我们的函数

函数写成下面的那样

最下面的label中的内容则是 JMP 00000000 其中这个地址是我们要重定位写进去的

第六步:实现代码,写入JMP

从这里开始我直接写实现代码了

   mov eax,@MsgProcAddrs       ;code
    mov ebx,NewMsgBox           ;dest
    sub ebx,eax                 ;dest - code = offset
    sub ebx,5                   ;得出的偏移需要-5,别忘了jmp占五个字节,这样才可以跳转到你的地址执行
    mov [eax],byte ptr 0e9h     ;写入Jmp
    mov [eax +1],ebx            ;写入跳转的地址

首先获得msg的位置,也就是Code

然后获得 自己函数的位置,也就是Dest

现在我们要求出中间的偏移是多少 dest - code = offset

然后因为JMP跳转要占五个字节,所以接着-5个字节大小

现在我们要把Msg函数的位置,改为JMP,我们要JMP我们的地址,我们看下OD分析

1.首先找到Msg函数位置,看下数据窗口中跟随

2.单步走,然后执行到第一个把二进制改为E9H的地址

现在我们接着反汇编窗口中去看看Msg的地址,看下是否改为了JMP了

现在是改为了JMP,但是偏移是不对了,不过我们的偏移已经计算出了了,所以写到E9后面即可

3.修改偏移OD查看.

,反汇编窗口中看下Msg

,现在显示不知是否正确,那么我们现在去反汇编窗口中看下00401000是不是我们的NewMsg位置

可以看出,代码正是我们写的.

也正好是JMP 000000000的位置,那么我们就可以在我们的代码中写了,劫持真正的MsgBox函数的执行

我们知道, 因为是jmp过来的,所以ebp - c 还是Msg的第二个参数,我们把里面的内容改了

注意,这个在劫持代码里面写.

四丶我们还有修改跳转回来的位置,这个是同理了

看下代码:

 invoke VirtualProtect,label1,1000h,PAGE_EXECUTE_READWRITE,addr @hOldProtect
    mov eax,offset label1           ;code 我们要修改的地址是标号的地址,所以他是code
    mov ebx,@MsgProcAddrs           ;dest 我们要跳转到Msg的地址,所以他是Dest
    sub ebx,eax                     ;dest - code = offset  带入公式咋得到ebx是偏移
    mov [eax +1],ebx                ;eax标号的位置+1后面,也就是JMP 00 00 00 00 把00 00 00 00 写成偏移,咋跳转回来Msg的位置继续执行
    invoke MessageBoxA,NULL,offset g_szMsgTitle,NULL,MB_OK 

第一,我们要修改的跳转位置是标号1的位置,所以他是code

第二,我们要跳转到哪里,所以他是dest

第三,根据公式, dest - code = offset 求得了偏移

第四,我们把dset +1的位置,也就是JMP 00 00 00 00  修改位了偏移,咋又跳转回来了.

看下OD分析

看下OD,我们也可以看出,我们单步走,单步走到 mov dword ptr[eax +0x1]的位置,看下是否把标号1的偏移修改了

在内存中我们已经看到了,我们的偏移修改了.

那么我们反汇编窗口看下,当前我们的API ,也就是JMP 00 00 00 00 的位置是否修改了

可以看出,确实修改了,那么我们看下JMP 后面的地址是哪里把

正好使我们调用MsgBox的位置 +5的下面,也就是说,上面JMP到我们的API执行了,下面咋通过JMP有跳转回来了,此时因为我们已经保存了 栈底环境,所以运行是没有出错的

看下不调试,正常运行

通过HOOK技术,我们把本来应该输出 Hello 看雪,变成了我们自己想要的字符串.

因为代码是RadAsm工程的,所以这里打包发到百度云盘

链接:http://pan.baidu.com/s/1kVBWalp 密码:luz8

作者:IBinary
出处:http://www.cnblogs.com/iBinary/
版权所有,欢迎保留原文链接进行转载:)

如果觉着好,请推荐,加关注,如果觉着哪里写的不好,请批评改正.谢谢大家.如果看不懂,请评论一下给点动力,其实写博客最主要的还是自己整理,每天都坚持.把最好的献给大家.

时间: 2024-10-22 11:48:47

逆向实用干货分享,Hook技术第一讲,之Hook Windows API的相关文章

从0 开始 WPF MVVM 企业级框架实现与说明 ---- 第一讲 WPF中 windows消息机制

谈到桌面应用程序,我们第一反应就是它的消息机制是怎么处理的,那么我们就先聊聊这个windows消息机制 谈起“消息机制”这个词,我们都会想到Windows的消息机制,系统将键盘鼠标的行为包装成一个Windows Message,然后系统主动将这些Windows Message派发给特定的窗口,实际上消息是被Post到特定窗口所在线程的消息队列,应用程序的消息循环再不断的从消息队列当中获取消息,然后再派发给特定窗口类的窗口过程来处理,在窗口过程中完成一次用户交互. 其实,WPF的底层也是基于Win

API HOOK技术

API HOOK技术是一种用于改变API执行结果的技术,Microsoft 自身也在Windows操作系统里面使用了这个技术,如Windows兼容模式等. API HOOK 技术并不是计算机病毒专有技术,但是计算机病毒经常使用这个技术来达到隐藏自己的目的. 外文名 API HOOK      用于 改变API执行结果的技术 应用 如Windows兼容模式等  目的 计算机病毒隐藏自己的技术                                                      

AWS云计算技术分享系列直播课-第一讲课程邀请函

科技的不断创新与演进时刻在改变我们所处的时间,人们从未停止用科技的力量去探索和实现.越来越多的企业和人们正在通过 AWS 重新构建,构建更好的用户体验,构建更强大的业务平台,构建更安全的系统架构- 今天光环云社群为大家带来AWS云计算技术分享系列直播课,帮助大家由浅入深的了解和使用AWS云服务. 直播课程规划如下: 第一讲 快速开始使用AWS 第二讲 计算.存储和访问权限管理 第三讲 利用 Amazon VPC 服务搭建经典 Web 三层架构 第四讲 弹性与负载均衡 第五讲 使用 Amazon

【Bugly干货分享】手把手教你逆向分析 Android 程序

很多人写文章,喜欢把什么行业现状啊,研究现状啊什么的写了一大通,感觉好像在写毕业论文似的,我这不废话,先直接上几个图,感受一下. 第一张图是在把代码注入到地图里面,启动首页的时候弹出个浮窗,下载网络的图片,苍老师你们不会不认识吧? 第二张图是微信运动步数作弊,6不6?ok,那我们从头说起 1.反编译 Android 的反编译,相信大家都应该有所了解,apktool.JEB 等工具我们先看一下 Apk 文件的结构吧,如下图: 1.META-INF:签名文件(这个是如何生成的后面会提到)2.res:

32位汇编第四讲,干货分享,汇编注入的实现,以及快速定位调用API的数量(OD查看)

32位汇编第四讲,干货分享,汇编注入的实现,以及快速定位调用API的数量(OD查看) 昨天,大家可能都看了代码了,不知道昨天有没有在汇编代码的基础上,实现注入计算器. 如果没有,今天则会讲解,不过建议把昨天代码熟悉一遍(课程是紧跟着来的,请不要拉下任何一天,因为今天的知识, 可能就和昨天的知识挂钩,昨天的知识,和前天的挂钩.....,当然你如你懂汇编,不是新手,那么则可以直接往下看) 一丶远程线程注入,和汇编远程注入的区别 昨天的代码,大家可能看了(没看也没有关系,就是远程线程注入的代码,开发角

Android逆向分析之Xposed的hook技术

Android逆向工程里常用到的工具除了的dex2jar,jd-gui,  Apktool之外还有一个Xposed. 这个工具是一个在不修改APK的情况下,影响其运行过程的服务框架.可以根据自己的需求编写模块,让模块控制目标应用的运行. 因为本人也是新手,对于Xposed用法还有很多的不熟悉,所以只对其hook技术进行简单的介绍,并让hook技术应用到以后的逆向分析工程中. 至于什么是hook,不了解的话就先去百度一下,这里基于菜鸟有限的经验,我只能说是一种函数拦截技术~ 首先,下载Xposed

PC逆向之代码还原技术,第二讲寻找程序入口点

PC逆向之代码还原技术,第二讲寻找程序入口点 一丶简介 程序逆向的时候.我们需要知道程序入口点.动态分析的时候以便于看是什么程序编写的. 比如VC++6.0 我们可以写一个程序测试一下 我们写一段代码. F10进行调试.看看是谁调用的main即可. 部分代码拷贝如下: __try { _ioinit(); /* initialize lowio */ #ifdef WPRFLAG /* get wide cmd line info */ _wcmdln = (wchar_t *)__crtGet

干货分享:十年大厂资深程序员的开发经验总结

本文由腾讯云加社区整理和发布,原文链接:cloud.tencent.com/developer/article/1004735,内容有删减和改动. 1.引言 在互联网一线做了十年的程序开发,经历了网易.百度.腾讯研究院.MIG 等几个地方,陆续做过 3D 游戏.2D 页游.浏览器.移动端翻译 app 等.积累了一些感悟,但必然有依然幼稚的地方,就当抛砖引玉,聊为笑谈. (本文同步发布于:http://www.52im.net/thread-2162-1-1.html) 2.关于作者 康亮: 腾讯

【腾讯Bugly干货分享】经典随机Crash之一:线程安全

本文作者:鲁可--腾讯SNG专项测试组 测试工程师 背景 Android QQ 在2016下半年连着好几个版本二灰 Crash 率都很高,如果说有新需求,一灰的 Crash 率高,还能找点理由,可是开发童鞋解过一灰的 Crash 单后,为啥二灰还有这么高的 Crash 率,我们还有覆盖全 SNG.不少外 BG 明星产品的终端稳定性测试工具 NewMonkey 随身版(NewMonkey系腾讯内部研发的测试工具,外部app有兴趣请点击这里填问卷调查申请使用)每天都在跑,更何况大多 Top Cras