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

正文內(nèi)容

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

2025-02-26 10:52本頁面

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

  

【正文】 立并運行一個遠(yuǎn)程的線程 這個好像和注入沒什么關(guān)系 ?往下看! 調(diào)用該 API 需要指定一個線程函數(shù)指針作為參數(shù),該線程函數(shù)的原型如下: Function ThreadProc(lpParam: Pointer): DWORD,我們再來看一下LoadLibrary 的函數(shù)原型: Function LoadLibrary(lpFileName: PChar): HModule。發(fā)現(xiàn)了吧!這兩個函數(shù)原型幾乎是一樣的(其實返回值是否相同關(guān)系不大,因為我們是無法得到遠(yuǎn)程線程函數(shù)的返回值的),這種類似使得我們可以把直接把 LoadLibrary當(dāng)做線程函數(shù)來使用,從而在目標(biāo)進程中加載鉤子 DLL。 與此類似,當(dāng)我們需要卸載鉤子 DLL 時,也可以 FreeLibrary 作為線程函數(shù)來使用,在目標(biāo)進程中卸載鉤子 DLL,一切看來是十分的簡潔方便。通過調(diào)用GetProcAddress 函數(shù),我們可以得到 LoadLibrary 函數(shù)的地址。由于LoadLibrary 是 Kernel32 中的函數(shù),而這個系統(tǒng) DLL 的映射地址對每一個進程來說都是相同的,因此 LoadLibrary 函數(shù)的地址也是如此。這點將確保我們能 27 把該函數(shù)的地址作為一個有效的參數(shù)傳遞給 CreateRemoteThread 使用。 FreeLibrary 也是一樣的。 AddrOfLoadLibrary := GetProcAddress(GetModuleHandle(‘’), ‘LoadLibrary’)。 HRemoteThread := CreateRemoteThread(HTargetProcess, nil, 0, AddrOfLoadLibrary, HookDllName, 0, nil)。 要使用 CreateRemoteThread,我們需要目標(biāo)進程的句柄作為參數(shù)。當(dāng)我們用 OpenProcess 函數(shù)來得到進程的句柄時,通常是希望對此進程有全權(quán)的存取操作,也就是以 PROCESS_ALL_ACCESS 為標(biāo)志打開進程。但對于一些系統(tǒng)級的進程,直接這樣顯然是不行的,只能返回一個的空句柄(值為零)。為此,我們必須把自己設(shè)置為擁有調(diào)試級的特 權(quán),這樣將具有最大的存取權(quán)限,從而使得我們能對這些系統(tǒng)級的進程也可以進行一些必要的操作。 通過 BHO來注入 DLL 有時,我們想要注入 DLL 的對象僅僅是 Inter Explorer,很幸運,Windows 操作系統(tǒng)為我們提供了一個簡單的歸檔方法(這保證了它的可靠性!)―― 利用 Browser Helper Objects( BHO)。一個 BHO 是一個在 DLL 中實現(xiàn)的 COM 對象,它主要實現(xiàn)了一個 IObjectWithSite 接口,而每當(dāng) IE運行時,它會自動加載所有實現(xiàn)了該接口的 COM 對象。 編碼 實現(xiàn) 鉤子的掛接 鉤子子程是一個應(yīng)用程序定義的回調(diào)函數(shù) (CALLBACK Function),不能定義成某個類的成員函數(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。 第 一個參數(shù) idHook,表明 鉤子的類型,即它處理的消息類型 ;第二個參數(shù) 鉤子子程的地址指針。如果 dwThreadId參數(shù)為 0 , 或是一個由別的進程創(chuàng)建的線程的標(biāo)識, lpfn 必須指向 DLL 中的鉤子子程。除此以外, 應(yīng)用程序?qū)嵗木浔?biāo)識包含 lpfn 所指的子程的 DLL。 第三個參數(shù) 鉤子函數(shù)的入口地址,當(dāng)鉤子鉤到任何消息后便調(diào)用這個函數(shù)。 最后一個參數(shù) 與安裝的鉤子子程相關(guān)聯(lián)的線程的 標(biāo)識符 。如果為 0,鉤子子程與所有的線程關(guān)聯(lián),即為 全局鉤子 。 以上所說的鉤子 子程 與線程相關(guān)聯(lián)是指在一鉤子鏈表中發(fā)給該線程的消息同時發(fā)送給鉤子子程,且被鉤子 子程 先處理。 對系統(tǒng)鉤子而言,當(dāng)安裝鉤子的函數(shù) SetWindowsHookEx 調(diào)用成功后,Windows在系統(tǒng)內(nèi)部對系統(tǒng)中的所有進程自動調(diào)用 LoadLibrary函數(shù),強迫它們加載包含鉤子函數(shù)執(zhí)行代碼的模塊,這就是這些進程能夠訪問鉤 子函數(shù)的原因。從這里可以得到一個重要啟示,那就是如果我們創(chuàng)建一個系統(tǒng)鉤子,并將包含鉤子函數(shù)執(zhí)行代碼的模塊編譯成 DLL(當(dāng)然這個 DLL 中還必須包含掛接函數(shù)的代碼 ),就可以實現(xiàn) DLL的自動注入。這就是使用鉤子注入 DLL 的基本原理。 系統(tǒng)鉤子監(jiān)視系統(tǒng)中的所有線程的事件消息。因為系統(tǒng)鉤子會影響系統(tǒng)中所有的應(yīng)用程序,所以鉤子函數(shù)必須放在獨立的動態(tài)鏈接庫 ((DLL)中。 因此,我們在 hooklib. dll的導(dǎo)出函數(shù) SetHook中實現(xiàn)了如下代碼。當(dāng)應(yīng)用程序調(diào)用 SetHook 函數(shù)時, SetWindowsHookEx 函數(shù) 就被執(zhí)行,也就完成了對需要攔截進程的 DLL 注入。 如果要將 DLL 注入到特定進程中,一般是將該進程中主線程的線程工DdwThreadId 傳遞給 SetWindowsHookEx 函數(shù),其中,被攔截的進程通過用戶選擇獲得,并傳給 dwThreadId。而如果要將 DLL注入到所有進程中,安裝一個系統(tǒng)范圍內(nèi)的鉤子即可 (將。 作為線程工 D傳遞給 SetWindowsHookEx 函數(shù) )。 使用 Windows 鉤子注入特定 DLL 到其他進程,一般都安裝 WH_ GETMESSAGE鉤子,這是因為 Windows 下的應(yīng)用程序大部分都需要調(diào)用 GetMessage 或PeekMessage 函數(shù)從消息隊列中獲取消息,所以它們都會加載鉤子函數(shù)所在的DLL。由于此處安裝 WH GETMESSAGE 鉤子的目的僅僅是讓其他進程加載鉤子函數(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)用進程虛擬地址空間中指定內(nèi)存頁的狀態(tài),將這些信息返回到一個 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)點是 : 當(dāng)不再鉤子 DLL 時,可以調(diào)用 UnhookWindowsHookEx 卸載鉤子 但它也有不足之處 : (1)它會大大降低系統(tǒng)的性能,因為系統(tǒng)要增加大量對消息處理的過程。 (2)不容易調(diào)試。而且如果打開了多個 VC 窗口,調(diào)試過程會變得更加復(fù)雜。 30 (3)它可能會影響整個系統(tǒng)的正常運行,有時不得不重新啟 動以恢復(fù)系統(tǒng)運作。 掛起 和恢復(fù) 進程 Windows API中定義的頭文件 ,定義了 win32幫助工具函數(shù)。其中函數(shù) CreateToolhelp32Snapshot 能為指定的進程、進程使用的堆、模塊、線程建立一個快照。 CreateToolhelp32Snapshot( DWORD dwFlags, DWORD th32ProcessID)第一個參數(shù)用于指定快照中需要的對象可以為 TH32CS_SNAPPROCESS、TH32CS_SNAPTHREAD等,指定快照中包含的內(nèi)容,可 以為表 31中的一個或者多個。 第二個參數(shù)指定快照的進程 ID。 表 31 dwFlags參數(shù)值 常量 描述 TH32CS_INHEIR 聲明快照句柄是可繼承的 TH32CS_SNAPALL 在快照中包含系統(tǒng)中所有的進程和線程。 TH32CS_SNAPHEAPLIST 在快照中包含在 th32ProcessID中指定的進程的所有的堆。 TH32CS_SNAPMODULE 在快照中包含在 th32ProcessID中指定的進程的所有的模塊。 TH32CS_SNAPTHREAD 在快照中包含系統(tǒng)中所有的線 程。 TH32CS_SNAPPROCESS 在快照中包含系統(tǒng)中所有的進程 取得線程句柄后,通過使用 ThreadFirst 函數(shù)將線程列表的第一個元素拷到緩沖區(qū),循環(huán)遍歷線程鏈表,對于屬于當(dāng)前進程的線程通過方法 OpenThread函數(shù) THREAD_SUSPEND_RESUME參數(shù)掛起線程。 然后通過 SuspendThread函數(shù)保存線程上下文, ResumeThread 恢復(fù)線程上下文。從而啟動和恢復(fù)整個進程。 獲取節(jié)數(shù)據(jù) 用戶地址空間存放的數(shù)據(jù)包括進程的代碼段、數(shù)據(jù)段、各線程的堆棧。代碼段 包含應(yīng)用程序可執(zhí)行文件和動態(tài)鏈接庫的執(zhí)行代碼。代碼段直接從文件映射到內(nèi)存空間中,在執(zhí)行過程中保持不變,因此不需要保存?;謴?fù)時,由于要重新啟動應(yīng)用程序,系統(tǒng)會將代碼段自動加載到指定位置,因此也不需要對程序代碼段進行特殊的恢復(fù)操作。 數(shù)據(jù)段包含應(yīng)用程序的靜態(tài)數(shù)據(jù)區(qū)域和動態(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ū)域時容易定位。動態(tài)數(shù)據(jù)區(qū)域包括程序執(zhí)行過程中動態(tài)創(chuàng)建的堆空間, 調(diào)用 HeapAlloc 函數(shù)在堆中分配的區(qū)域以及系統(tǒng)調(diào)用 VirtualAlloc函數(shù)分配的區(qū)域。 進程恢復(fù)時,由于重新啟動進程,所以程序運行過程中動態(tài)分配的區(qū)域不復(fù)存在。對于 VirtualAlloc 分配的區(qū)域指定了大小和位置 恢復(fù)相對容易。通過PE文件來定位節(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。
點擊復(fù)制文檔內(nèi)容
試題試卷相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1