一.註冊表注入
AppInit_DLLs值在以下註冊表項中找到:
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Windows
在此值中指定的所有 Dll 都被加載的每個基於 Windows 的應用程序中。當User32.dll被影射到一個新的進程的時候,會收到DLL_PROCESS_ATTACH通知。User32.dl會取得上述註冊表鍵的值,並調用LOadlibrary 來載入這個字符串中制定的所有DLL。只有加載User32.dll的應用程序纔會使用到上述的註冊表來注入DLL 。U我們的DLL只會被影射到那些使用了User32.dll的進程中,所有基於GUI的應用程序都使用了User32.dll,但大多數CUI應用程序沒有使用User32.dll。
二.使用windows掛鉤(hook)注入
調用SetWindowsHookEx函數來安裝掛鉤:
ex: HHOOK hHook = SetWindowsHookEx(WH_GETMESSAGE,GetMsgProc,hInstDll,0);
第一個參數表示安裝掛鉤類型:可以參考:
Hook | Scope |
---|---|
WH_CALLWNDPROC | Thread or global |
WH_CALLWNDPROCRET | Thread or global |
WH_CBT | Thread or global |
WH_DEBUG | Thread or global |
WH_FOREGROUNDIDLE | Thread or global |
WH_GETMESSAGE | Thread or global |
WH_JOURNALPLAYBACK | Global only |
WH_JOURNALRECORD | Global only |
WH_KEYBOARD | Thread or global |
WH_KEYBOARD_LL | Global only |
WH_MOUSE | Thread or global |
WH_MOUSE_LL | Global only |
WH_MSGFILTER | Thread or global |
WH_SHELL | Thread or global |
WH_SYSMSGFILTER | Global only |
第二個參數是一個函數的地址,第三個參數標示一個DLL,這個DLL包含這第二個參數指定的函數,第四個參數爲線程ID。
例:進程Pa安裝了掛鉤,當第一個參數爲WH_GETMESSAGE,當進程pb中的一個線程準備向一個窗口發送消息會:
- 系統檢測該進程是否安裝了WH_GETMESSAGE掛鉤
- 系統檢測GetMsgProc所在的DLL是否被影射到該進程(pb)的地址空間中
- 如果尚未被影射,那麼系統會強制將該DLL影射到該進程(pb)中並將該進程中該DLL的鎖計數器遞增