資安調查與鑑識 / FIELD NOTE

Process Monitor 入門:追查可疑程式讀了哪些檔案、把資料寫到哪裡

找到可疑程式後,怎麼查清楚它碰過哪些文件?延續 update-check.exe 的調查案例,從擷取、篩選與確認身分開始,追查 ReadFile、WriteFile、核對副本並保存 PML,補齊影片未展開的欄位、常見結果與排查方法。

Process Monitor 入門:追查可疑程式讀了哪些檔案、把資料寫到哪裡封面

看起來只是檢查更新的程式,卻碰了工作文件,甚至在別的資料夾留下副本。當你已經找到一個需要追查的程式,下一個問題就不只是「它有沒有連網」,而是:它在這台電腦上實際做過什麼?

這篇延續上一集的 update-check.exe。我會用 Process Monitor,從動作紀錄追到檔案本身,帶你完成一次「確認身分 → 追查讀寫 → 核對副本 → 保存紀錄」的練習。你不需要先把整套工具背起來。

先把系列接起來

如果是第一次接觸,建議先看 Windows 資安調查入門播放清單,再看 E02:用 TCPView 找出連線背後的 process。Autoruns 幫我們檢查自動啟動入口;TCPView 幫我們對照程式與連線;這次則追查檔案讀寫。這些工具回答的是不同問題,不是互相取代。

觀看 E03 完整影片:找到可疑程式後,怎麼查它讀寫了哪些檔案?。本文可先獨立閱讀;TCPView 的欄位與狀態可回查上一集文章

先準備好工具與練習環境

Microsoft 官方 Process Monitor 頁面下載,解壓後選擇符合系統架構的版本,以系統管理員身分啟動。本文實拍使用 Windows 11;其他 Windows 版本請先核對目前下載版本的系統需求。Process Monitor 會記錄活動,不會直接替你判定哪個程式是病毒。

這次教學只使用兩份虛構文件,不連網、不上傳,也不需要另一台 server。請使用本集教材,不是任意找一個同名 exe 執行。

下載 E03 練習套件

直接下載 E03 v1.0.0 ZIP,完整解壓縮後先閱讀 README.md。不需要 Git,也不必下載整個 repo。

套件含原始碼、操作腳本與使用說明,不含預編譯 exe;Windows 需有 .NET Framework 4.x 的 C# 編譯器。先執行 build_demo.bat 產生 update-check.exe,再依下列步驟練習。

想看程式如何讀取、寫入檔案,可查看本版完整原始碼版本頁與 SHA-256 校驗檔可用來核對下載檔案。Process Monitor 仍需從 Microsoft 官方另行下載。

  1. 將 E03 套件放在個人測試機的一般本機資料夾,避開公司機、同步資料夾與網路磁碟。
  2. 執行 build_demo.bat,把 UpdateCheck.cs 編譯成真正的 update-check.exe,並準備假資料。把 .cs 改副檔名不會變成可執行程式。
  3. 準備好 Process Monitor 後,執行 run_demo.bat;第一個 Enter 才開始動作,完成後第二個 Enter 才結束。E03 不需輸入 IP,也不使用 E02 的 listener。
  4. 主擷取停止後才執行 verify_demo.bat。它會再次啟動測試程式讀取檔案,若擷取還開著,會混入另一輪事件。

測試資料是 lab\documents\客戶聯絡名單.csvlab\documents\工作筆記.txt;副本位置由後面的事件帶我們找到。若安全工具攔截,先保留訊息,不要為了完成練習關掉防毒。

1.先留下當下的動作,再慢慢看

打開工具後,畫面可能已經不斷增加事件。先停止擷取,檢查舊篩選條件;若已有重要紀錄,先保存再清空。這次只記錄一次短練習,不需要讓工具整天運行。

Ctrl+E 開始擷取,再讓測試程式執行動作。看到檢查完成後,再按 Ctrl+E 停止。停止的是「繼續記錄新事件」,不是停止被調查的程式。官方也採先擷取、重現、停止、保存的流程。擷取時間過長可能耗用大量記憶體或磁碟空間。Microsoft 操作說明

