Windows HOOK總結 待完善

2021-09-29 01:29:47 字數 4936 閱讀 5261

安裝鉤子:

hhook winapi setwindowshookex(

\\1,鉤子型別

__in int idhook,

\\2,函式位址,即掛鉤型別事件發生時,系統應該呼叫的函式;

__in hookproc lpfn,

\\3,標識乙個dll,這個dll中包含第二個引數表示的函式;例項控制代碼

__in hinstance hmod,

\\4,執行緒id,0表示系統鉤子,0表示給所有gui執行緒安裝

__in dword dwthreadid);

//如果函式成功,則返回掛鉤執行緒的控制代碼.如果函式失敗,返回值為null.

//要獲取擴充套件錯誤資訊,請呼叫getlasterror

鉤子型別:

第乙個引數為鉤子的型別,鉤子的型別一共還有14種,表示在什麼時機呼叫鉤子。

常用鉤子型別有以下幾種:

(1)鍵盤鉤子和低階鍵盤鉤子可以監視各種鍵盤訊息。

(2)滑鼠鉤子和低階滑鼠鉤子可以監視各種滑鼠訊息。

(3)外殼鉤子可以監視各種shell事件訊息。比如啟動和關閉應用程式。

(4)日誌鉤子可以記錄從系統訊息佇列中取出的各種事件訊息。

(5)視窗過程鉤子監視所有從系統訊息佇列發往目標視窗的訊息。

例子:

#include "stdafx.h"

#include int _tmain(int argc, _tchar* ar**)

//__asm int 3;

/* * get the address of the function inside the dll.

*/ hookproc addr = (hookproc)getprocaddress(dll, "meconnect");

if(addr == null)

/** hook the function.

*/ hhook handle = setwindowshookex(wh_keyboard, addr, dll, 0);

if(handle == null)

/** unhook the function.

*/ printf("program successfully hooked,

\npress enter to unhook the function and stop the program.\n");

getchar();

unhookwindowshookex(handle);

return 0;

}

解除安裝鉤子:
bool winapi unhookwindowshookex(

_in_ hhook hhk

);

hook過程(原理):

略幾點說明:

1、如果對於同一事件(如滑鼠訊息)既安裝了執行緒鉤子又安裝了系統鉤子,那麼系統會自動先呼叫執行緒鉤子,然後呼叫系統鉤子。

2、對同一事件訊息可安裝多個鉤子處理過程,這些鉤子處理過程形成了鉤子鏈。當前鉤子處理結束後應把鉤子資訊傳遞給下乙個鉤子函式。

3、特別是系統鉤子會消耗訊息處理時間,降低系統效能。只有在必要的時候才安裝鉤子,在使用完畢後要及時解除安裝。

4、32位dll不能被注入到64位程序中,64位dll不能被注入到32位程序中。

5、呼叫callnexthookex函式鏈結到下乙個鉤子過程是可選的,但強烈建議; 否則,已安裝鉤子的其他應用程式將不會收到鉤子通知,因此可能會出現錯誤的行為。應該呼叫callnexthookex。

6、所有全域性鉤子函式都必須在庫中。

7、目標程序b必須先執行,安裝鉤子必須在目標程序執行之後,否則鉤子會失效。安裝全域性鉤子時,會將鉤子和當前系統的所有執行緒關聯起來。後面建立的執行緒當然就不在其列了。

8、a用loadlibrary載入val.dll時,兩者必須是同一種版本,即同為debug版或release版,否則會出現找不到目標檔案錯誤。

實際中使用最為廣泛的一種注入方式,它即可以精確指定需要注入的程序,又可以注入到非gui程式中。

dll注入指的是向執行中的其他程序強制插入特定的dll檔案,從而使之執行特定**。

dll注入基本過程:執行程式使其他程序呼叫loadlibrary()api,呼叫使用者指定的dll檔案,從而在loadlibrary()完成後,呼叫dll檔案中的dllmain()函式。

dll載入到程序後會自動執行dllmain()函式,使用者可以把想要執行的**放到dllmain()函式裡,每當該dll被載入時,新增的**就會被執行。利用該過程可以修復程式bug,編寫惡意dll等

winbaseapi

_ret_maybenull_

handle

winapi

createremotethread

