簡體   English   中英

從TCP數據包有效負載獲取主機字段

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM