本章的實驗標本:SuperFunkyChat#

分析協定需要有流量可分析。本章的標本是作者用 C# 寫的聊天程式 SuperFunkyChat,可在 Windows、Linux 與 macOS 上執行。預編譯的執行檔與原始碼可從 GitHub 取得:

https://github.com/tyranid/ExampleChatApplication/releases/

下載時要挑選符合你平台的 release binaries(用 Mono 就選 .NET 版本,依此類推)。解壓縮到任一目錄後,會看到兩支主控台程式:ChatServer(伺服器)與 ChatClient(用戶端)。

後續所有範例命令列都以 Windows 執行檔為準。若跑在 Mono 上,請在命令前加上 mono 主程式的路徑;若跑 .NET Core,則在命令前加上 dotnet,且檔案副檔名會是 .dll 而非 .exe

啟動伺服器#

不帶任何參數執行 ChatServer.exe 即可啟動:

C:\SuperFunkyChat> ChatServer.exe
ChatServer (c) 2017 James Forshaw
WARNING: Don't use this for a real chat system!!!
Running server on port 12345 Global Bind False

最後一行是重點,它印出兩件事:伺服器監聽的連接埠(此處為 12345),以及是否綁定到所有介面(global)。連接埠通常不必更動(--port NUM),但如果你想讓用戶端與伺服器分處不同機器,就必須改變綁定行為——加上 --global 參數綁定到所有介面。

請認真看待程式印出的那行警告:這支程式不是為了當作安全的聊天系統而設計的,它存在的目的就是當分析標本。

在 Windows 上要擷取本機回送介面(local loopback)的流量並不容易。若遇到困難,把伺服器搬到另一台實體機器或虛擬機(VM)上執行,會省下很多麻煩。

啟動用戶端#

伺服器跑起來後就能啟動一個或多個用戶端。執行 ChatClient.exe 時要指定使用者名稱(可任意取)與伺服器主機名稱(例如 localhost):

C:\SuperFunkyChat> ChatClient.exe USERNAME HOSTNAME
ChatClient (c) 2017 James Forshaw
WARNING: Don't use this for a real chat system!!!
Connecting to localhost:12345

用戶端連上時,伺服器端的主控台會出現對應輸出,顯示它收到了一個「Hello」封包:

Connection from 127.0.0.1:49825
Received packet ChatProtocol.HelloProtocolPacket
Hello Packet for User: alice HostName: borax

若出現連線錯誤,先確認伺服器設定:是否需要綁定所有介面(--global)、伺服器端防火牆是否擋住了連線。

用戶端之間的通訊#

連上多個用戶端後就能互相通訊。要對所有使用者送出訊息,直接在命令列輸入訊息並按 ENTER。ChatClient 另外支援幾個以斜線(/)開頭的指令:

指令說明
/quit [message]離開用戶端,可附帶離開訊息
/msg user message傳送訊息給特定使用者
/list列出系統上的其他使用者
/help印出說明資訊

這張指令表就是後續分析的路線圖。做協定分析時,你能對應用程式下多少種指令,就有多少種機會在流量中辨識出對應的協定結構。分析未知協定的第一步,往往就是把應用程式的所有功能列出來,然後逐一觸發、逐一擷取。

有了會產生流量的用戶端與伺服器,接下來就能開始用 Wireshark 擷取並檢視這些流量。