HOOK鉤子技術2 內聯鉤子Inline HOOK 通過DLL注入
阿新 • • 發佈:2019-02-05
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
生成的子程式。