[英]Getting Host field from TCP packet payload
我正在用C編寫一個內核模塊,並嘗試從帶有HTTP請求標頭的TCP數據包的有效負載中獲取Host字段。 我已經設法與FTP進行了類似的操作(掃描有效負載並查找FTP命令),但是我似乎無法做到這一點並找到該字段。
我的模塊已連接到POST_ROUTING掛鈎。 如果到達該鈎子的每個數據包的dst端口為80,則將其識別為HTTP數據包,因此我的模塊開始對其進行解析。
由於某些原因,我似乎無法獲得HOST行(實際上,我只看到服務器HTTP 200正常)
這些標頭是否總是放在使用端口80的數據包上? 如果是這樣,解析這些packt的有效載荷的最佳方法是什么? 似乎逐字符進行很多工作。 有什么更好的辦法嗎?
謝謝
編輯:取得了一些進展。 從服務器收到的每個數據包,我都可以毫無問題地讀取有效負載。 但是我發送的每個數據包-就像有效負載是空的。
我認為這是skb指針的問題,但我的TCP端口很好。 只是似乎無法讀取該死的有效載荷。 這就是我解析它的方式:
unsigned char* user_data = (unsigned char *)((int)tcphd + (int)(tcphd->doff * 4));
unsigned char *it;
for (it = user_data; it != tail; ++it) {
unsigned char c = *(unsigned char *)it;
http_command[http_command_index] = c;
http_command_index++;
}
尾巴在哪里:
tail = skb_tail_pointer(skb);
指針在循環上根本不前進。 就像一開始是空的,還是什么,我不知道為什么。 請幫助。
我設法解決了這個問題。
使用此方法 ,我已經弄清楚了如何解析所有數據包的有效負載。 我希望這段代碼能解釋它
int http_command_offset = iphd->ihl*4 + tcphd->doff*4;
int http_command_length = skb->len - http_command_offset;
http_command = kmalloc(http_command_length + 1, GFP_ATOMIC);
skb_copy_bits(skb, http_command_offset , (void*)http_command, http_command_length);
skb_cop_bits,只需將有效負載完全復制到我創建的緩沖區中即可。 現在解析它非常簡單。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.