国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術文章
文章詳情頁

《Undocumented Windows 2000 Secrets》翻譯 --- 第四章(7)

瀏覽:139日期:2023-08-27 18:00:08

第四章 探索 Windows 2000 的內存管理機制

翻譯: Kendiv( [email protected] )

更新: Sunday, February 17, 2005

聲明:轉載請注明出處,并保證文章的完整性,本人保留譯文的所有權利。

內存 Dump 工具 ---- 本書示例程序

現在你已經學完了復雜和讓人困惑的內存 Spy 設備的 IOCTL 函數的代碼,你可能想看這些函數運行起來是什么樣子。因此,我創建了一個控制臺模式的工具,名為:“ SBS Windows 2000 Memory Spy ”,該工具會加載 Spy 驅動程序,根據命令行出入的參數,它會調用多個 IOCTL 函數。該程序的可執行文件為: w2k_mem.exe ,其源代碼位于本書光盤的 srcw2k_mem 目錄下。

命令行格式

你可以從光盤中運行內存 Spy 工具: d:binw2k_mem.exe ,這里 d: 應該由你的 CD-ROM 盤符代替。如果無參數啟動 w2k_mem.exe ,將會列出冗長的命令信息,如 示列 4-1 所示。 W2k_mem.exe 基本的命令體系是:一個命令包含一個或多個數據請求,每個命令都至少提供一個線性基址,內存 Dump 將從該地址開始。如果你愿意還可指定內存塊的大小,不過這是可選的,內存塊的默認大小是 256 。命令中的內存大小必須以“ # ”開始??赏ㄟ^增加多個選項來改變命令的默認行為。一個選項包括一個單字符的選項 ID 和一個“ + ”或“ - ”前綴?!?+ ”或“ - ”表示允許或禁止該選項。默認情況下,所有選項都是允許的。

// w2k_mem.exe

// SBS Windows 2000 Memory Spy V1.00

// 08-27-2000 Sven B. Schreiber

// [email protected]

