如何從TCP中提取HTTP報文
阿新 • • 發佈:2019-02-14
最近在做個與網路安全相關的專案,專案中要捕獲各種資料包並進行分析; 下面是如何從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]); }