• 沒有找到結果。

4. 無線區網監聽環境建置

4.4 通訊協定辨識

4.4.2 HTTP

(1) HTTP 協定特徵

HTTP的特徵,首先可以透過網站伺服器(Web Server) 使用TCP 連線與編號 為80的標準通訊埠進行判斷。如果並非使用標準的通訊埠編號,可以在TCP連線 完成三次握手協定之後,取得封包的應用層內容,檢視是否含有” H T T P / 1.1 ” 字串。然而,HTTP 基本上是屬於無狀態的通訊協定:每一個HTTP要求(HTTP Request) 都是獨立的,網站伺服器也不會儲存HTTP Request的歷史記錄。圖17 為HTTP狀態圖。

圖 17: HTTP 狀態圖 判斷 HTTP 協定之正規表示式,依照:

Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF (rfc 2616)

http/(0\.9|1\.0|1\.1) [1-5][0-9][0-9] [\x09-\x0d -~]*(connection:|content-type:|content-length:|date:)|post [\x09-\x0d -~]* http/[01]\.[019]

較快速度的版本:

http/(0\.9|1\.0|1\.1) [1-5][0-9][0-9]|post [\x09-\x0d -~]* http/[01]\.[019]

(2) HTTP 協定分析

HTTP 使用 TCP Port 80 來進行資料傳輸。利用 WinPcap 程序設計時可以 直接實作對 Port 資料的過濾,按照 HTTP Request 和 Response 格式抓獲所有的 HTTP 訊息。但是有大量使用代理進行網頁瀏覽的機器可能不通過 80 Port 來傳 輸 HTTP 資料。

1. IP 與 TCP

每接收到一個 Ethernet 訊框,資料從協定堆疊中由底向上檢查 datagram 標頭 的標識,去掉各層協定的 datagram 標頭,將不符合條件的封包丟棄,只保留運

行 HTTP 協定的封包。從資料鏈結層中的訊框標頭擷取 Ethernet 類型,判斷是否 端的 Response 封包。客戶端發出一個 Request 封包給伺服器端,然後伺服器端再 根據所收到的 Request 回應 Response 封包給客戶。

表 17: Request/Response 封包內容

Request 封包 GET /blogbus/blog/diary.php?diaryid=182145 HTTP/1.1 User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0) Opera 7.20

[zh-tw]

Host: www.blogbus.com Accept:

text/html, application/xml;q=0.9, application/xhtml+xml;q=0.9,

image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1 Accept-Language: en

Accept-Charset: utf-8, utf-16, iso-8859-1;q=0.6, *;q=0.1 Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0 Cache-Control: no-cache

Connection: Keep-Alive, TE

TE: deflate, gzip, chunked, identity, trailers Response 封包 HTTP/1.1 200 OK

Date: Tue, 06 Jul 2004 07:34:30 GMT Server: Apache/1.3.29 (Unix) PHP/4.1.1 X-Powered-By: PHP/4.1.1

Connection: close

Transfer-Encoding: chunked Content-Type: text/html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

<head>

如表 17 為 Request/Response 封包內容。Request 封包的第一行為 Request 行,

Request 行以下是 Request 封包的標頭,在標頭後有一空行。Request 行由 Request 類型、連接地址和版本號組成。其中通過代理的 Request 行中的鏈接地址顯示為 絕對路徑,沒有通過代理的 Request 行的鏈接地址顯示相對路徑,主地址在標頭 的「Host:」字段之後。上表中的範例是沒有通過代理的 (HTTP Proxy)。

Response 封包的第一行為狀態行,由 HTTP 版本號、狀態碼和狀態字串組 成,狀態行之後直到空行為狀態行標頭。空行之後就是 HTTP 資料。當 HTTP Response 封包標頭的 Content-Type 為 text/html 時,Response 封包的內容就是 html 檔案。網頁檔案寫在<html>和</html>標籤之間,<head></head>標籤定義了檔案 的標頭。當 Content-Type 為 image/gif 時,表示 Response 封包的內容是 image 圖 片且是 gif 格式的。常見的圖片格式還有.jpg 和.bmp。有無代理的情況稍有不同,

只是在有代理的 Request 行中,鏈接地址為絕對路徑。

(3) HTML 頁面還原

瀏覽網頁時,客戶端首先向伺服器發出 HTTP Request 封包,伺服器做出相 應的 Response,以 HTTP Response 封包返回。Response 封包的序列號 (Sequence number)等於相應的 Request 封包的確認號 (ACK number)。然而 IP datagram 最大 為 1500B,一般的頁面內容卻都在 10KB 以上,要用多個 Response 封包才能完 成一個頁面的傳輸。頁面傳送時,資料被分割了成多個 IP datagram。接受端收到 這些資料後按照封包序列的順序將它們重新組合起來,然後以 HTML 頁面返回 給客戶端。TCP 在三次握手(three-way handshaking)建立連接時確定了開始傳輸第 一個 segment 的序列號和確認號。由於 TCP 連接完全是雙向的,傳輸過程中雙 方資料是獨立的,因此傳輸同一頁面的所有 segment 的確認號不會改變,序列號 依次增加。

重組頁面就可以根據確認號判定傳輸該頁面的所有封包。首先根據客戶端的 Request 得到與 Request 封包對應的第一個 Response 封包,依照該頁面的確認號,

查找最近接收到的相同確認號的封包,這些封包都是用來傳輸同一頁面的。然後 按照包的序列號的順序,將封包中傳輸資料部分依次保存下來,這樣就完成了頁 面內容的恢復。

網路資料處理的流程如下表 18 所示。在程序中,使用 WinPcap.dll 提供的 API 函數設置和抓取網路設備上傳輸的資料。主要的函數有 pcap_findalldevs、

pcap_open_live 和 pcap_loop 等。依照 HTTP 訊息所在封包在訊框標頭、IP 標 頭 和 TCP 標 頭 的 FLAG , 過 濾 掉 不 包 含 HTTP 訊 息 的 封 包 。 也 可 以 用 pcap_compile 和 pcap_setfilter 直接設定封包過濾的表達式 (Expression)。

表 18: HTML 頁面重組流程

處理流程 內容描述

封包抓取 利用 pcap 函數庫從 WLAN 中截獲封包 封包過濾 分析封包並擷取 Port 為 80 的 TCP 資料

HTTP 訊息解析 確定 Request 包與 Response 包的確認號和序列號 HTML 頁面瀏覽 以 Response 包的序列號重組、HTML 頁面並顯示

相關文件