第9章 動態(tài)鏈接庫和鉤子_第1頁
第9章 動態(tài)鏈接庫和鉤子_第2頁
第9章 動態(tài)鏈接庫和鉤子_第3頁
第9章 動態(tài)鏈接庫和鉤子_第4頁
第9章 動態(tài)鏈接庫和鉤子_第5頁
已閱讀5頁,還剩33頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第9章動態(tài)鏈接庫和鉤子9.1動態(tài)鏈接庫9.2Windows鉤子9.3掛鉤API技術(shù)9.1動態(tài)鏈接庫動態(tài)鏈接庫的概念進(jìn)程與模塊DLL中的函數(shù)實(shí)驗(yàn)使用導(dǎo)出函數(shù)動態(tài)鏈接庫的概念動態(tài)鏈接庫是應(yīng)用程序的一個模塊,這個模塊的作用是導(dǎo)出一些函數(shù)和數(shù)據(jù)供程序中其他模塊使用動態(tài)鏈接庫是程序的一部分,它在本質(zhì)上和可執(zhí)行文件沒有區(qū)別,都是作為模塊被進(jìn)程加載到自己的地址空間。(dll是進(jìn)程的一個模塊,exe也是進(jìn)程的一個模塊)Dll在exe編譯階段不會被插到exe中,dll是在程序運(yùn)行時才會掉入內(nèi)存,具體分為裝載期和運(yùn)行期。如果有多個程序用到同一個dll,內(nèi)存中只有一個dll,大家共享它。os僅通過分頁機(jī)制將這份代碼映射到不同的進(jìn)程中。動態(tài)鏈接庫的概念動態(tài)鏈接庫通常都不能直接運(yùn)行,也不能接收消息。它們是一些獨(dú)立的文件,其中包含能被可執(zhí)行程序或其它DLL調(diào)用來完成某項(xiàng)工作的函數(shù)。只有在其它模塊調(diào)用動態(tài)鏈接庫中的函數(shù)時,它才發(fā)揮作用。WindowsAPI中的所有函數(shù)都包含在DLL中。其中有3個最重要的DLL,Kernel32.dll,它包含用于管理內(nèi)存、進(jìn)程和線程的各個函數(shù);User32.dll,它包含用于執(zhí)行用戶界面任務(wù)(如窗口的創(chuàng)建和消息的傳送)的各個函數(shù);GDI32.dll,它包含用于畫圖和顯示文本的各個函數(shù)。動態(tài)鏈接庫的概念靜態(tài)庫:函數(shù)和數(shù)據(jù)被編譯進(jìn)一個二進(jìn)制文件(通常擴(kuò)展名為.LIB)。在使用靜態(tài)庫的情況下,在編譯鏈接可執(zhí)行文件時,鏈接器從庫中復(fù)制這些函數(shù)和數(shù)據(jù)并把它們和應(yīng)用程序的其它模塊組合起來創(chuàng)建最終的可執(zhí)行文件(.EXE文件)。在使用動態(tài)庫的時候,往往提供兩個文件:一個引入庫和一個DLL。引入庫包含被DLL導(dǎo)出的函數(shù)和變量的符號名,DLL包含實(shí)際的函數(shù)和數(shù)據(jù)。在編譯鏈接可執(zhí)行文件時,只需要鏈接引入庫,DLL中的函數(shù)代碼和數(shù)據(jù)并不復(fù)制到可執(zhí)行文件中,在運(yùn)行的時候,再去加載DLL,訪問DLL中導(dǎo)出的函數(shù)。動態(tài)鏈接庫的優(yōu)點(diǎn)可以采用多種編程語言來編寫。增強(qiáng)產(chǎn)品的功能。提供二次開發(fā)的平臺。簡化項(xiàng)目管理。可以節(jié)省磁盤空間和內(nèi)存。有助于資源的共享。有助于實(shí)現(xiàn)應(yīng)用程序的本地化。Windows提供的某些特性只有DLL才能使用動態(tài)鏈接庫被多個進(jìn)程訪問代碼頁面2代碼頁面1數(shù)據(jù)頁面2代碼頁面3數(shù)據(jù)頁面1DLL的虛擬內(nèi)存代碼頁面2代碼頁面1數(shù)據(jù)頁面2代碼頁面3數(shù)據(jù)頁面1代碼頁面2代碼頁面1代碼頁面2代碼頁面3數(shù)據(jù)頁面1數(shù)據(jù)頁面2代碼頁面2代碼頁面2代碼頁面3數(shù)據(jù)頁面1數(shù)據(jù)頁面2代碼頁面1第一個進(jìn)程的地址空間第二個進(jìn)程的地址空間動態(tài)鏈接庫的概念動態(tài)鏈接庫的形式可以是:dll,exe,ocx(控件)等等。進(jìn)程與模塊一個進(jìn)程可包含多個模塊模塊可以是exe,dll,lib,ocx等進(jìn)程執(zhí)行離不開這些模塊的支持,其中exe為進(jìn)程的主模塊進(jìn)程模塊exe模塊dll模塊dllDllMain DllMain是動態(tài)鏈接庫的入口點(diǎn)。庫的入口函數(shù)僅供os使用,windows在庫裝載、卸載、進(jìn)程中創(chuàng)建和結(jié)束線程時調(diào)用DllMain,以便采取相應(yīng)的動作。BOOLAPIENTRYDllMain(HANDLEhModule,//本模塊句柄

DWORDul_reason_for_call,//調(diào)用的原因

LPVOIDlpReserved//保留

){switch(ul_reason_for_call) { caseDLL_PROCESS_ATTACH:dll加載時

caseDLL_THREAD_ATTACH:創(chuàng)建新線程時

caseDLL_THREAD_DETACH:新線程正常結(jié)束時

caseDLL_PROCESS_DETACH:dll卸載時 break;}returnTRUE;}Dll中的函數(shù)Dll能夠定義兩種函數(shù),導(dǎo)出函數(shù)和內(nèi)部函數(shù)。導(dǎo)出函數(shù)可以被其他模塊調(diào)用,以可以被定義這個函數(shù)的模塊調(diào)用內(nèi)部函數(shù)只能被定義這個函數(shù)的模塊調(diào)用動態(tài)鏈接庫的主要功能是向外導(dǎo)出函數(shù),供進(jìn)程中的其他模塊使用編寫動態(tài)鏈接庫程序例子:.cpp

.h#ifdefDLLDEMO_EXPORTS#defineDLLDEMO_API__declspec(dllexport)#else#defineDLLDEMO_API__declspec(dllimport)#endif一個項(xiàng)目預(yù)定義宏在項(xiàng)目\設(shè)置\C++\Preprocessor\definition定義在DLL的CPP中,#include.h,里面有函數(shù)聲明為__declspec(dllexport),而在調(diào)用工程中的cpp中,也#include.h,里面需要將函數(shù)聲明為__declspec(dllimport),所以,就要求一個聲明具有兩個含義,所以就用到了條件預(yù)定義來解決。在dll工程中,自動預(yù)定義了DLLDEMO_EXPORTS,而調(diào)用方的工程里,是沒有DLLDEMO_EXPORTS預(yù)定義的。問題得以解決。實(shí)驗(yàn)實(shí)驗(yàn)1:利用向?qū)桑y試實(shí)驗(yàn)2:隱式加載使用#pragmacomment(lib,"dlldemo")使用工程配置Lib文件,h文件,dll文件的復(fù)制路徑使用函數(shù)、全局變量、類實(shí)驗(yàn)3:顯示加載實(shí)驗(yàn)4:dllexport的解釋,驗(yàn)證工程預(yù)定義宏使用導(dǎo)出函數(shù)裝載期間動態(tài)鏈接:API函數(shù)就是這樣調(diào)用的。編譯期必須提供.h和.lib,運(yùn)行時必須提供.dll,與exe在同一個目錄下或者在system32下運(yùn)行期間動態(tài)鏈接:編譯器無需.h和.lib,在程序中顯式的加載dll使用導(dǎo)出函數(shù)裝載期間動態(tài)鏈接(隱式加載)例子運(yùn)行期間動態(tài)鏈接(顯式加載)例子HANDLEHMODULEHINSTANCEHWND有什么區(qū)別? Handle是代表系統(tǒng)的內(nèi)核對象,如文件句柄,線程句柄,進(jìn)程句柄。HMODULE是代表應(yīng)用程序載入的模塊,win32系統(tǒng)下通常是被載入模塊的線性地址。HINSTANCE在win32下與HMODULE是相同的東西,在Win32下還存在主要是因?yàn)閣in16程序使用HINSTANCE來區(qū)別task。HWND是窗口句柄。補(bǔ)充一點(diǎn):系統(tǒng)對內(nèi)核對象以鏈表的形式進(jìn)行管理,載入到內(nèi)存中的每一個內(nèi)核對象都有一個線性地址,同時相對系統(tǒng)來說,在串列中有一個索引位置,這個索引位置就是內(nèi)核對象的handle.HMODULE是一種特殊的handle他只對于exe,dll等模塊9.2Windows鉤子鉤子的概念鉤子的安裝與卸載鍵盤鉤子實(shí)例鉤子的概念Hook是Windows消息處理機(jī)制中的一個監(jiān)視點(diǎn)應(yīng)用程序可以在系統(tǒng)中安裝一個鉤子,以監(jiān)視指定窗口某種類型的消息監(jiān)視的窗口可以是其他進(jìn)程創(chuàng)建的當(dāng)消息到達(dá)后,目標(biāo)窗口處理函數(shù)處理之前,鉤子首先截獲它,并進(jìn)行處理。截獲消息后,用于處理消息的子程序叫做鉤子函數(shù)。系統(tǒng)中同一時間可能有多個進(jìn)程安裝鉤子,在處理截獲到的消息時,應(yīng)把消息事件傳遞下去,以便其他鉤子有機(jī)會處理這一消息。鉤子的安裝與卸載使用SetWindowsHookEx函數(shù)可以把應(yīng)用程序定義的鉤子函數(shù)HHOOKSetWindowsHookEx(IntidHook,//指定鉤子的類型

