1. 程式人生 > >HOOK鉤子技術2 內聯鉤子Inline HOOK 通過DLL注入

HOOK鉤子技術2 內聯鉤子Inline HOOK 通過DLL注入

dll注入很有意思,它最大的優勢在於一旦這個dll被注入,就可以訪問宿主程式整個記憶體空間。因此直接的操作dll是可以達到間接操作目標宿主程式的作用。

這次繼續使用CILHook類,不過這次是在目標程式內使用,而不是像1一樣自己跟自己玩。建立一個windows dynamic library。原始碼如下:

// inlineDLL.cpp : Defines the entry point for the DLL application.
//
#include "ILHook.h"

CILHook hooker;

BOOL WINAPI myCreateProcess(
                            LPCWSTR               lpApplicationName,
                            LPWSTR                lpCommandLine,
                            LPSECURITY_ATTRIBUTES lpProcessAttributes,
                            LPSECURITY_ATTRIBUTES lpThreadAttributes,
                            BOOL
bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCWSTR lpCurrentDirectory, LPSTARTUPINFOW lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation ) { BOOL
bRet = false; hooker.UnHook(); MessageBoxW(NULL,lpApplicationName,lpCurrentDirectory,MB_OK); bRet = CreateProcessW( lpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes, bInheritHandles, dwCreationFlags, lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation ); hooker.ReHook
(); return bRet; } BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: hooker.Hook("kernel32.dll","CreateProcessW",(PROC)myCreateProcess); break; case DLL_PROCESS_DETACH: break; case DLL_THREAD_ATTACH: break; case DLL_THREAD_DETACH: break; } return TRUE; }

DLL注入器注入到explorer.exe中,就可以執行MessageBox了。讓然這個注入器你也可以自己寫。

做實驗的時候遇到兩個問題:
1. DLL只能生成debug 版本,不能生成release 版本,我使用的是vc6.0 。想著可能是太老了,用vs2008 但是卻曝出了很多字元型別轉化這樣的錯誤,改天找找原因吧。
2. CreateProcessW 是從msdn 上直接copy過來的,但是還是引數型別要跟著變,VC6.0之後微軟的字元處理髮生了很大的變化。

總而言之,有時候你對微軟這些大牛的邏輯很服,但是有時候你又覺得他們格格不入,就像是醫生開的藥方寫的草書,只有他們內部人看的懂,我說的是很多莫名其妙的巨集定義和一大堆的別名,對於新手而言真是折磨。

做完實驗也可以看出,通過點選圖示開啟的程式,其實是explorer.exe呼叫了CreateProcess 生成的子程式。