看起來只是檢查更新的程式,卻碰了工作文件,甚至在別的資料夾留下副本。當你已經找到一個需要追查的程式,下一個問題就不只是「它有沒有連網」,而是:它在這台電腦上實際做過什麼?
這篇延續上一集的 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 官方另行下載。
- 將 E03 套件放在個人測試機的一般本機資料夾,避開公司機、同步資料夾與網路磁碟。
- 執行
build_demo.bat,把UpdateCheck.cs編譯成真正的update-check.exe,並準備假資料。把 .cs 改副檔名不會變成可執行程式。 - 準備好 Process Monitor 後,執行
run_demo.bat;第一個 Enter 才開始動作,完成後第二個 Enter 才結束。E03 不需輸入 IP,也不使用 E02 的 listener。 - 主擷取停止後才執行
verify_demo.bat。它會再次啟動測試程式讀取檔案,若擷取還開著,會混入另一輪事件。
測試資料是 lab\documents\客戶聯絡名單.csv 與 lab\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\documents 與 lab\UpdateCache |
| Result | 這個動作回報的結果 | 讀寫事件搭配 SUCCESS 判讀 |
| Detail | 該次動作的補充資料 | 查看 Offset、Length;內容隨 Operation 改變 |
一句話讀法是:「哪個程式,在什麼時間,對哪個路徑,做了什麼,結果如何?」
Detail 裡的 Offset 是從檔案哪個位置開始;Length 是該筆讀寫的長度資訊,通常以 bytes 表示。大檔案可能分成多次處理,不能用一列代替整份檔案的完整故事。需要更多資訊時,可在欄位設定加入 User Name、Command Line、Duration 等;Duration 看的是事件耗時,不是程式已經開了多久。
4.先找讀取,再找寫入
保留程式篩選,加入 Operation → is → ReadFile → Include。先掃描路徑:啟動時讀取 .NET 或系統設定,和讀取工作文件,是不同的調查方向。
這次我們找到 客戶聯絡名單.csv 與 工作筆記.txt 的成功讀取;畫面分別顯示 Length 138、139。這些數字是本次假資料的結果,不是偵測惡意程式的門檻。
接著移除 ReadFile 條件,改成 Operation → is → WriteFile → Include,保留原本的程式條件。這樣一輪專心看一種動作,較不容易把不同路徑看混。
現在才沿著 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 events 與 Native 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。封面為概念示意,操作截圖為本次實拍。
