PE文件格式与API HOOK

本文介绍了在Windows低层编程中实现API Hook的方法,通过修改PE文件的输入地址表来拦截API调用。文章详细讲解了PE文件格式、DOS文件头、PE文件头、数据目录、引入表等概念,并阐述了如何找到并修改输入地址表以实现API Hook。此外,还讨论了DLL远程注入、内存管理和API拦截的实现细节,包括DLL的入口点函数、系统钩子的使用以及如何在DLL被卸载时恢复IAT表。
摘要由CSDN通过智能技术生成

对于windows低层编程来说,进行API拦截始终是一件让人激动的事,用自己的代码来改变其它程序的行为,还有比这个更有趣吗?而且,在实现API拦截的过程中我们还有机会去熟悉许多在RAD编程环境中很少接触的东西,如DLL远程注入、内存管理,PE文件格式等知识。许多商业软件,如金山词霸等词典软件,各种即时汉化软件、甚至一些网络游戏的外挂中都用到了这种技术,各种调试工具中多多少少也要用到这种技术。

实现API拦截的一种方法是修改PE文件中的输入地址表。在32windows中,无论是.EXE文件,还是.DLL文件都是采用PE文件格式,PE文件格式将程序所有调用的API函数的地址信息存放在输入地址表中,而在程序码中,对API的调用使用的地址不是API函数的地址,而是输入地址表中该API函数对应的地址。我们只要修改输入地址表中函数地址就可以拦截API了。首先我们来熟悉一下PE文件格式,由于PE文件格式本身比较复杂,涉及到的数据类型较多,所以在这里只介绍一部分内容。我已经画了一幅示意图,大致描绘出PE文件格式,其中有的结构中的数据是一个RVA,凡是这样数据在图中都已注明。

 

PE文件是由一个DOS文件头开始的,紧接在它后面的是一个DOS stub,它们合在一起实际上是一个完整的DOS程序,在PE文件中提供它们最主要的目的是由于兼容性,如果我们在DOS中去执行一个win32程序,这个DOS程序就会显示出“This program can not run in dos mode”之类的语句。在它们的后面才是真正的PE文件头,所以这两个部分并不重要,但是由于每一个DOS stub的大小并不一样,所以我们必须要用DOS文件头中一个成员e_lfanew来定位PE文件头,DOS文件头被定义成IMAGE_DOS_HEADER结构。它的成员e_lfanew中含有PE文件头的“相对虚拟地址”(RVA)。

在这里我们要解释一下RVA(相对虚拟地址),在PE文件中经常见到这个名词,所谓RVA指的是相对于模块起始地址的偏移量,所以RVA必须要加上模块的起始地址才能得到真正的地址。之所以称它为“虚拟”的是因为在一个PE格式文件没有被装入内存之前,RVA是没有意义的,只有PE格式文件被装入内存后,RVA才是有意义的。

举例说明:如上图所示:

假设某个PE文件的装入虚拟地址(VA)为400000h,而这个PE文件中的DOS头中的成员e_lfanew的值为40hRVA)的话, 那么它所指的PE文件头的虚拟地址(VA)就是400040h

DOS stub后面才是我们感兴趣的PE文件头,它被定义成IMAGE_NT_HEADERS结构,这个结构中含有整个PE文件的信息,它的定义如下:( 这里用汇编语言定义,在winnt.h中有基于C语言的定义)

IMAGE_NT_HEADERS STRUCT

  Signature dd ?

  FileHeader IMAGE_FILE_HEADER <>

  OptionalHeader IMAGE_OPTIONAL_HEADER32<>

IMAGE_NT_HEADERS ENDS

而这个结构中,与我们API

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值