資安調查與鑑識 / FIELD NOTE

軟體裝了這麼多,誰在連網?TCPView 欄位、狀態與調查實作指南

電腦裝了不少軟體,卻不知道誰在背景連網?本文從正常連線開始,帶你讀懂 TCPView 欄位與狀態,再沿著 process、程式路徑、IP 與 domain 縮小調查範圍,補上證據保存與後續查詢方法。

軟體裝了這麼多,誰在連網?TCPView 欄位、狀態與調查實作指南封面

一台電腦用久了,通常會裝進不少軟體。有些每天都在用,有些只為了處理一次工作,後來就忘了它的存在。

當電腦開始變慢,或你擔心以前裝過的軟體夾帶了其他東西,問題不只是「現在有哪些程式」,還有「它們正在跟哪裡連線」。

我會把 TCPView 當成調查的起點:先把連線和 process 對起來,再決定哪個項目值得繼續追。本文適合第一次使用 TCPView 的 Windows 使用者,也可以當成 IT 或藍隊調查時的欄位速查表。

搭配影片:陌生連線是誰建立的?用 TCPView 找出背後的 process

先知道工具能回答什麼

TCPView 列出目前的 TCP/UDP endpoints,包含擁有它的 process、本機與遠端位址,以及 TCP 狀態。它能把「有連線」轉成「哪個程式擁有這個連線端點」。官方文件也提供下載與基本操作說明。Microsoft TCPView

這不是病毒掃描器,也不是一份完整的歷史紀錄。我的目標不是從一整張清單立刻判定誰有毒,而是找到一個有理由優先確認的候選。

本文的影片案例使用個人 Windows 測試環境,無害的教學程式混在正常 Internet 流量裡。它不是實際入侵事件;測試程式名稱與實驗位址都不是可直接拿去封鎖的 IOC 清單。

1. 從官方下載,先做一個看得懂的練習

Microsoft Sysinternals 官方下載頁 取得 TCPView;也可使用官方頁提供的 TCPView ZIP。解壓縮後,執行套件裡適合自己 Windows 架構的 TCPView 程式。公司設備請先遵循工具使用規範。

圖 1|本集個人測試環境的 TCPView 全覽。正常瀏覽器與系統程序同時出現;先建立對完整清單的認識,再挑一列閱讀。

第一次練習不需要執行任何陌生測試檔:

  1. 開啟 TCPView,先看完整清單。
  2. 用平常使用的瀏覽器開啟一個熟悉的網站。
  3. 回到 TCPView,找瀏覽器相關的 process。
  4. 選取其中一列,照「程式、PID、本機、遠端、狀態」讀一次。

成功的標準不是找出病毒,而是能說出:「我目前看到哪個 process,透過哪個本機 port,和哪個遠端 endpoint 通訊。」

不要要求每次練習都出現新的一列。瀏覽器可能重用連線,也可能使用多個程序、背景服務或 UDP;操作一次,不代表只會產生一條 TCP 連線。

2. 一列不是一個程式,更不是一次完整網路活動

同一個 process 可以擁有多個 endpoints,所以相同名稱與 PID 出現很多次並不奇怪。反過來,同名但 PID 不同的程序,也可能是同一套軟體的不同執行個體。

以下以本集實拍出現的欄位為範圍;不同版本與視窗設定可能影響欄位順序或顯示內容。

圖 2|從同一張實拍擷取表頭與一列 msedge.exe:PID 4792,本機 192.168.50.200:52616,遠端 52.178.17.235:443,狀態為 Established。這裡練習讀欄位,不是列出惡意目標。

欄位白話解讀調查時怎麼用
Process Name擁有這個 endpoint 的程式名稱。先認出用途;同名程式不一定是同一個檔案。
Process ID(PID)這次執行的程序編號。跨工具對照時一起保存時間與路徑;PID 會被重用。
ProtocolTCP、UDP,以及 IPv4/IPv6 的區別。不要用 TCP 的連線狀態解讀 UDP。
State這條 TCP 連線目前所處的階段。Established、Listen、Time Wait 的意義不同,詳見下表。
Local Address/Local Port本機這一端的位址與 port。Local Port 不一定固定;新連線可能換用另一個臨時 port。
Remote Address/Remote Port另一端的位址與 port。先分清內網、回送與 public 位址,再決定查哪裡。
Create Time本次示範畫面中的時間欄位。可連同畫面保存,但不要把它當成涵蓋每次變化的完整事件歷史。
Module Name畫面列出的模組/服務識別資訊。作為輔助;不是執行檔完整路徑,也不是可信簽章。
Sent Packets/Recv Packets送出/收到的封包計數。看目前工具提供的統計;空白不是已證明零流量。
Sent Bytes/Recv Bytes送出/收到的位元組計數。不能由數字直接知道傳了哪個檔案或內容;Bytes 也不是每秒速率。

