一台電腦用久了,通常會裝進不少軟體。有些每天都在用,有些只為了處理一次工作,後來就忘了它的存在。
當電腦開始變慢,或你擔心以前裝過的軟體夾帶了其他東西,問題不只是「現在有哪些程式」,還有「它們正在跟哪裡連線」。
我會把 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 全覽。正常瀏覽器與系統程序同時出現;先建立對完整清單的認識,再挑一列閱讀。
第一次練習不需要執行任何陌生測試檔:
- 開啟 TCPView,先看完整清單。
- 用平常使用的瀏覽器開啟一個熟悉的網站。
- 回到 TCPView,找瀏覽器相關的 process。
- 選取其中一列,照「程式、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 會被重用。 |
| Protocol | TCP、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 Name | update-check.exe |
| PID | 以當次畫面為準;不同錄製片段不強行串成同一次執行。 |
| Local Port | 隨新連線改變。 |
| Remote endpoint | 192.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-AuthenticodeSignature、Get-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 找到過可疑連線嗎?當時是哪個細節讓你起疑,最後又怎麼確認?分享經驗時,記得遮掉敏感資訊。