HOOKPROClpfn,//鉤子函數(shù)地址

HINSTANCEhMod,//鉤子函數(shù)所在dll句柄

DWORDdwThreadId//被監(jiān)視線程ID);任何線程只要注冊了窗口類,都會有一個消息隊(duì)列,用來接受各種消息如果監(jiān)視其他進(jìn)程,鉤子函數(shù)必須寫到dll中鉤子函數(shù)LRESULTCALLBACKHookProc(intnCode,//Hook代碼,用來確定任務(wù),它的值依賴于Hook的類型WPARAMwParam,LPARAMlParam//wParam,lParam的值依賴于Hook代碼){ …//處理消息的代碼

return::CallNextHookEx(hHook,nCode,wParam,lParam);}卸載鉤子BOOLUnhookWindowsHookEx(HHOOKhhk);鍵盤鉤子實(shí)例動態(tài)鏈接庫工程Win32應(yīng)用程序工程9.3掛鉤API技術(shù) HOOKAPI是指截獲特定進(jìn)程或系統(tǒng)對某個API函數(shù)的調(diào)用,使得API的執(zhí)行流程轉(zhuǎn)向指定的代碼。

最常用的一種掛鉤API的方法是改變目標(biāo)進(jìn)程中調(diào)用API函數(shù)的代碼,使得它們對API的調(diào)用變?yōu)閷τ脩糇远x函數(shù)的調(diào)用實(shí)現(xiàn)原理Windows應(yīng)用程序有自己的地址空間,它們只能調(diào)用自己地址空間中的函數(shù),所以在掛鉤API之前,必須將一個可以代替API執(zhí)行的函數(shù)的執(zhí)行代碼注入到目標(biāo)進(jìn)程,然后再想辦法將目標(biāo)進(jìn)程對該API的調(diào)用改為對注入到目標(biāo)進(jìn)程中自定義函數(shù)的調(diào)用。比較簡單的方法是把要注入的代碼寫到DLL中,然后讓目標(biāo)進(jìn)程加載這個DLL。還可以趁著DLL在目標(biāo)進(jìn)程中初始化的機(jī)會去創(chuàng)建新的線程。使用鉤子注入DLL在成功調(diào)用SetWindowsHookEx函數(shù)安裝系統(tǒng)范圍內(nèi)的鍵盤鉤子之后,Windows在內(nèi)部自動對每個接收鍵盤輸入的進(jìn)程調(diào)用LoadLibrary函數(shù),強(qiáng)迫它們加載包含鉤子函數(shù)執(zhí)行代碼的模塊09KeyHookLib.dll。使用Windows鉤子注入特定DLL到其他進(jìn)程時一般都安裝WH_GETMESSAGE鉤子,而不是安裝WH_KEYBOARD鉤子。使用鉤子注入DLL如果要將DLL注入到特定進(jìn)程中,一般是將該進(jìn)程中主線程的線程ID傳遞給SetWindowsHookEx函數(shù)如果要將DLL注入到所有進(jìn)程中,安裝一個系統(tǒng)范國內(nèi)的鉤子即可。使用注冊表注入DLL為了插入一個DLL到鏈接系統(tǒng)模塊User32.dll,可以簡單地向下面的注冊表鍵下添加鍵值數(shù)據(jù).HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Windows\AppInit_DLLs鍵值數(shù)據(jù)可以是單一的DLL名稱,也可以是逗號或空格間隔的DLL集合.使用注冊表注入DLL僅對使用User32.dll的應(yīng)用程序有效,僅被被Windows2000系列的操作系統(tǒng)直持.不足:為了激活/取消對進(jìn)程的插入

,不得不重新啟動Windows.插入的DLL僅能被映射到使用User32.dll的進(jìn)程編程者不能對插入動作進(jìn)行任何控制使用遠(yuǎn)程線程注入DLL主要使用創(chuàng)建遠(yuǎn)程線程的函數(shù)CreateRemoteThreadHANDLECreateRemoteThread(HANDLEhProcess,//目標(biāo)進(jìn)程句柄LPSECURITY_ATTRIBUTESlpThreadAttributes,//SDSIZE_TdwStackSize,//initialstacksize

LPTHREAD_START_ROUTINElpStartAddress,//目標(biāo)進(jìn)程中線程入口地址LPVOIDlpParameter,//threadargumentDWORDdwCreationFlags,//creationoptionLPDWORDlpThreadId//threadidentifier);使用遠(yuǎn)程線程注入DLLDWORDWINAPIThreadProc(LPVOID);HMODULEWINAPILoadLibrary(LPCTSTRlpFileName);使用遠(yuǎn)程線程注入DLL要使用遠(yuǎn)程線程技術(shù)有3個條件:確保當(dāng)前進(jìn)程有足夠的權(quán)限可以使用OpernProcess打開目標(biāo)進(jìn)程。線程函數(shù)過程存在于目標(biāo)進(jìn)程地址空間待執(zhí)行的函數(shù)過程的

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論