[電子報封存 ^][< 第 6 卷,第 1 期][第 7 卷,特殊公告 >]

Sysinternals 電子報第 7 卷,第 1 期

http://www.sysinternals.com
Copyright (C) 2005 Mark Russinovich


2005 年 1 月 5 日 - 本期內容:

  1. 社論

    • 有 DEP 嗎?
  2. WINDOWS INTERNALS,第 4 版

  3. SYSINTERNALS 最新動向

    • 11 月統計資料
    • Sysinternals Magazine 文章
    • Sysinternals RSS 摘要
    • Mark 是 Microsoft MVP
    • Autoruns v6.01
    • PROCESS EXPLORER v8.61
    • Sigcheck v1.0
    • Bginfo v4.07
    • Regjump v1.0
    • Hex2dec v1.0
    • Tcpvcon v2.34
    • PsTools 更新
    • Microsoft 的 Sysinternals
  4. 內部資訊

    • 網際網路瀏覽
    • 使用 LiveKd 對生病的系統進行疑難排解
    • CreekSide?
    • ChkReg 登錄修正程式
    • Windows 記憶體診斷
    • 研究未記載的介面
  5. INTERNALS 訓練

    • 在舊金山舉行的 Windows Connections
    • Mark Russinovich 和 David 所羅門的實作 Windows Internals/Sysinternals 課程

Sysinternals 電子報由 Winternals Software 贊助,該公司的網址為 http://www.winternals.com。 Winternals Software 是一家領先的開發公司,提供了諸多適用於 Windows NT/2000/XP/2003 的先進系統工具。

Winternals 很高興宣佈即將發行 Administrator's Pak 5.00,以及包含 ERD Commander 2005 在內的全面性更新。

ERD Commander 2005 的新功能包括:

  • 損毀分析器:快速且輕鬆地診斷造成 Windows 當機的驅動程式,即使系統無法開機也可以
  • DiskWipe - 安全地清除硬碟或磁碟區;Autoruns:查看哪些應用程式在 Windows 安裝程式和使用者登入時啟動 - 適用於診斷系統資源問題,並尋找潛在的惡意程式碼
  • FireFox 網頁瀏覽器:下載 Hotfix、驅動程式更新、在 Microsoft 知識庫中搜尋說明,這些全都在您嘗試修復的系統上
  • Hotfix 解除安裝精靈,可讓您從無法開機的系統上移除 Hotfix 和 Service Pack
  • 系統檔案修復,可檢查 Windows 系統檔案的完整性。

這些功能、ERD Commander 2005 的眾多改進和可用性增強功能,以及以 Windows PE 為基礎的更易於建置和使用的全新遠端復原用戶端,全都包含在 2005 年 1 月下旬推出的全新 Administrator's Pak 5.0 中。 若要在發行時註冊試用 Administrator's Pak 5.0,請造訪 http://www.winternals.com/ap5preview/.

社論

大家好,

歡迎閱讀 Sysinternals 電子報。 本電子報目前有 40,000 名訂閱者。

包括間諜軟體和病毒在內的惡意程式碼不斷增加,讓每個人都擔心安全問題。 良好的安全措施包括及時更新作業系統和應用程式修補程式、安裝和設定防火牆、防毒軟體和間諜軟體移除工具,以及在從網際網路下載或開啟電子郵件附件時謹慎判斷。 不過,儘管採取徹底的措施,惡意程式碼仍然可以找到規避防禦機制和感染電腦的方法。 系統防禦機制中最常見的漏洞是緩衝區溢位問題,因此您應該熟悉 Windows XP Service Pack 2 的資料執行防止 (DEP) 功能。

緩衝區溢位是一種程式設計錯誤,惡意程式可以利用這種錯誤來控制執行編碼錯誤的執行緒。 緩衝區溢位通常是以堆疊為基礎,這表示攻擊者會為程式提供比儲存在堆疊上的緩衝區所能容納更多的資料。 這些資料的製作方式如下:當具有溢位的函式嘗試傳回叫用它的函式時,它會改為傳回資料中的位置。

遺憾的是,即使是經過最全面測試和檢查的軟體,也可能出現緩衝區溢位錯誤的困擾。 Windows 及其元件軟體每月都會公告多起緩衝區溢位事件 (Linux 及其應用程式也無法倖免,緩衝區溢位數目 Windows 相當)。 大部分緩衝區溢位惡意探索的常見手段是,它們會導致在只能包含資料的記憶體區域中執行程式碼。

雖然 Intel Itanium 處理器自推出以來就支援不可執行保護,但直到 Windows XP SP2 (以及即將推出的 Windows Server 2003 SP1),Windows 才真正採用了這項硬體支援,例如將執行緒堆疊和堆積記憶體標記為不可執行。 支援不可執行硬體保護的處理器包括 64 位元 AMD64 Opteron 和 Athlon 64 以及 Intel 的仿效產品 EM64T (現在可在 Xeon 和 Pentium 4 處理器上使用)。 AMD 和 Intel 最近推出了包含不可執行支援的 32 位元處理器:AMD Sempron 和 Pentium 4 "J" 系列 (例如 520J、540J 等)。

