不学网

 找回密码
 立即注册

只需一步,快速开始

手机号码,快捷登录

查看: 231|回复: 0

[c/c++] IATHook(PE导入地址表)

[复制链接]
BiaoGe 发表于 2018-4-6 00:35:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 BiaoGe 于 2018-4-6 00:41 编辑

Hook是一种古老而又非常实用的技术


IATHookClass.h

  1. #pragma once

  2. #include <Windows.h>

  3. class IATHookClass
  4. {
  5. private:
  6.         DWORD oldAddr;
  7.         DWORD newAddr;

  8. public:
  9.         BOOL Hook(char *apiName, DWORD callfunc);
  10.         BOOL UnHook(void);
  11. };
复制代码
IATHookClass.cpp
  1. #include "IATHookClass.h"

  2. BOOL IATHookClass::Hook(char *apiName, DWORD callfunc)
  3. {
  4.         BOOL bOk = FALSE;
  5.         HMODULE hMod = GetModuleHandle(NULL);
  6.         IMAGE_DOS_HEADER *pDosHeader = (IMAGE_DOS_HEADER *)hMod;
  7.         IMAGE_OPTIONAL_HEADER *pOptHeader = (IMAGE_OPTIONAL_HEADER *)((BYTE *)hMod + pDosHeader->e_lfanew + 24);
  8.         IMAGE_IMPORT_DESCRIPTOR *pImportDesc = (IMAGE_IMPORT_DESCRIPTOR *)((BYTE *)hMod + pOptHeader->DataDirectory[1].VirtualAddress);

  9.         while (pImportDesc->FirstThunk)
  10.         {
  11.                 char *pszDllName = (char *)((BYTE *)hMod + pImportDesc->Name);
  12.                 IMAGE_THUNK_DATA *pThunk = (IMAGE_THUNK_DATA *)((BYTE *)hMod + pImportDesc->FirstThunk);
  13.                 IMAGE_THUNK_DATA *pThunkDesc = (IMAGE_THUNK_DATA *)((BYTE *)hMod + pImportDesc->OriginalFirstThunk);

  14.                 while (pThunkDesc->u1.Function)
  15.                 {
  16.                         if (!lstrcmpi(apiName, (char *)((BYTE *)hMod + (DWORD)pThunkDesc->u1.AddressOfData + 2)))
  17.                         {
  18.                                 IATHookClass::oldAddr = pThunk->u1.Function;
  19.                                 IATHookClass::newAddr = (DWORD)callfunc;
  20.                                 DWORD dwOldProtect = 0;

  21.                                 VirtualProtect((LPVOID)&pThunk->u1.Function, 4, PAGE_EXECUTE_READWRITE, &dwOldProtect);
  22.                                 bOk = (pThunk->u1.Function = callfunc) ? TRUE : FALSE;
  23.                                 VirtualProtect((LPVOID)&pThunk->u1.Function, 4, dwOldProtect, &dwOldProtect);
  24.                                 CloseHandle(hMod);
  25.                                 return bOk;
  26.                         }
  27.                         pThunk++;
  28.                         pThunkDesc++;
  29.                 }
  30.                 pImportDesc++;
  31.         }
  32.         CloseHandle(hMod);
  33.         return bOk;
  34. }

  35. BOOL IATHookClass::UnHook(void)
  36. {
  37.         BOOL bOk = FALSE;
  38.         HMODULE hMod = GetModuleHandle(NULL);
  39.         IMAGE_DOS_HEADER *pDosHeader = (IMAGE_DOS_HEADER *)hMod;
  40.         IMAGE_OPTIONAL_HEADER *pOptHeader = (IMAGE_OPTIONAL_HEADER *)((BYTE *)hMod + pDosHeader->e_lfanew + 24);
  41.         IMAGE_IMPORT_DESCRIPTOR *pImportDesc = (IMAGE_IMPORT_DESCRIPTOR *)((BYTE *)hMod + pOptHeader->DataDirectory[1].VirtualAddress);

  42.         while (pImportDesc->FirstThunk)
  43.         {
  44.                 char *pszDllName = (char *)((BYTE *)hMod + pImportDesc->Name);
  45.                 IMAGE_THUNK_DATA *pThunk = (IMAGE_THUNK_DATA *)((BYTE *)hMod + pImportDesc->FirstThunk);
  46.                 while (pThunk->u1.Function)
  47.                 {
  48.                         if (IATHookClass::newAddr == pThunk->u1.Function)
  49.                         {
  50.                                 DWORD dwOldProtect = 0;
  51.                                 VirtualProtect((LPVOID)&pThunk->u1.Function, 4, PAGE_EXECUTE_READWRITE, &dwOldProtect);
  52.                                 bOk = (pThunk->u1.Function = IATHookClass::oldAddr) ? TRUE : FALSE;
  53.                                 VirtualProtect((LPVOID)&pThunk->u1.Function, 4, dwOldProtect, &dwOldProtect);
  54.                                 CloseHandle(hMod);
  55.                                 if (bOk)
  56.                                 {
  57.                                         IATHookClass::newAddr = 0;
  58.                                         IATHookClass::oldAddr = 0;
  59.                                 }
  60.                                 return bOk;
  61.                         }
  62.                 }
  63.         }
  64.         CloseHandle(hMod);
  65.         return bOk;
  66. }
复制代码
Hook效果图
无标题.png

代码注释我就不写了,IATHook是用PE头来实现的,这个PE结构体比较复杂,我也是参见网上的前辈帖子才略懂那么一点,Hook效果达到了也就没再继续深究,如果有想深入了解到底什么原理的话,可以看看这位前辈的帖子:https://www.cnblogs.com/banchen/p/6696275.html,其实原理并没有说的很透彻,但是我感觉他的代码注释很详细。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|不学网

GMT+8, 2018-7-23 08:13

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表