1. 程式人生 > >如何從TCP中提取HTTP報文

如何從TCP中提取HTTP報文

最近在做個與網路安全相關的專案,專案中要捕獲各種資料包並進行分析; 下面是如何從TCP 中提取HTTP 資料。

前提:捕獲的資料包(我用的是wireshark 捕獲的資料包)

1:發現TCP報文;

我們捕獲的資料包是經過多次包裝的資料,最常見的包裝為Ethernet II  -> IP  -> TCP/UDP ->應用層協議(HTTP 等)。

要發現IP資料包下的TCP報文,我們可以根據IP首部的協議型別來判斷,常見的協議型別有:

1:ICMP

2:IGMP

6:TCP

17:UDP, 等

2:發現TCP 報文後,我們就要對TCP 報文進行進一步的處理,首先對其首部進行處理,可以獲取到源埠、目的埠、首部長度、標誌位、序列號、確認號、校驗和、等資訊;但是如何在確定下面包裝的是不是HTTP報文確實有些麻煩。最開始打算通過埠號來確定,我們知道HTTP預設使用的是80 埠;雖然可以發現一些HTTP 報文,但是我們知道埠號是可以改變的;所以這樣可能會出現遺漏的情況。

後來,想通過對TCP 的資料部分進行正則匹配,匹配HTTP 報文必須的關鍵字,如:“請求報文” “響應報文”的首部,看看是否符合HTTP 報文的格式,

匹配程式碼:

String string = new String(tcpdata);
		
		//判斷是否為HTTP 報文(通過正則表示式 判斷資料是否具有HTTP 協議的格式)
		Pattern pattern = Pattern.compile("[a-zA-Z]{3,7} .* HTTP/1.[0,1]");//匹配所有的HTTP 請求報文
		Matcher matcher = pattern.matcher(string);
		Pattern pattern2 = Pattern.compile("^HTTP/1.[0,1] [0-9]{0,3} *");//匹配所有的HTTP 響應報文
		Matcher matcher2 = pattern2.matcher(string);
		if (matcher.find() || matcher2.find()) {
			System.out.println(string.split("\r\n")[0]);
		}