用hook實現dll注入詳解

2021-08-29 06:23:43 字數 2451 閱讀 2086

需要乙個用來注入的dll(inject.dll)及乙個呼叫程式(caller.exe)

流程:caller.exe

procedure testhook;

var pwnd,hchild, hwndinject :hwnd;

msg:tmsg;

begin

//通過視窗標題用findwindow找到要注入的程式的主視窗控制代碼pwnd

pwnd := findwindow('progman',nil);

//用findwindowex(hmain,0,nil,nil)找到要處理的子視窗控制代碼hchild

hchild := findwindowex(pwnd,0,nil,nil);

//用getwindowthreadprocessid(hchild,nil)找到要注入的執行緒

dwthreadid := getwindowthreadprocessid(hchild,nil);

//呼叫 inject.dll的setinjecthook方法

setinjecthook(dwthreadid);

//卻⒎禱?br>   getmessage(msg,0,0,0);

//找到注入的視窗

hwndinject:= findwindow(nil,'injectform');

//傳送控制訊息,將目標窗體的控制代碼作為wparam,控制引數以lparam傳入

//關閉注入的視窗

sendmessage( hwndinject,wm_close,0,0);

//等待視窗關閉

sleep(500);

//檢查是否成功關閉

assert(not iswindow( hwndinject));

//去掉掛鉤

setdipshook(0);

end;  

//下面說明 inject.dll的setinjecthook的具體操作

在全域性定義以下變數

varg_hhook :hhook=0;

g_dwthreadidinject :dword=0;

g_hinjectfrm:hwnd;

function setinjecthook(dwthreadid:dword):boolean;

begin

result := false;

//如果執行緒標誌為0則用於去掉鉤子,否則進行動態庫注入

if dwthreadid<>0 then

begin

assert(g_hhook=0);

//儲存當前執行緒的id到 g_dwthreadidinject

g_dwthreadidinject := getcurrentthreadid;

//下乙個getmessage的鉤子到目標執行緒

//getmsgproc是在下面定義的乙個函式,在第一次呼叫時將自定義的form在目標執行緒中建立出來

//這樣就能通過這個自定義的form對目標執行緒進行程序內控制了

g_hhook := setwindowshookex(wh_getmessage,getmsgproc,hinstance,dwthreadid);

result := g_hhook <> null;

if result then

//發乙個空的資訊以便於立即建立這個自定義form

result := postthreadmessage(dwthreadid, wm_null,0,0);

//等待半秒鐘,以保證呼叫者可以找到這個剛建立的form

sleep(500);

end else

begin

assert(g_hhook<>0);

//去掉鉤子

result := unhookwindowshookex(g_hhook);

g_hhook := 0;

end;

end;

//定義乙個全域性的是否第乙個訊息的標誌

varffirsttime:boolean = true;

//這個函式用於在收到第乙個訊息時建立自定義窗體,以便於遠端控制

function getmsgproc(code: integer; wparam: wparam; lparam: lparam): lresult; stdcall;

begin

//如果是第一次

if ffirsttime then

begin

ffirsttime := false;

//建立窗體

injectfrm := tinjectfrm.create(nil);

//儲存窗體控制代碼

g_hinjectfrm := injectfrm.handle;

end;

//呼叫預設處理,這一句可不能忘記

result := callnexthookex(g_hhook,code,wparam,lparam);

end;

用hook實現dll注入詳解

需要乙個用來注入的dll inject.dll 及乙個呼叫程式 caller.exe 流程 caller.exe procedure testhook var pwnd,hchild,hwndinject hwnd msg tmsg begin 通過視窗標題用findwindow找到要注入的程式的主...

用hook實現dll注入詳解

下面說明 inject.dll的setinjecthook的具體操作 在全域性定義以下變數 varg hhook hhook 0 g dwthreadidinject dword 0 g hinjectfrm hwnd function setinjecthook dwthreadid dword ...

用hook實現dll注入詳解

該日誌由傻貓發表於 2010 07 21 13 00 31 需要乙個用來注入的 dll inject.dll 及乙個呼叫程式 caller.exe 流程 caller.exe procedure testhook var pwnd,hchild,hwndinject hwnd msg tmsg be...