不要開啟 Drop Filtered Events 來做這次練習:它會丟棄被篩掉的事件,後續移除篩選也救不回來。一般顯示篩選則用來縮小閱讀範圍。更完整的選項請看工具內 Help;我們這次先保留短時間內的紀錄再分析。

2.先確認是哪一個程式,不只看名稱

在 Filter 視窗加入 Process Name → is → update-check.exe → Include,按 Add,再套用。這只是先找出同名程式的活動。

接著雙擊事件,查看 Process 分頁的執行檔完整路徑、PID、Command Line 等資訊,再用 Process Tree 核對啟動關係。本次是從批次檔啟動,因此看到命令提示字元相關的父程序有其操作背景,不能單靠父程序名稱下結論。

本次畫面中的 PID 是 11492,不是你必須照填的固定答案。同名程式可能不只一個;程式重開後 PID 也可能不同。將路徑、啟動時間與本次擷取時段一起記下來,才知道自己追的是哪一次執行。

3.這七個欄位,先看懂就能開始查

欄位白話意思這次怎麼用
Time of Day事件發生的時間排出先讀取、後寫入的順序;另外記錄日期與時區
Process Name發出這個動作的程式名稱先篩選 update-check.exe
PID這一次執行的程序編號本次畫面是 11492;你的數字會不同
Operation程式做了什麼動作分開追 ReadFile 與 WriteFile
Path這個動作碰到的路徑區分 lab\documentslab\UpdateCache
Result這個動作回報的結果讀寫事件搭配 SUCCESS 判讀
Detail該次動作的補充資料查看 Offset、Length;內容隨 Operation 改變

一句話讀法是:「哪個程式,在什麼時間,對哪個路徑,做了什麼,結果如何?」

Detail 裡的 Offset 是從檔案哪個位置開始;Length 是該筆讀寫的長度資訊,通常以 bytes 表示。大檔案可能分成多次處理,不能用一列代替整份檔案的完整故事。需要更多資訊時,可在欄位設定加入 User Name、Command Line、Duration 等;Duration 看的是事件耗時,不是程式已經開了多久。

4.先找讀取,再找寫入

保留程式篩選,加入 Operation → is → ReadFile → Include。先掃描路徑:啟動時讀取 .NET 或系統設定,和讀取工作文件,是不同的調查方向。

實拍:ReadFile 清單中,同一個 PID 讀取兩份 lab documents 文件;上方也保留了系統設定檔的讀取。

這次我們找到 客戶聯絡名單.csv工作筆記.txt 的成功讀取;畫面分別顯示 Length 138、139。這些數字是本次假資料的結果,不是偵測惡意程式的門檻。

接著移除 ReadFile 條件,改成 Operation → is → WriteFile → Include,保留原本的程式條件。這樣一輪專心看一種動作,較不容易把不同路徑看混。

實拍:同一個 PID 隨後將兩份檔案寫到 lab UpdateCache,兩筆結果均為 SUCCESS。

現在才沿著 Path 找到 lab\UpdateCache。把讀取與寫入的 PID、時間、檔名、長度放在一起核對,我們就有具體方向去檢查副本,而不是憑程式名稱猜測。

5.Operation 與 Result,不要只照英文直譯

以下是入門常遇到的動作,不是全部事件清單;這集主要使用 ReadFile 與 WriteFile。

Operation怎麼讀容易誤會的地方
CreateFile建立或開啟檔案/目錄等物件看到名稱不代表一定新增檔案,要看 Detail 的 Disposition、存取需求與後續事件
ReadFile讀取檔案資料確認 Path、Result、Offset 與 Length,不只看檔名
WriteFile寫入檔案資料確認目的地,再核對留下的檔案
QueryDirectory列出目錄內容看到檔名不等於讀過檔案正文
QueryInformationFile/QueryBasicInformationFile查詢檔案資訊查大小、屬性等資訊與讀取內容不同
CloseFile關閉檔案的開啟控制代號不是刪除檔案

特別是 CreateFile,Windows 的同名 API 可以建立,也可以開啟既有物件;不要直接翻成「新增檔案」就結案。Microsoft CreateFile 文件

