您的位置:首页 > 其它

Api Hook 例程

2015-10-08 00:24 417 查看
#include "windows.h"
DWORD* lpAddr;
PROC OldProc;
HMODULE MyTerminateProcess(HANDLE hProcess,UINT
uExitCode)
{
   
MessageBox(NULL,"硬不起来了把","API HOOK",0);
    return 0;
}

int ApiHook(char *DllName,//DLL文件名
     
      PROC
OldFunAddr,//要HOOK的函数地址
     
      PROC
NewFunAddr//我们够造的函数地址
     
     )
{
//得到函数进程模块基地址
    HMODULE lpBase =
GetModuleHandle(NULL);
    IMAGE_DOS_HEADER
*dosHeader;
    IMAGE_NT_HEADERS
*ntHeader;
    IMAGE_IMPORT_BY_NAME
*ImportName;
//定位到DOS头
   
dosHeader=(IMAGE_DOS_HEADER*)lpBase;
//定位到PE头
   
ntHeader=(IMAGE_NT_HEADERS32*)((BYTE*)lpBase+dosHeader->e_lfanew);
//定位到导入表
    IMAGE_IMPORT_DESCRIPTOR
*pImportDesc=(IMAGE_IMPORT_DESCRIPTOR*)((BYTE*)lpBase+ntHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);
//循环遍历IMAGE_IMPORT_DESCRIPTOR机构数组
   
while(pImportDesc->FirstThunk)
    {
//得到DLL文件名
     
  char* pszDllName = (char*)((BYTE*)lpBase +
pImportDesc->Name);
//比较得到的DLL文件名是否和要HOOK函数所在的DLL相同
//定位到FirstThunk参数指向的IMAGE_THUNK_DATA,此时这个结构已经是函数入口点地址了
     
  IMAGE_THUNK_DATA* pThunk =
(IMAGE_THUNK_DATA*)
     
     
     
     
     
   
 ((BYTE*)lpBase +
pImportDesc->FirstThunk);
//遍历这部分IAT表
     
 
MessageBox(NULL,pszDllName,"Output",MB_OK);
     
  while(pThunk->u1.Function)
     
  {
     
      lpAddr =
(DWORD*)&(pThunk->u1.Function);
//比较函数地址是否相同
     
      if(*lpAddr
== (DWORD)OldFunAddr)
     
      {
     
     
    DWORD dwOldProtect;
//修改内存包含属性
     
     
    VirtualProtect(lpAddr,
sizeof(DWORD), PAGE_READWRITE,
&dwOldProtect);
//API函数的入口点地址改成我们构造的函数的地址
     
     
   
WriteProcessMemory(GetCurrentProcess(),lpAddr,
&NewFunAddr, sizeof(DWORD), NULL);
     
     
   
MessageBox(NULL,"FindIt","",MB_OK);
     
      }
     
     
pThunk++;
     
  }
     
  pImportDesc++;
    }
    return 0;
}

extern "C" {

    BOOL APIENTRY DllMain(
HANDLE hModule,
     
     
     
     
   DWORD
ul_reason_for_call,
     
     
     
     
   LPVOID lpReserved
     
     
     
     
 )
    {
     
  switch (ul_reason_for_call)
     
  {
     
  case DLL_PROCESS_ATTACH:
     
  case DLL_THREAD_ATTACH:
//得到TerminateProcess函数地址
     
      OldProc =
(PROC)GetProcAddress(GetModuleHandle("Kernel32"),"TerminateProcess");
     
     
if(OldProc==NULL)
     
      {
     
     
   
MessageBox(NULL,"FAILED","",MB_OK);
     
     
    return 0;
     
      }
//定位,修改IAT表
     
     
ApiHook((char*)"kernel32.dll",OldProc,(PROC)MyTerminateProcess);
     
     
//MessageBox(NULL,"Success","Ok",MB_OK);
     
     
break;
     
  case DLL_THREAD_DETACH:
     
  case DLL_PROCESS_DETACH:
//恢复IAT表中API函数的入口点地址
     
     
WriteProcessMemory(GetCurrentProcess(),lpAddr,
&OldProc, sizeof(DWORD), NULL);
     
     
break;
     
  }
     
  return TRUE;
    }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: