概述
目前主流的網絡數據分析工具主要有兩類,一類是http協議分析工具,如fiddler,這類工具擅長對字符串類型協議分析;另一類是原始網絡數據包的監聽分析,如Wireshark,這類工具擅長分析網絡底層行為。這兩類工具一類擅長字符串協議分析,另一類擅長網絡底層行為分析,但是上述兩類工具分析二進制流類型協議時,就顯得力不心了,TcpEngine (官網:http://www.tcpengine.cn/)補充上述兩類工具的空白,提供了二進制流協議分析的方法。
TcpEngine擅長分析Tcp長連接協議,在數據流協議出現數據錯誤時使用,比如使用了tcp|websocket協議的網絡游戲出現數據錯誤時,使用本工具對游戲網絡數據分析,查找數據錯誤原因。這款工具不但可以在發開環境中使用,也可以在非開發環境中使用,比如網絡數據錯誤發生在測試環境或用戶環境,可以使用本工具在發生錯誤環境中監聽拷貝網絡數據,保存到文件再交給技術開發人員慢慢分析。
目前只支持在win32平台運行,工具分兩部分,應用軟件部分和系統內核WFP模塊,WFP(Windows Filtering Platform) 是windows推出的用於TCP/IP協議棧五層各層里面對數據包進行交互操作的基礎框架,這里用於監聽拷貝指定的網絡數據。使用前需要安裝WFP,由於WFP內核模塊還沒有數據簽名,使用前需要按下面鏈接指導步驟重啟和設置系統http://www.xitongcheng.com/jiaocheng/win10_article_10547.html
界面
啟動界面如下圖所示。
運行界面如下圖所示,奇數行是原始的數字流,偶數行是對應的解析后的可讀數據。
使用方法
TcpEngine使用WFP截取應用層網絡數據,WFP是內核模塊,進行數字簽名,殺毒軟件會直接報名,並且使用需要按http://www.xitongcheng.com/jiaocheng/win10_article_10547.html進行一些設置,WFP模塊TcpEngine官網已公開源代碼,你了可以下載重新編譯。以管理員身份運算TcpEngine,點擊主界面新建文檔,如下圖所示。
點擊開始,輸入需要監聽的網絡地址(支持域名和真實IP地直)和端口,如下圖所示。
點擊“接收並解析”或“接收不解析”,把要監聽的網絡信息寫入WFP內核,當監聽的網絡有數據流通時,就拷貝一分到TcpEngine中,如下圖所示。
本示例使用的是flamingo應用演示,收到的是加密后數據,我們需要對它解密,按TcpEngine規則實現了flamingo算法,在TcpEngine官網有示例代碼,使用方法,1、先暫停;2、加入解密庫,如下圖所示。
再點擊刷新,得到解密后的數據,如下圖所示。
這時可以編寫解析規則對原始數據進行解析,再“刷新並解析”,可以得到正常數據,如下圖所示。
解析規則
每個不同的應用定義了不同的Tcp協議,面對千變萬化的協議,TcpEngine提供的方案是半編程的解析規則,需要你根據自己的協議,編寫解析規則來解析你的數據。解析規則借鑒了編程的變量,分支(if)和循環(for)。
比如我們的數字流協議定義如下圖所示。
那我們對應的解析規則如下所示。
int32 id;int32 msgLen;
if (0 < msgLen)
{
byte [msgLen] body;
}
如果我們的id=1000消息的消息體如下圖所示。
if(1000 == id) {
int32 loginId = split(body);
text[msgLen-4] = split(body);
}
完整的解析規則如下圖所示。
如果我們的消息體是結構體數組,那么我們可以用for表達式循環解析,示例如下圖所示。
如果我們的消息體是結構體數組,那么我們可以用for表達式循環解析,示例如下圖所示。
網絡數據說明
當我們的網絡數據出錯時,需要按我們自定義的協議規則解析網絡數據成為我們可閱讀的格式,一般情況下,我們的網絡數字流是按固定的格式連續組成二進制數據流。我們向您提供了半編程式的方法對這類網絡數據解析,把不可閱讀的數字流解析成可閱讀的數據格式。
工具通過wfp內核模塊從系統內核拷貝指定網絡數據,當我們的網絡程序向網絡發送或接收一段完整的數據時,會拷貝一份應用層的數據到工具,每一條數據會生成兩行數據,奇數行是原始數據,緊接偶數行是對應的解析數據。由原始數據行顏色標識數據類型,如下圖所示。
解析參數
在解析網絡數據前,我們需要分別對發送和接收的數據設置好數據類型,發送和接收兩種類型都要設置,發送類型的設置只對發送數據有效,接收類型的設置只對接收數據有效。
設置參數有四種,分別是字節序;字符編碼;網絡協議;指定解碼庫(后續再說明),需要注意,參數設置必須全部小寫。
set endian = big; 設置字節序,對基本數字類型有影響,如 四個字節的int型等,目前主流的網絡序都使用大端字節序,也叫網絡字節序。支持的值有 big 大端字節和little小端字節序兩種。
set encoding = utf-8; 設置字符串編碼,對字符串數據類型有影響,當前只支持 utf-8和local(本地類型)兩種編碼格式。
數據類型
解析規則的功能是把連續無規則無法閱讀的數據流解析成規則的,可閱讀的數據格式,方法是把連續的字節按變量的形式划分到一個整體並顯示代表的值,如把連續的四個字節划分成整型,或如把多個字節划分成一個字符串變量,工具支持的變量類型如下列表。
數據類型列表
char 字符型,一個字節,顯示ASCII 字符。
byte 字節型,一個字節,以十六進制顯示。
int8 有符號整型,一個字節,以十進制顯示。
uint8 無符號整型,一個字節,以十進制顯示。
int16 有符號整型,兩個字節,以十進制顯示。
uint16 無符號整型,兩個字節,以十進制顯示。
int32 有符號整型,四個字節,以十進制顯示。
uint32 無符號整型,四個字節,以十進制顯示。
int64 有符號整型,八個字節,以十進制顯示。
uint64 無符號整型,八個字節,以十進制顯示。
float32 有符號浮點型,四個字節,以十進制顯示。
float64 有符號浮點型,八個字節,以十進制顯示。
string 字符串型,可變長度,如果指定了長度,則按指定長度划分字節數,如果不指定長度,一直划分到遇到零為止,如果剛好本行結束,則本數據類型不參與解析。
text 字符串型,可變長度,如果指定了長度,則按指定長度划分字節數,如果不指定長度,一直划分到遇到零為止,如果剛好本行結束,則使用下一行參與繼續解析。