2013-06-23 43 views
0

我想查看使用libpcap往返於我的環回網絡適配器的http流量。我只是從網絡編程開始,對這個庫完全陌生。感謝我之前收到的answer,我已經成功地檢測到我的機器的「lo0」適配器(Mac OSx)上的鏈接層類型。TCPDump/libpcap - 找到有效載荷數據的內存位置

//lookup link-layer header type 
link_layer_type = pcap_datalink(handle); 
if(link_layer_type == DLT_NULL){ 
    printf("DLT_NULL"); // this true in the case of "lo0" 
} 

Programming with Pcap指南假定每個數據包都包含一個以太網報頭。所以,用於查找數據包的有效載荷的邏輯如下:

ethernet = (struct sniff_ethernet*)(packet); 
    ip = (struct sniff_ip*)(packet + SIZE_ETHERNET); 
    size_ip = IP_HL(ip)*4; 
    if (size_ip < 20) { 
     printf(" * Invalid IP header length: %u bytes\n", size_ip); 
     return; 
    } 
    tcp = (struct sniff_tcp*)(packet + SIZE_ETHERNET + size_ip); 
    size_tcp = TH_OFF(tcp)*4; 
    if (size_tcp < 20) { 
     printf(" * Invalid TCP header length: %u bytes\n", size_tcp); 
     return; 
    } 
} 

payload = (u_char *)(packet + SIZE_ETHERNET + size_ip + size_tcp); 

此邏輯結算不會檢查數據包從那裏以太網頭不存在loopback接口始發的內容時工作。 Link-Layer Header Types documentation指出鏈接層類型的「DTL_NULL」包含一個由包含網絡層協議的PF_值組成的4字節頭(在我的例子中,我猜IPv4)。

鑑於上述信息..我如何正確定位數據包的有效載荷位置?

任何指導或信息將不勝感激。謝謝!

回答

0

鑑於上述信息,我該如何正確定位數據包的有效載荷位置?

對於DLT_NULL,程序應該將數據包的前4個字節提取爲32位數字。如果您正在進行實時捕獲,則可以按主機的字節順序提取它,並將其與您的操作系統值AF_INETAF_INET6(如果它具有AF_INET6定義進行比較;如今它們應該支持大多數當前操作系統版本IPv6的);如果您正在讀取捕獲文件,那麼如果pcap_is_swapped()返回非零值(您也可以將其用於實時捕獲;實時捕獲總是返回零),則需要對該值進行字節交換。需要與幾個不同的「IPv6」值(24,28和30)進行比較,其中每個值在某些特定操作系統上均表示「IPv6」(幸運的是,AF_INET在支持DLT_NULL的所有操作系統上均爲2,因爲它們都從該值4.2BSD)。

如果該值是IPv4值(2,如上所述),那麼在這4個字節之後,您將擁有該數據包的IPv4標頭。如果它是其中一個IPv6值,那麼在這4個字節之後,您將擁有該數據包的IPv6標頭。如果它不是這些值中的任何一個,則是其他協議。