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

Sysinternals---Process monitor

Process Monitor 是Windows 平臺使用的一個比較高階的監控工具,它可以實時的顯示檔案系統、登錄檔和程序、執行緒的活動。它集合了FileMon 和 Regmon 兩個工具的功能,並進行了特別的功能增強。
主要功能包括:

1.可獲取到輸入輸出操作的更多的引數。
2.無侵害過濾,設定filter 的同時不會導致資料的丟失。
3.截獲每一個操作的執行緒棧,從而使得分析每一個操作發生的根源稱為可能。
4.獲得相關程序的更詳細的資訊,包括命令列,映象路徑,使用者和會話ID
5.自定義的顯示配置
6.可以為任何資料子段設定過濾器,包括未配置為列的子段。
7.先進的日誌記錄體系結構,可以擴充套件到數千萬個捕獲的事件和千兆位元組的日誌資料
8.程序樹顯示在一次追蹤中的所有程序之間的關係
9.通用的日誌格式,以便在不同的Process Monitor 例項中載入
10.在程序上懸空時會顯示程序的映象資訊。
11.另外,在行上懸空時,它會顯示當前行由於列寬的原因而暫未全部顯示的資訊。
12.可撤銷的搜尋
13.引導時載入,以記錄系統的所有操作

例項分析程序的載入過程,看看該工具能給我多少資訊

  • 為了簡單期間,我們首先選取Win7 (Vista+即可)進行實驗。
int main()
{
    printf("Hello World\r\n");
    return 0;
}

分析什麼都不做的程序的操作也有利於我們在真正分析問題的時候過濾掉不重要的問題,抓住問題的重點。
這裡寫圖片描述

開啟後我們點選1處標記的按鈕,會彈出該對話方塊以設定filter 規則,如果不設定我們自己的規則,系統產生的資料將會極其多。另外,Process Monitor 預設添加了一些Exclude,我們看自己的需要選擇吧,剛開始我們暫時不修改預設的Exclude。新增好規則後全部規則如下:注意輸入程序名稱時需要輸入副檔名。
這裡寫圖片描述


之後點選OK,雙擊執行DemoProgram.exe。為了更好的描述資訊,我們在列標題上右鍵,選擇Select Columns 選單,之後在彈出的選單中選擇Sequence Number,給截獲到的事件加上編號,之後我們可以通過拖拽的方式將編號移動到第一列。
這裡寫圖片描述

另外,我們當前設定是截獲包括,登錄檔,程序執行緒,檔案,網路的所有資訊,如果想選擇特定型別的資訊,點選如下按鈕:
這裡寫圖片描述
截獲到如下資訊:
這裡寫圖片描述

下面依次分析程序操作:
0—Process Start
這裡寫圖片描述

程序初始執行的環境是父程序的環境,之後這裡我們唯一可見的符號是ntdll.dll 的NtCreateUserProcess 函式,其他函式我們也不是特別清楚,總之這裡的操作就是在父程序的執行緒環境下執行了建立新程序的程序物件的操作,裡面的諸多細節我們就不深究了,因為是核心方面的操作。

1—Thread Create
這裡寫圖片描述
這裡與程序初始類似,初始程序的第一個執行緒也是在父程序的執行緒環境下建立的,而且是建立的執行緒物件。

2—Load Image—-DemoProgram.exe
將EXE 映象對映到新程序的地址空間,並執行校驗簽名等一系列的操作。

3—Load Image—-ntdll.dll
ntdll.dll 模組的載入與普通的DLL模組載入不同,由於ntdll.dll 是需要在系統的所有程序中載入的,系統初始化時就將dll 對映到了記憶體中,之後再在新程序初始化的時候將ntdll.dll 對映到新程序的地址空間中,而且這個地址在所有的程序的地址空間中是一樣的。

4—CreateFile—C:\Windows\Prefetch\DEMOPROGRAM.EXE-934BCD18.pf
Prefetch,預取器,作業系統在程式執行的時候,會首先去該目錄下查詢是否有當前程式的預取器,有的話就可以按照已經有的載入過程載入程序,所謂預取就是提前載入,按照往常的經驗來判斷程式將會執行哪部分的內容,從而提前一次性的全部載入完畢,這種將多次讀入操作合併起來的行為可以 有效的提高程式的載入速度。由於我們的程式是第一次執行,所以這裡是CreateFile 的操作,之後再次執行這個程式將會執行OpenFile 和 ReadFile的操作。

5~8—-開啟登錄檔HKLM\System\CurrrentControlSet\Control\Session Manager並讀取其子鍵CWDIllegalInDLLSearch的值,關閉登錄檔鍵。
我們看到,這裡是沒有找到這個子鍵的值。

9—CreateFile—C:\Users\admin\Desktop
我們看起呼叫堆疊如下:
這裡寫圖片描述
ntdll.dll:LdrInitializeThunk 是新建立的程序在Ring3執行的第一段程式碼,它的作用相當於執行EXE 檔案的匯入表解析等等的初始化功能,這個CreateFile 的作用,我猜測,是開啟程序的當前目錄,或者是在解析其匯入表的時候嘗試在當前目錄下找到其匯入檔案。

10—LoadLibrary—-C:\Windows\System32\Kernel32.dll
這裡寫圖片描述

依然是解析匯入表,進行基本的初始化操作。
11—LoadLibrary—C:\Windows\System32\KernelBase.dll
Kernel32.dll 的依賴的初始化操作
這裡寫圖片描述

12~19—語言相關的操作
20~34—這一段也是登錄檔操作,暫時還不清楚是做什麼的。
35—主執行緒退出
36~40—列舉所有的程序載入的模組名。
41~46—關閉主程序檔案。
47—Process Exit—-這個退出代表的是程序物件的銷燬。
48—CloseFile—-關閉上面開啟的檔案:Desktop
49~50—關閉上面開啟的未關閉的登錄檔

途中的很多資訊現在暫時不知道什麼意思,但是一個簡單的printf語句就能產生這麼多資訊,我們大概看一遍,以後分析時才能抓住重點。

另外,如果我們想快速查詢想知道的特定資訊,可以Ctrl+F進行查詢,十個十分方便的功能。

還有一個需要注意的是,此應用程式不能長時間保持執行,因為它對系統各個方面的操作進行監控,十分佔用資源。

如果想長時間大量的監控程式的執行,可以選擇使用檔案為後備檔案而不是虛擬記憶體。否則會出現記憶體耗盡的問題。

引導時記錄

在引導啟動裝置驅動程式初始化時,Process Monitor 可以在引導過程的比較早的階段開始log 活動。通過選單選擇Enable Boot Logging 可以開啟引導時log 功能。Process Monitor 的驅動將在下次引導的時候進行log 活動,並將資訊儲存在$Windr%目錄下,另外,這個log 活動將持續到關機或者再次執行Process Monitor。因此,如果在一次引導過程會話中不執行Process Monitor,Process Monitor 的驅動將記錄從開機到關機的完成的資訊。
thread profiling 會極大的增加日誌的大小,可根據需要選擇是否開啟此功能。
當我們執行Process Monitor,它檢視是否之前有一次引導log,如果有的話,它將詢問你儲存引導log 檔案的位置。Monitor 在解析完log 檔案後,會將其顯示給使用者。如果想看System Process 的活動,從選單中選擇Enable Advanced Output

如果配置了引導log,而系統在引導期間崩潰了,可以通過從Windows boot menu 中選擇Last Known Good option 來關閉引導 log。

另外,由於Process Monitor 的網路事件是通過 ETW(Widows 事件追蹤)實現的,引導log 時不支援該功能。