Usage: w2k_mem { { [+option|-option] [/<path>] } [#[[0]x]<size>] [[0]x]<base> }

<path> specifIEs a module to be loaded into memory.

Use the +x/-x switch to enable/disable its startup code.

If <size> is missing, the default size is 256 bytes.

Display address options (mutually exclusive):

+z -z zero-based display on / OFF

+r -r physical RAM addresses on / OFF

Display mode options (mutually exclusive):

+w -w Word data formatting on / OFF

+d -d DWORD data formatting on / OFF

+q -q QWORD data formatting on / OFF

Addressing options (mutually exclusive):

+t -t TEB-relative addressing on / OFF

+f -f FS-relative addressing on / OFF

+u -u user-mode FS:[<base>] on / OFF

+k -k kernel-mode FS:[<base>] on / OFF

+h -h handle/object resolution on / OFF

+a -a add bias to last base on / OFF

+s -s sub bias from last base on / OFF

+p -p pointer from last block on / OFF

System status options (cumulative):

+o -o display OS information on / OFF

+c -c display CPU information on / OFF

+g -g display GDT information on / OFF

+i -i display IDT information on / OFF

+b -b display contiguous blocks on / OFF

Other options (cumulative):

+x -x execute DLL startup code on / OFF

Example: The following command displays the first 64

bytes of the current Process Environment Block (PEB)

in zero-based DWORD format, assuming that a pointer to

the PEB is located at offset 0x30 inside the current

Thread Environment Block (TEB):

w2k_mem +t #0 0 +pzd #64 0x30

Note: Specifying #0 after +t causes the TEB to be

addressed without displaying its contents.

示列 4-1. 內存 Spy 工具的幫助信息

每個命令行所執行的數據請求不等同于選項,數據大小的說明,路徑或任何其他的命令修飾成分。命令中的每個無格式的數字都被假定是一個線性地址,并且將從該地址開始,按 16 進制顯示其內容。數字默認按 10 進制格式解釋,如果有前綴“ 0x ”或“ x. ”則按照 16 進制格式解釋。

如果提供一些簡單的示例,很容易掌握 w2k_mem.exe 采用的復雜命令行選項,下面就給出一些:

l w2k_mem 0x80400000 顯示從線性地址 0x80400000 開始的 256 個字節,產生的內容可能會類似于示列 4-2 。順便說一下,這是 ntoskrnl.exe 的 Dos stub (注意開始的“ MZ ” ID )。

l w2k_mem #0x40 0x80400000 顯示從線性地址 0x80400000 開始的 64 個字節, #0x40 表示要顯示的塊大小為 64

l w2k_mem +d #0x40 0x80400000 在前一命令的基礎上,按照 32 位的 DWORD Chunk 來顯示,這就是 +d 選項的作用。在同一個命令中,首先出現的 + 選項將會一直有效,除非使用相應的 - 選項或使用其互斥選項。如 +d 的互斥選項為: +w 、 +q 。

l w2k_mem +wz #0x40 0x10000 +d –z 0x200000 包含兩個數據請求。首先,線性地址范圍: 0x10000----0x1003F 中的內容將按照 16 位 WORD 格式來顯示,隨后的 0x20000---0x2003F 按照 32 位 DWORD 格式顯示(見 示列 4-3 )。第一個請求中還包含一個 +z 選項,該選項將使“ Address ”列的數字從 0 開。在第二個請求中,通過 -z 選項,禁用了從 0 開始的顯示模型。

l w2k_mem +rd #4096 0xC0300000 以 DWORD 格式顯示起始于 0xC0300000 的系統頁目錄。 +r 選項表示在“ Address ”列中以物理內存地址代替線性地址。

現在,你應該基本上明白命令行格式是如何工作的了。在下一小節中,將詳細討論一些比較特別的選項和特性。它們中的大多數會改變對出現在它們之前的地址的解釋方式。在默認情況下,指定的地址是一個線性基址,內存 Dump 將從那里開始。選項: +t 、 +f 、 +u 、 +k 、 +h 、 +a 、 +s 和 +p 將以多種方式改變這種默認解釋方式。

示列 4-2. 數據請求示列

示列 4-3. 以指定格式顯示數據

與 TEB 相關的地址

進程中的每個線程都有其自己的線程環境塊( Thread Environment Block , TEB ),系統在此 TEB 中保存頻繁使用的線程相關的數據。在用戶模式下,當前線程的 TEB 位于獨立的 4KB 段,可通過 CPU 的 FS 寄存器來訪問該段。而在內核模式下, FS 卻指向不同的段,下面將解釋之。一個進程的所有 TEB 都以堆棧的方式,存放在從 0x7FFDE000 開始的線性內存中,每 4KB 為一個完整的 TEB ,不過該內存區域是向下擴展的。這意味著,第二個線程的 TEB 的地址將是 0x7FFDC000 ,這和堆棧類似。在第七章,我們會詳細討論 TEB 的內容和進程環境塊( Process Environment Block , PEB )的地址 0x7FFDF000 (參見 列表 7-18 7-19 )。這里知道 TEB 的存在,而且知道其地址由 FS 寄存器給出就足夠了。

如果在一個地址之前出現了 +t 選項, w2k_mem.exe 將自動把 FS 段的基地址加到該地址上, 示列 4-4 展示了 w2k_mem +dt #0x38 0 命令執行后的輸出。這一次我省略了 w2k_mem.exe 輸出的標題和狀態信息。

示列 4-4. 顯示第一個線程環境塊( TEB

與 FS 相關的地址

我前面已經提到過,在用戶和內核模式下, FS 將指向不同的段。 +t 選項將選擇用戶模式下 FS 所指向的地址, +f 選項則使用在內核模式下 FS 指向的地址。當然, Win32 應用程序沒有辦法獲取該地址,因此,需要再次請求 Spy 設備。 w2k_mem.xe 調用 IOCTL 函數 SPY_IO_CPU_INFO ,來讀去 CPU 的狀態信息,這包括所有段寄存器在內核模式下的值。從此開始,所有的事情和 +t 選項相同。

內核模式的 FS 指向另一個線程相關的結構, Windows 2000 內核回經常使用該結構,其名稱為:內核的處理器控制區域( Kernel's Processor Control Region , KPCR )。該結構在討論 IOCTL 函數 SPY_IO_OS_INFO 時已經提及過,在第七章我們還會再次提到它(見 列表 7-16 )。再次強調,現在你只需要知道該結構存在于線性地址 0xFFDFF000 處即可,使用 +f 選項就可訪問它。在 示列 4-5 中,我使用命令: w2k_mem +df #0x54 0 來演示,在實際情況下,使用 +f 選項的結果。

示列 4-5. 顯示內核的處理器控制區域( KPCR

FS:[Base] 尋址方式

在察看 Windows 2000 內核代碼時,你會經常遇到像 MOV EAX, FS:[18h] 這樣的指令。這些指令用于取出屬于 TEB 或 KPCR 的成員的值,或者是屬于其他包含在 FS 段中的結構體的成員的值。它們中的大多數都指向其他的內部結構。命令行選項 +u 和 +k 允許你; +u 表示使用用戶模式下的 FS 段; +k 表示使用內核模式下的 FS 段。例如,命令: w2k_mem +du #0x1E8 0x30 (見 示列 4-6 )將在用戶模式下,從位于 FS:[30h] 處的內存塊中轉儲( dump ) 488 個字節。而命令: w2k_mem +dk #0x1C 0x20 (見 示列 4-7 )將顯示由內核模式下的 FS:[20h] 指向的內存塊的前 28 個字節,這實際上是指向 KPRCB 的一個指針。如果你不知道 PEB 或 KPRCB 是什么,不要著急,讀完本書你就會一目了然了。

示列 4-6. 顯示進程環境塊( PEB

示列 4-7. 顯示內核的處理器控制區域( KPRCB

句柄 / 對象 解析

假設你有一個對象句柄,而且你想要看看該句柄對應的對象在內存中是什么樣子。如果你使用 +h 選項,你就會發現完成這一任務太簡單了,該選項將調用 Spy 設備的 SPY_IO_HANDLE_INFO 函數(見 列表 4-26 )來查找給定句柄的對象體( Object Body )。 Windows 2000 對象世界是一個令人驚訝的主題,我將在第七章深入剖析它。所以,現在先把它丟掉一邊去。

相對尋址

有時使用這種尋址方式可以很容易顯示一系列內存塊,這些內存塊間隔相同大小的字節。這很有可能,比如,一個數組結構,像朵線程程序中的 TEB 堆棧。 +a 和 +s 選項通過將給定的地址解釋為一個偏移量,來進行對尋址。這兩個選項的區別是: +a ( add bias )將產生一個正的偏移量, +s ( subtract bias )則產生一個負的偏移量。 示列 4-8 展示了命令: w2k_mem +d #32 0xC0000000 +a 4096 4096 的輸出結果。它將取出三個連續 4KB 頁中的前 32 個字節,起始地址為: 0xC0000000 ,系統的頁表就位于此處。注意, +a 選項接近命令的結尾處。它將使隨后的“ 4096 ”將被解釋為偏移量,該偏移量將被加到前面的基地址上。

示列 4-8. 頁表樣本

示列 4-8 還展示了如果傳入一個無效的線性地址會發生什么。顯然,第一對頁表涉及的 4MB 地址范圍: 0x00000000----0x003F0000 和 0x00400000-----0x007F0000 是有效的。而第三對頁表則是無效的。 w2k_mem.exe 會通過顯示一個空表來反映這一現實。程序知道那個地址范圍是有效的,因為 Spy 設備的 SPY_IO_MEMORY_DATA 函數將此信息放入作為結果的 SPY_MEMORY_DATA 結構中(參見 列表 4-25 )。

間接尋址

我所鐘愛的命令選項之一就是: +p ,因為在我準備這本書的時候,它為我節省了很多打字的時間。該選項和 +u 和 +k 的工作方式類似,但不使用 FS 段,而是使用先前顯示過的數據塊。這是一個很棒的特性,如果你想向下尋找鏈表上的對象,例如,讀取下一個成員的地址,隨該命令一起,鍵入一個新的命令等等,通過簡單在命令中加入 +p 選項和一系列偏移量,就可以指定下一個對象的鏈接在前一個 16 進制 Dump 表中的位置。

示列 4-9 中,我使用該選項來向下遍歷當前活動進程的鏈表。首先,我告訴通過內核調試器獲取系統內部變量 PsActiveProcessHead 的地址,該地址是一個 LIST_ENTRY 結構,用于標識進程鏈表的開始。 LIST_ENTRY 結構中包含一個 Flink (向前指針)成員和一個 Blink (向后)成員。 Flink 成員位于偏移量 0 處, Blink 成員位于偏移量 4 處(參見 列表 2-7 )。命令: w2k_mem #8 +d 0x8046A180 +p 0 0 0 0 首先轉儲 PsActiveProcessHead (這是一個 LIST_ENTRY 結構),然后從 +p 選項出開始轉為間接尋址。選項后的四個 0 是用來告訴 w2k_mem.exe 提取前一個數據塊中偏移量為 0 的值,這正是 Flink 所在的位置。注意, 示列 4-9 中的 Blink 成員在偏移量為 4 的位置上,它指向前一個 LSIT_ENTRY 之后,就像我們期望的那樣。

譯注:

對于 w2k_mem #8 +d 0x8046A180 +p 0 0 0 0 命令

0x8046A180 需要由你自己系統中的 PsActiveProcessHead 的地址來替代。

可通過內核調試器來查找 PsActiveProcessHead 的地址,我在這里使用的是 livekd ,命令為: ln PsActiveProcessHead

如果命令中加入了足夠的值為 0 的參數, 16 進制轉儲最終會回到 PsActiveProcessHead ,它用來標識進程鏈表的開始和結束。就像第二章里解釋的那樣, Windows 2000 維護的雙向鏈表實際上是一個環;也就是說,鏈表中最后一個成員的 Flink 將指向鏈表中的第一個成員,而鏈表中第一個成員的 Blink 指向最后一個成員。

示列 4-9. 向下遍歷活動進程鏈表

加載模塊

有時你可能會想 dump 一個模塊在內存中的映像,但是該模塊還沒有映射到 w2k_mem.exe 進程的線性地址空間。通過使用 /<path> 和 +x 選項來顯示的加載一個指定模塊就可解決這一問題。每個前綴為斜線(“ / ”)的命令項將被解釋為模塊的全路徑名, w2k_mem.exe 將嘗試使用 Win32 API 函數 LoadLibraryEx() 從該路徑出加載模塊。默認情況下,將使用加載選項 DON'T_RESOLVE_DLL_REFERENCES ,這會使模塊被加載到內存中,但不會被初始化。對于一個 DLL ,這意味著它的 DllMian() 入口點將不會被調用。同樣,在該 DLL 的導入節中指定的依賴模塊也都不會被加載。然而,如果你在路徑參數之前,指定了 +x 選項,那么模塊將在加載后進行完整的初始化。注意,有些模塊可能會拒絕在 w2k_mem.exe 進程的上下文環境中被初始化。例如,內核模式的設備驅動程序就不能在使用 +x 選項的情況下,被加載到內存中。

加載和顯示一個模塊一般需要經過兩個操作步驟,如 示列 4-10 所示。首先,你應該加載模塊,而不顯示任何數據,以找出系統分配給該模塊的基地址。幸運的是,只要在此期間,沒有其他的模塊加入到進程中,模塊的加載地址就將是唯一的,因此,接下來嘗試通過相同的基地址來加載模塊。在 示列 4-10 中,我加載了內核模式的設備驅動程序 nwrdr.sys ,它是微軟的 NetWare 重定向器。在我的系統里沒有使用 IPX/SPX ,因此,默認沒有加載該驅動程序。

列表 4-10. 加載和顯示一個模塊映像( Module Image

標簽: Windows系統
主站蜘蛛池模板: 国内精品久久久久影院网站 | 欧美日韩在线视频播放 | 国产精品无打码在线播放9久 | 亚洲一区二区中文 | 女人夜色黄网在线观看 | 黑人巨大交牲老太 | 在线成人免费观看国产精品 | 亚洲免费a | 韩国一级做a爰片性色毛片 韩国一区在线 | 欧美日韩国产亚洲一区二区 | 国产色啪午夜免费视频 | 男女性高爱潮免费网站 | 波多野结衣在线视频免费观看 | 99国产精品一区二区 | 色播亚洲视频在线观看 | 成人一区二区免费中文字幕 | 国产亚洲精品一品区99热 | 日韩国产欧美一区二区三区 | 国产精品久久视频 | 深夜福利爽爽爽动态图 | 亚洲一级毛片视频 | 国产91综合 | 一级作爱视频免费观看 | 日本一级特黄毛片高清视频 | 午夜一级影院 | 日韩欧美一及在线播放 | 欧美精品成人一区二区视频一 | 日本综合欧美一区二区三区 | 免费一级欧美性大片 | 五月激激激综合网色播免费 | 日韩欧美一级毛片精品6 | 美女国产在线观看免费观看 | 亚洲 自拍 欧美 综合 | 在线视频一二三区 | 久草在线网站 | 91精品久久久久久久久网影视 | 亚洲区精品久久一区二区三区 | 美日韩黄色片 | 久久99久久精品国产只有 | 99热只有精品一区二区 | 全部免费毛片在线 |