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

正文內(nèi)容

基于windows進(jìn)程狀態(tài)提取與恢復(fù)的研究畢業(yè)論文(參考版)

2025-03-02 10:52本頁面
  

【正文】 。j8。ipFileHeaderNumberOfSections。 //區(qū)塊表 IMAGE_SECTION_HEADER * pSecHeader = (IMAGE_SECTION_HEADER *)(((LPBYTE)pOptHeader) + pFileHeaderSizeOfOptionalHeader)。 //兩者均可,取得選擇頭 32 //IMAGE_OPTIONAL_HEADER * pOptHeader =(IMAGE_OPTIONAL_HEADER *)((BYTE*)hMod + pDosHeadere_lfanew + 24)。 // IMAGE_FILE_HEADER * pFileHeader=(IMAGE_FILE_HEADER *)((BYTE*)pNTHeader+sizeof(pNTHeaderSignature))。 if(pNTHeaderSignature !=0x4550) return false。 if(pDosHeadere_magic !=0x5a4d) return false。通過PE文件來定位節(jié)的位置和保存數(shù)據(jù)。 進(jìn)程恢復(fù)時,由于重新啟動進(jìn)程,所以程序運(yùn)行過程中動態(tài)分配的區(qū)域不復(fù)存在。靜態(tài)數(shù)據(jù)區(qū)與位置在可執(zhí)行文件中已經(jīng)定義,因此保存和恢復(fù)靜態(tài)數(shù)據(jù)區(qū)域時容易定位。數(shù)據(jù)段狀態(tài)與程序執(zhí)行密切相關(guān),必須保存?;謴?fù)時,由于要重新啟動應(yīng)用程序,系統(tǒng)會將代碼段自動加載到指定位置,因此也不需要對程序代碼段進(jìn)行特殊的恢復(fù)操作。代碼段 包含應(yīng)用程序可執(zhí)行文件和動態(tài)鏈接庫的執(zhí)行代碼。從而啟動和恢復(fù)整個進(jìn)程。 TH32CS_SNAPPROCESS 在快照中包含系統(tǒng)中所有的進(jìn)程 取得線程句柄后,通過使用 ThreadFirst 函數(shù)將線程列表的第一個元素拷到緩沖區(qū),循環(huán)遍歷線程鏈表,對于屬于當(dāng)前進(jìn)程的線程通過方法 OpenThread函數(shù) THREAD_SUSPEND_RESUME參數(shù)掛起線程。 TH32CS_SNAPMODULE 在快照中包含在 th32ProcessID中指定的進(jìn)程的所有的模塊。 表 31 dwFlags參數(shù)值 常量 描述 TH32CS_INHEIR 聲明快照句柄是可繼承的 TH32CS_SNAPALL 在快照中包含系統(tǒng)中所有的進(jìn)程和線程。 CreateToolhelp32Snapshot( DWORD dwFlags, DWORD th32ProcessID)第一個參數(shù)用于指定快照中需要的對象可以為 TH32CS_SNAPPROCESS、TH32CS_SNAPTHREAD等,指定快照中包含的內(nèi)容,可 以為表 31中的一個或者多個。 掛起 和恢復(fù) 進(jìn)程 Windows API中定義的頭文件 ,定義了 win32幫助工具函數(shù)。而且如果打開了多個 VC 窗口,調(diào)試過程會變得更加復(fù)雜。 } } 這種方法的優(yōu)點(diǎn)是 : 當(dāng)不再鉤子 DLL 時,可以調(diào)用 UnhookWindowsHookEx 卸載鉤子 但它也有不足之處 : (1)它會大大降低系統(tǒng)的性能,因?yàn)橄到y(tǒng)要增加大量對消息處理的過程。mbi, sizeof(mbi)) != 0) { return (HMODULE)。 static HMODULE ModuleFromAddress(PVOID pv) { MEMORY_BASIC_INFORMATION mbi。 } 自定義函數(shù) ModuleFromAddress 通過虛擬內(nèi)存管理函數(shù) VirtualQuery 返回指定內(nèi)存地址所處模塊的模塊句柄。 使用 Windows 鉤子注入特定 DLL 到其他進(jìn)程,一般都安裝 WH_ GETMESSAGE鉤子,這是因?yàn)?Windows 下的應(yīng)用程序大部分都需要調(diào)用 GetMessage 或PeekMessage 函數(shù)從消息隊列中獲取消息,所以它們都會加載鉤子函數(shù)所在的DLL。而如果要將 DLL注入到所有進(jìn)程中,安裝一個系統(tǒng)范圍內(nèi)的鉤子即可 (將。當(dāng)應(yīng)用程序調(diào)用 SetHook 函數(shù)時, SetWindowsHookEx 函數(shù) 就被執(zhí)行,也就完成了對需要攔截進(jìn)程的 DLL 注入。因?yàn)橄到y(tǒng)鉤子會影響系統(tǒng)中所有的應(yīng)用程序,所以鉤子函數(shù)必須放在獨(dú)立的動態(tài)鏈接庫 ((DLL)中。這就是使用鉤子注入 DLL 的基本原理。 對系統(tǒng)鉤子而言,當(dāng)安裝鉤子的函數(shù) SetWindowsHookEx 調(diào)用成功后,Windows在系統(tǒng)內(nèi)部對系統(tǒng)中的所有進(jìn)程自動調(diào)用 LoadLibrary函數(shù),強(qiáng)迫它們加載包含鉤子函數(shù)執(zhí)行代碼的模塊,這就是這些進(jìn)程能夠訪問鉤 子函數(shù)的原因。如果為 0,鉤子子程與所有的線程關(guān)聯(lián),即為 全局鉤子 。 第三個參數(shù) 鉤子函數(shù)的入口地址,當(dāng)鉤子鉤到任何消息后便調(diào)用這個函數(shù)。除此以外, 應(yīng)用程序?qū)嵗木浔? 第 一個參數(shù) idHook,表明 鉤子的類型,即它處理的消息類型 ;第二個參數(shù) 鉤子子程的地址指針。 HHOOK SetWindowsHookEx( int idHook, HOOKPROC lpfn,HINSTANCE hMod, DWORD dwThreadId )。 編碼 實(shí)現(xiàn) 鉤子的掛接 鉤子子程是一個應(yīng)用程序定義的回調(diào)函數(shù) (CALLBACK Function),不能定義成某個類的成員函數(shù),只能定義為普通的 C函數(shù)。 通過 BHO來注入 DLL 有時,我們想要注入 DLL 的對象僅僅是 Inter Explorer,很幸運(yùn),Windows 操作系統(tǒng)為我們提供了一個簡單的歸檔方法(這保證了它的可靠性?。┄D― 利用 Browser Helper Objects( BHO)。但對于一些系統(tǒng)級的進(jìn)程,直接這樣顯然是不行的,只能返回一個的空句柄(值為零)。 要使用 CreateRemoteThread,我們需要目標(biāo)進(jìn)程的句柄作為參數(shù)。 AddrOfLoadLibrary := GetProcAddress(GetModuleHandle(‘’), ‘LoadLibrary’)。這點(diǎn)將確保我們能 27 把該函數(shù)的地址作為一個有效的參數(shù)傳遞給 CreateRemoteThread 使用。通過調(diào)用GetProcAddress 函數(shù),我們可以得到 LoadLibrary 函數(shù)的地址。發(fā)現(xiàn)了吧!這兩個函數(shù)原型幾乎是一樣的(其實(shí)返回值是否相同關(guān)系不大,因?yàn)槲覀兪菬o法得到遠(yuǎn)程線程函數(shù)的返回值的),這種類似使得我們可以把直接把 LoadLibrary當(dāng)做線程函數(shù)來使用,從而在目標(biāo)進(jìn)程中加載鉤子 DLL。 線程函數(shù)的代碼不能位于你自己進(jìn)程的地址空間中。參數(shù) pfnStartAddr指明線程函數(shù)的內(nèi)存地址。 CreateRemoteThreadEx 與 CreateRemoteThread 很相似,差別在于它增加了一個參數(shù) hProcess。由 26 于是自己創(chuàng)建這個線程,因此我們能夠控制它執(zhí)行什么代碼。 該注入過程也十分簡單: 我們知道,任何一個進(jìn)程都可以使用 LoadLibrary 來動態(tài)地加載一個 DLL。 使用 CreateRemoteThread 函數(shù) 注入 DLL 的第三種方法是使用遠(yuǎn)程線程。 這種 DLL 注入方式有兩個優(yōu)點(diǎn): 這種機(jī)制在 Win 9x/Me 和 Win NT/2K 中都是得到支持的,預(yù)計在以后的版本中也將得到支持;鉤子 DLL 可以在不需要的時候,可由我們主動的調(diào)用 UnHookWindowsHookEx 來卸載,比起使用注冊表的機(jī)制來說方便了許多。 在 Borland 的 BCB 中有一個指令 pragma codeseg 與 VC++中的 pragma data_seg 指令有點(diǎn)類似,應(yīng)該也能起到一樣的作用 。 在 VC++中我們可以采用預(yù)編譯指令 pragma data_seg 在 DLL 文件中創(chuàng)建一個新的段,并且在 DEF 文件中把該段的屬性設(shè)置為“ shared”,這樣就建立了一個共享數(shù)據(jù) 段。但在 Windows 鉤子 DLL 中,有一些數(shù)據(jù),例如 Windows 鉤子句柄HHook,這是由 SetWindowsHookEx 函數(shù) [17]返回值得到的,并且作為參數(shù)將在CallNextHookEx 函數(shù)和 UnhookWindoesHookEx 函數(shù)中使用,顯然使用 SetWind owsHookEx 函數(shù)的進(jìn)程和使用 CallNextHookEx 函數(shù)的進(jìn)程一般不會是同一個進(jìn)程,因此我們必須能夠使句柄在所有的地址空間中都是有效的有意義的,也就 25 是說,它的值必須必須在這些鉤子 DLL 所掛鉤的進(jìn)程之間是共享的。一旦某個進(jìn)程中產(chǎn)生了該類型的消息,操作系統(tǒng)會自動把該鉤子所在的DLL 映像到該進(jìn)程的地址空間中,從而使得消息回調(diào)函數(shù)(在 SetWindowsHookEx的參數(shù) 中指定)能夠?qū)Υ讼⑦M(jìn)行適當(dāng)?shù)奶幚恚谶@里,我們所感興趣的當(dāng)然不是對消息進(jìn)行什么處理,因此在消息回調(diào)函數(shù)中只需把消息鉤子向后傳遞就可以了,但是我們所需的 DLL 已經(jīng)成功地注入了目標(biāo)進(jìn)程的地址空間,從而可以完成后續(xù)工作。 Windows 鉤子一般是在DLL 中實(shí)現(xiàn)的,這是一個全局性的 Windows 鉤子的基本要求,這也很符合我們的需要。 . 建立系統(tǒng)范圍的 Windows 鉤子 這是本文采用的注入方法。 但它也有一些比較明顯的缺點(diǎn):該方法僅適用于 NT/2K 操作系統(tǒng),顯然看看鍵的名稱就可以明白;如果需要激活或停止鉤子的注入,只有重新啟動Windows,這個就似乎太不方便了;最后一點(diǎn)也很顯然,不能用此方法向沒有使用 的應(yīng)用程序注入 DLL,例如控制臺應(yīng)用程序等。 并不檢查每個庫是否已經(jīng)加載成功,或者初始化是否取得成功。由于插入的 DLL在進(jìn)程的壽命期 24 中早早地就進(jìn)行了加載,因此在調(diào)用函數(shù)時應(yīng)該格外小心。當(dāng)這個通知被處理時, User32 . dll便檢索保存的這個關(guān)鍵字中的值,并且為字符串 中指定的每個 DLL 調(diào)用 LoadLibrary 函數(shù)。所有由該值標(biāo)識的 DLL 將在符合條件的應(yīng)用程序啟動的時候裝載。因此,我們必須采取某種獨(dú)特的手段,使得 API 鉤子(準(zhǔn)確的說是鉤子驅(qū)動器)能夠成為目標(biāo)進(jìn)程中的一部分,才有較大的可能來對目標(biāo)進(jìn)程數(shù)據(jù)和代碼進(jìn)行有控制的修改。 最后按 F7 鍵重新編譯hooklib 工程, DLL 方的工程修改完畢。 在新添的 DEF文件中寫入如下的內(nèi)容。為了能夠運(yùn)行期間動態(tài)地導(dǎo)出函數(shù) SetHook,一般需要在 hooklib 工程中建立一個 DEF 文件來指定要導(dǎo)出的函數(shù) SetHook。單擊 Finish 按鈕,完成工程創(chuàng)建。 (2) 單擊 OK按鈕, VC++彈出要求選擇動態(tài)鏈接庫類型的對話框。 DLL的創(chuàng)建 下面我們進(jìn)行第一步,也就是創(chuàng)建動態(tài)鏈接庫 [16]工程 。 一旦可執(zhí)行模塊和所有 DLL 模塊被映射到進(jìn)程的地址空間中,進(jìn)程的主線程就可以啟動運(yùn)行,同時應(yīng)用程序也可以啟動運(yùn)行。若要對進(jìn)程進(jìn)行全面的初始化,加載程序要分析每個模塊的輸入節(jié),并將所有需要的 DLL 模塊映射到進(jìn)程的地址空間。對于該節(jié)中列出的每個 DLL名字,加載程序要找出用戶系統(tǒng)上的 DLL模塊,再將該 DLL映射到進(jìn)程的地址空間??蓤?zhí)行模塊被映射到新進(jìn)程的地址空間。 一旦 DLL 和可執(zhí)行模塊創(chuàng)建完成,一個進(jìn)程就可以執(zhí)行。此外,對于列出的每個 DLL名字,該節(jié)指明了可執(zhí)行 模塊的二進(jìn)制代碼 引用了哪些函數(shù)和變量符號。該映像文件(或模塊)包含了可執(zhí)行文件的所有二進(jìn)制代碼和全局 /靜態(tài)變量。 8) 創(chuàng)建可執(zhí)行模塊,將使編譯器對每個源代碼模塊進(jìn)行處理,生成一個 .obj 模塊(每個源 代碼模塊有一個 .obj 模塊)。 7) 要創(chuàng)建一個 C/C + +源代碼模塊(或多個模塊),用于實(shí)現(xiàn)你想要 在可執(zhí)行模塊中實(shí)現(xiàn)的 函數(shù)和變量。 一旦創(chuàng)建了 DLL模塊,就可以創(chuàng)建可執(zhí)行模塊。它只是列出所有已輸出函數(shù) 和變量的符號名。 5) 如果鏈接程序發(fā)現(xiàn) DLL的源代碼模塊至少輸出了一個函數(shù)或變量,那么鏈接程序也生成 一個 .lib 文件。該映像文件(即模塊)包含了用于 DLL 的所有二進(jìn)制代碼和全局 /靜態(tài)數(shù)據(jù)變 量。 3) 創(chuàng)建 DLL模塊,將使編譯器對每個源代碼模塊進(jìn)行處理,產(chǎn)生一個 .obj模塊(每個源代 碼模塊有一個 .obj 模塊)。 2) 要創(chuàng)建 一個 C / C + +源代碼模塊(或多個模塊),用于實(shí)現(xiàn)你想要在DLL 模塊中實(shí)現(xiàn)的函 數(shù)和變量。 DLL 的 所有源代碼模塊均包含該頭文件,以幫助創(chuàng)建 DLL。然后就可以創(chuàng)建可執(zhí)行模塊。 11) 加載程序?qū)⑿枰?DLL 加載到地址空間中進(jìn)程的主線程開始執(zhí)行; 應(yīng)用程序啟動運(yùn)行。 9) 鏈接程序?qū)⒏鱾€ .obj 模塊鏈接起來,產(chǎn)生一個 .exe 文件 (它包含了所需要 DLL 模塊的名字和輸入符號的列表 )。 7) 建立引用輸入函數(shù) /變量的 C/C++源文件。 5) 如果至少輸出一個函數(shù) /變量,那么鏈接程序也生成 lib 文件。 3) 編譯 器為每個 C/C++源文件生成 .obj 模塊。 20 圖 31應(yīng)用程序如何創(chuàng)建和隱含鏈接 DLL的示意圖 創(chuàng) 建 DLL: 1) 建立帶有輸出原型 /結(jié)構(gòu) /符號的頭文件。 現(xiàn)在要重點(diǎn)介紹可執(zhí)行模塊
點(diǎn)擊復(fù)制文檔內(nèi)容
試題試卷相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1