w59541511 发表于 2016-3-17 09:31

[科普向]hook技术简单介绍

首先1、这只是科普向,会介绍相关Hook技术及原理,但是不会给源码、源码请自行百度2、请至少有一点Windows编程经验,知道系统API是什么...以免看科普内容给您带来不适3、这里结合了一些大神的个人了解有可能有错误。(见谅) 首先要说下CPU权限...Intel把自家CPU指令分为四个等级,Ring0,Ring1,Ring2,Ring3,Windows操作系统只用了Ring0和Ring3两个权限。简称R0和R3好了-。-

R0权限只能让系统用,比较危险。R3权限为应用层用。大部分非驱动程序都是R3应用层的...

Hook也分为R0和R3两个层次。

R3应用层Hook又分为两种,一种是 API Hook,一种是系统钩子。

R0内核层Hook我只介绍一种,SSDT Hook 系统钩子:
系统钩子实质上是系统提供的一个API函数,叫做 SetWindowsHookEx(),可以拦截指定的13种消息类型
全局钩子包含这样13种消息类型:具体参考百度百科:http://baike.baidu.com/link?url=5-gmumJKhgDSvAZiYb018vhbevJ-kcfzkHxRPG2k8dClvJaFy473iL0FiixCA0waNeD16sosZQlWoMp9irvYoq
这个是系统提供的功能,百度百科也有详细的原理介绍。我也不太熟就不多说了...实在是用的太少

系统钩子应用:键盘鼠标监控/禁用等等 API Hook:
API Hook可以说是很简单很暴力的Hook方法。
要知道,程序调用一个API实质上调用的是那个API函数的入口地址。
也就是说,只要把API函数入口地址修改成我们自己的子程序的入口地址,那么程序就会调用API的时候调用到我们自己的子程序,从而实现Hook的效果
那么我们应该是这样做的:
寻找需要Hook的函数地址-修改地址改成自己的子程序地址-还原为原来的函数地址
举个例子,比如MessageBoxA()函数,它的地址是12345
我写了个子程序叫做MyMessageBoxA(),它的地址是56789
我们只要将MessageboxA()在内存里把存放函数地址的12345改成56789,
那么别人调用MessageBoxA()的时候就会调用到地址56789,也就是我们自己写的MyMessageBoxA()
至于我们是在自己的MyMessageBoxA()里怎么操作就随意了
是放行(Call调用原地址)
还是拦截(直接无视调用请求)
还是修改(修改参数后Call调用原地址)都可以

然而这时候我们会面临一个无法避免的问题:我们自己写的子程序在自己的进程空间内,和目标进程完全不在一起。事实上windows似乎无法跨进程访问
那么我们只能让子程序和目标进程在同一个进程空间内运行...这个就需要另外一项技术:dll注入
所以我们通常能看到封包助手,软件多开器之类的都会有个DLL...就是为了注入后Hook用的...
简单的说下API Hook的应用
封包拦截。hook send函数,这样发送封包(调用send函数)之前会先调用自己的函数,就可以获取甚至修改封包内容了
软件多开。已知道软件可以通过创建互斥体(一个api函数)来限制多开...也就是说我们只要Hook掉那个api SSDT Hook:
所谓R0级的Root,其实还有种称呼:内核钩子
是杀毒软件广泛采用的一项技术这里要介绍下SSDT。
SSDT(System Services Descriptor Table),系统服务描述符表。这个表就是一个把ring3的Win32 API和ring0的内核API联系起来。SSDT并不仅仅只包含一个庞大的地址索引表,它还包含着一些其它有用的信息,诸如地址索引的基地址、服务函数个数等。

知道这句话里包含着什么?我们从R3层调用的API函数实质上要通过查询SSDT获取R0层的真正地址...

这意味着如果我们可以把SSDT里的地址修改掉,就可以实现全局API Hook的效果。
不过权限问题← ←R3无驱进R0有多困难我就不吐槽了...你们可以自己试试...
驱动(Sys)加载后本身就是R0权限...所以R0层的Hook基本都会要写驱动...
具体实现方法不说了(到了这个层次不会汇编真的没法玩,一般理工类都会有汇编课选修,我选了,然而并没有学好。) 最后说下SSDT Hook的具体应用吧
已知关闭进程需要用函数TerminateProcess()。
调用TerminateProcess之前需要调用OpenProcess()获取进程句柄。
那么我们如果Hook掉OpenProcess函数,检测到如果是某个指定进程就不调用OpenProcess而是去返回获取句柄失败。那么会怎样呢?
Windows任务管理器尝试关闭进程,会因为OpenProcess在SSDT被Hook,访问到你的子程序。然后你的子程序告诉了任务管理器:打开进程失败
于是任务管理器就会返回一个经典的提示:无法完成操作 拒绝访问。 相信你们在不少杀毒软件都看过这个提示还有我自己按照百度百科对SSDT表的介绍,可以得知API也分为R3和R0.R3运行的API会通过查询SSDT获得R0的地址并且运行。

Shark恒 发表于 2016-3-17 09:40

我相信一定会帮助很多人!

_韩小柒′. 发表于 2016-3-17 09:53

第一次离恒大这么近{:5_191:}

sunlili001 发表于 2016-3-17 10:02

自然卷。 发表于 2016-3-17 10:05

马克.~{:5_116:}

狂人猩 发表于 2016-3-17 10:36

小白路过 咱还不懂

anyeck 发表于 2016-3-17 12:29

支持一下,对新手有一个很好的了解

2857428593 发表于 2016-3-17 12:36

很详细实用的说。。。

小不点吃肉 发表于 2016-3-17 13:39

学习了,留着再温习

sunlili001 发表于 2016-3-17 16:59

Shark恒 发表于 2016-3-17 09:40
我相信一定会帮助很多人!

我是无名小草,老大你们才是我膜拜的主角
页: [1] 2 3 4
查看完整版本: [科普向]hook技术简单介绍