久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

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

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

第四章 探索 Windows 2000 的內(nèi)存管理機(jī)制

翻譯: Kendiv( fcczj@263.net )

更新: Sunday, February 17, 2005

聲明:轉(zhuǎn)載請(qǐng)注明出處,并保證文章的完整性,本人保留譯文的所有權(quán)利。

內(nèi)存 Dump 工具 ---- 本書示例程序

現(xiàn)在你已經(jīng)學(xué)完了復(fù)雜和讓人困惑的內(nèi)存 Spy 設(shè)備的 IOCTL 函數(shù)的代碼,你可能想看這些函數(shù)運(yùn)行起來是什么樣子。因此,我創(chuàng)建了一個(gè)控制臺(tái)模式的工具,名為:“ SBS Windows 2000 Memory Spy ”,該工具會(huì)加載 Spy 驅(qū)動(dòng)程序,根據(jù)命令行出入的參數(shù),它會(huì)調(diào)用多個(gè) IOCTL 函數(shù)。該程序的可執(zhí)行文件為: w2k_mem.exe ,其源代碼位于本書光盤的 srcw2k_mem 目錄下。

命令行格式

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

// w2k_mem.exe

// SBS Windows 2000 Memory Spy V1.00

// 08-27-2000 Sven B. Schreiber

// sbs@orgon.com

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. 內(nèi)存 Spy 工具的幫助信息

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

如果提供一些簡(jiǎn)單的示例,很容易掌握 w2k_mem.exe 采用的復(fù)雜命令行選項(xiàng),下面就給出一些:

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

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

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

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

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

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

示列 4-2. 數(shù)據(jù)請(qǐng)求示列

示列 4-3. 以指定格式顯示數(shù)據(jù)

與 TEB 相關(guān)的地址

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

如果在一個(gè)地址之前出現(xiàn)了 +t 選項(xiàng), w2k_mem.exe 將自動(dòng)把 FS 段的基地址加到該地址上, 示列 4-4 展示了 w2k_mem +dt #0x38 0 命令執(zhí)行后的輸出。這一次我省略了 w2k_mem.exe 輸出的標(biāo)題和狀態(tài)信息。

示列 4-4. 顯示第一個(gè)線程環(huán)境塊( TEB

與 FS 相關(guān)的地址

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

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

示列 4-5. 顯示內(nèi)核的處理器控制區(qū)域( KPCR

FS:[Base] 尋址方式

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

示列 4-6. 顯示進(jìn)程環(huán)境塊( PEB

示列 4-7. 顯示內(nèi)核的處理器控制區(qū)域( KPRCB

句柄 / 對(duì)象 解析

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

相對(duì)尋址

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

示列 4-8. 頁(yè)表樣本

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

間接尋址

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

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

譯注:

對(duì)于 w2k_mem #8 +d 0x8046A180 +p 0 0 0 0 命令

0x8046A180 需要由你自己系統(tǒng)中的 PsActiveProcessHead 的地址來替代。

可通過內(nèi)核調(diào)試器來查找 PsActiveProcessHead 的地址,我在這里使用的是 livekd ,命令為: ln PsActiveProcessHead

如果命令中加入了足夠的值為 0 的參數(shù), 16 進(jìn)制轉(zhuǎn)儲(chǔ)最終會(huì)回到 PsActiveProcessHead ,它用來標(biāo)識(shí)進(jìn)程鏈表的開始和結(jié)束。就像第二章里解釋的那樣, Windows 2000 維護(hù)的雙向鏈表實(shí)際上是一個(gè)環(huán);也就是說,鏈表中最后一個(gè)成員的 Flink 將指向鏈表中的第一個(gè)成員,而鏈表中第一個(gè)成員的 Blink 指向最后一個(gè)成員。

示列 4-9. 向下遍歷活動(dòng)進(jìn)程鏈表

加載模塊

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

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

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

標(biāo)簽: Windows系統(tǒng)
主站蜘蛛池模板: 国产伊人99 | 国产成人精品免费视频大全 | 亚洲成人动漫在线观看 | 一区二区三区视频 | 亚洲精品视频在线 | 国产精品综合 | 成人免费在线视频 | jlzzjlzz国产精品久久 | 中文字幕在线三区 | 久久极品 | a欧美 | 国产精品永久免费视频 | 日韩精品小视频 | 在线激情网站 | 激情久久久 | 国产色视频网站 | 网站av| 中文字幕一区二区三区四区不卡 | 四虎动漫 | 免费中文字幕 | 亚洲国产日韩欧美 | 中文二区 | 日韩一区二区在线观看 | 亚洲一区二区三区高清 | 国产最好的精华液网站 | 一区免费 | 中文字幕一区二区三区乱码图片 | а_天堂中文最新版地址 | 国产99久久久国产精品 | 91精品国产91久久久久久最新 | 国产精品自产av一区二区三区 | 国产成人av一区二区三区 | 波多野吉衣网站 | 国产欧美在线观看 | 日韩手机专区 | 亚洲精品乱码久久久久久蜜糖图片 | www国产亚洲精品久久网站 | 亚洲视频一区二区在线 | 亚洲91精品 | 久久九九精品视频 | 4h影视|