当前位置:   article > 正文

导入表注入(iathook)

导入表注入(iathook)

头文件(hookMain.h)内容

  1. #pragma once
  2. #include<Windows.h>
  3. DWORD* g_iatAddr = NULL;
  4. DWORD* g_unHookAddr = NULL;
  5. BOOL InstallHook(); //安装钩子
  6. BOOL UninstallHook(); //卸载钩子
  7. DWORD* GetIatAddr(const char* dllName, const char* dllFuncName);

源文件(iatHookMain.cpp)内容

  1. #include "hookMain.h"
  2. int WINAPI HookMessageBoxW( //必须指定调用约定,否则注入时会弹错误窗口
  3. HWND hWnd,
  4. LPCWSTR lpText,
  5. LPCWSTR lpCaption,
  6. UINT uType
  7. )
  8. {
  9. int result = MessageBoxA(0, "51hook", "提示", MB_OK);
  10. return result;
  11. }
  12. BOOL InstallHook() //安装钩子
  13. {
  14. DWORD dwOldProtect = 0;
  15. VirtualProtect(g_iatAddr, 4, PAGE_EXECUTE_READWRITE, &dwOldProtect);
  16. *g_iatAddr = (DWORD)HookMessageBoxW;
  17. VirtualProtect(g_iatAddr, 4, dwOldProtect, &dwOldProtect);
  18. return TRUE;
  19. }
  20. BOOL UninstallHook() //卸载钩子
  21. {
  22. DWORD dwOldProtect = 0;
  23. VirtualProtect(g_iatAddr, 4, PAGE_EXECUTE_READWRITE, &dwOldProtect);
  24. *g_iatAddr = (DWORD)g_unHookAddr;
  25. VirtualProtect(g_iatAddr, 4, dwOldProtect, &dwOldProtect);
  26. return TRUE;
  27. }
  28. DWORD* GetIatAddr(const char* dllName, const char* dllFuncName)
  29. {
  30. HMODULE hModule = GetModuleHandleA(0); //获取当前进程exe文件模块句柄
  31. DWORD dwhModule = (DWORD)hModule;
  32. PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)hModule; //获取dos头
  33. PIMAGE_NT_HEADERS pNtHeader = (PIMAGE_NT_HEADERS)(pDosHeader->e_lfanew + dwhModule); //获取NT头
  34. PIMAGE_OPTIONAL_HEADER pOptionHeader = &pNtHeader->OptionalHeader; //获取可选PE头
  35. IMAGE_DATA_DIRECTORY dataDirectory = pOptionHeader->DataDirectory[1]; //获取数据目录表
  36. PIMAGE_IMPORT_DESCRIPTOR pImageImportTable = (PIMAGE_IMPORT_DESCRIPTOR)(
  37. dataDirectory.VirtualAddress + dwhModule); //获取导入表
  38. while (pImageImportTable->Name) // 遍历导入表获取符合条件的函数
  39. {
  40. char* iatDllName = (char*)(pImageImportTable->Name + dwhModule);
  41. if (_stricmp(iatDllName, dllName) == 0)
  42. {
  43. PIMAGE_THUNK_DATA pInt = (PIMAGE_THUNK_DATA)(pImageImportTable->OriginalFirstThunk
  44. + dwhModule); //获取导入名称表
  45. PIMAGE_THUNK_DATA pIat = (PIMAGE_THUNK_DATA)(pImageImportTable->FirstThunk
  46. + dwhModule); //获取导入地址表
  47. while (pInt->u1.Function)
  48. {
  49. if ((pInt->u1.Ordinal & 0x8000000) == 0)
  50. {
  51. PIMAGE_IMPORT_BY_NAME pImportName = (PIMAGE_IMPORT_BY_NAME)(pInt->u1.Function + dwhModule);
  52. if (_stricmp(pImportName->Name, dllFuncName) == 0)
  53. {
  54. return (DWORD*)pIat;
  55. }
  56. }
  57. ++pInt;
  58. }
  59. }
  60. ++pImageImportTable;
  61. }
  62. return NULL;
  63. }
  64. BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD callReason, LPVOID lpReservered)
  65. {
  66. if (callReason == DLL_PROCESS_ATTACH)
  67. {
  68. /**
  69. * 1 获取iat表
  70. * 2 保存要hook的函数地址
  71. * 3 安装钩子
  72. */
  73. g_iatAddr = GetIatAddr("user32.dll", "MessageBoxW");
  74. g_unHookAddr = (DWORD*)* g_iatAddr;
  75. InstallHook();
  76. }
  77. else if (callReason == DLL_PROCESS_DETACH)
  78. {
  79. UninstallHook();
  80. }
  81. return TRUE;
  82. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/58472
推荐阅读
相关标签
  

闽ICP备14008679号