顯而易見地,Windows 應該預設對堆疊和應用程式堆積記憶體強制實施不可執行保護,以防止緩衝區溢位惡意探索,但現有的應用程式數目以數十萬計,其中有些應用程式實際上可能依賴未強制執行來進行正確作業的設定。 因此,Windows XP SP2 作為第一個強制實施不可執行保護的 Windows 版本,可讓系統管理員控制哪些處理程序應受到保護,而哪些處理程序不受保護。 首先,為了決定改善未來的安全性,64 位元版本的 Windows 對所有 64 位元處理程序一律強制實施不可執行旗標。 如果軟體廠商想要推出 64 位元應用程式,他們必須確定不會從記憶體的不可執行區域執行程式碼 (如果他們是動態產生程式碼,就像 Java 和 .NET 應用程式通常的操作一樣,則可以將資料區域標記為可執行)。

其次,由於緩衝區溢位惡意探索最常見的目標是作業系統元件,因此 32 位元 Windows XP 和 Windows Server 2003 預設會保護核心作業系統映像。 不過,針對 32 位元應用程式 (在 32 位元 Windows 或 64 位元 Windows 上執行),Windows XP 預設會採用「選擇加入」策略 (應用程式預設不受保護),而 Windows Server 2003 則預設採用「選擇退出」策略 (應用程式預設受保護,但特定應用程式可以排除在外)。 這很合理,因為對伺服器系統來說,安全性通常具有更高的優先權。 您可以在 DEP 組態對話方塊中變更選擇加入或選擇退出設定,該對話方塊可在 [系統控制台] 小程式的 [進階] 頁面上,透過 [效能] 區段中的 [設定] 按鈕存取。

正如我前面所提到,除了相對較新的 AMD Sempron 和 Pentium 4 "J" 處理器外,迄今為止推出的所有 x86 相容晶片都缺乏不可執行支援。 不過,Windows XP 和 Windows Server 2003 會在這些處理器上實作有限的 DEP 形式,稱為「軟體 DEP」。 由於當執行緒產生錯誤時,作業系統會取得執行緒的控制權,因此可以確保它會執行的錯誤處理常式是程式碼以靜態方式註冊的處理常式。 這可防止重新導向執行緒錯誤處理常式的惡意探索,以在溢位堆疊緩衝區中執行惡意程式碼,而這即是 CodeRed 病毒在 2001 年爆發時導致 IIS 執行的動作。

儘管 DEP 相對簡單,但這項機制是作業系統在其防禦自我傳播惡意程式碼時提供的最強防禦措施之一。 可惜的是,以下三者限制了其效力:大多數目前部署的處理器缺乏對不可執行設定的硬體支援、Windows XP 中的預設選擇加入設定 (僅保護核心作業系統處理程序),以及缺乏意識。 軟體 DEP 的範圍有限,因此除非是在支援不可執行的硬體上執行 Windows,否則 DEP 的效果有限。 Windows XP 預設採用選擇加入設定,代表即使使用者在不可執行的硬體上執行 Windows,受到 DEP 保護的唯一處理程序就是作業系統的處理程序,如果您的協力廠商防火牆、網頁瀏覽器、電子郵件閱讀器或其他支援網路的應用程式中有緩衝區溢位,您仍然容易受到攻擊。 事實上,一些最常被惡意程式碼探索的應用程式 (如 IIS 和 Outlook),並未受到選擇加入設定的保護。 最後,由於大多數人不知道 DEP 的預設行為,甚至聞所未聞,因此系統在很大程度上仍面臨緩衝區溢位問題的風險。

Microsoft 是時候讓使用者付出相容性的代價,來換取更好的安全性了,否則使用者最終將在病毒面前付出更高的代價,而他們又會將此代價轉嫁給 Microsoft。 同時,我強烈建議各位升級至 Windows XP SP2 (Windows XP 64 位元版本和 Windows Server 2003 SP1 也支援不可執行保護)、切換為選擇加入,以及升級至包含不可執行保護支援的處理器 (可惜的是,我並不會因此而獲利)。

請將電子報轉發給您認為可能對其內容感興趣的朋友。

感謝您!

-Mark

WINDOWS INTERNALS,第 4 版

我與 Dave Solomon 合著關於 Windows Server 2003、Windows 2000 和 Windows XP 內部知識的 Microsoft 官方書籍現已在書店上架。 Dave 和我將前一版的涵蓋範圍擴充了約 25%,不僅加入了有關 Windows Server 2003 和 XP 變更的新素材,還新增了關於疑難排解工具和技術的內容。 其中包括使用 Process Explorer、Filemon 和 Regmon 的進階秘訣,以及 Windows 損毀傾印分析的全新章節。

請至以下網址進一步了解本書內容以及線上訂購

http://www.sysinternals.com/windowsinternals.shtml

SYSINTERNALS 最新動向

SYSINTERNALS RSS 摘要

我經常收到將新發佈的通知機制加入 Sysinternals 的要求,因此,我最終跟隨整個網路的趨勢並新增了 RSS 摘要 (如果您不熟悉 RSS 摘要,以下是很好的入門指南:http://rss.softwaregarden.com/aboutrss.html). 此摘要也讓我有機會將未必完整列在首頁的次要錯誤修正和更新通知大家。 根據摘要每天獲得的點擊次數,這看起來已經成為大家得知更新的首選方式。

請至以下網址存取 Sysinternals RSS 摘要:

http://www.sysinternals.com/sysinternals.xml

SYSINTERNALS 雜誌文章

大約六個月前,我開始在 Windows IT Pro Magazine (前身為 Windows and .NET Magazine) 上撰寫有關 Sysinternals 工具的半月刊專欄。 每期專欄均說明不同的工具,並提供進階使用方式的秘訣,以及其運作方式的相關資訊。

如下所列,在已發佈的三期專欄中,前兩期可供非訂閱者線上存取,第三期則即將推出:

Autoruns:http://www.win2000mag.com/Windows/Article/ArticleID/44089/44089.html

Pslist 和 Pskill:http://www.winnetmag.com/Windows/Article/ArticleID/43569/43569.html

PsExec:http://www.winnetmag.com/Windows/Issues/IssueID/714/Index.html

MARK 是 MICROSOFT MVP

平臺 SDK Microsoft 最有價值的專業版 (MVP) 負責人已為我命名為 2005 的 MVP。 我很感謝他和 Microsoft 對 Sysinternals 對 Microsoft 客戶所做的貢獻。

11 月統計資料

我終於取得了一個像樣的 Sysinternals 網路流量分析程式,並分析了 11 月的記錄檔。 數字之大連我自己都感到驚訝。 以下是摘錄的一些重點:

  • 360 萬頁面檢視次數
  • 775,000 名不重複訪客
  • 120 萬公用程式下載次數
  • 200,000 下載 Process Explorer 次數,#1 下載

AUTORUNS V6.01

Autoruns 在過去幾個月中發生了很大變化,有兩次主要版本號碼更新。 最新版的自動執行除了標準執行鍵和啟動資料夾之外,還會顯示自動啟動位置,包括 Winlogon 通知 DLL、Explorer 工具列、命名空間擴充功能和瀏覽器協助程式物件,以及自動初始化 DLL。 另一項新功能是 Google 功能表項目 (借用自 Process Explorer)從進程總管借用),可藉由開啟瀏覽器並起始搜尋選取的映像名稱,協助您識別未知的映像。

另一項新功能是映像簽署驗證,可協助您區分惡意程式碼與系統元件或信任的應用程式。 Microsoft 通常包含使用 Microsoft 私密簽署金鑰簽署的作業系統檔案雜湊。 Windows 密碼編譯函式會使用 Microsoft 的公開簽署金鑰來解密已簽署的雜湊,而 Autoruns 會藉由比較其雜湊與解密版本來驗證系統上的映像,並在有相符項目時,在映像的公司名稱前面加上 「(已驗證)」。 如果映像遭到竄改、損毀、取代或有由系統不信任的發行者簽署的雜湊,則 Autoruns 會將映像的公司名稱回報為「(未驗證)」。

身為系統管理員,您可能想要檢查您登入帳戶以外的帳戶中的自動啟動映像,因此 Autoruns 現在包含使用者功能表,針對在電腦上儲存設定檔的每個帳戶提供選項。

最後,現在有一個相當於 Autoruns GUI 的命令列,稱為 Autorunsc,此命令列可對主控台列出自動執行資訊。 與 Sysinternals 的 PsExec 公用程式結合使用時,其具備將輸出格式化為 CSV 的功能,可讓您輕鬆地針對整個網路的電腦產生已設定自動啟動映像的清查。

Autoruns 下載網址:
http://www.sysinternals.com/ntw2k/freeware/autoruns.shtml

PROCESS EXPLORER V8.61

同樣地,Process Explorer 這項取代「工作管理員」作為進階處理程序管理公用程式的工具,仍是我最關注的工具,這是因為我收到關於這項工具的踴躍反應。 自上次電子報發行以來,Process Explorer 已從版本 8.4 升級到 8.6。 這兩個版本具有一系列新功能,包括可起始搜尋所選處理程序相關資訊的 Google 功能表項目、處理程序屬性對話方塊中的字串索引標籤 (其中列出處理程序映像檔中存在的 ASCII 和 Unicode 字串)、列出所選 DLL 映像檔中字串的字串功能表項目,以及當您將滑鼠停留在 Process Explorer 系統匣圖示上時顯示的工具提示中最消耗 CPU 的處理程序名稱。

許多人要求提供從「工作管理員」切換時遺失的功能,例如 [工作管理員應用程式] 索引標籤。[應用程式] 索引標籤會顯示互動式桌面上最上層視窗的清單,以及擁有每個視窗的執行緒狀態:如果執行緒目前正在等待接收視窗訊息,或在過去五秒內處理過視窗訊息,則顯示「執行中」,否則會顯示「未回應」(令人意外的是,這通常意味著「執行中」代表執行緒正在等待,而「未回應」則代表停止執行)。 您現在可以在 Process Explorer 透過將 [視窗標題] 和 [視窗狀態] 欄新增至處理程序檢視,以取得相同的資訊。

Process Explorer 具有以 at.NET 處理程序為目標的功能已有一段時間,包括醒目提示 .NET 處理程序,以及在 .NET 處理程序的處理程序屬性對話方塊中提供 [.NET 效能] 索引標籤。 .NET 處理程序是與 .NET 執行階段一起載入和註冊的處理程序。 如果處理程序在啟動之後才註冊,Process Explorer 可能無法辨識它是 .NET 處理程序,但當您按下重新整理工具列按鈕、F5 鍵或選取 [重新整理] 功能表項目來手動重新整理顯示畫面時,最新版本會重新檢查處理程序的 .NET 狀態和工作物件成員資格。