我不會只用 PID 當永久身分。程序結束後,Windows 可以把編號分給別的程序;要跨時間或跨工具比較,至少一起看觀察時間、主機與執行檔路徑。需要更穩定的程序關聯時,已部署的 Sysmon 可提供 ProcessGuid。Microsoft Sysmon

另外,「Remote」只表示另一端,不表示一定在 Internet,也不單獨證明是誰主動發起連線。

3. 把 State 當成連線進度,不是風險分數

TCP 狀態描述握手、傳輸與關閉的進度。下表是簡化解讀,不是每條連線都會依表格順序走完;短暫狀態也可能在兩次畫面更新之間就結束。TCP 狀態定義:RFC 9293,第 3.3.2 節

狀態白話解讀
Listen等待別人發起連線。尚未等同已和遠端建立連線。
Syn Sent本機已送出建立連線請求,仍在等待握手進展。
Syn Received收到並回應建立請求,等待對方最後確認。
Established握手完成,連線已建立。
Fin Wait 1本機開始關閉,等待確認或對方關閉。
Fin Wait 2本機的關閉已獲確認,等待對方關閉。
Close Wait對方已關閉傳送方向,本機應用程式尚待關閉。
Closing雙方幾乎同時關閉,仍等待確認。
Last Ack等待對方確認本機最後送出的關閉訊息。
Time Wait收尾等待,讓最後確認能完成,並避免舊連線延遲封包影響後續連線。
Closed沒有連線狀態;不一定以一列持續留在畫面。

實務上我會特別注意三種容易誤解的情況:

  • Established 不等於正在大量傳資料。 它可能只是保持連線,等待下一次工作。
  • Time Wait 不等於程式還在傳檔。 這是 TCP 收尾的一部分;endpoint 留著,不代表原來的 process 仍在執行。
  • Close Wait 長時間堆積,先查應用程式的關閉處理。 不要只因狀態名稱陌生,就把它歸類成惡意連線。

UDP 沒有 TCP 這套握手狀態。畫面中 UDP 沒有 Established,或沒有提供固定遠端對象,不能據此推論它沒有通訊。

4. 顏色、名稱解析與 Pause,各自解決不同問題

顏色幫你找變化

TCPView 用綠色標示新 endpoint、黃色標示狀態改變、紅色標示移除。這些是清單變化,不是惡意程度。更新頻率可由 Options 的 Refresh Rate 調整。TCPView 操作說明

我的做法是先看變化,再決定要不要選取,不是追著每個紅色或綠色項目查。

名稱解析方便辨認,但要保留原始 IP

工具列的名稱解析切換,可以在可解析的名稱與原始 IP 間切換。辨認服務時看名稱方便;保存證據與跨工具比對時,我也會留下原始 IP。

圖 3|TCV-02 同一列在 7 秒與 12 秒的名稱解析對照:LockApp.exe、PID 7592、Local Port 54879 均一致。遠端顯示由截短的主機名稱切回 23.45.207.203,https 切回 443;解析不代表建立了另一條連線。

反向解析顯示的主機名稱,不一定就是程式原本請求的網站名稱。共用主機或 CDN 也可能讓同一個 IP 服務多個網域。因此,看到熟悉字樣不能直接當成信任依據;IP 和 domain 查詢也要分開記錄,不要自行替它們補上尚未證實的對應關係。

Pause 是把畫面停住,不是把網路停住

清單一直跳動時,我會先 Pause,讓自己有時間看完整欄位。這只暫停畫面更新:應用程式與連線仍然繼續運作。

停住後的內容是一張當時的快照。要確認狀態是否還存在,必須恢復更新;想保留短暫變化,應搭配錄影或事先配置的事件紀錄。

5. 真實調查:先排順序,再追陌生的 process

一張真實清單可能有大量瀏覽器、同步軟體、更新服務與系統程序。我的第一步通常不是逐列調查,而是先把用途明確、符合當下操作的項目排到後面。

這不是把 Chrome、Edge 或 Microsoft 名稱放進永久白名單,而是有限時間下的調查順序。只要行為、路徑或其他證據不對勁,熟悉的程序一樣要回頭查。

我會優先看以下組合:

  • 名稱不熟悉,而且無法對上自己安裝的軟體。
  • 連線目的地或出現時間和預期用途不合。
  • 程式路徑與聲稱的產品不一致。
  • 同一候選反覆建立連線,值得再核對更新、同步或排程行為。

這些條件一起決定「下一個先看誰」。不需要每一項都重複宣判安全或惡意。

圖 5|調查流程速查:Pause → 挑候選 → 對照目的地與路徑 → 保存證據 → 後續查證。圖中的時間是觀察/採集時間,並非 TCPView 自動記錄的完整事件歷史。

本集示範:update-check.exe

影片中,我們從清單找到一個看起來像更新程式的名稱,接著才讀它的 endpoint:

觀察項目本集示範
Process Nameupdate-check.exe
PID以當次畫面為準;不同錄製片段不強行串成同一次執行。
Local Port隨新連線改變。
Remote endpoint192.168.50.201:9000,個人實驗環境的 listener。
State觀察到 Established、收尾的 Time Wait,以及後續新連線。

這裡的重點不是記住名稱或 9000,而是把程式、路徑、連線目的地與時間放在一起。正常更新程式也會背景連線;我們起初不知道這個名稱屬於哪套軟體,所以先把它列為候選。

192.168.50.201 是 private IP,不是 public Internet IOC。私有位址會在不同網路重複使用,應回到自己的資產與網路環境確認,不拿它去外部 reputation 服務推斷哪一台設備有問題。IANA 私有位址說明

如果自己重做相同實驗,要看到 Established,就需要可到達、正在監聽的 server。隨便指定一個不存在的私有位址,可能卡在鄰居解析、連線重試或逾時,不能期待相同畫面。一般閱讀練習只要使用自己的正常軟體即可,不必架設 listener。

6. Process Properties:從名字回到磁碟上的檔案

選取候選 process,開啟 Process Properties。本集實拍可看到程式說明、Company、版本與執行檔路徑。

圖 4|TCV-05 的真實 Properties 視窗:update-check.exe(PID 1188)的說明、Company、版本與 Path。路徑指向本集無害教學程式,不是惡意樣本。

我最在意的是完整路徑:檔名相同不表示內容相同,而 Company 和版本文字也不是數位簽章驗證。找到檔案後,才有辦法確認它來自哪個安裝來源、由誰簽署,以及和其他紀錄是否為同一份檔案。

下面是影片未展開的補充。只在有權限調查的 Windows 電腦操作;先把示意路徑換成 Process Properties 裡實際看到的路徑。不要為了檢查未知檔案而雙擊執行它。

# 示意路徑,請替換成實際檔案位置
$targetFile = 'C:\Lab\update-check.exe'

Get-AuthenticodeSignature -LiteralPath $targetFile |
    Select-Object Status, StatusMessage, SignerCertificate

Get-FileHash -LiteralPath $targetFile -Algorithm SHA256

第一個指令取得檔案的 Authenticode 簽章資訊;第二個計算 SHA-256,方便辨識與查詢同一份檔案。它們不是啟動測試程式的指令,也不會把檔案內容自動上傳到 VirusTotal。簽章檢查可能受系統信任鏈與網路驗證環境影響;不要把 Company 字串或單一 Status 當成完整的惡意判斷。

Microsoft:Get-AuthenticodeSignatureGet-FileHash

7. 查 IP、domain 與檔案 hash,要分清「查資料」和「送出樣本」

TCPView 沒有替這份教學直接完成 VirusTotal 惡意判定。遇到不熟悉的 public IP、domain 或檔案 SHA-256,我會到 VirusTotal 搜尋既有資料,查看報告時間、偵測結果與相關背景。

VirusTotal 官方說明支援用 hash 找既有檔案報告,也能查 IP 與 domain 資訊,不必為了查既有結果重新提交檔案。VirusTotal 搜尋說明

我的紀錄會分成三欄:「我查了什麼」、「查到什麼」、「這對目前候選有什麼意義」。零偵測、沒有資料、查詢失敗,是三種不同結果;歷史關聯也要對照目前事件的時間。

