freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

apihook完全手冊-資料下載頁

2025-06-25 06:00本頁面
  

【正文】 S_NOTIFY_ROUTINE,其定義為:VOID(*PCREATE_PROCESS_NOTIFY_ROUTINE) (IN HANDLE ParentId,IN HANDLE ProcessId,IN BOOLEAN Create)。ParentId和ProcessId用來標識進程,Create則是用來表示該進程是正在被創(chuàng)建還是正在被結(jié)束。這樣,每當進程被創(chuàng)建或者結(jié)束的時候,操作系統(tǒng)就會立刻調(diào)用NotifyRoutine這個回調(diào)函數(shù)并正確提供參數(shù)。,屬于Windows的內(nèi)核空間,因此必須編寫一個處于內(nèi)核模式的驅(qū)動程序才可以。但是,至此問題并沒有完全解決。內(nèi)核模式的驅(qū)動程序和用戶模式的主程序如何通訊呢?這里就需要用到IO請求包IRP(IO Request Packet)。這個IRP的定義為:typedef struct _CallbackInfo{HANDLE hParentId。HANDLE hProcessId。BOOLEAN bCreate。} CALLBACK_INFO, *PCALLBACK_INFO。其字段的意義就和PCREATE_PROCESS_NOTIFY_ROUTINE一樣,不再贅述。用戶模式的程序通過DeviceIoControl函數(shù)發(fā)送IO請求包到內(nèi)核模式的驅(qū)動。內(nèi)核模式接收到此請求包,并填寫數(shù)據(jù)到用戶程序所提供的CALLBACK_INFO緩沖區(qū)里。這樣通過檢查CALLBACK_INFO的值就可以知道hProcessId所指定的進程是正在被創(chuàng)建或者結(jié)束了。雖然有了數(shù)據(jù)交換的機制,這還是不夠。這樣只能告訴用戶程序究竟是哪一個進程,是創(chuàng)建還是結(jié)束,但是無法通知用戶程序此事件的發(fā)生。通常,通知某個程序某個事件的發(fā)生一般的方法是使用事件(Event)。驅(qū)動程序創(chuàng)建一個內(nèi)核事件(Kernel Event)。用戶程序打開這個事件用于同步。每當事件發(fā)生的時候驅(qū)動程序就首先把該事件設(shè)置為Signaled,然后再Nonsignaled。這樣用戶程序就可以接收到通知了。但是為什么需要首先設(shè)置為Signaled,然后再Nonsignaled?因為用戶程序沒有權(quán)限來設(shè)置其狀態(tài),因此只能由驅(qū)動程序來設(shè)置,首先設(shè)置為Signaled,然后再Nonsignaled是唯一的辦法。有了這兩種方法,就可以掛接操作系統(tǒng)中的所有進程了。首先,主線程調(diào)用CreateToolhelp32Snapshot函數(shù)創(chuàng)建系統(tǒng)內(nèi)所有進程的快照,掛接這些進程,然后啟動驅(qū)動程序,在主程序中啟動一個新線程等待Event來監(jiān)視新的進程的創(chuàng)建和舊進程的結(jié)束。驅(qū)動程序的代碼和監(jiān)聽的代碼可以在。5 其他問題 Unicode大部分Windows API均有兩個版本:Ansi和Unicode。如GetWindowText API實際上只是一個宏,實際上在不同編譯選項下對應(yīng)GetWindowTextA和GetWindowTextW。在NT系統(tǒng)下,GetWindowTextA只是做一個轉(zhuǎn)換,再調(diào)用GetWindowTextW,實際的實現(xiàn)在GetWindowTextW中。因此,掛接API必須要Hook兩個版本,實際在Hook的時候,我們也可以仿照Windows的做法,讓GetWindowTextA做一個簡單字符串轉(zhuǎn)換,然后直接調(diào)GetWindowTextW即可。可能有朋友要問了,為何不直接Hook GetWindowTextW呢?反正GetWindowTextA要調(diào)GetWindowTextW就不用Hook GetWindowTextA了嘛。不過實際上,因為GetWindowTextA和GetWindowTextW在同一個DLL中,他們的調(diào)用很有可能并不是通過IAT來,而是直接調(diào)用的關(guān)系,所以GetWindowTextA會繞過我們的Hook機制而直接調(diào)到原始的GetWindowTextW,這不是我們希望看到的,所以兩個版本保險起見都應(yīng)該Hook。 IPC由于Hook的API代碼位于某個DLL中,這個DLL處于不同的進程,因此需要用到IPC機制在主程序和其他被Hook的進程進行通訊。不同進程之間的通訊稱之為IPC(Interprocess Communication),大概的方法有下面幾種:1. Pipe。管道是比較常用的IPC機制,可以傳輸大量數(shù)據(jù),代碼寫起來也比較方便。管道也可以用于網(wǎng)絡(luò)間不同計算機通訊,但是有一定限制。2. Socket。雖然Socket一般用于網(wǎng)絡(luò),但是顯然也可以用于本機,優(yōu)點是大家可能對Socket編程比較熟悉,此外可以很容易擴展到網(wǎng)絡(luò)之間的通訊,基本沒有限制,因此也是很不錯的選擇。3. Message。消息一般適用于比較簡單的通訊,如果要傳遞數(shù)據(jù)必須要使用WM_COPYDATA消息。優(yōu)點是比較簡單,但是性能可能無法保證。4. Shared Segment。也就是共享段。簡單來說,就是把EXE/DLL中的某個段標記為共享,這樣多個EXE/DLL的實例之間會共享同一塊內(nèi)存,通過讀寫此塊內(nèi)存便可以互相傳遞數(shù)據(jù),但是同步比較困難。具體做法是:pragma bss_seg(shared_bss)int a。pragma bss_seg()pragma ment(linker, /Section:shared_bss,rws)這樣,變量a便放在了共享段之中。5. Memory Mapped File(內(nèi)存映射文件)。比較簡單,但是缺點和Shared Segment類似,無法同步。6. Event/Semaphore/Mutex。這些只能用于同步,無法傳遞數(shù)據(jù)。7. …還有很多可以根據(jù)自己的情況靈活選用。6 總結(jié)API Hook的通常做法如下:1. 通過全局消息鉤子或者驅(qū)動程序監(jiān)視進程啟動/結(jié)束來掛接系統(tǒng)中所有進程a. 如果不需要掛接CUI程序則選用全局消息鉤子b. 否則則選用驅(qū)動程序2. 通過全局消息鉤子或者遠程線程來注入代碼到目標進程中a. 全局消息鉤子無需考慮如何加載DLL的問題,系統(tǒng)會自動加載b. 遠程線程一般直接創(chuàng)建線程執(zhí)行LoadLibrary代碼加載DLL,當然也可以執(zhí)行自己寫的匯編代碼3. 通過修改IAT (Import Address Table)中的API地址為自己的函數(shù)地址來Hook API。所使用的API是ImageDirectoryEntryToData.4. 自己編寫的API的代碼放在DLL中以解決重定位問題(如果用全局消息鉤子的話放在DLL是強制要求)7 相關(guān)參考文獻我當初在寫程序和寫作本文的時候,參考了下面這些書籍和文章,有興趣的朋友可以參考一下看看:Windows核心編程,第22章Windows環(huán)境下32位匯編語言程序設(shè)計,第13章,17章API Hooking Revealed, 地址:Detecting Windows NT/2K process execution, 地址
點擊復制文檔內(nèi)容
法律信息相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1