在不確定哪個處理程序擁有視窗的情況下,您可以使用新的視窗尋找工具工具列按鈕來識別它。 只要將看起來像目標的工具列按鈕從工具列拖曳到相關視窗上方,Process Explorer 就會在處理程序檢視中選取具有擁有權的處理程序。

另一個顯而易見的附加功能是工具列附近顯示的迷你 CPU 圖表。 此圖表顯示系統的 CPU 使用量記錄,與按一下它以開啟 [Process Explorer 系統資訊] 對話方塊時所取得的擴充版本一樣,也會顯示工具提示,其中包含您將滑鼠移到圖中某點的時間戳記和最高 CPU 耗用處理程序。 您可以將圖表移至工具列區域中的任何位置,甚至移至其中一列,讓圖表沿著 Process Explorer 視窗的寬度延伸。

兩個安全性相關功能是映像簽署驗證和資料執行保護 (DEP) 狀態。 當您啟用映像簽署選項時, Process Explorer 會檢查處理程序映像是否已由信任的簽署者數位簽署,例如 Autoruns,並在處理程序屬性對話方塊中的公司名稱前面加上「已驗證」或「未驗證」。 此選項預設為停用,因為映像簽署檢查可能需要幾秒鐘的時間,以前往網站來驗證簽署憑證的有效性。

我在這期電子報的簡介中說明的 DEP,是應該在 Windows XP SP2 上啟用的功能,以增強針對緩衝區溢位惡意探索的保護。 您可以將 [DEP 狀態] 欄新增至處理程序檢視,或檢查處理程序屬性對話方塊的映像頁面上的 [DEP 狀態] 欄位,以檢查處理程序的 DEP 狀態。

最後,Process Explorer 現在會在系統處理程序的 DLL 檢視中列出系統上載入的驅動程序,這是與核心和裝置驅動程式背景工作執行緒相關聯的處理程序。 與針對其他處理程序列出的 DLL,每個驅動程式都有相同的資訊,包括版本、公司名稱、完整路徑,以及系統位址空間中的載入位址。

Process Explorer 的下載網址:
http://www.sysinternals.com/ntw2k/freeware/procexp.shtml

SIGCHECK V1.0

許多 Sysinternals 工具都採用可協助使用者識別惡意程式碼的功能,而 Sigcheck 正是一個幾乎完全著重於該目標的命令列公用程式。 它會使用 Autoruns 和 Process Explorer 中包含的相同映像簽署驗證功能,告訴您檔案是否已由受信任的發行者以數位方式簽署。 此外,它會回報您所指定映像的檔案版本資訊,包括產品名稱、描述、公司名稱和版本。 這項資訊與隨附於 Windows XP 和 Windows Server 2003 的 Filever 工具所回報的內容類似,但 Sigcheck 也會回報檔案最初針對未簽署映像「連結」或建立的時間戳記,以及已簽署映像的映像簽署時間戳記。 最後,大多數已簽署的雜湊都是使用本身簽署的金鑰進行簽署,該序列形成所謂的憑證簽署鏈。 Sigcheck 支援命令列選項,指示其列印簽署鏈,其中包含簽署鏈中每個簽署者的相關資訊。

Sigcheck 與安全性相關的潛在用途之一是調查 Windows 安裝根目錄下的任何目錄 (通常是 \Windows) 中的任何未簽署的 .exe .dll 或 .sys 映像。 您可以透過使用此命令列執行 Sigcheck,輕鬆識別未簽署的 .exe 映像,例如:

sigcheck -s -u c:\windows\*.exe

所有 Microsoft 映像都應包含有效簽章,但遺憾的是,上述命令將顯示許多並未包含有效簽章,導致檔案可能被用來隱藏惡意程式碼。

Sigcheck 下載網址:
http://www.sysinternals.com/ntw2k/source/misc.shtml

BGINFO V4.07

Bginfo 這項工具會顯示您在執行它的電腦桌面上設定的資訊,讓您能夠輕鬆檢視,而這個次要更新可進一步支援點陣圖,使其必須延展以符合您指定的大小、CPU 偵測增強功能、支援 MySQL,以及改善的多監視器顯示相容性。

Bginfo 下載網址:
http://www.sysinternals.com/ntw2k/freeware/bginfo.shtml

REGJUMP V1.0

如果您曾經想要建立特定登錄機碼的檔案總管捷徑,或者只是輸入登錄機碼的路徑並讓 Regedit 開啟到目標位置,那麼您會發現 Regjump 很有用。 Regjump 是一項命令列公用程式,其使用我們在 Regmon 中首創的相同登錄「跳轉」技術。 請為 Regjump 提供登錄路徑作為其命令列引數,Regedit 將開啟並導覽至指定的機碼或值。

Regjump 下載網址:
http://www.sysinternals.com/ntw2k/source/misc.shtml

HEX2DEC V1.0

