鱼C论坛

 找回密码
 立即注册
查看: 2553|回复: 1

IAThook失败

[复制链接]
发表于 2017-5-3 15:03:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

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

x
将dll注入到release版exe中,用xuetr发现MessageboxA已经被挂钩但是hook失败,注入到debug版中hook成功,为啥呢?
@小甲鱼 @人造人
dll代码:
  1. #include <windows.h>
  2. #include <imagehlp.h>
  3. #include <stdio.h>
  4. #include "process.h"
  5. #pragma comment(lib,"IMAGEHLP.lib")


  6. /*

  7. pDllName [in] - 要HOOK的API所在的DLL

  8. pApiName [in] - 要HOOK的API的名称

  9. iNewApi       [in] - 新的API入口地址

  10. pOldApi       [out]    - 用于输出源API入口地址,

  11. */

  12. int ReplaceIAT(const char *pDllName, const char *pApiName, INT_PTR iNewApi, INT_PTR *pOldApi)

  13. {

  14.         HANDLE hProcess = ::GetModuleHandle (NULL);

  15.         DWORD dwSize = 0;

  16.         PIMAGE_IMPORT_DESCRIPTOR pImageImport = (PIMAGE_IMPORT_DESCRIPTOR)ImageDirectoryEntryToData(hProcess,TRUE,

  17.                 IMAGE_DIRECTORY_ENTRY_IMPORT,&dwSize);

  18.         if (NULL == pImageImport)

  19.                 return 1;

  20.         PIMAGE_IMPORT_BY_NAME pImageImportByName = NULL;

  21.         PIMAGE_THUNK_DATA   pImageThunkOriginal = NULL;

  22.         PIMAGE_THUNK_DATA   pImageThunkReal  = NULL;

  23.         while (pImageImport->Name)

  24.         {

  25.                 char *pName = (char*)(PBYTE)hProcess+pImageImport->Name;

  26.                 if (0 == strcmpi((char*)((PBYTE)hProcess+pImageImport->Name),pDllName))

  27.                 {

  28.                         break;

  29.                 }

  30.                 ++pImageImport;

  31.         }

  32.         if (!pImageImport->Name) return 2;

  33.         pImageThunkOriginal = (PIMAGE_THUNK_DATA)((PBYTE)hProcess+pImageImport->OriginalFirstThunk);

  34.         pImageThunkReal = (PIMAGE_THUNK_DATA)((PBYTE)hProcess+pImageImport->FirstThunk);

  35.         while (pImageThunkOriginal->u1.Function)

  36.         {

  37.                 if ((pImageThunkOriginal->u1.Ordinal & IMAGE_ORDINAL_FLAG) != IMAGE_ORDINAL_FLAG)

  38.                 {

  39.                         pImageImportByName = (PIMAGE_IMPORT_BY_NAME)((PBYTE)hProcess+pImageThunkOriginal->u1.AddressOfData);

  40.                         if (0 == strcmpi(pApiName,(char*)pImageImportByName->Name))

  41.                         {

  42.                                 MEMORY_BASIC_INFORMATION mbi_thunk;

  43.                                 VirtualQuery(pImageThunkReal, &mbi_thunk, sizeof(MEMORY_BASIC_INFORMATION));

  44.                                 VirtualProtect(mbi_thunk.BaseAddress,mbi_thunk.RegionSize, PAGE_READWRITE, &mbi_thunk.Protect);



  45.                                 *pOldApi =(INT_PTR) pImageThunkReal->u1.Function;

  46.                                 pImageThunkReal->u1.Function = (DWORD)iNewApi;



  47.                                 DWORD dwOldProtect;

  48.                                 VirtualProtect(mbi_thunk.BaseAddress, mbi_thunk.RegionSize, mbi_thunk.Protect, &dwOldProtect);

  49.                                 break;

  50.                         }

  51.                 }

  52.                 ++pImageThunkOriginal;

  53.                 ++pImageThunkReal;

  54.         }

  55.         return 0;

  56. }



  57. //自己想hook函数这里
  58. typedef int (WINAPI *MESSAGEBOXA)(HWND, LPCWSTR, LPCWSTR, UINT);

  59. // Pointer for calling original MessageBoxW.
  60. MESSAGEBOXA fpMessageBoxA = NULL;

  61. // Detour function which overrides MessageBoxW.
  62. int WINAPI DetourMessageBoxA(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType)
  63. {
  64.         return fpMessageBoxA(hWnd, L"Hookedbybybyby!", lpCaption, uType);
  65. }

  66. void ThreadProc(void *param)
  67. {

  68.         ReplaceIAT("user32.dll","MessageBoxA", (INT_PTR)DetourMessageBoxA, (INT_PTR*)&fpMessageBoxA);
  69. }



  70. BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved)
  71. {
  72.         switch (fdwReason)
  73.         {
  74.         case DLL_PROCESS_ATTACH:
  75.                 WinExec("notepad",SW_NORMAL);
  76.                  _beginthread(ThreadProc,0,NULL);        //创建线程,调用ThreadProc
  77.                 //SetHook();
  78.                 //ReplaceIAT("user32.dll","MessageBoxA", (INT_PTR)DetourMessageBoxA, (INT_PTR*)&fpMessageBoxA);
  79.                 break;

  80.         case DLL_PROCESS_DETACH:
  81.                 // Code to run when the DLL is freed
  82.                 break;

  83.         case DLL_THREAD_ATTACH:
  84.                 // Code to run when a thread is created during the DLL's lifetime
  85.                 break;

  86.         case DLL_THREAD_DETACH:
  87.                 // Code to run when a thread ends normally.
  88.                 break;
  89.         }
  90.         return TRUE;
  91. }
复制代码

exe代码:
  1. #include "stdafx.h"
  2. #include "stdio.h"
  3. #include "windows.h"

  4. int _tmain(int argc, _TCHAR* argv[])
  5. {
  6.         printf("test---/n");
  7.         while(1)
  8.         {
  9.                 getchar();
  10.                 MessageBoxA(NULL, "原函数", "09HookDemo", 0);
  11.         }
  12.         return 0;
  13. }

复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-5-3 17:49:36 | 显示全部楼层
Windows SDK 我还没有学
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-24 03:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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