Về Field Notes

Process nào đang gọi API lạ trên Windows?
4 cách điều tra network connection ẩn

Bối cảnh: máy gọi đi đâu không biết?

Một tình huống quen thuộc: firewall log hoặc monitoring báo máy Windows đang gọi liên tục về một domain lạ — api.something.com — nhưng bạn không biết đó là ứng dụng nào. Không phải malware, có thể chỉ là một app nào đó tự update hoặc telemetry. Nhưng không xác định được thì không thể kết luận.

Windows không có giao diện đơn giản để xem "process X đang kết nối tới domain Y". Phải biết đúng công cụ mới điều tra được nhanh.

Chạy với quyền Administrator. Tất cả phương pháp bên dưới đều cần quyền admin mới thấy đầy đủ process — kể cả những process chạy dưới system account.

4 công cụ, 4 cách tiếp cận

Cách 1
netstat + tasklist
Built-in, không cài thêm gì. Nhanh nhưng output thô, phải tự ghép PID.
CLI Built-in
Cách 2
TCPView
GUI Sysinternals. Real-time, thấy ngay process nào kết nối đi đâu.
GUI Real-time
Cách 3
Process Monitor
Sysinternals nâng cao. Filter theo domain, ghi log, audit toàn bộ network event.
GUI Deep audit
Cách 4
PowerShell
Scriptable, output có thể export CSV. Phù hợp khi cần tự động hoá hoặc chạy remote.
CLI Scriptable
1
netstat + tasklist
Command Prompt · Built-in · Không cần cài thêm
Nhanh

Cách cổ điển nhất. netstat liệt kê connection kèm PID, tasklist ghép PID ra tên process. Dùng được ngay trên mọi máy Windows.

Bước 1: Tìm IP của domain cần điều tra:

cmd (Administrator)
nslookup api.freshstartwalk.org Server: UnKnown Address: 192.168.1.1 Non-authoritative answer: Name: api.freshstartwalk.org Address: 104.21.45.67

Bước 2: Tìm kết nối đang active đến IP đó:

cmd (Administrator)
Xem tất cả connection đang ESTABLISHED, kèm PID netstat -ano | findstr "ESTABLISHED" Hoặc filter thẳng theo IP của domain: netstat -ano | findstr "104.21.45.67" TCP 192.168.1.10:52341 104.21.45.67:443 ESTABLISHED 4872

Bước 3: Tra PID ra tên process:

cmd (Administrator)
tasklist /fi "PID eq 4872" Image Name PID Session Name Mem Usage ============ ===== ============ ========== chrome.exe 4872 Console 185,420 K
Nếu domain dùng CDN (Cloudflare, AWS CloudFront...) thì IP có thể thay đổi mỗi lần resolve. Trong trường hợp đó, netstat một mình không đủ — cần TCPView hoặc ProcMon để bắt được event đúng lúc kết nối xảy ra.
2
TCPView — Sysinternals
GUI real-time · Download từ Microsoft · Cách nhanh nhất về mặt trực quan
Khuyến nghị

TCPView là công cụ GUI của Sysinternals (Microsoft) hiển thị real-time toàn bộ TCP/UDP connection trên máy — process nào, kết nối tới IP/port nào, trạng thái gì. Không cần ghép PID thủ công, không cần gõ lệnh.

Download tại: Microsoft Sysinternals → TCPView (tìm "TCPView site:microsoft.com"). Giải nén, chạy Tcpview.exe với quyền Administrator.

Sau khi mở:

  1. Nhìn vào cột Remote Address — tìm domain hoặc IP cần điều tra
  2. Cột Process bên trái cho thấy ngay ứng dụng nào đang kết nối
  3. Dùng View → Filter để lọc theo domain/IP nếu danh sách dài
  4. Connection mới xuất hiện sẽ highlight xanh, connection đóng sẽ highlight đỏ
TCPView hiển thị tên domain thay vì IP nếu resolve được — giúp nhận diện nhanh hơn nhiều so với netstat. Với domain dùng CDN, đây là cách đáng tin nhất vì bắt được event ngay tại thời điểm connection mở.
3
Process Monitor — Sysinternals
GUI nâng cao · Filter theo domain · Ghi log đầy đủ
Deep audit

Process Monitor (ProcMon) là công cụ mạnh nhất trong bộ Sysinternals — ghi lại mọi event của mọi process: file, registry, network, process. Dùng khi cần audit sâu hơn hoặc bắt event ngắt quãng (không phải connection thường xuyên).

Cách setup filter để theo dõi domain cụ thể:

  1. Mở Process Monitor với quyền Administrator
  2. Vào Filter → Filter... (Ctrl+L)
  3. Thêm filter: Operation is TCP ConnectInclude
  4. Thêm filter thứ hai: Path contains freshstartwalkInclude
  5. Apply và chờ — mỗi lần máy gọi domain đó, event sẽ xuất hiện kèm tên process và full path
ProcMon ghi rất nhiều event — tắt filter sẽ làm đầy màn hình trong vài giây. Luôn setup filter trước khi bật capture, đặc biệt trên máy có nhiều process chạy nền.
4
PowerShell
Scriptable · Export CSV · Chạy được remote qua WinRM
Tự động hoá

Khi cần kết quả có thể export, tích hợp vào script, hoặc chạy trên nhiều máy từ xa — PowerShell là lựa chọn duy nhất. Script dưới đây liệt kê tất cả connection đang active kèm tên process và đường dẫn file thực thi:

PowerShell (Administrator)
Get-NetTCPConnection | Where-Object {$_.State -eq "Established"} | ForEach-Object { $proc = Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue [PSCustomObject]@{ LocalPort = $_.LocalPort RemoteAddr = $_.RemoteAddress RemotePort = $_.RemotePort PID = $_.OwningProcess Process = $proc.Name Path = $proc.Path } } | Format-Table -AutoSize

Export ra CSV để phân tích hoặc gửi cho người khác:

PowerShell — export CSV
# Thêm | Export-Csv vào cuối pipeline Get-NetTCPConnection | Where-Object {$_.State -eq "Established"} | ForEach-Object { $proc = Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue [PSCustomObject]@{ RemoteAddr = $_.RemoteAddress RemotePort = $_.RemotePort Process = $proc.Name Path = $proc.Path } } | Export-Csv -Path "C:\connections.csv" -NoTypeInformation

Chọn công cụ nào?

Tình huống Công cụ phù hợp Lý do
Cần xác định ngay, không muốn cài thêm gì netstat + tasklist Nhanh nhất built-in, không phụ thuộc
Muốn nhìn real-time, thấy ngay, ít thao tác TCPView Trực quan GUI rõ ràng, highlight đổi màu
Connection không liên tục, cần bắt đúng lúc xảy ra Process Monitor Deep audit ghi log event, không bỏ sót
Cần export, chạy trên nhiều máy, hoặc tích hợp script PowerShell Tự động hoá pipeline, CSV, remote WinRM

Quy trình thực tế thường đi theo thứ tự: thử netstat trước (30 giây), nếu không bắt được thì mở TCPView (2 phút), nếu vẫn không thấy thì mới dùng ProcMon với filter để chờ event.

Tìm ra rồi, làm gì tiếp?

Sau khi xác định được process, bước tiếp theo tuỳ thuộc vào kết quả:

  • Là ứng dụng hợp lệ (browser, updater, telemetry): Xem cài đặt privacy của app đó. Nhiều ứng dụng cho phép tắt telemetry hoặc block cụ thể connection trong Windows Firewall.
  • Là process không rõ nguồn gốc: Tra hash file thực thi trên VirusTotal (Get-FileHash "path\to\process.exe" trong PowerShell để lấy SHA256).
  • Muốn chặn hoàn toàn: Tạo Outbound rule trong Windows Defender Firewall — block theo tên process hoặc theo IP/domain cụ thể.
PowerShell — lấy hash để kiểm tra VirusTotal
# Thay đường dẫn bằng Path lấy được từ bước điều tra Get-FileHash "C:\Program Files\SomeApp\app.exe" -Algorithm SHA256 Algorithm Hash Path --------- ---- ---- SHA256 3A7B2C...F9E1D4 C:\Program Files\... # Copy hash, paste vào virustotal.com để kiểm tra
Nếu process không có chữ ký số (Properties → Digital Signatures tab trống), đường dẫn nằm trong %AppData% hoặc %Temp%, hoặc VirusTotal cho kết quả dương tính — đó là dấu hiệu nghiêm trọng. Cô lập máy khỏi mạng và tiến hành phân tích sâu hơn.

Case study: node.exe giả Edge task

Câu chuyện thực tế · April 2026
Máy liên tục gọi api.freshstartwalk.org — truy ra node.exe núp trong folder giả danh Edge task

Sau khi phát hiện traffic đến api.freshstartwalk.org, áp dụng các phương pháp trên cho kết quả: process thủ phạm là node.exe — nhưng không phải Node.js cài chính thống. Đường dẫn đầy đủ: C:\WINDOWS\system32\EdgeVersionHealthCheckerV2Task-fzf8\node.exe.

Tên thư mục EdgeVersionHealthCheckerV2Task-fzf8 được thiết kế để trông như một scheduled task của Microsoft Edge. Nhưng khi chạy schtasks /query /fo LIST /v | findstr /i EdgeVersion — không có kết quả nào trả về. Nghĩa là: không có task nào với tên đó tồn tại trong hệ thống. Thư mục chỉ mượn tên để ngụy trang.

Bắt process tự spawn lại bằng PowerShell loop

Vấn đề: process node.exe liên tục bị tắt rồi spawn lại với PID mới — mỗi lần chỉ sống vài chục giây. Netstat và TCPView snapshot không đủ nhanh để bắt kịp. Giải pháp: chạy vòng lặp PowerShell polling liên tục để theo dõi.

PowerShell (Administrator) — polling loop
while ($true) { Get-Process node -ErrorAction SilentlyContinue | Select Id, Path, StartTime Start-Sleep -Milliseconds 200 }

Output sau vài giây chạy:

output
Id Path StartTime -- ---- --------- 5752 C:\WINDOWS\system32\EdgeVersionHealthCheckerV2Task-fzf8\node.exe 20/04/2026 11:08:01 5752 C:\WINDOWS\system32\EdgeVersionHealthCheckerV2Task-fzf8\node.exe 20/04/2026 11:08:01 ... 8972 C:\WINDOWS\system32\EdgeVersionHealthCheckerV2Task-fzf8\node.exe 20/04/2026 11:08:39 ...

PID thay đổi (5752 → 8972 → ...) nhưng đường dẫn giống nhau — xác nhận đây là một process được spawn định kỳ từ cùng một nơi. Interval khoảng 30–40 giây một lần.

Kỹ thuật polling loop này rất hữu ích khi điều tra process ngắn hạn — malware, updater, cron task trên Windows. Giảm interval xuống -Milliseconds 50 nếu cần bắt process sống rất ngắn.

Phân tích thư mục nghi vấn

Bước tiếp theo: inspect nội dung thư mục chứa process. Chạy dir để xem toàn bộ file:

dir "C:\WINDOWS\system32\EdgeVersionHealthCheckerV2Task-fzf8"
Mode LastWriteTime Length Name ---- ------------- ------ ---- d----- 20/04/2026 11:09 db -a---- 24/02/2026 18:12 332256 0.5oe0t2qw4kv.node -a---- 24/02/2026 18:12 107984 0.6gn19lthqzo.node -a---- 24/02/2026 18:11 184832 0.8vu6h3l2cg.node -a---- 24/02/2026 18:12 837520 0.gr2z7mtphdc.node -a---- 24/02/2026 18:12 63440 0.jnl0emo8bq.node -a---- 24/02/2026 18:12 216640 0.nolvhrr6vxi.node -a---- 24/02/2026 18:12 126464 0.t525khuzc9.node -a---- 24/02/2026 18:12 77184 0.viwad3mg7fo.node -a---- 24/02/2026 18:12 4870832 app.js ← 4.8 MB minified -a---- 25/02/2026 04:07 7013312 build.zip -a---- 29/10/2025 14:56 89872896 node.exe ← 89 MB runtime -a---- 21/11/2025 10:41 33562122 node.zip -a---- 24/02/2026 18:12 12016 preload.js -a---- 14/10/2025 23:09 318536 winpty-agent.exe -a---- 10/12/2025 16:25 258560 winpty.dll

Những điểm đáng ngờ khi nhìn vào directory listing:

  • Tên folder giả danh Edge task — nhưng schtasks /query | findstr EdgeVersion không trả về kết quả nào. Không có task Windows nào với tên đó.
  • node.exe nặng 89 MB nằm trong system32 — Node.js runtime đầy đủ được nhúng vào, không phải file hệ thống Windows.
  • app.js nặng 4.8 MB — ứng dụng Node.js minified/bundled. Kèm preload.js — pattern quen thuộc của Electron app.
  • Các file .node tên random hash — native addon (C++ module) được compile sẵn. Không có file nào tên thông thường hay chữ ký rõ ràng.
  • winpty-agent.exe + winpty.dll — thư viện terminal emulation. Thường thấy trong Git for Windows, ConEmu — không liên quan gì đến Edge health check.
  • Không có chữ ký số của Microsoft — tất cả file đều có thể verify bằng Get-AuthenticodeSignature. File hợp lệ của Microsoft sẽ có chữ ký.

Truy vết nguồn gốc qua ngày tháng file

Thay vì vội kết luận là malware, bước quan trọng là đối chiếu timestamp file với lịch sử cài đặt phần mềm. Hai đợt file rõ ràng:

File Ngày tháng Nhận định
winpty-agent.exe 14/10/2025 Lần cài đầu
node.exe 29/10/2025 Lần cài đầu
node.zip 21/11/2025 Bundle gốc
winpty.dll 10/12/2025 Lần cài đầu
app.js, preload.js, *.node 24/02/2026 Lần update
build.zip 25/02/2026 Lần update
db/ (folder) 20/04/2026 Runtime data

Kiểm tra lịch sử cài đặt qua Programs and Features (Control Panel) hoặc PowerShell:

PowerShell — xem lịch sử cài đặt
# Xem tất cả phần mềm đã cài, sort theo ngày Get-ItemProperty "HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*" | Select DisplayName, InstallDate, DisplayVersion | Where-Object { $_.InstallDate } | Sort-Object InstallDate -Descending | Format-Table -AutoSize # Lọc cụ thể theo tên nghi vấn Get-ItemProperty "HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*" | Where-Object { $_.DisplayName -like "*BlueStacks*" } | Select DisplayName, InstallDate, DisplayVersion

Kết quả cho thấy BlueStacks được cài vào tháng 10/2025 — khớp với timestamp của node.exewinpty-agent.exe. Đợt update tháng 2/2026 khớp với lần BlueStacks tự update app.js và các module.

Kết luận: BlueStacks

Thủ phạm đã xác định: BlueStacks Android Emulator

api.freshstartwalk.org là endpoint telemetry/update của BlueStacks — phần mềm giả lập Android trên Windows. BlueStacks cài một background service viết bằng Node.js, ẩn trong system32 với tên thư mục giả danh Edge task để tránh bị chú ý.

Về bản chất đây không phải malware — nhưng hành vi ngụy trang dưới tên Microsoft, spawn process định kỳ không có UI, và gọi API nền mà không thông báo là những pattern đáng lo ngại từ góc độ bảo mật doanh nghiệp.

Tuỳ mục đích sử dụng, có thể xử lý theo một trong ba cách:

  • Gỡ cài BlueStacks hoàn toàn: Control Panel → Uninstall. Folder EdgeVersionHealthCheckerV2Task-fzf8 sẽ được dọn sạch theo.
  • Vẫn muốn dùng BlueStacks, nhưng chặn telemetry: Tạo Outbound rule trong Windows Defender Firewall — block node.exe theo đường dẫn cụ thể hoặc block domain *.freshstartwalk.org ở DNS/firewall layer.
  • Tắt service BlueStacks nền: Vào services.msc, tìm các service BlueStacks (thường có tên BstHdLogRotatorSvc, BlueStacksAgent...) và set Startup Type → Manual hoặc Disabled.
Bài học từ case này: Tên folder nghe có vẻ hợp lệ không có nghĩa là hợp lệ. Bước kiểm tra schtasks /query | findstr <tên> rất hữu ích — nếu task không tồn tại mà folder đã mượn tên, đó là dấu hiệu đáng điều tra thêm.
Traffic không rõ nguồn gốc không nhất thiết là malware — nhưng không điều tra thì không thể kết luận. Mười lần thì chín là ứng dụng nào đó gọi telemetry — nhưng lần thứ mười mới quan trọng.