使用偵錯工具和反組譯碼時,我經常發現自己必須將十六進制轉換為十進制,反之亦然。 最終,我厭倦了還要開啟 Calc、輸入數字,然後切換基數以查看轉換結果,所以我編寫了一個小型命令行轉換公用程式。 Hex2dec 可雙向轉換,如果輸入具有 "0x" 或 "x" 前置詞,或包含字母 'a'-'f' (不區分大小寫),則可以輕鬆地將輸入內容識別為十六進位。

Hex2dec 下載網址:
http://www.sysinternals.com/ntw2k/source/misc.shtml

TCPVCON V2.34

Netstat 是內建於 Windows NT 和更高版本的命令列公用程式,其會顯示系統上目前作用中的 TCP 和 UDP 端點。 Microsoft 隨 Windows XP 推出的版本包含一項實用的資訊:開啟每個端點的處理程序的處理程序識別碼 (PID)。 不過,若要判斷處理程序的名稱或任何其他相關資訊,您必須開啟處理程序清單工具,並找到具有該 PID 的處理程序。

TCPView 是 Sysinternals GUI 應用程式,會顯示相同的作用中端點資訊,但比 Netstat 更方便,因為它包含處理程序名稱、快速切換 DNS 名稱和原始 IP 位址,以及用色彩醒目提示新增和已刪除的端點。 TCPView 的下載現在包含 TCPVCon,這是 TCPView 的主控台版本,適用於想要使用命令列介面的使用者。 不同於 Netstat,TCPVCon 會顯示與每個端點相關聯的處理程序完整路徑,並包含以 CSV 格式傾印輸出的切換開關。

Tcpvcon 下載網址:
http://www.sysinternals.com/ntw2k/source/tcpview.shtml

PSTOOLS 更新

PsKill 和 PsLoglist 是過去幾個月獲得增強的兩項 PsTools。 PsKill 是終止本機或遠端系統上處理程序的命令列公用程式,現在支援 -t 切換參數,讓您可以結束整個處理程序樹狀結構。 許多人要求提供此選項,以便輕鬆地清除批次指令碼的無法控制的樹狀結構。

PsLoglist 是命令列工具,會在本機或遠端系統上傾印事件記錄。 最近的更新已將 5 個選項新增至其內容豐富的命令列限定詞清單。 新的引數可讓您從輸出內容中排除指定的事件類型或事件來源,或只傾印過去幾分鐘或幾小時的事件。 它現在也支援執行事件記錄檔監視模式,在您終止之前,會在事件記錄檔記錄檔產生時列印。

PsTools (含 PsKill 和 PsLoglist) 下載網址:
http://www.sysinternals.com/ntw2k/freeware/pstools.shtml

WWW.MICROSOFT.COM 網站上的 SYSINTERNALS

以下是自上期電子報以來發行的 Microsoft 知識庫文章中 Sysinternals 參考内容的最新一期。 公用知識庫中對 Sysinternals 的引用總次數達到了 63 次。

  • 修正程式:適用於 Windows 的 Windows 媒體播放機 9 系列經常存取登錄,並可能會影響效能http://support.microsoft.com/?kbid=886423

  • GDI+ 1.0 安全性更新概觀 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnsecure/html/gdiplus10security.asp

  • 登錄編輯 http://support.microsoft.com/default.aspx?scid=kb;en-gb;835818

  • 當您嘗試存取專案檢視時,收到「此檢視中沒有資訊可顯示」錯誤訊息 http://support.microsoft.com/default.aspx?scid=kb;en-us;810596

INTERNALS 資訊

網際網路瀏覽

大約一年前,我公告自己已從 IE 換成使用 Mozilla,因為 IE 缺少一個像樣的網際網路瀏覽器的必要功能,例如快顯視窗封鎖、分頁瀏覽、自動填寫表單和廣告過濾。 不久之後,有人向我推薦了 Avant Browser,這是一個使用 IE (不是它自己的瀏覽器) 的小下載項目,可以提供上述所有功能以及更多功能。 Mozilla 難用的 UI 和與某些網站缺乏相容性,我經常決定轉換到好用的瀏覽器。 雖然新的 FireFox 版本在這兩方面都更好,但仍有一些不相容的網站 (例如 Windows Update),因此我尚未被迫再次切換。

Microsoft 進展緩慢改善 IE,即使考慮到 IE 的適度 Windows XP SP2 增強功能,應該羞辱他們購買 Avant Browser,並將其建置為下一版 IE。即使考慮到 IE 在 Windows XP SP2 上的稍有增強,但 Microsoft 在改進 IE 方面的進度緩慢,實在應買下 Avant Browser 並將其內建到下一版本的 IE 中。

Avant Browser 下載網址:http://www.avantbrowser.com

使用 LIVEKD 對生病的系統進行疑難排解

LiveKd 是我為 Inside Windows 2000 第 3 版編寫的公用程式 (現在是 Sysinternals 上的免費軟體工具)。 它允許您使用 Windows 套件的 Microsoft 偵錯工具的 Windbg 或 Kd,來執行通常用於調查線上且作用中的系統上的損毀傾印和凍結系統的偵錯命令。 Microsoft 針對在 Windows XP 及更高版本上執行的偵錯工具,引進了稱為「本機核心偵錯」的類似功能。 不過,您可以使用 LiveKd 執行一些本機核心偵錯無法執行的操作。 例如,您無法使用本機核心偵錯查看核心模式執行緒堆疊,而且在本機核心偵錯中執行時,列出核心模組命令 lm k 命令只會列出作業系統核心,而不會列出其他載入驅動程式。 這兩個命令會在 LiveKd 內執行。

