安裝鉤子:
鉤子型別: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;
}
hook過程(原理):bool winapi unhookwindowshookex(
_in_ hhook hhk
);
略幾點說明:
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等
第乙個引數指定新建立的執行緒歸哪個程序所有,其他引數和createthread相同。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
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.包裹字串單引號與雙引號的區別 通常來說,單引號是不解析變數的,而...