压在透明的玻璃上c-国产精品国产一级A片精品免费-国产精品视频网-成人黄网站18秘 免费看|www.tcsft.com

實現(xiàn)HOOK其他進程的Messagebox(1)

  HOOK –實現(xiàn)HOOK其他進程的Messagebox、、

  思路方法如下:

  1 DLL的編寫(實現(xiàn)IAT hook)、

  2 DLL注入工具(遠程線程技術(shù)和簡單的MFC控件知識)、

  3簡單的測試程序、

  1編寫dll、

  之前有篇文章HOOK — IAT HOOK本進程MessageBox、這里部分代碼是相同的、畢竟均為IAT HOOK嘛、、

  DLL與跟exe有個main或者WinMain入口函數(shù)一樣也有一個入口函數(shù)DllMain、不過很多僅僅包含資源信息的DLL是沒有DllMain函數(shù)的、其原型如下

  BOOL WINAPI DllMain(  HINSTANCE hInstance,  ULONG ulReason,  LPVOID Reserved);

  何時調(diào)用Dllmain、

  DllMain的第二個參數(shù)fdwReason指明了系統(tǒng)調(diào)用Dll的原因、

  DLL_PROCESS_ATTACH、當(dāng)一個DLL文件被映射到進程的地址空間時、用此參數(shù)掉dllmain

  當(dāng)同一DLL再次映射時不會再調(diào)DllMain函數(shù)只增加dll次數(shù)、

  DLL_PROCESS_DETACH、當(dāng)DLL被從進程的地址空間解除映射時FreeLibrary

  進程結(jié)束而解除DLL映射(若是使用的TerminateProcess則不調(diào))

  DLL_THREAD_ATTACH、當(dāng)進程創(chuàng)建一線程時,跟DLL_PROCESS_ATTACH區(qū)別

  無論何時創(chuàng)建線程均會用此參數(shù)調(diào)用Dllmain

  DLL_THREAD_DETACH   如果線程調(diào)用了ExitThread來結(jié)束線程(線程函數(shù)返回時,系統(tǒng)也會自動調(diào)用ExitThread),若是TerminateThread也不會調(diào)用DllMain.

  這里選擇如下方式編寫DllMain函數(shù)

  BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)

  {

  If  ( fdwReason= =DLL_PROCESS_ATTACH)   //加載dll時候調(diào)用DllMain

  _beginthread(ThreadProc,0,NULL); //創(chuàng)建線程

  return TRUE;

  }

  就是說當(dāng)dll被加載的時候(LoadLirary)、在DllMain中實現(xiàn)創(chuàng)建ThreadProc線程函數(shù)、、而ThreadProc函數(shù)里邊是我們IAT HOOK的核心代碼、、

  ThreadProc函數(shù):  功能是 一個應(yīng)用程序定義的函數(shù)作為一個線程的起始地址服務(wù)、

  要Hook Messagebox需寫一個自己的Messagebox如下:

  int __stdcall HookMBox(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption,UINT uType)

  {

  return MessageBox(NULL,"哈哈! HOOK到MessageBox了","HOOK",MB_OK); //證明一下Hook成功

  }

  在線程函數(shù)中完成我們的ITA HOOK的代碼:

  1   獲取本進程的模塊基址  HANDLE pBegin = GetModuleHandle(NULL);

  2   初始化PE結(jié)構(gòu)得到IAT的地址

  PBYTE  pBegin2 = (PBYTE)pBegin;

  PIMAGE_DOS_HEADER   DOS = PIMAGE_DOS_HEADER(pBegin2);

  PIMAGE_NT_HEADERS  NT = PIMAGE_NT_HEADERS(pBegin2+DOS->e_lfanew);

  PIMAGE_OPTIONAL_HEADER  OPTION = &(NT->OptionalHeader);

  PIMAGE_IMPORT_DESCRIPTOR   IMPORT =PIMAGE_IMPORT_DESCRIPTOR(OPTION->DataDirectory[1].VirtualAddress + pBegin2);

  3   遍歷尋找IMPORT->FirstThunk的內(nèi)容當(dāng)其與真正的MessageBox的地址相等時即可

  真正的MessageBoxA的地址在程序之前得到即    DWORD RealBox = (DWORD)MessageBox、

  while (pOriginalThunk->u1.Function) //記住是Function

  {

  PDWORD lpAddr = (DWORD *)( pBegin2+ (DWORD)IMPORT->FirstThunk);

  if (*lpAddr = = RealBox)

  {

  找到后即找到了此PE的MessageBox在其IAT中的位置、接下來就是改之、

  修改的內(nèi)存的話首先內(nèi)存的保護屬性必須可讀可寫所以使用以下幾個API

  DWORD dwOLD;

  MEMORY_BASIC_INFORMATION  mbi;

  //獲取需要修改的內(nèi)存的信息存放于MEMORY_BASIC_INFORMATION結(jié)構(gòu)

  VirtualQuery (lpAddr,  &mbi,  sizeof(mbi));

  //修改此內(nèi)存保護屬性為并將原有的保護屬性存放于&dwOLD中

  VirtualProtect (lpAddr,  sizeof(DWORD),  PAGE_READWRITE,  &dwOLD);

  //將咱自己的HookMBox函數(shù)的地址寫到此內(nèi)存、

  WriteProcessMemory (GetCurrentProcess(),          lpAddr, &ADD, sizeof(DWORD), NULL);

  //將保存的原有的內(nèi)存保護屬性寫回去、、

  VirtualProtect (lpAddr,  sizeof(DWORD),  dwOLD, 0 );

  break;

  }

  pOriginalThunk++;

  }

  IMPORT++;

  }

  到此DLL文件編寫完畢、、后邊繼續(xù)記錄注入DLL(遠程線程技術(shù)、、)

 

上一篇:安卓防火墻 PS DroidWall

下一篇:實現(xiàn)簡單的ring3進程保護、hook OpenProcess函數(shù)、簡單分析