- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
API Hook 基本原理和实现 [图文]
关键字:API Hook, 消息,拦截API,钩子,wskjuf
作者:wskjuf 更新:2007-12-23 08:18:25 浏览:16126
注:本文主要为解决 论坛上 /forum/forum_posts.asp7TIDu7281 的 提问
而写的。我搜索了一下互联网,将网络上几篇有代表性的api hook文章的精华进行了浓缩和 适当简化,写成这篇介绍性文章。另外也希望初学者能够认真思考本文采用的循序渐进的分 析思路,如何解决了一个未知的问题。文中借鉴的文献资料列于文末附录一节。
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技术就可以实现的。
api hook 和pe格式的关系
api hook技术的难点,并不在于hook技术,初学者借助于资料照葫芦画瓢能够很容易就 掌握hook的基本使用技术。但是如何修改api函数的入口地址?这就需要学习pe可执行文 件(.exe,.dll等)如何被系统映射到进程空间中,这就需要学习pe格式的基本知识。windows 已经提供了很多数据结构struct帮助我们访问pe格式,借助它们,我们就不要自己计算格 式的具体字节位置这些繁琐的细节。但是从api hook的实现来看,pe格式的访问部分仍然 是整个编程实现中最复杂的一部分,对于经常crack的朋友不在此列。
假设我们已经了解了 pe格式,那么我们在哪里修改api的函数入口点比较合适呢?这个就 是输入符号表imported symbols table (间接)指 向的输入符号地址。
下面对于pe格式的介绍这一部分,对于没有接触过pe格式学习的朋友应该是看不太明白 的,但我已经把精华部分提取出来了,学习了 pe格式后再看这些就很容易了。
pe格式的基本组成
+ +
| DOS-stub
| --DOS-头
+ +
| file-header |
--文件头
+ +
| optional header |
| |
--可选头
1 1
| |
| data directories |
| |
--(可选头尾的)数据目录
1 1
+ +
1 1
丨 丨
| section headers |
| |
--节头
TOC \o 1-5 \h \z + +
| |
| section 1 | --节 1
I I
+ +
I I
| section 2 | --节 2
I I
+ +
I I
I ... I
I I
+ +
I I
I section n I --节 n
I I
+ +
在上图中,我们需要从 可选头”尾的 数据目录”数组中的第二个元素一一输入符号表的 位置,它是一个IMA
文档评论(0)