想在你的程序中截住API函数吗?那就快看吧! (转)

本文介绍了一种在程序中拦截API函数的方法,通过自定义函数func并利用apiSpy函数实现对特定API(如TextOutA)的拦截。为保持原有功能,需在自定义函数内调用原API。若要拦截整个系统的API,还需使用全局HOOK。
想在你的程序中截住API函数吗?那就快看吧! (转)[@more@]

在你的程序中做一个函数func(...)

调用 func1 = apiSpy(NULL,"GDI32.DLL","TextOutA",(PROC)func)

那么你的程序没次调用TextOut时,就会调用func 为了不破坏原有功能

请在func中调用func1。如果想截获整个系统的api,你需要做一个全局HOOK

在HOOK的DLL里的初始化时调用本函数。主要代码如下:

PROC WINAPI

ApiSpy(PSTR pDllUse,PSTR pDllName,PSTR pApiName,PROC pNewPorc)
{
  PIMAGE_DOS_HEADER pDosHeader;
  PIMAGE_NT_HEADERS pNTHeader;
  PIMAGE_IMPORT_DESCRIPTOR pImportDesc;
  PIMAGE_THUNK_DATA pThunk;
  PROC pOldProc;
   Dword oldpr;
  static int Layer = 0;
  if ( pDllUse == NULL )
  Layer = 0;
  pOldProc = GetProcAddress( GetModuleHandle(pDllName),pApiName );
  if ( pOldProc == NULL )
  return NULL;
  pDosHeader = (PIMAGE_DOS_HEADER)GetModuleHandle(pDllUse); 
   if ( IsBadReadPtr(pDosHeader, sizeof(IMAGE_DOS_HEADER)) )
  return NULL;
  if ( pDosHeader->e_magic != IMAGE_DOS_SIGNATURE )
  return NULL;
  pNTHeader = MakePtr(PIMAGE_NT_HEADERS, pDosHeader, pDosHeader->e_lfanew);
  if ( IsBadReadPtr(pNTHeader, sizeof(IMAGE_NT_HEADERS)) )
  return NULL;
  if ( pNTHeader->Signature != IMAGE_NT_SIGNATURE )
  return NULL;
  pImportDesc = MakePtr(PIMAGE_IMPORT_DESCRIPTOR, pDosHeader,
  pNTHeader->OptionalHeader.
  DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].
  VirtualAddress);
  if ( pImportDesc == (PIMAGE_IMPORT_DESCRIPTOR)pNTHeader )
  return NULL;
 __try{
  while ( pImportDesc->Name ){
 PSTR pszModName = MakePtr(PSTR, pDosHeader, pImportDesc->Name);
 REM("[%s]",pszModName);
 if ( stricmp(pszModName, pDllName) == 0 ){
 pThunk = MakePtr(PIMAGE_THUNK_DATA, pDosHeader, pImportDesc->FirstThunk);
 while ( pThunk->u1.Function ){ 
 REM("[%s:%s]  ?  %s %8x ==> %8x",pDllName,pApiName,pszModName,
 // (DWORD)pOldProc,(DWORD)pThunk->u1.Function);
 if ( pThunk->u1.Function == (PDWORD)pOldProc ){
 if (!VirtualProtect(pThunk, 16, PAGE_READWRITE,&oldpr)){
 REM("VirtualProtect False");
 }
 REM("ApiSpy [%s:%s] OK !",pDllName,pApiName);
 pThunk->u1.Function=(PDWORD)pNewPorc;
 return pOldProc;
 }
 pThunk++; 
 } 
 return NULL;
 }
 else{
 if ( Layer < __Layer ){
 Layer ++;
 ApiSpy(pszModName,pDllName,pApiName,pNewPorc); 
 }
 }
 pImportDesc++;
 }
  }
 __except(TRUE){
 return NULL;
 }
  return NULL; 
}


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10752043/viewspace-988138/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10752043/viewspace-988138/

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值