逆向实用干货分享,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,别忘了jmp占五个字节,这样才可以跳转到你的地址执行
mov [eax],byte ptr 0e9h ;写入Jmp
mov [eax +],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 +],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 看雪,变成了我们自己想要的字符串.

四丶总结

  总结来说. HOOK 需要记住一个公式以及硬编码即可. 公式  目的地址 - 源地址 -指令长度(如果是JMP则是5)

  JMP 硬编码是E9  E9 00000000 后边四个0我们定位到我们要执行代码的位置. 用公式计算机课. 目的 - 源 - JMP(5) == 偏移. 偏移写入这里即可.

  HOOK 别人程序也是这样去做.

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

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

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

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

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

  1. 逆向实用干货分享,Hook技术第二讲,之虚表HOOK

    逆向实用干货分享,Hook技术第二讲,之虚表HOOK 正好昨天讲到认识C++中虚表指针,以及虚表位置在反汇编中的表达方式,这里就说一下我们的新技术,虚表HOOK 昨天的博客链接: http://www ...

  2. PC逆向之代码还原技术,第一讲基本数据类型在内存中的表现形式.浮点,指针寻址公式

    目录 代码还原技术 一丶简介代码还原 二丶代码还原中的数据类型表现形式 1.整数类型 2.无符号整数 3.有符号整数 4.浮点数数据类型 5.浮点编码 4.Double类型解析. 三丶浮点汇编 1.浮 ...

  3. API HOOK技术

    API HOOK技术是一种用于改变API执行结果的技术,Microsoft 自身也在Windows操作系统里面使用了这个技术,如Windows兼容模式等. API HOOK 技术并不是计算机病毒专有技 ...

  4. HOOK技术的一些简单总结

    好久没写博客了, 一个月一篇还是要尽量保证,今天谈下Hook技术. 在Window平台上开发任何稍微底层一点的东西,基本上都是Hook满天飞, 普通应用程序如此,安全软件更是如此, 这里简单记录一些常 ...

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

    很多人写文章,喜欢把什么行业现状啊,研究现状啊什么的写了一大通,感觉好像在写毕业论文似的,我这不废话,先直接上几个图,感受一下. 第一张图是在把代码注入到地图里面,启动首页的时候弹出个浮窗,下载网络的 ...

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

    32位汇编第四讲,干货分享,汇编注入的实现,以及快速定位调用API的数量(OD查看) 昨天,大家可能都看了代码了,不知道昨天有没有在汇编代码的基础上,实现注入计算器. 如果没有,今天则会讲解,不过建议 ...

  7. 逆向实战第一讲,寻找OllyDbg调试工具的Bug并修复

    逆向实战第一讲,寻找OllyDbg调试工具的Bug并修复 首先我们要知道这个OD的Bug是什么. 我们调试一个UNICODE的窗口,看下其窗口过程. 一丶查看OllyDbg 的Bug 1.1spy++ ...

  8. 20145307陈俊达_安卓逆向分析_Xposed的hook技术研究

    20145307陈俊达_安卓逆向分析_Xposed的hook技术研究 引言 其实这份我早就想写了,xposed这个东西我在安卓SDK 4.4.4的时候就在玩了,root后安装架构,起初是为了实现一些屌 ...

  9. 逆向知识第一讲,IDA的熟悉使用,以及TEB,PEB结构

    逆向知识第一讲,IDA的熟悉使用,以及TEB,PEB结构 一丶熟悉IDA,以及手工制作sig文件. IDA,静态分析工具,网上随便找一个即可下载. 首先,我们写一个可执行EXE,最简单的 使用IDA打 ...

随机推荐

  1. Redis使用记录-相关资料汇总

    1 redis在centos上的安装 http://www.cnblogs.com/hanyinglong/p/5036558.html 2 redis在windows上的可视化GUI工具 https ...

  2. python的multiprocessing模块进程创建、资源回收-Process,Pool

    python的multiprocessing有两种创建进程的方式,每种创建方式和进程资源的回收都不太相同,下面分别针对Process,Pool及系统自带的fork三种进程分析. 1.方式一:fork( ...

  3. 我的前端故事----关于redux的一些思考

    背景 我一个前端,今年第一份工作就是接手一个 APP 的开发...一个线下 BD 人员用的推广 APP,为了让我这个一天原生开发都没有学过的人能快速开发上线,于是乎就选择了 react-native ...

  4. NSA武器库知识整理

    美国国家安全局(NSA)旗下的"方程式黑客组织"(shadow brokers)使用的部分网络武器被公开,其中包括可以远程攻破全球约70%Windows机器的漏洞利用工具. 其中, ...

  5. maven 添加memcached.jar配置方法

    针对Java项目添加 memcahced 在mvnrepository 找了半天也没找到memcached.jar的配置xml, 由于目前Javamemcached client没有官方的maven ...

  6. Net分布式系统之七:日志采集系统(1)

    日志对大型应用系统或者平台尤其重要,系统日志采集.分析是系统运维.维护及用户分析的基础. 一.系统日志分类 一般系统日志可分为三大类: 1.用户行为日志:通过采集系统用户使用系统过程中,一系列的操作日 ...

  7. 深入理解line-height

    什么是行间距? 古时候我们使用印刷机来出来文字.印刷出来的每个字,都位于独立的一个块中. 行间距,即传说中控制两行文字垂直距离的东东.在CSS中,line-height被用来控制行与行之间垂直距离. ...

  8. None是什么?

    None是什么,是空,就是空即是色,色即是空.是一个真的很特别的值,下面比较了下 0,True,False (python 的比較) >>> None == 0False>&g ...

  9. poj 1149经典网络流构图

    题意:m个猪圈,n个客户,每个客户给出选则猪圈的钥匙和需要购买猪的个数,其中每次客户购买时客户选则的猪圈数量可以相互更换,问最大购买数量. 思路:以客户作为除源点汇点之外的点,然后对于每个猪圈从源点连 ...

  10. mysql初学,mysql修改,mysql查找,mysql删除,mysql基本命令

    Mysql 下载地址https://dev.mysql.com/downloads/mysql/ 1.连接Mysql格式: mysql -h主机地址 -u用户名 -p用户密码 1.连接到本机上的MYS ...