EasyHook遠端程序注入並hook api的實現
介紹:HOOK API是指截獲特定程序或系統對某個API函式的呼叫,使得API的執行流程轉向指定的程式碼。Windows下的應用程式都建立在API函式至上,所以截獲API是一項相當有用的技術,它使得使用者有機會干預其它應用程式的程式流程。
最常用的一種掛鉤API的方法是改變目標程序中呼叫API函式的程式碼,使得它們對API的呼叫變為對使用者自定義函式的呼叫。
HOOK API和HOOK技術完全不同。儘管它們都是鉤子。HOOK鉤的是訊息,它在系統將訊息傳遞給應用程式之前截獲它,然後進行操作、或修改訊息、或停止訊息的傳遞;而HOOK API截獲的是應用程式對系統API的呼叫,它在應用程式對系統API的呼叫之前截獲此呼叫動作,讓其轉而呼叫我們所定義的函式(內容可能是進行一些操作後再呼叫原系統API)。
EasyHook提供了兩種模式的注入管理。一種是託管程式碼的注入,另一種是非託管程式碼的注入。我是學習C++的,所以直接學習了例子中的非託管專案UnmanagedHook。裡面給了一個簡單的掛鉤MessageBeep API的示例,但是其遠端注入的例子在執行過程中出錯(我用的是VS2005)。我需要將其改造成支援遠端注入的。
整個過程比較複雜我先把各個程式功能介紹一下:
1.三個程式。
qt_playSound.exe,目標程式,是我們要hook的程式示例,用qt編寫的,主要呼叫了
PlaySound(TEXT("d:\\Ding.wav"),NULL,SND_FILENAME|SND_ASYNC/*|SND_LOOP*/);
hookdll.dll,鉤子所在,hook的程式碼及我們自己的 MyPlaySoundW(LPCWSTR pszSound, HMODULE hwnd,DWORD fdwSound)的實現
inject.exe遠端注入程式,用來把hookdll.dll 注入到qt_playSound.exe程序中。
2.功能
qt_playSound.exe執行過程中呼叫PlaySoundW這個系統API,我們實現對這個API的hook,當PlaySoundW被呼叫時,先轉到我們hookdll.dll中的MyPlaySoundW。
具體原始碼下載: http://download.csdn.net/detail/v6543210/8503153