API Hook基本原理和实现

豆豆网   技术应用频道   2008年01月10日  【字号: 收藏本文

内容摘要:将网络上几篇有代表性的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()

API Hook基本原理和实现

  为了减少这个图的大小,不得已将汇编和c++的结构都用上了。这个图是输入符号表初始化的情形,此时两个IMAGE_THUNK_DATA结构数组的对应元素都指向同一个IMAGE_IMPORT_BY_NAME结构。

  程序加载到进程空间后,两个IMAGE_THUNK_DATA结构数组指向有所不同了。看下图:

API Hook基本原理和实现

  初始化的,“两个结构都指向同一个IMAGE_IMPORT_BY_NAME”,此时还没有api函数地址

API Hook基本原理和实现

来源:www.ccrun.com    作者:wskjuf    责编:豆豆技术应用

正在加载评论...