(//執行緒所屬程序的程序控制代碼.

_in_ handle hprocess,

//乙個指向 security_attributes 結構的指標, 該結指定了執行緒的安全屬性.

_in_opt_ lpsecurity_attributes lpthreadattributes,

//執行緒初始大小,以位元組為單位,如果該值設為0,那麼使用系統預設大小.

_in_ size_t dwstacksize,

//在遠端程序的位址空間中,該執行緒的執行緒函式的起始位址.

_in_ lpthread_start_routine lpstartaddress,

//傳給執行緒函式的引數.

_in_opt_ lpvoid lpparameter,

執行緒的建立標誌.

_in_ dword dwcreationflags,

//指向所建立執行緒id的指標,如果建立失敗,該引數為null.

_out_opt_ lpdword lpthreadid

);//如果呼叫成功,返回新執行緒控制代碼

//如果失敗,返回null

第乙個引數指定新建立的執行緒歸哪個程序所有,其他引數和createthread相同。

winbaseapi

_ret_maybenull_ _post_writable_byte_size_

(dwsize)

lpvoid

winapi

virtualallocex

(//申請記憶體所在的程序控制代碼。

_in_ handle hprocess,

//保留頁面的記憶體位址;一般用null自動分配。

_in_opt_ lpvoid lpaddress,

//欲分配的記憶體大小,位元組單位;

//注意實際分配的記憶體大小是頁記憶體大小的整數倍

_in_ size_t dwsize,

//指定記憶體分配的方式,預定還是要提交

_in_ dword flallocationtype,

//指定應用程式讀寫的許可權,記憶體的保護屬性

_in_ dword flprotect

);

htargeprocess =

openprocess

(process_all_access, false, dwprocessid)

;// dwprocessid為被注入目標程序的程序idif(

!htargeprocess)

size_t dllpathsize =

strlen

(pszdllpath)

;// pszdllpath儲存了dll的路徑

pvm4dllpath =

virtualallocex

(htargeprocess,

null

, dllpathsize, mem_reserve | mem_commit, page_execute_readwrite);if

(!pvm4dllpath)if(

!writeprocessmemory

(htargeprocess, pvm4dllpath, pszdllpath, dllpathsize,

null))

遠端執行緒注入步驟:

1、用virtualallocex函式在遠端程序申請空間。

2、用writeprocessmemory函式把dll的路徑複製到申請的記憶體。

3、用getprocessaddress函式得到loadlibraryw(loadlibrarya)函式(kernel32.dll)中實際位址。

4、用createrenotethread函式在遠端執行緒建立乙個執行緒,讓新的執行緒呼叫loadlibrary函式並在引數中傳入第一步分配給的記憶體位址。這時dll就被注入到了遠端程序位址空間,dll函式dllmain會就收觸發事件,然後執行我們需要執行的**,dllmain返回時遠端執行緒會從loadlibraryw(loadlibrarya)呼叫返回到basethreadstart函式。basethreadstart然後呼叫exitthread,使遠端執行緒終止。

5、需要清理申請的空間,遠端執行緒還在目標程序位址空間。

6、用virtualfreeex釋放申請的記憶體。

7、用getprocessaddress得到freelibrary函式在kernel32.dll中的實際位址。

取消注入:

pthread_start_routine pfnthreadrtn =

(pthread_start_routine)

getprocaddress

(getmodulehandle

(text

("kernel32"))

,"freelibrary");

if(pfnthreadrtn)

幾點說明:

記錄,待總結

1.關於函式位址 class a void h virtual void g 0 int main mike jack 4.乙個類的成員變數列表中包含另乙個類的物件,叫做包含 包容 10.傳遞陣列的3種方式 1 void func int a 2 void func int a 5 3 void f...

待總結 IOCP相關

i o完成佇列 先進先出 q1 等待執行緒佇列 後進先出 q2 已釋放執行緒列表 活動執行緒 l1 已暫停執行緒列表 掛起執行緒 l2 1.當執行緒呼叫getqueuedcompletionstatus阻塞時,該執行緒被放入等待執行緒佇列q2中。io 完成埠核心物件根據此佇列知道有哪些執行緒在等待處...

優化總結 待完善

sql優化 1.變數在外部解析通常要比在sql內部解析要快 name 1 sql select from user where name name sql select from user where name name.字串優化 1.包裹字串單引號與雙引號的區別 通常來說,單引號是不解析變數的,而...