Windows核心编程(二十二)API拦截

1、一个模块的导入段包含一组DLL。为了让模块能够运行,这些DLL是必须的。

导入段还包含一个符号表。它列出了该模块从各DLL中导入的符号。当模块调用这些导入符号的时候,系统实际上会调用转换函数,获得导入函数在导入表的地址,然后再跳到相应的位置。

如果我们能将导入段中相应导入函数的地址替换成自定义的函数的地址,即可实现对该函数的拦截。在自定义的函数中,我们既可以调用拦截的函数,也可以执行其他工作。


2、为了修改要拦截的函数在导入段的地址,首先要获得PE文件导入段的地址。可以调用ImageDirectoryEntryToData函数。

[cpp]  view plain copy
  1. PVOID WINAPI ImageDirectoryEntryToData(   
  2.   
  3. __in   PVOID Base,   
  4.   
  5. __in   BOOLEAN MappedAsImage,   
  6.   
  7. __in   USHORT DirectoryEntry,   
  8.   
  9. __out  PULONG Size );  

---Base为要获得导入段所在模块的基地址。它一般是GetModuleHandle的返回值。

---MappedAsImage,它为true时,系统将该模块以映像文件的形式映射,否则以数据文件的形式映射。

---DirectoryEntry,要获得的段的索引。


3、此函数不仅能够获得导入段的地址,根据此索引的不同,该函数返回对应段的地址。此处我们使用IMAGE_DIRECTORY_ENTRY_IMPORT表示我们要获得导入段的地址。

---Size返回表项的大小。注意其类型。

[cpp]  view plain copy
  1. ULONG size;  
  2.   
  3. HMODULE hModule=GetModuleHandle(NULL);  
  4.   
  5. PIMAGE_IMPORT_DESCRIPTOR pImport=  
  6.   
  7. ImageDirectoryEntryToData(hModule,true,IMAGE_DIRECTORY_ENTRY_IMPORT,&size);  
  8.   
  9. while(pImport->FirstThunk)  
  10.   
  11. {  
  12.   
  13. int i=0;  
  14.   
  15. char *ModuleName=(char*)((BYTE*)hModule+pImport->Name);  
  16.   
  17. PIMAGE_THUNK_DATA pThunk=(PIMAGE_THUNK_DATA)  
  18.   
  19.                                                 ((BYTE*)hModule+pImport->FirstThunk);  
  20.   
  21. while(pThunk->u1.Function)  
  22.   
  23. {  
  24.   
  25.                   char*Func=(char*)((BYTE*)hModule+pThunk->u1.AddressOfData+2);  
  26.   
  27. If(Func=="MessageBoxA")   
  28.   
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值