用hook實現dll注入詳解

2022-07-24 11:51:10 字數 2745 閱讀 8673

該日誌由傻貓發表於

2010-07-21 13:00:31

需要乙個用來注入的

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);

//等待訊息返回

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注入詳解

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