看流星社区

 找回密码
 注册账号
查看: 2722|回复: 3

科普一下如何对抗IAT Hook

[复制链接]

该用户从未签到

发表于 2011-8-8 08:36:48 | 显示全部楼层 |阅读模式
绕过IAT Hook的方法。
处理一下可以恢复InlineHook。



  1. //获取函数的原始地址,以此绕过IAT Hook
  2. //原理:读取文件,从导出表里面弄偏移,然后加上加载基址即可。

  3. //参考文献:《加密与解密 第三版》,也就是我学习PE结构的书。

  4. #include <windows.h>
  5. #include <stdio.h>
  6. #include <imagehlp.h>
  7. #pragma comment(lib,"imagehlp")

  8. typedef int (WINAPI *pfnMessageBoxA)(
  9.                   HWND hWnd,
  10.                   LPCSTR lpText,
  11.                   LPCSTR lpCaption,
  12.                   UINT uType
  13.                   );//函数原型

  14. pfnMessageBoxA OrigMessageBoxA = NULL;//保存原始函数地址
  15. LPVOID RvaToPtr(PIMAGE_NT_HEADERS pNtH,LPVOID ImageBase,DWORD dwRVA);//转化成文件偏移
  16. DWORD GetOrigMessageBoxAAddress();//获取函数原始地址

  17. int main(int argc, char* argv[])
  18. {
  19.     printf("AntiIATHook Demo\nBy XiaoWei[0GiNr]\n");
  20.     printf("http://www.0GiNr.com\n");
  21.     printf("http://0Gsns.com\n");
  22.     printf("http://hi.baidu.com/zoo%%5F\n\n");
  23.     OrigMessageBoxA = (pfnMessageBoxA)GetOrigMessageBoxAAddress();
  24.     printf("OrigMessageBoxA = 0x%08lX\n",OrigMessageBoxA);
  25.     OrigMessageBoxA(0,"0GiNr","0GiNr",0);
  26.     getchar();
  27.     return 0;
  28. }

  29. LPVOID RvaToPtr(PIMAGE_NT_HEADERS pNtH,LPVOID ImageBase,DWORD dwRVA)
  30. {   
  31.     return ImageRvaToVa(pNtH,ImageBase,dwRVA,NULL);
  32. }

  33. DWORD GetOrigMessageBoxAAddress()
  34. {
  35.     LPVOID lpBass = NULL;
  36.     HANDLE hMapFile = NULL;
  37.     HANDLE hFile = NULL;
  38.     PIMAGE_DOS_HEADER    pDH = NULL;
  39.     PIMAGE_NT_HEADERS    pNH = NULL;
  40.     PIMAGE_OPTIONAL_HEADER    pOH = NULL;
  41.     PIMAGE_EXPORT_DIRECTORY pED = NULL;
  42.     DWORD        dwDataStartRVA    = 0;
  43.     PDWORD      pdwRvas, pdwNames;
  44.     PWORD       pwOrds;
  45.     UINT        iNumOfName;
  46.     char        *szFuncName;
  47.     int            i,j;
  48.     HMODULE        hUser32;
  49.     DWORD        dwRetAddr;
  50.     //////////////////////////////////////////////////////////////////////////
  51.     ::LoadLibraryA("user32.dll");//load一下。
  52.     hUser32 = GetModuleHandleA("user32.dll");
  53.     if (!hUser32) {
  54.         printf("Get User32 Base Error..\n");
  55.         goto __exit;
  56.     }
  57.     hFile = ::CreateFileA(
  58.         "c:\\windows\\system32\\user32.dll",
  59.         GENERIC_READ,
  60.         FILE_SHARE_READ,
  61.         NULL,
  62.         OPEN_EXISTING,
  63.         FILE_ATTRIBUTE_NORMAL,
  64.         NULL);
  65.     if ( hFile == INVALID_HANDLE_VALUE ) {
  66.         printf("open file error..\n");
  67.         goto __exit;
  68.     }
  69.     hMapFile = ::CreateFileMappingA(
  70.         hFile,
  71.         NULL,
  72.         PAGE_READONLY,
  73.         NULL,
  74.         NULL,
  75.         NULL);
  76.     if ( hMapFile == INVALID_HANDLE_VALUE ) {
  77.         printf("CreateFileMappingA error..\n");
  78.         goto __exit;
  79.     }
  80.     lpBass = MapViewOfFile(
  81.         hMapFile,
  82.         FILE_MAP_READ,
  83.         0,
  84.         0,
  85.         0);
  86.     if ( !lpBass ) {
  87.         printf("CreateFileMappingA error..\n");
  88.         goto __exit;
  89.     }
  90.     pDH = (PIMAGE_DOS_HEADER)lpBass;
  91.     pNH = (PIMAGE_NT_HEADERS)((DWORD)pDH + pDH->e_lfanew);
  92.     pOH = &pNH->OptionalHeader;
  93.     dwDataStartRVA = pOH->DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress;
  94.     pED = (PIMAGE_EXPORT_DIRECTORY)RvaToPtr(pNH,lpBass,dwDataStartRVA);

  95.     pwOrds    = (PWORD)RvaToPtr(pNH, lpBass,pED->AddressOfNameOrdinals);
  96.     pdwRvas   = (PDWORD)RvaToPtr(pNH, lpBass,pED->AddressOfFunctions);
  97.     pdwNames  = (PDWORD)RvaToPtr(pNH, lpBass,pED->AddressOfNames);
  98.     iNumOfName = pED->NumberOfNames;

  99.     for (i = 0;i<pED->NumberOfFunctions;i++) {
  100.         if (*pdwRvas) {
  101.             for (j = 0;j<iNumOfName;j++) {
  102.                 if ( i == pwOrds[j] ) {
  103.                     szFuncName = (char*)RvaToPtr(pNH,lpBass,pdwNames[j]);
  104.                     break;
  105.                 }
  106.             }
  107.             if ( !strcmp(szFuncName,"MessageBoxA") ) {
  108.                 printf("*pdwRvas : 0x%08lX..\n",*pdwRvas);
  109.                 dwRetAddr = (DWORD)hUser32 + *pdwRvas;//文件偏移加上加载地址,得到原始函数地址。
  110.                 goto __exit;
  111.             }
  112.             pdwRvas++;
  113.         }
  114.     }
  115. __exit:
  116.     if (lpBass)
  117.         ::UnmapViewOfFile(lpBass);
  118.     ::CloseHandle(hFile);
  119.     ::CloseHandle(hMapFile);
  120.     return dwRetAddr;
  121. }
复制代码

该用户从未签到

发表于 2013-9-28 10:57:49 | 显示全部楼层
聪明的女人对付男人,而笨女人对付女人.

该用户从未签到

发表于 2019-3-28 15:59:33 | 显示全部楼层
支持楼主,支持看流星社区,以后我会经常来!

该用户从未签到

发表于 2019-3-28 16:29:22 | 显示全部楼层
支持楼主,支持看流星社区,以后我会经常来!
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-4-25 07:17

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

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