2024年6月14日发(作者:)

hook是什么?

windows系统下的编程,消息message的传递是贯穿其始终的。这个消息我们可以

简单理解为一个有特定意义的整数,正如我们看过的老故事片中的“长江长江,我是黄河”

一个含义。windows中定义的消息给初学者的印象似乎是“不计其数”的,常见的一部分

消息在winuser.h头文件中定义。hook与消息有着非常密切的联系,它的中文含义是“钩

子”,这样理解起来我们不难得出“hook是消息处理中的一个环节,用于监控消息在系

统中的传递,并在这些消息到达最终的消息处理过程前,处 理某些特定的消息”。这也是

hook分为不同种类的原因。

hook的这个本领,使它能够将自身的代码“融入”被hook住的程序的进程中,成为

目标进程的一个部分。我们也知道,在windows2000以后的系统中,普通用户程序的进

程空间都是独立的,程序的运行彼此间都不受干扰。这就使我们希望通过一个程序改变其

他程序的某些行为的想法不能直接实现,但是hook的出现给我们开拓了解决此类问题的

道路。

api hook是什么?

在windows系统下编程,应该会接触到api函数的使用,常用的api函数大概有2000

个左右。今天随着控件,stl等高效编程技术的出现,api的使用概率在普通的用户程序上

就变得越来越小了。当诸如控件这些现成的手段不能实现的功能时,我们还需要借助api。

最初有些人对某些api函数的功能不太满意,就产生了如何修改这些api,使之更好的服务

于程序的想法,这样api hook就自然而然的出现了。我们可以通过api hook,改变一个

系统api的原有功能。基本的方法就是通过hook“接触”到需要修改的api函数入口点,

改变它的地址指向新的自定义的函数。api hook并不属于msdn上介绍的13类hook中

的任何一种。所以说,api hook并不是什么特别不同的hook,它也需要通过基本的hook

提高自己的权限,跨越不同进程间访问的限制,达到修改api函数地址的目的。对于自身

进程空间下使用到的api函数地址的修改,是不需要用到api hook技术就可以实现的。

在上图中,我们需要从“可选头”尾的“数据目录”数组中的第二个元素——输入符

号表的位置,它是一个IMAGE_DATA_DIRECTORY结构,从它中的VirtualAddress地址,

“顺藤摸瓜”找到api函数的入口地点。

下图的简单说明如下:

OriginalFirstThunk 指向IMAGE_THUNK_DATA结构数组,为方便只画了数组的一

个元素,AddressOfData 指向IMAGE_IMPORT_BY_NAME结构。

IMAGE_IMPORT_DESCRIPTOR数组:每个引入的dll文件都对应数组中的一个元素,

以全0的元素(20个bytes的0)表示数组的结束

IMAGE_THUNK_DATA32数组:同一组的以全0的元素(4个bytes的0)表示数组

的结束,每个元素对应一个IMAGE_IMPORT_BY_NAME结构

IMAGE_IMPORT_BY_NAME:如..@Consts@initialization$qqrv. 表示

Unmangled Borland C++ Function: qualified function __fastcall

Consts::initialization()