您好,登錄后才能下訂單哦!
HOOK --實現HOOK其他進程的Messagebox、、
思路方法如下:
1 DLL的編寫(實現IAT hook)、
2 DLL注入工具(遠程線程技術和簡單的MFC控件知識)、
3簡單的測試程序、
1編寫dll、
之前有篇文章HOOK -- IAT HOOK本進程MessageBox、這里部分代碼是相同的、畢竟均為IAT HOOK嘛、、
DLL與跟exe有個main或者WinMain入口函數一樣也有一個入口函數DllMain、不過很多僅僅包含資源信息的DLL是沒有DllMain函數的、其原型如下
BOOL WINAPI DllMain( HINSTANCE hInstance, ULONG ulReason, LPVOID Reserved);
何時調用Dllmain、
DllMain的第二個參數fdwReason指明了系統調用Dll的原因、
DLL_PROCESS_ATTACH、當一個DLL文件被映射到進程的地址空間時、用此參數掉dllmain
當同一DLL再次映射時不會再調DllMain函數只增加dll次數、
DLL_PROCESS_DETACH、當DLL被從進程的地址空間解除映射時FreeLibrary
進程結束而解除DLL映射(若是使用的TerminateProcess則不調)
DLL_THREAD_ATTACH、當進程創建一線程時,跟DLL_PROCESS_ATTACH區別
無論何時創建線程均會用此參數調用Dllmain
DLL_THREAD_DETACH 如果線程調用了ExitThread來結束線程(線程函數返回時,系統也會自動調用ExitThread),若是TerminateThread也不會調用DllMain.
這里選擇如下方式編寫DllMain函數
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
If ( fdwReason= =DLL_PROCESS_ATTACH) //加載dll時候調用DllMain
_beginthread(ThreadProc,0,NULL); //創建線程
return TRUE;
}
就是說當dll被加載的時候(LoadLirary)、在DllMain中實現創建ThreadProc線程函數、、而ThreadProc函數里邊是我們IAT HOOK的核心代碼、、
ThreadProc函數: 功能是 一個應用程序定義的函數作為一個線程的起始地址服務、
要Hook Messagebox需寫一個自己的Messagebox如下:
int __stdcall HookMBox(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption,UINT uType)
{
return MessageBox(NULL,"哈哈! HOOK到MessageBox了","HOOK",MB_OK); //證明一下Hook成功
}
在線程函數中完成我們的ITA HOOK的代碼:
1 獲取本進程的模塊基址 HANDLE pBegin = GetModuleHandle(NULL);
2 初始化PE結構得到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的內容當其與真正的MessageBox的地址相等時即可
真正的MessageBoxA的地址在程序之前得到即 DWORD RealBox = (DWORD)MessageBox、
while (pOriginalThunk->u1.Function) //記住是Function
{
PDWORD lpAddr = (DWORD *)( pBegin2+ (DWORD)IMPORT->FirstThunk);
if (*lpAddr = = RealBox)
{
找到后即找到了此PE的MessageBox在其IAT中的位置、接下來就是改之、
修改的內存的話首先內存的保護屬性必須可讀可寫所以使用以下幾個API
DWORD dwOLD;
MEMORY_BASIC_INFORMATION mbi;
//獲取需要修改的內存的信息存放于MEMORY_BASIC_INFORMATION結構
VirtualQuery (lpAddr, &mbi, sizeof(mbi));
//修改此內存保護屬性為并將原有的保護屬性存放于&dwOLD中
VirtualProtect (lpAddr, sizeof(DWORD), PAGE_READWRITE, &dwOLD);
//將咱自己的HookMBox函數的地址寫到此內存、
WriteProcessMemory (GetCurrentProcess(), lpAddr, &ADD, sizeof(DWORD), NULL);
//將保存的原有的內存保護屬性寫回去、、
VirtualProtect (lpAddr, sizeof(DWORD), dwOLD, 0 );
break;
}
pOriginalThunk++;
}
IMPORT++;
}
到此DLL文件編寫完畢、、后邊繼續記錄注入DLL(遠程線程技術、、)
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。