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

正文內(nèi)容

基于windows進(jìn)程狀態(tài)提取與恢復(fù)的研究畢業(yè)論文-資料下載頁(yè)

2025-02-26 10:52本頁(yè)面

【導(dǎo)讀】從磁盤文件中讀出保存的進(jìn)程狀態(tài),實(shí)現(xiàn)進(jìn)程重啟后的狀態(tài)恢復(fù)。本文針對(duì)32位的WinNT內(nèi)核實(shí)現(xiàn),支持Windows2021、XP以上版本。步驟,并對(duì)其進(jìn)行了編碼實(shí)現(xiàn)。文章首先對(duì)基于用戶級(jí)Windows進(jìn)程狀態(tài)的提。接庫(kù)注入,最后對(duì)完成實(shí)例程序的功能進(jìn)行了介紹?,F(xiàn),給出了相應(yīng)的重點(diǎn)代碼,詳細(xì)闡述了實(shí)現(xiàn)機(jī)制。

  

【正文】 立并運(yùn)行一個(gè)遠(yuǎn)程的線程 這個(gè)好像和注入沒什么關(guān)系 ?往下看! 調(diào)用該 API 需要指定一個(gè)線程函數(shù)指針作為參數(shù),該線程函數(shù)的原型如下: Function ThreadProc(lpParam: Pointer): DWORD,我們?cè)賮?lái)看一下LoadLibrary 的函數(shù)原型: Function LoadLibrary(lpFileName: PChar): HModule。發(fā)現(xiàn)了吧!這兩個(gè)函數(shù)原型幾乎是一樣的(其實(shí)返回值是否相同關(guān)系不大,因?yàn)槲覀兪菬o(wú)法得到遠(yuǎn)程線程函數(shù)的返回值的),這種類似使得我們可以把直接把 LoadLibrary當(dāng)做線程函數(shù)來(lái)使用,從而在目標(biāo)進(jìn)程中加載鉤子 DLL。 與此類似,當(dāng)我們需要卸載鉤子 DLL 時(shí),也可以 FreeLibrary 作為線程函數(shù)來(lái)使用,在目標(biāo)進(jìn)程中卸載鉤子 DLL,一切看來(lái)是十分的簡(jiǎn)潔方便。通過調(diào)用GetProcAddress 函數(shù),我們可以得到 LoadLibrary 函數(shù)的地址。由于LoadLibrary 是 Kernel32 中的函數(shù),而這個(gè)系統(tǒng) DLL 的映射地址對(duì)每一個(gè)進(jìn)程來(lái)說(shuō)都是相同的,因此 LoadLibrary 函數(shù)的地址也是如此。這點(diǎn)將確保我們能 27 把該函數(shù)的地址作為一個(gè)有效的參數(shù)傳遞給 CreateRemoteThread 使用。 FreeLibrary 也是一樣的。 AddrOfLoadLibrary := GetProcAddress(GetModuleHandle(‘’), ‘LoadLibrary’)。 HRemoteThread := CreateRemoteThread(HTargetProcess, nil, 0, AddrOfLoadLibrary, HookDllName, 0, nil)。 要使用 CreateRemoteThread,我們需要目標(biāo)進(jìn)程的句柄作為參數(shù)。當(dāng)我們用 OpenProcess 函數(shù)來(lái)得到進(jìn)程的句柄時(shí),通常是希望對(duì)此進(jìn)程有全權(quán)的存取操作,也就是以 PROCESS_ALL_ACCESS 為標(biāo)志打開進(jìn)程。但對(duì)于一些系統(tǒng)級(jí)的進(jìn)程,直接這樣顯然是不行的,只能返回一個(gè)的空句柄(值為零)。為此,我們必須把自己設(shè)置為擁有調(diào)試級(jí)的特 權(quán),這樣將具有最大的存取權(quán)限,從而使得我們能對(duì)這些系統(tǒng)級(jí)的進(jìn)程也可以進(jìn)行一些必要的操作。 通過 BHO來(lái)注入 DLL 有時(shí),我們想要注入 DLL 的對(duì)象僅僅是 Inter Explorer,很幸運(yùn),Windows 操作系統(tǒng)為我們提供了一個(gè)簡(jiǎn)單的歸檔方法(這保證了它的可靠性?。┄D― 利用 Browser Helper Objects( BHO)。一個(gè) BHO 是一個(gè)在 DLL 中實(shí)現(xiàn)的 COM 對(duì)象,它主要實(shí)現(xiàn)了一個(gè) IObjectWithSite 接口,而每當(dāng) IE運(yùn)行時(shí),它會(huì)自動(dòng)加載所有實(shí)現(xiàn)了該接口的 COM 對(duì)象。 編碼 實(shí)現(xiàn) 鉤子的掛接 鉤子子程是一個(gè)應(yīng)用程序定義的回調(diào)函數(shù) (CALLBACK Function),不能定義成某個(gè)類的成員函數(shù),只能定義為普通的 C函數(shù)。用以監(jiān)視系統(tǒng)或某一特定類型的事件,這些事件可以是與某一特定線程關(guān)聯(lián)的,也可以是系統(tǒng)中所有線程的事件。 HHOOK SetWindowsHookEx( int idHook, HOOKPROC lpfn,HINSTANCE hMod, DWORD dwThreadId )。 28 函數(shù)成功則返回鉤子子程的句柄,失敗返回 NULL。 第 一個(gè)參數(shù) idHook,表明 鉤子的類型,即它處理的消息類型 ;第二個(gè)參數(shù) 鉤子子程的地址指針。如果 dwThreadId參數(shù)為 0 , 或是一個(gè)由別的進(jìn)程創(chuàng)建的線程的標(biāo)識(shí), lpfn 必須指向 DLL 中的鉤子子程。除此以外, 應(yīng)用程序?qū)嵗木浔?。?biāo)識(shí)包含 lpfn 所指的子程的 DLL。 第三個(gè)參數(shù) 鉤子函數(shù)的入口地址,當(dāng)鉤子鉤到任何消息后便調(diào)用這個(gè)函數(shù)。 最后一個(gè)參數(shù) 與安裝的鉤子子程相關(guān)聯(lián)的線程的 標(biāo)識(shí)符 。如果為 0,鉤子子程與所有的線程關(guān)聯(lián),即為 全局鉤子 。 以上所說(shuō)的鉤子 子程 與線程相關(guān)聯(lián)是指在一鉤子鏈表中發(fā)給該線程的消息同時(shí)發(fā)送給鉤子子程,且被鉤子 子程 先處理。 對(duì)系統(tǒng)鉤子而言,當(dāng)安裝鉤子的函數(shù) SetWindowsHookEx 調(diào)用成功后,Windows在系統(tǒng)內(nèi)部對(duì)系統(tǒng)中的所有進(jìn)程自動(dòng)調(diào)用 LoadLibrary函數(shù),強(qiáng)迫它們加載包含鉤子函數(shù)執(zhí)行代碼的模塊,這就是這些進(jìn)程能夠訪問鉤 子函數(shù)的原因。從這里可以得到一個(gè)重要啟示,那就是如果我們創(chuàng)建一個(gè)系統(tǒng)鉤子,并將包含鉤子函數(shù)執(zhí)行代碼的模塊編譯成 DLL(當(dāng)然這個(gè) DLL 中還必須包含掛接函數(shù)的代碼 ),就可以實(shí)現(xiàn) DLL的自動(dòng)注入。這就是使用鉤子注入 DLL 的基本原理。 系統(tǒng)鉤子監(jiān)視系統(tǒng)中的所有線程的事件消息。因?yàn)橄到y(tǒng)鉤子會(huì)影響系統(tǒng)中所有的應(yīng)用程序,所以鉤子函數(shù)必須放在獨(dú)立的動(dòng)態(tài)鏈接庫(kù) ((DLL)中。 因此,我們?cè)?hooklib. dll的導(dǎo)出函數(shù) SetHook中實(shí)現(xiàn)了如下代碼。當(dāng)應(yīng)用程序調(diào)用 SetHook 函數(shù)時(shí), SetWindowsHookEx 函數(shù) 就被執(zhí)行,也就完成了對(duì)需要攔截進(jìn)程的 DLL 注入。 如果要將 DLL 注入到特定進(jìn)程中,一般是將該進(jìn)程中主線程的線程工DdwThreadId 傳遞給 SetWindowsHookEx 函數(shù),其中,被攔截的進(jìn)程通過用戶選擇獲得,并傳給 dwThreadId。而如果要將 DLL注入到所有進(jìn)程中,安裝一個(gè)系統(tǒng)范圍內(nèi)的鉤子即可 (將。 作為線程工 D傳遞給 SetWindowsHookEx 函數(shù) )。 使用 Windows 鉤子注入特定 DLL 到其他進(jìn)程,一般都安裝 WH_ GETMESSAGE鉤子,這是因?yàn)?Windows 下的應(yīng)用程序大部分都需要調(diào)用 GetMessage 或PeekMessage 函數(shù)從消息隊(duì)列中獲取消息,所以它們都會(huì)加載鉤子函數(shù)所在的DLL。由于此處安裝 WH GETMESSAGE 鉤子的目的僅僅是讓其他進(jìn)程加載鉤子函數(shù) 29 所在的 DLL,所以一般僅在鉤子函數(shù)中調(diào)用 CallNextHookEx 函數(shù)即可,如下面代碼所示: static LRESULT WINAPI GetMsgProc(int code, WPARAM wParam, LPARAM lParam) { return ::CallNextHookEx(g_hHook, code, wParam, lParam)。 } 自定義函數(shù) ModuleFromAddress 通過虛擬內(nèi)存管理函數(shù) VirtualQuery 返回指定內(nèi)存地址所處模塊的模塊句柄。 VirtualQuery 函數(shù)可以取得調(diào)用進(jìn)程虛擬地址空間中指定內(nèi)存頁(yè)的狀態(tài),將這些信息返回到一個(gè) PMEMORY_BASIC _INFORMATION 結(jié)構(gòu)中。 static HMODULE ModuleFromAddress(PVOID pv) { MEMORY_BASIC_INFORMATION mbi。 if(::VirtualQuery(pv, amp。mbi, sizeof(mbi)) != 0) { return (HMODULE)。 } else { return NULL。 } } 這種方法的優(yōu)點(diǎn)是 : 當(dāng)不再鉤子 DLL 時(shí),可以調(diào)用 UnhookWindowsHookEx 卸載鉤子 但它也有不足之處 : (1)它會(huì)大大降低系統(tǒng)的性能,因?yàn)橄到y(tǒng)要增加大量對(duì)消息處理的過程。 (2)不容易調(diào)試。而且如果打開了多個(gè) VC 窗口,調(diào)試過程會(huì)變得更加復(fù)雜。 30 (3)它可能會(huì)影響整個(gè)系統(tǒng)的正常運(yùn)行,有時(shí)不得不重新啟 動(dòng)以恢復(fù)系統(tǒng)運(yùn)作。 掛起 和恢復(fù) 進(jìn)程 Windows API中定義的頭文件 ,定義了 win32幫助工具函數(shù)。其中函數(shù) CreateToolhelp32Snapshot 能為指定的進(jìn)程、進(jìn)程使用的堆、模塊、線程建立一個(gè)快照。 CreateToolhelp32Snapshot( DWORD dwFlags, DWORD th32ProcessID)第一個(gè)參數(shù)用于指定快照中需要的對(duì)象可以為 TH32CS_SNAPPROCESS、TH32CS_SNAPTHREAD等,指定快照中包含的內(nèi)容,可 以為表 31中的一個(gè)或者多個(gè)。 第二個(gè)參數(shù)指定快照的進(jìn)程 ID。 表 31 dwFlags參數(shù)值 常量 描述 TH32CS_INHEIR 聲明快照句柄是可繼承的 TH32CS_SNAPALL 在快照中包含系統(tǒng)中所有的進(jìn)程和線程。 TH32CS_SNAPHEAPLIST 在快照中包含在 th32ProcessID中指定的進(jìn)程的所有的堆。 TH32CS_SNAPMODULE 在快照中包含在 th32ProcessID中指定的進(jìn)程的所有的模塊。 TH32CS_SNAPTHREAD 在快照中包含系統(tǒng)中所有的線 程。 TH32CS_SNAPPROCESS 在快照中包含系統(tǒng)中所有的進(jìn)程 取得線程句柄后,通過使用 ThreadFirst 函數(shù)將線程列表的第一個(gè)元素拷到緩沖區(qū),循環(huán)遍歷線程鏈表,對(duì)于屬于當(dāng)前進(jìn)程的線程通過方法 OpenThread函數(shù) THREAD_SUSPEND_RESUME參數(shù)掛起線程。 然后通過 SuspendThread函數(shù)保存線程上下文, ResumeThread 恢復(fù)線程上下文。從而啟動(dòng)和恢復(fù)整個(gè)進(jìn)程。 獲取節(jié)數(shù)據(jù) 用戶地址空間存放的數(shù)據(jù)包括進(jìn)程的代碼段、數(shù)據(jù)段、各線程的堆棧。代碼段 包含應(yīng)用程序可執(zhí)行文件和動(dòng)態(tài)鏈接庫(kù)的執(zhí)行代碼。代碼段直接從文件映射到內(nèi)存空間中,在執(zhí)行過程中保持不變,因此不需要保存?;謴?fù)時(shí),由于要重新啟動(dòng)應(yīng)用程序,系統(tǒng)會(huì)將代碼段自動(dòng)加載到指定位置,因此也不需要對(duì)程序代碼段進(jìn)行特殊的恢復(fù)操作。 數(shù)據(jù)段包含應(yīng)用程序的靜態(tài)數(shù)據(jù)區(qū)域和動(dòng)態(tài)數(shù)據(jù)區(qū)域。數(shù)據(jù)段狀態(tài)與程序執(zhí)行密切相關(guān),必須保存。靜態(tài)數(shù)據(jù)區(qū)域包括可執(zhí)行文件和 DLL 文件的 PE 文件 31 格式中屬性為寫的節(jié)。靜態(tài)數(shù)據(jù)區(qū)與位置在可執(zhí)行文件中已經(jīng)定義,因此保存和恢復(fù)靜態(tài)數(shù)據(jù)區(qū)域時(shí)容易定位。動(dòng)態(tài)數(shù)據(jù)區(qū)域包括程序執(zhí)行過程中動(dòng)態(tài)創(chuàng)建的堆空間, 調(diào)用 HeapAlloc 函數(shù)在堆中分配的區(qū)域以及系統(tǒng)調(diào)用 VirtualAlloc函數(shù)分配的區(qū)域。 進(jìn)程恢復(fù)時(shí),由于重新啟動(dòng)進(jìn)程,所以程序運(yùn)行過程中動(dòng)態(tài)分配的區(qū)域不復(fù)存在。對(duì)于 VirtualAlloc 分配的區(qū)域指定了大小和位置 恢復(fù)相對(duì)容易。通過PE文件來(lái)定位節(jié)的位置和保存數(shù)據(jù)。 BOOL GetSection(HMODULE hMod,BYTE Name[8],DWORD *Data_Section_Add,DWORD *VirtualSize) { //dos 頭 IMAGE_DOS_HEADER* pDosHeader = (IMAGE_DOS_HEADER*)hMod。 if(pDosHeadere_magic !=0x5a4d) return false。 //nt 頭 IMAGE_NT_HEADERS * pNTHeader =(IMAGE_NT_HEADERS *)((BYTE*)hMod + pDosHeadere_lfanew )。 if(pNTHeaderSignature !=0x4550) return false。 //兩者均可,取得文件頭 IMAGE_FILE_HEADER * pFileHeader =(IMAGE_FILE_HEADER *)((BYTE*)hMod + pDosHeadere_lfanew + 4)。 // IMAGE_FILE_HEADER * pFileHeader=(IMAGE_FILE_HEADER *)((BYTE*)pNTHeader+sizeof(pNTHeaderSignature))。 int x=sizeof(IMAGE_OPTIONAL_HEADER)。 //兩者均可,取得選擇頭 32 //IMAGE_OPTIONAL_HEADER * pOptHeader =(IMAGE_OPTIONAL_HEADER *)((BYTE*)hMod + pDosHeadere_lfanew + 24)。 IMAGE_OPTIONAL_HEADER * pOptHeader =(IMAGE_OPTIONAL_HEADER *)((BYTE*)pNTHeader +sizeof(pNTHeaderSignature)+ sizeof(pNTHeaderFileHeader))。 //區(qū)塊表 IMAGE_SECTION_HEADER * pSecHeader = (IMAGE_SECTION_HEADER *)(((LPBYTE)pOptHeader) + pFileHeaderSizeOfOptionalHeader)。 for(int i=0。ipFileHeaderNumberOfSections。i++)//遍歷所有節(jié) { for(int j=0。j8。j++) { if(pSecHeaderName[j]!=Name[j]) break。
點(diǎn)擊復(fù)制文檔內(nèi)容
試題試卷相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1