另一個無法在本機核心偵錯中執行,但可以在 LiveKd 中執行的命令是 .dump。 有位 Microsoft 產品支援服務 (PSS) 工程師告訴我,.dump 命令適用於疑難排解生病的系統。 遇到問題但提供 Web 或資料庫等服務的電腦,可能不適合重新啟動或在調查期間系統需要暫停的傳統偵錯。 執行 LiveKd 並執行 .dump 會導致損毀傾印格式的檔案,其中包含系統實體記憶體的內容。 您可以將傾印檔案移到另一部電腦,並透過將傾印檔案載入 WinDbg 或 Kd 來分析作業系統和服務應用程式的狀態,進而避免在尋找問題原因時中斷。

LiveKd 下載網址:
http://www.sysinternals.com/ntw2k/freeware/livekd.shtml

CREEKSIDE?

我最近正在研究 Windows XP Service Pack 2 版本 Winlogon 的初始化,這是負責顯示登入使用者介面的系統處理程序,我在反組譯碼中發現這段程式碼:Winlogon 會在 \Windows\System32 目錄中檢查名為 ediskeer.dll 的 DLL 是否存在,如果存在,則確保其由信任的簽署者以數位方式簽署,然後載入它,並呼叫 DLL 匯出的未命名函式。 當有人登入系統時執行的 Winlogon 程式碼,也會呼叫 DLL (如果它是在初始化期間載入)。

我在系統上尋找這個 DLL,但找不到,而且也不存在於 Service Pack 2 CD 上。 那麼,DLL 是什麼? 使用 Microsoft 隨附於作業系統的偵錯符號,我可以看到 Winlogon 設定名為 "Creekside" 的變數 (如果 ediskeer.dll 存在並已簽署),然後我發現 "ediskeer"" 其實是由 "creekside" 的後面 8 個字母反向所組成。 我仍然不確定 Creekside 指的是什麼,但我高度懷疑這個 DLL 是僅隨附於 Windows XP Starter Edition,這是 Microsoft 最近為發展中國家推出的 Windows XP 的低成本版本。 Starter Edition 是以與 Windows XP Professional 和 Home Edition 相同的作業系統核心為基礎,但它會對使用者可以同時執行的應用程式數目施加限制。 如果我猜得沒錯,Winlogon 會載入 DLL 以強制執行該限制,並在每次新使用者登入時啟用該限制。

CHKREG 登錄修正程式

多年來,Bryce 和我收到許多針對 Chkdsk (即檔案系統一致性檢查公用程式) 編寫類似登錄的要求。 我們從來沒有編寫過,因為我們覺得受眾太少,不值得這麼做。 大約一年前,Microsoft 發佈了少有人知的 Chkreg,這是一個適用於登錄的 Chkdsk,可修正許多類型的登錄損毀問題。

但可惜的是,Chkreg 僅在 Windows 2000 上受到支援 (它也可能適用於 Windows NT 4 和 Windows XP 登錄),而且實作為使用原生 API 而非 Windows API 的「原生」應用程式,因此不會在 Windows 下執行。 下載後,您必須將其安裝到一組六個 Windows 安裝程式開機軟碟上,既繁瑣又耗時。 我們已連絡 Chkreg 的開發人員,並鼓勵他們公開發行我們已知 Microsoft 產品支援服務 (PSS) 正在內部使用的 Windows 版本,但尚未收到何時或是否會發行的回音。

Chkreg 下載網址:
http://www.microsoft.com/downloads/details.aspx?FamilyID=56D3C201-2C68-4DE8-9229-CA494362419C&displaylang=en

WINDOWS 記憶體診斷

對 Windows 使用者來說,最令人沮喪的經歷之一就是系統當機。 在大多數情況下,故障是有問題的第三方裝置驅動程序,您可以透過停用驅動程式或更新到已修復的版本來解決問題。 回報給 Microsoft Online Crash Analysis (OCA) 當機情況中,大約有 10% 是由硬體問題引起的,其中大多數與磁碟和記憶體相關。

如果您遇到 OCA 無法診斷的當機情況,或您懷疑是記憶體問題,那麼您應該花幾分鐘使用 Microsoft Windows 記憶體診斷 (WMD),這是 Microsoft 最近發行的記憶體檢查工具。 WMD 安裝程式需要一張軟碟或 CD 來儲存 WMD 程式。 當您從您建立的軟碟或 CD 開機時,WMD 會執行並對電腦記憶體執行完整測試,並將其進度和任何問題回報到螢幕上。 如果您有記憶體錯誤,WMD 可以讓您免於 Windows 當機帶來的無盡挫折感。

您可以在 下載 Windows 記憶體診斷; http://www.microsoft.com/downloads/details.aspx?FamilyID=56D3C201-2C68-4DE8-9229-CA494362419C&displaylang=en

研究未記載的介面

在電子報稍早的 Process Explorer 增強功能一節中,我所說明的 DEP 狀態功能相依於未記載的函式。 我想許多人都會有興趣了解我如何在沒有 Windows 原始碼存取權限的情況下發現該函式及其正確用法 (我的 Windows Internals 合著者 Dave Solomon 有存取權限,但我沒有)。