Result白話意思調查時怎麼看
SUCCESS這次動作成功不是「程式安全」的評分
NAME NOT FOUND找不到指定名稱可能在找不存在的設定或檔案;查看後續是否改找其他位置
PATH NOT FOUND路徑中的部分找不到檢查完整路徑,不只最後的檔名
ACCESS DENIED要求的存取被拒絕看它想碰什麼、是否影響後續動作,不直接判定感染
BUFFER OVERFLOW回傳資料超過提供的緩衝區大小不是看到這個字就代表發生漏洞攻擊
NO MORE FILES沒有更多符合條件的檔案目錄列舉結束時可能出現

Result 是單次操作的回報,需配合 Operation 與前後事件閱讀。上述狀態含義可對照 Microsoft NTSTATUS 文件;「後續是否恢復、是否與問題有關」則是調查時要額外核對的事。

6.從事件走到檔案:核對到底留下什麼

在這次已知的測試環境中,打開 UpdateCache,使用記事本檢查兩份假資料。名單裡的 Demo-A、Demo-B 與 example.invalid 信箱都是示範內容。

實拍:用記事本查看副本中的虛構名單,與前面的寫入紀錄互相核對。

執行套件的 verify_demo.bat 看到 PASS,代表通過這個套件對原始檔與副本的核對。它不是 Process Monitor 內建功能,也不是通用的病毒檢測工具。

真實事件不要直接在日常電腦雙擊陌生附件、啟用巨集或執行疑似惡意程式。先保存證據,再依組織流程到受控環境分析。這裡能直接開記事本,是因為我們知道它是自己準備的文字假資料。

7.保存 PML,讓下一次還能接著查

選擇 File → Save,使用 All eventsNative Process Monitor Format (PML),例如命名為 e03-take01-all.pml。存好後重新開啟,確認仍能套用程式與 Operation 篩選。Microsoft 保存說明

All events 指目前保留下來的所有事件,不能補回開始擷取以前、被清空或被丟棄的資料。如果只存目前顯示的兩列,下次可能就缺了原本想追查的前後文。CSV 適合另外做摘要,截圖適合溝通,都不取代這份原始 PML。

同時記錄擷取日期、時間與時區、電腦代號、工具版本、程式完整路徑、PID、操作步驟與檔案保存位置。PML 可能含帳號、內部路徑等資訊,不要直接上傳公開留言區。

8.最後怎麼交代調查結果?

不要只寫「這個程式很可疑」。這次可以整理成:

在本次擷取時段,update-check.exe(PID 11492)對兩份測試文件產生成功的 ReadFile,接著在 lab\UpdateCache 出現對應的 WriteFile。核對落地副本與測試資料後,確認本機讀取與複製行為;相關事件已保存為 PML。

接著分開列出待查事項:它為什麼需要這些文件?是否符合程式用途?是否有同時段的網路傳輸、其他程序接手或其他資料存取?

本文示範到的是本機讀取與複製,沒有資料外傳。上一集的連線畫面加上這次副本,也不能直接證明文件已傳出去。相反地,這份短時間紀錄沒看到某個動作,也不等於其他時段從未發生。Process Monitor 是調查工具,不是能回放過去所有活動的完整監視器。

查不到事件時,先檢查這些地方

  • 動作發生時是否已開始擷取?停止後才發生的動作不會補進來。
  • 程式名稱、PID 與路徑是否對應這次執行?有沒有留下上一次的條件?
  • 檔案系統活動是否被隱藏?是否有其他 Include/Exclude 條件縮小範圍?
  • 套件是否真的完成,還是因目標已存在或資料被改過而停止?不要自行拿真實文件替換假資料。
  • 驗證程式是否在停止擷取之後才執行?重拍前先保存上一輪紀錄,再使用套件 reset_demo.bat;它會詢問確認,把已知副本移到 recovery,不是要求你直接刪掉整個資料夾。

下一次練習,試著自己回答四個問題

哪個程式?讀了什麼?寫到哪裡?我留下哪些可以回頭核對的證據?

你曾用 Process Monitor 找到什麼跟預期不同的行為?歡迎分享你怎麼查、最後如何確認原因,不必貼出私人文件或公司畫面。想繼續跟著案例練習,可以收藏 Windows 資安調查入門播放清單

本文使用 RuleArena 自製測試程式與實拍紀錄;官方文件查核日期:2026-09-18。封面為概念示意,操作截圖為本次實拍。

ARTICLE IMAGE圖片放大檢視