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

正文內(nèi)容

基于windows進程狀態(tài)提取與恢復的研究畢業(yè)論文(編輯修改稿)

2025-04-03 10:52 本頁面
 

【文章內(nèi)容簡介】 問違規(guī) PAGE_READWRITE 如果試圖在該頁面上執(zhí)行代碼,就會引發(fā)訪問違規(guī) PAGE_EXECUTE 如果試圖在該頁面上對內(nèi)存進行讀取或寫入操作,就會引發(fā)訪問違規(guī) PAGE_EXECUTE_READ 如果試圖在該頁面上對內(nèi)存進行寫入操作,就會引發(fā)訪問違規(guī) PAGE_EXECUTE_READWRITE 對于該頁面不管執(zhí)行什么操作,都不會引發(fā)訪問違規(guī) PAGE_WRITECOPY 如果試圖在該頁面上寫入內(nèi)存,就會導致系統(tǒng)將它自己的私有頁面(受頁文件的支持)拷貝賦予該進程 PAGE_EXECUTE_WRITECOPY 該頁面執(zhí) 行所有操作 內(nèi)存映射文件可以用于 三 個不同的目的: ,以便加載和執(zhí)行 .exe和 DLL 文件。這可以大大節(jié)省頁文件空間和應用程序啟動運行所需的時間。 2. 可以使用內(nèi)存映射文件來訪問磁盤上的數(shù)據(jù)文件。這使你可以不必對文件執(zhí)行 I/O操作,并且可以不必對文件內(nèi)容進行緩存。 3. 可以使用內(nèi)存映射文件,使同一臺計算機上運行的多個進程能夠相互之間共享數(shù)據(jù)。 Windows 確實提供了其他一些方法,以便在進程之間進行數(shù)據(jù)通信,但是這些方法都是使用內(nèi)存映射文件來實現(xiàn)的,這使得內(nèi)存映射文件成為單個計 算機上的多個進程互相進行通信的最有效的方法。 虛擬內(nèi)存的使用 使用管理虛擬內(nèi)存的函數(shù),可以直接保留一個地址空間區(qū)域,將物理存儲器提交到該區(qū)域,并且可以設置自己的保護屬性。 1. 在地址空間保留一個區(qū)域 通過使用 VirtualAlloc 函數(shù),可以在進程的地址空間保留一個區(qū)域: PVOID VirtualAlloc(PVOID pvAddress, SIZE_T dwSize,DWORD dwSize,DWORD fdwProtect) 第一個參數(shù) pvAddress 包含一個內(nèi)存地址,用于設定想讓系統(tǒng)將地址空間保留在什么地方。 NULL 表示地址由系統(tǒng)分配。 如果 VirtualAlloc函數(shù)能夠滿足你的要求,那么它就返回一個 指明保留區(qū)域的基地址 值 。 第二個參數(shù) dwSize 用于設置想保留區(qū)域的大小,第三個參數(shù)表明分 15 配的是保留區(qū)域還是物理存儲器,最后一個參數(shù)設置文件屬性 (參考表27)。 2. 提交物理存儲器 若要提交物理存儲器,必須再次調用 VirtualAlloc 函數(shù)。不過這次為 fdwAllocationType 參數(shù)傳遞的是 MEM_COMMIT 標志,而不MEM_RESERVE 標志。 3. 同時進行保留區(qū)域和提交內(nèi)存 只需要 fdwAllocationType參數(shù)傳遞的是 MEM_COMMIT|MEM_RESERVE標志 即可。 可以采用以下四種方法確定何時提交物理存儲器:總是提交、通過 VirtualQuery 函數(shù)、保留提交記錄、使用結構化異常處理(SEH)。 4. 物理存儲器的回收和釋放 若要回收物理存儲器可以調用 VirtualFree 函數(shù)。參數(shù)和 Virtual Alloc 一樣,由于系統(tǒng)知道釋放的內(nèi)存大小故應設為 0, 第三個參數(shù)設為 MEM_REALSE 則釋放內(nèi)存 , MEM_DECOMMIT 則回收內(nèi)存。 決定回收時間可以使用結構來記錄、無用單元收集函數(shù)或者將每個結構設計為一個頁面。 當創(chuàng)建一個線程時, 系統(tǒng)就會為線程的堆棧保留一個 1MB 堆棧空間區(qū)域,將一些物理存儲器提交給這個已保留的區(qū)域。 但是,當調用 CreateThread 或_begin ThreadEx 函數(shù)時,可以重載原先提交的內(nèi)存數(shù)量。這兩個函數(shù)都有一個參數(shù),可以用來重載原先提交給堆棧的地址空間的內(nèi)存數(shù)量。如果設定這個參數(shù)為 0,那么系統(tǒng)將使用 /STACK開關指明的已提交的堆棧大小值。 表 22顯示了在頁面大小為 4KB 的 計算機上的一個堆棧區(qū)域。 表 23 堆棧區(qū)域 內(nèi)存地址 頁面狀態(tài) 0x080F F000 堆棧頂部 已提交頁面 0x080F DOOO 帶有保護屬性標志的已提交頁面 0x0800 2021 0x0800 1000 0x0800 3000 保留頁面 0x0800 0000 堆棧底部: 保留頁面 16 內(nèi)存映射的可執(zhí)行文件和 DLL 文件 當線程調用 CreateProcess 時,系統(tǒng)將執(zhí)行下列操作步驟: 1) 系統(tǒng)找出在調用 CreateProcess 時設定的 .exe 文件。如果找不到這個 .exe 文件 ,進程將無法創(chuàng)建, CreateProcess 將返回 FALSE。 2) 系統(tǒng)創(chuàng)建一個新進程內(nèi)核對象。 3) 系統(tǒng)為這個新進程創(chuàng)建一個私有地址空間。 4) 系統(tǒng)保留一個足夠大的地址空間區(qū)域,用于存放該 .exe 文件。該區(qū)域需要的位置在 .exe 文件本身中設定。按照默認設置, .exe 文件的基地址是0x0040 0000。 5) 系統(tǒng)注意到支持已保留區(qū)域的物理存儲器是在磁盤上的 .exe文件中,而不是在系統(tǒng)的頁文件中。 當 .exe 文件被映射到進程的地址空間中之后,系統(tǒng)將訪問 .exe 文件的一個部分,該部分列出了包 含 .exe 文件中的代碼要調用的函數(shù)的 DLL 文件。然后,系統(tǒng)為每個 DLL 文件調用 LoadLibrary 函數(shù),如果任何一個 DLL 需要更多的DLL,那么系統(tǒng)將調用 LoadLibrary 函數(shù),以便加載這些 DLL。每當調用LoadLibrary來加載一個 DLL時,系統(tǒng)將執(zhí)行下列操作步驟,它們均類似上面的第 4 和第 5個步驟: 1) 系統(tǒng)保留一個足夠大的地址空間區(qū)域,用于存放該 DLL 文件。該區(qū)域需要的位置在 DLL文件本身中設定。按照默認設置, Microsoft的 Visual C++ 建立的 DLL 文件基地址是 0x1000 0000但是,你可以在創(chuàng)建 DLL 文件時重載這個地址,方法是使用鏈接程序的 /BASE 選項。 Windows 提供的所有標準系統(tǒng) DLL 都擁有不同的基地址,這樣,如果加載到單個地址空間,它們就不會重疊。 2) 如果系統(tǒng)無法在該 DLL 的首選基地址上保留一個區(qū)域,其原因可能是該區(qū)域已經(jīng)被另一個 DLL 或 .exe 占用,也可能是因為該區(qū)域不夠大,此時系統(tǒng)將設法尋找另一個地址空間的區(qū)域來保留該 DLL。如果一個 DLL無法加載到它的首選基地址,這將是非常不利的,原因有二。首先,如果系統(tǒng)沒有再定位信息,它就無法加載該 DLL(可以在 DLL 創(chuàng)建時,使用鏈接程序的 / F I X E D 開關,從 DLL中刪除再定位信息,這能夠使 DLL變得比較小,但是這也意味著該 DLL必須加載到它的首選地址中,否則它就根本無法加載)。第二,系統(tǒng)必須在 DLL中執(zhí)行某些再定位操作。在 Windows 98 中,系統(tǒng)可以在頁面被轉入 RAM 時執(zhí)行再 17 定位操作。在 Windows 2021 中,這些再定位操作需要由系統(tǒng)的頁文件提供更多的存儲器,它們也增加了加載 DLL 所需要的時間量。 3) 系統(tǒng)會注意到支持已保留區(qū)域的物理存儲器位于磁盤上的 DLL 文件中,而不是在系統(tǒng)的頁文件中。 如 果由 DLL 無法加載到它的首選基地址, Windows 必須執(zhí)行再定位操作,那么系統(tǒng)也將注意到 DLL的某些物理存儲器已經(jīng)被映射到頁文件中。 如果由于某個原因系統(tǒng)無法映射 .exe 和所有必要的 DLL 文件,那么系統(tǒng)就會向用戶顯示一個消息框,并且釋放進程的地址空間和進程對象。CreateProcess 函數(shù)將向調用者返回 FALSE,調用者可以調用 GetLastError 函數(shù),以便更好地了解為什么無法創(chuàng)建該進程。 當所有的 .exe和 DLL文件都被映射到進程的地址空間之后,系統(tǒng)就可以開始執(zhí)行 .exe 文件的啟動代碼。當 .exe文件被映射后,系統(tǒng)將負責所有的分頁、緩沖和高速緩存的處理。例如,如果 .exe 文件中的代碼使它跳到一個尚未加載到內(nèi)存的指令地址,那么就會出現(xiàn)一個錯誤。系統(tǒng)能夠發(fā)現(xiàn)這個錯誤,并且自動將這頁代碼從該文件的映像加載到一個 RAM頁面。然后,系統(tǒng)將這個 RAM頁面映射到進程的地址空間中的相應位置,并且讓線程繼續(xù)運行,就像這頁代碼已經(jīng)加載了一樣。當然,這一切是應用程序看不見的。當進程中的線程每次試圖訪問尚未加載到 RAM 的代碼或數(shù)據(jù)時,該進程就會重復執(zhí)行。 在 DLL 的多個實例之間共享靜態(tài)數(shù)據(jù) 全局數(shù)據(jù)和靜態(tài)數(shù)據(jù) 不能被同一個 .exe 或 DLL 文件的多個映像共享,這是個安全的默認設置。但是,在某些情況下,讓一個 .exe 文件的多個映像共享一個變量的實例是非常有用和方便的。本節(jié)將介紹一種方法,它允許你共享 .exe或 DLL 文件的所有實例的變量。不過在介紹這個方法之前,首先讓我們介紹一些背景知識。 每個 .exe 或 DLL 文件的映像都由許多節(jié)組成。按照規(guī)定,每個標準節(jié)的名字均以圓點開頭。例如,當編譯你的程序時,編譯器會將所有代碼放入一個名叫 . text 的節(jié)中。該編譯器還將所有未經(jīng)初始化的數(shù)據(jù)放入一個 . bss 節(jié),而已經(jīng)初始化的所 有數(shù)據(jù)則放入 .data節(jié)中。 每一節(jié)都擁有與其相關的一組屬性,這些屬性如表 2 3所示。 18 表 29 DLL文件各節(jié)的屬性 屬性 含義 READ 該節(jié)中的字節(jié)可以讀取 WRITE 該節(jié)中的字節(jié)可以寫入 EXECUTE 該節(jié)中的字節(jié)可以執(zhí)行 SHARE 該節(jié)中的字節(jié)可以被多個實例共享(本屬性能夠有效地關閉 c o p y o n w r i t e機制) 除了編譯器和鏈接程序創(chuàng)建的標準節(jié)外,也可以在使用下面的命令進行編譯時創(chuàng)建自己的節(jié): pragma data_seg(“ sectionname” ) 定義全局變量 pragma data_seg() 常見的節(jié)名和作用如表 24所示: 表 210常見的節(jié)名和作用 節(jié)名 作用 .text .exe和 .dll文件的代碼 .data 已經(jīng)初始化的數(shù)據(jù) .bss 未初始化的數(shù)據(jù) .reloc 重定位表(裝載進程的進程地址空間) .rdata 運行期只讀數(shù)據(jù) .CRT C運行期只讀數(shù)據(jù) .debug 調試信息 .xdata 異常處理表 .tls 線程的本地化存儲 .idata 輸入文件名表 .edata 輸出文件名表 .rsrc 資源表 .didata 延遲輸入文件名表 第 3 章 DLL 注入 DLL基礎 動態(tài)鏈接庫( DLL) [15]是 Dynamic Link Library 的縮寫形式, DLL 是一個包含可由多個程序同時使用的代碼和數(shù)據(jù)的庫。 19 (1)動態(tài)鏈接庫是應用程序的一部分,它的任何操作都是代表應用程序進行的。所以動態(tài)鏈接庫在本質上與可執(zhí)行文件沒有區(qū)別,都是作為模塊被進程加載到自己的地址空間的。 (2)動態(tài)鏈接庫在程序編譯時并不會被插入到可執(zhí)行文件中,在程序運行時整個庫的代碼才會調入內(nèi)存,這就是所謂 的“動態(tài)鏈接”。 (3)如果有多個程序用到同一個動態(tài)鏈接庫, Windows 在物理內(nèi)存中只保留一份庫的代碼,僅通過分頁機制將這份代碼映射到不同的進程中。這樣,不管有多少程序同時使用一個庫,庫代碼實際占用的物理內(nèi)存永遠只有一份。 由于動態(tài)鏈接庫的“動態(tài)鏈接”特性使得我們可以將用于 Windows API 攔截的 DLL在被攔截程序運行過程中加載到它的進程地址空間中,也就是 DLL 注入。 另外,當多個應用程序是用同一個 DLL時,該 DLL只會被載入一次,所有應用程序都共享該 DLL 的頁面,這樣就可以在這些應用程序之間共 享數(shù)據(jù)及其資源了。這是攔截進程如何得到獲取的被攔截進程通信信息問題的基礎,將在下文中進行詳細的闡述。 Windows API 中的所有函數(shù)都包含在 DLL中。 3個最重要的 DLL是 Kernel32. DLL,它包含用于管理內(nèi)存、進程和線程的各個函數(shù); User32. DLL,它包含用于執(zhí)行用戶界面任務(如窗口的創(chuàng)建和消息的傳送)的各個函數(shù); GDI32. DLL,它包含用于畫圖和顯示文本的各個函數(shù)。 DLL的運行機制 為了全面 理解 DLL是如何運行的以及你和系統(tǒng)如何使用 DLL,讓我們首先觀察一下 DLL 的整個運行情況。圖 3 1綜合說明了它的所有組件一道配合運行的情況。 現(xiàn)在要重點介紹可執(zhí)行模塊和 DLL模塊之間是如何隱含地互相鏈接的。 在圖 3 1中你可以看到,當一個模塊(比如一個可執(zhí)行文件)使用 DLL中的函數(shù)或變量時,將有若干個文件和組件參與發(fā)揮作用。 20 圖 31應用程序如何創(chuàng)建和隱含鏈接 DLL的示意圖 創(chuàng) 建 DLL: 1) 建立帶有輸出原型 /結構 /符號的頭文件。 2) 建立實現(xiàn)輸出函數(shù) /變量的 C/C++源文件。 3) 編譯 器為每個 C/C++源文件生成 .obj 模塊。 4) 鏈接程序將生成 DLL 的 .obj 模塊鏈接起來。 5) 如果至少輸出一個函數(shù) /變量,那么鏈接程序也生成 lib 文件。 創(chuàng)造 EXE: 6) 建立帶有輸入原型 /結構 /符號的頭文件。 7) 建立引用輸入函數(shù) /變量的 C/C++源文件。 8) 編
點擊復制文檔內(nèi)容
試題試卷相關推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1