我的分析程式的第一個步驟是假設處理程序到 DEP 狀態查詢會透過 NtQueryInformationProcess API 進行路由。 許多擷取處理程序相關資訊的 Windows API 函式會使用 NtQueryInformationProcess 介面來取得資訊。 此函式是在 Windows 驅動程式開發工具組 (DDK) 的 Ntddk.h 檔案中原型,可透過「原生 API」系統呼叫介面從使用者模式存取:

NTSYSAPI
NTSTATUS
NTAPI
NtQueryInformationProcess(
    IN HANDLE ProcessHandle,
    IN PROCESSINFOCLASS ProcessInformationClass,
    OUT PVOID ProcessInformation,
    IN ULONG ProcessInformationLength,
    OUT PULONG ReturnLength OPTIONAL
);

其前兩個引數是處理程序的控制碼和「處理程序類別」。 PROCESSINFOCLASS 列舉 (其前幾個定義如下所示) 也包含在 NTDDK.H 中:

typedef enum _PROCESSINFOCLASS {
    ProcessBasicInformation,
    ProcessQuotaLimits,
    ProcessIoCounters,
    ProcessVmCounters,
    ProcessTimes,
//...

由於 DEP 是在 Windows XP SP2 中引進的,因此我不認為 DEP 查詢的資訊類別會列在 Windows XP 或 Windows Server 2003 版本的 Ntddk.h 中,而且快速檢查後確認其的確不存在。 因此,我必須研究 SP 2 的 Ntoskrnl.exe 反組譯碼,這是實作 NtQueryInformationProcess 的映像,以查看我是否可以以經驗方式判斷 DEP 查詢資訊類別。

反組譯程式會取得可執行檔映像,並列出組成其程式碼的組合語言指令。 組合語言指令會直接對應至處理器所執行的指令。 我使用的反組譯程式是 http://www.datarescue.com 的 IDA Pro ,因為其瞭解 Microsoft 的偵錯資訊檔案,並將資訊整合到組合語言輸出中。 在反組譯碼中,我在 NtQueryInformationProcess 的開頭發現指令序列很複雜,它採用處理程序資訊類別參數並執行特定於每個類別的程式碼。 由於我知道資訊類別是新加入的,我可以略過在 Ntddk PROCESSINFOCLASS 列舉中看到定義的類別執行。 這讓我的研究範圍縮小到 Windows XP 版本以來引進的約 3 或 4 個新類別。

其中一個類別對應至 0x22 的 ProcessInformationClass 值,會將我帶入程式碼路徑,進入名為 MmGetExecuteOptions 的函式,其開頭如下所示:

PAGE:0054D7CC ; __stdcall MmGetExecuteOptions(x)
PAGE:0054D7CC _MmGetExecuteOptions@4 proc near ; CODE XREF:
NtQueryInformationPro0063ess(x,x,x,x,x)+251C p
PAGE:0054D7CC
PAGE:0054D7CC arg_4 = dword ptr 8
PAGE:0054D7CC
PAGE:0054D7CC mov edi, edi
PAGE:0054D7CE push ebp
PAGE:0054D7CF mov ebp, esp
PAGE:0054D7D1 mov eax, large fs:124h
PAGE:0054D7D7 mov eax, [eax+44h]
PAGE:0054D7DA mov cl, [eax+6Bh]
PAGE:0054D7DD mov eax, [ebp+arg_4]
PAGE:0054D7E0 and dword ptr [eax], 0
PAGE:0054D7E3 xor edx, edx
PAGE:0054D7E5 inc edx
PAGE:0054D7E6 test dl, cl
PAGE:0054D7E8 jz short loc_54D7EC
PAGE:0054D7EA mov [eax], edx
PAGE:0054D7EC
PAGE:0054D7EC loc_54D7EC: ; CODE XREF:
MmGetExecuteOptions(x)+1C j
PAGE:0054D7EC test cl, 2
PAGE:0054D7EF jz short loc_54D7F4
PAGE:0054D7F1 or dword ptr [eax], 2
PAGE:0054D7F4
PAGE:0054D7F4 loc_54D7F4: ; CODE XREF:
MmGetExecuteOptions(x)+23 j
PAGE:0054D7F4 test cl, 4
PAGE:0054D7F7 jz short loc_54D7FC
PAGE:0054D7F9 or dword ptr [eax], 4
PAGE:0054D7FC

IDA Pro 在上面輸出的第一行顯示此函數接受一個引數,我懷疑該參數是指向接收 DEP 設定的變數的指標。 我花了不少時間查看 Windows 核心的反組譯碼,瞭解指令順序 mov eax, large fs:124h; mov eax,[eax+44h] 為處理器控制區域 (PCR) 中目前執行緒 _KTHREAD 資料結構的讀取,後面接著 _KTHREAD 結構中位移 0x44的 KPROCESS 欄位參考。 其後面的指令會讀取 _KPROCESS 結構中位移 0x6B 處的位元組中的個別位元。

由於不知道位移 0x6B _KPROCESS 處的內容,我在本機核心偵錯模式下啟動了 Windbg 並執行了命令 dt _kprocess,回報內容如下:

+0x06b Flags : _KEXECUTE_OPTIONS

Looking at that structure with another dt command showed the bit definitions:

+0x000 ExecuteDisable : Pos 0, 1 Bit
+0x000 ExecuteEnable : Pos 1, 1 Bit
+0x000 DisableThunkEmulation : Pos 2, 1 Bit
+0x000 Permanent : Pos 3, 1 Bit
+0x000 ExecuteDispatchEnable : Pos 4, 1 Bit
+0x000 ImageDispatchEnable : Pos 5, 1 Bit
+0x000 Spare : Pos 6, 2 Bits

不出所料,這些位元與 DEP 相關,而且 MmGetExecuteOptions 似乎會將它們當作 ProcessInformation 引數傳遞至 NtQueryInformationProcess,從該結構複製到記憶體位置中的對應位元。 因此,我判斷可以呼叫 NtQueryInformationProcess 加上 0x22 的 ProcessInformationClassDWORD (4 位元組整數的位址) 和長度 4 來查詢處理程序的 DEP 狀態。 MmGetExecuteOptions 似乎只會傳回目前處理程序的旗標,並忽略 ProcessHandle 參數 (Process Explorer 會透過 KeAttachProcess API 切換至其他處理程序的 DEP 狀態,以查詢其他處理程序的 DEP 狀態)。

除了 64 位元版本的 Windows 上有幾個細微的差異,基本上已完成,因為已我提供了 64 位元版本的 Process Explorer。 在 64 位元 Windows 上,MmGetExecuteOptions 需要 ProcessHandle 為 -1,如果目前處理程序是 64 位元處理程序,則會傳回 STATUS_INVALID_PARAMETER 錯誤,因為 64 位元處理程序一律開啟 DEP。 我使用 Windbg 來反組譯 Ntoskrnl.exe 的 64 位元版本,不過從那以後就已取得支援 AMD64 映像反組譯碼的 IDA Pro 版本。

INTERNALS 訓練

在舊金山舉行的 WINDOWS CONNECTIONS

我將在 Windows Connections 大會舉辦兩場座談會,大會由 Windows IT Pro Magazine 主辦,4 月 17 日至 20 日在舊金山舉行。 其中一場是名為「Understanding and Fighting Malware: Viruses, Spyware, and Rootkits」的一般座談會,我將說明惡意程式碼如何利用漏洞來傳播和規避安全措施、其如何使用名為 "rootkits" 的複雜技術進行隱藏,以及如何在系統上進行偵測和清除。

另一場是「針Troubleshooting Windows Memory Problems」,其中我將示範如何回答「我在工作管理員中看到的值所代表的意義」、「哪些程式在使用我的記憶體」,以及「我應該如何製作分頁檔案」等老生常談的問題。

大會手冊下載與報名網址:
http://www.devconnections.com/shows/win/default.asp?s=60#

WINDOWS INTERNALS/SYSINTERNALS 實作課程,講師:MARK RUSSINOVICH

與新版 Windows Internals 4 版的作者 Mark Russinovich 和 David 所羅門共度 5 天,瞭解進階疑難排解技術,同時深入探討 Windows NT/2000/XP/2003 作業系統核心的內部。 如果您是部署及支援 Windows 伺服器與工作站的 IT 技術人員,您必須能在問題發生時探究背後的原因。 瞭解 Windows 作業系統的內部原理,並瞭解如何使用進階疑難排解工具,將幫助您更有效地處理此類問題,並瞭解系統效能問題。 瞭解內部原理可以幫助程式設計人員善用 Windows 平台,並提供進階的偵錯技術。 由於課程使用完整存取 Windows 核心原始程式碼,並且透過開發人員進行開發,因此您看到的會是真實案例。

近期日期包括:

  • 6 月 6-10 日,美國佛羅里達州奧蘭多
  • 7 月 11-15 日,德國慕尼黑
  • 9 月 19-23 日,加州舊金山
  • 12 月 5-9 日,德州奧斯汀

附註:這是實機操作課程,每位學員都必須攜帶自己的筆記型電腦 (設定指示將提前寄送)。

您會深入了解 Windows NT/2000/XP/2003 的核心架構,包括處理程序內部、執行緒排程、記憶體管理、I/O、服務、安全性、登錄和啟動程序。 課程內容還包括進階疑難排解技術,例如惡意程式碼殺毒、損毀傾印 (藍色畫面) 分析,及解決啟動問題。 您也將瞭解使用來自 www.sysinternals.com (例如 Filemon、Regmon 和 Process Explorer) 的密鑰工具,針對一系列系統和應用程式問題進行疑難解答的進階秘訣,例如計算機緩慢、病毒偵測、DLL 衝突、許可權問題和登錄問題。 Microsoft 產品支援每天使用這些工具,有效解決各種電腦和伺服器問題,因此熟悉這些工具的操作和應用,可協助您處理 Windows 的不同問題。 我們提供真實範例,示範應用這些工具成功解決的實際問題。

若要報名,請造訪 http://www.sysinternals.com/troubleshoot.shtml


感謝您閱讀 Sysinternals 電子報。

發佈時間:2005 年 1 月 5 日星期三下午 4:36,發佈者:ottoh

[電子報封存 ^][< 第 6 卷,第 1 期][第 7 卷,特殊公告 >]