0

libpcap を使用して、ループバック ネットワーク アダプターとの間で送受信される http トラフィックを表示しようとしています。私はネットワークプログラミングを始めたばかりで、このライブラリはまったく初めてです。以前に受け取った回答のおかげで、マシンの「lo0」アダプター (Mac OSx) でリンク層の種類を検出することに成功しました。

//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);

イーサネット ヘッダーが存在しないループバック インターフェイスから発信されたパケットの内容を検査する場合、このロジックはクリアされません。Link-Layer Header Types のドキュメントには、「DTL_NULL」のLink-Layer タイプには、ネットワーク層プロトコルを含む PF_ 値で構成される 4 バイトのヘッダーが含まれていると記載されています (私の場合は IPv4 だと思います)。

上記の情報から、パケットのペイロードの場所を正しく特定するにはどうすればよいですか?

ガイダンスや情報をいただければ幸いです。ありがとう!

4

1 に答える 1