查詢服務仍會收到你輸入的字串。內部網域、含 token 的 URL、公司檔案與客戶資料,都要依組織規範處理;公司內部檔案的 hash 也先確認是否能對外查詢。不要把「查不到」直接變成「那就上傳」。

對共用 IP 的負面資料,要回到實際 domain、檔案與行為查證,避免把整個雲端或 CDN 範圍一起當成惡意目標。

8. 留下能交接的紀錄,不只是截一張圖

TCPView 的 Save 可保存目前輸出;它不是自動補回過去所有連線事件的功能。套件內也有命令列版 Tcpvcon,適合輸出一份當下清單。官方 Tcpvcon 參數

在已解壓縮的工具資料夾開啟 PowerShell,可執行:

# 先核對套件內命令列工具的實際檔名
# -a 全部 endpoints;-c CSV;-n 不解析位址
# 使用時間戳檔名,避免蓋掉前一份紀錄
$stamp = Get-Date -Format 'yyyyMMdd-HHmmss-fff'
Get-Date -Format o
.\Tcpvcon.exe -a -c -n |
    Set-Content -LiteralPath ".\tcpview-$stamp.csv" -Encoding UTF8

這是一次性快照;不是持續封包擷取,也不是能保證不漏短暫連線的事件記錄器。命令裡的時間是採集時間,不是每一條連線的開始或結束時間。

我會一起保存:

  • 觀察時間與時區、主機識別。
  • Process Name、PID、完整路徑;能取得時另記程序啟動時間。
  • Protocol、Local/Remote Address、Port、State。
  • 畫面截圖或匯出檔,以及當時是否 Pause、是否開啟名稱解析。
  • 簽章、SHA-256、外部查詢的時間與報告連結。
  • 已確認的事實、目前推測、下一個要驗證的問題。

要追長時間或已結束的事件,改用事先部署且配置合適的紀錄來源。例如 Sysmon 的 Event ID 3 可記錄網路連線,但預設未啟用,不能假設任何裝了 Sysmon 的電腦都已有歷史網路資料。Sysmon Event ID 3

9. 幾個容易讓調查走偏的地方

只看 Remote Port 猜軟體。 常見 port 能提供方向,不能保證實際應用協定或用途;看到 443,也不是已確認安全。

把 Listen 當成被入侵。 先問哪個程式在等待連線、綁在哪些介面,再核對是否有需要與是否能從外部到達。監聽不等於已有人連入。

把 0.0.0.0 當成外部主機。 出現在監聽的本機位址時,通常表示所有 IPv4 本機介面的綁定;其他欄位中的值要按情境判讀,不能當成一個可查 reputation 的目的地。Microsoft Winsock bind 說明

把畫面沒有出現當成沒有發生。 短連線可能出現在更新間隔之間;Pause 更不會保存停住期間的每一次變化。

按 Close Connections 就以為處理完了。 TCPView 能關閉已建立的 TCP 連線,但程式可能再次連線。關閉連線不等於移除程式、封鎖網路或清除持久化;真實事件先保存證據,再依授權流程處置。

10. TCPView、Wireshark、Autoruns 和 Process Monitor 怎麼分工?

想回答的問題優先使用的工具
Windows 被設定成會自動載入什麼?Autoruns
這個 endpoint 屬於誰?目前連到哪裡?TCPView
封包裡的協定、握手與傳輸細節是什麼?Wireshark
這個 process 在讀寫哪些檔案、操作哪些 Registry?Process Monitor

所以 TCPView 不取代 Wireshark:前者讓我們快速從 endpoint 回到 process,後者深入看擷取到的封包;加密內容也不是開了 Wireshark 就自動解開。Wireshark 使用者指南

下一集要接上的 Process Monitor,則把調查帶到檔案系統、Registry 與 process/thread 活動。Microsoft Process Monitor

最後,把「不認識」變成下一個能驗證的問題

我最在意的不是看過多少列,而是離開 TCPView 時,手上是否已經有足夠資料繼續追:

這是哪個 process?檔案在哪裡?哪個時間連到哪個 endpoint?用途和安裝來源對得起來嗎?下一個該查的是網路背景、檔案,還是程序行為?

先用一條熟悉的正常連線把這個流程走完。等到遇見陌生項目,就不必只憑名稱或顏色猜測。

你有用 TCPView 找到過可疑連線嗎?當時是哪個細節讓你起疑,最後又怎麼確認?分享經驗時,記得遮掉敏感資訊。

參考資料

ARTICLE IMAGE圖片放大檢視