1. 程式人生 > >Sysinternals---Process Explorer

Sysinternals---Process Explorer

如果你現在或者將來的主要工作平臺為Windows,但還沒有接觸過Process Explorer,那你應該反思一下了。

官網:

https://docs.microsoft.com/zh-cn/sysinternals/downloads/process-explorer

  • 顧名思義,Process Explorer 就是一個功能強大的程序資源管理器。Windows 自帶的工作管理員功能太過簡陋,對於一個專業的開發人員來說,一個強大的程序資源管理器十分必要。

功能介紹

    1. 更詳盡的程序列表

這裡寫圖片描述
其中以縮排方式顯示程序父子關係,不同的程序顏色顯示不同的程序屬性,且其顏色可自定義,選單->Options->Configure Colors
這裡寫圖片描述
列條目是可選的,可以定製自己所需顯示的資訊,我常用的就是兩項,Image Type 和 User Name
這裡寫圖片描述

    1. 詳細的程序資訊(以可憐的calc.exe 為例)

雙擊或者選中calc 程序後雙擊(或者通過類似spy++的小靶子選中可視的視窗)出現如下視窗:

這裡寫圖片描述
視窗最上方顯示了可以選擇的程序資訊。當前選擇為Threads,途中顯示了執行緒的ID,起始地址,以及其起始時間、優先順序、佔用了系統及使用者空間的時間、狀態等資訊,下方按鈕提供了可對執行緒進行的操作:主要就是暫停/恢復,kill,檢視執行緒許可權等操作。
Module 按鈕顯示的是執行緒當前執行所在的模組的資訊。

檢視執行緒棧
點選Stack,效果同雙擊執行緒,將會顯示執行緒的呼叫棧,其實現方式是dbghelp.dll模組及其相關的函式,如果想了解相關內容可以檢視我之前介紹棧回溯的文章,或自行百度。
這裡比較特別的一點是:當我們UAC 執行Process Explorer,此時選擇檢視執行緒呼叫堆疊時將可以顯示核心模組的資訊。
這裡寫圖片描述

  • TCP/IP—-顯示程序的TCP/IP 活動
  • Security—程序安全相關
  • Environment—程序環境變數,順便提一句,此工具以及Sysinternals 的所有的工具的列表顯示有的是可以排序的,另外,在主視窗對應的選項卡點選以排序後,會丟失父子關係資訊,如果想恢復顯示,可以按下Ctrl+T,或者選擇選單:View->Show Process Tree。Process Hacker 比這個工具好的地方就在於,其提供了程序搜尋功能,可以搜尋程序名,程序ID等,另外其顯示列表可排序的程度更大,對於顯示不太全的資訊,雙擊後可以顯示,總體來說功能更加強大,更好用。後面將會介紹。
  • Strings
    這裡寫圖片描述

字元搜尋功能,包括映象檔案中的字元搜尋以及記憶體中的字元搜尋。可以說很貼心了。

  • Image
    程序完整路徑,簽名,版本號,生成時間,命令列,當前路徑,父程序,使用者,起始時間, 映象型別,DEP 狀態,ASLR 狀態等等。

  • performance 和 performace Graph 是其執行效能方面的資訊

  • Disk 和 Network 顯示網路I/O 和 磁碟I/O 的量。
  • 對於Job 中的程序可以顯示Job 資訊。

程序詳細資訊中的資訊大概就是上面這些了。但是我們發現它的資訊是不全的,其中我們程序需要了解的模組資訊,控制代碼,等資訊是沒有的。後來經過檢視選單選項,發現其模組資訊和控制代碼資訊是可選擇的顯示在主視窗上的。可能作者考慮這兩項是經常需要使用的功能,就放在了這裡。相反,Process Hacker 的作者將它放到了程序的詳細資訊中,哪個位置比較好就看個人的洗好了,用起來其實差別不大。
選擇顯示模組和控制代碼的方法:
快捷鍵:Ctrl+D 顯示DLL,Ctrl+H顯示控制代碼。Ctrl+L 選擇顯示或者不顯示下層的資訊。
選單按鈕:這裡寫圖片描述
點選圖中6號可以切換顯示DLL 和 控制代碼。
選單:View->Show lower Pane設定。
這裡寫圖片描述
如果想選擇顯示未命名的控制代碼、記憶體對映:
View->Show Unnamed Handles And Mappings

檔案及控制代碼查詢:強大且使用的功能,查詢檔案佔用、模組佔用很有效果。Ctrl+F 即可召喚。

其他福利功能:自行探索吧。

例項解決問題。

  • 問題描述,在開發一個防火牆功能時,為了測試“對指定路徑的應用程式新增規則”的功能時,選擇了internet Explorer(IE).exe。之後新增規則,但是發現其仍然可以上網。然後檢視log發現檔案路徑以及函式呼叫都是成功的,之後想,是不是自己的路徑傳入錯了,然後想起自己平時使用chorme 時,程序列表中常常有很多的chorme 程序,IE 會不會也是這樣的。此時開啟Process Explorer,發現如下資訊:
    這裡寫圖片描述

目標系統為X64,為什麼執行IE 會同時有X64、X86兩種程序存在,之後檢視程序詳細型別發現IE分別運行了X64和X86兩個版本,我們傳入給下層的程序的路徑是X64版本IE 的路徑。當我們在IE 中開啟多個標籤頁時,會新增一些X86 版本的IE,後來我猜想,IE 是不是通過X86版本的程序進行的網路操作,X64版本進行的行為控制等等資訊?後來通過選取X86版本的IE 的路徑設定防火牆,IE 確實無法進行網路連線了。
之後更進一步,檢視IE的更多細節如下:
這裡寫圖片描述
在我們使用Process Explorer 的靶子分別選擇IE的1,2號區域時,Process Explorer 分別指向了X64 IE和 X86 IE。
再看下面的實驗:分別選擇不同的選項卡:
這裡寫圖片描述

由此可猜測IE 的選項卡的機制,具體的內容不清楚,留給有興趣的同學吧。

  • 順便說一句,如果沒有對於這個工具的很好的利用,沒有自己的猜想和實驗,估計問題的解決時間是不確定的。由此可見經驗和工具對於工作效率的重要性。

題外話:可以通過Process Explorer 檢視一下Process Explorer 自己的實現機制。它對應平臺的映象是怎麼安排的?都是X86?都是X64?當以UAC 許可權執行時是否有驅動?如果有,驅動的路徑在哪裡?