1

PPI フレーム形式のパケットの解析に問題があります。802.11+mac+phy フィールドが必要です。共通フィールドの後に、オフセットに誤りがあるようです。これが私のコードです:

void process_packet(u_char *args, const struct pcap_pkthdr *header, const u_char *packet)
{
int offset = 0;

const struct ppi_packetheader *ppi_header = (struct ppi_packetheader *)(packet + offset);
offset += 8;

const struct ppi_fieldheader *ppi_80211_common = (struct ppi_fieldheader *)(packet + offset);
printf("common type: %d | len: %d\n", ppi_80211_common->pfh_type, ppi_80211_common->pfh_datalen);
offset += 4 + 20;

const struct ppi_fieldheader *ppi_80211_mac = (struct ppi_fieldheader *)(packet + offset);
printf("mac type: %d | len: %d\n", ppi_80211_mac->pfh_type, ppi_80211_mac->pfh_datalen);
offset += 4 + 27;

const struct ppi_fieldheader *ppi_80211_mac_phy = (struct ppi_fieldheader *)(packet + offset);
printf("mac+phy type: %d | len: %d\n", ppi_80211_mac_phy->pfh_type, ppi_80211_mac_phy->pfh_datalen);
}

common フィールドの出力は正しいです。type: 2、len: 20 と表示されます。ただし、mac フィールドの type: 64、len: 0 と同様に、他の値は間違っています (mac+phy も同様です)。リトルエンディアン/ビッグエンディアンの問題ですか、それとも私の間違いですか? 私はwiresharkの実装を見てきましたが、オフセットに関数 tvb_get_letohs() を使用しており、それはかなり複雑です...誰かが助けてくれることを願っています.

4

1 に答える 1

1

まず第一に、アラインメント ビットを見ていません。pph_flagsそれが設定されている場合、各フィールドは 4 バイト境界でアラインされ、クリアされている場合、フィールドは必ずしも 4 バイト境界でアラインされているわけではありません。ただし、802.11-Common フィールドの長さは、フィールド ヘッダーの長さと同様に 4 の倍数であるため、そのビットを確認する必要がありますが、この特定の問題は発生しません。

そして、はい、「パケット ヘッダーとフィールド ヘッダーのマルチバイト整数はリトルエンディアンとして格納する必要があります」ので、バイト順の問題が発生する可能性があります。pfh_typeただし、これはおよびに適用されるpfh_datalenため、ビッグ エンディアン マシンを使用している場合は、これらの値をバイト スワップする必要があります (これtvb_get_letohs()が実行中です - 境界チェックを行う Wireshark バッファーから、リトル エンディアンを取得しています)。 、Short (16 ビット) 値、およびそれをホスト バイト オーダーに変換する; フィールドが「自然な」バイト境界に配置されているかどうかに関係なく機能します)、リトルエンディアン マシンで実行しているようです (すべての Intel ベースの Mac を含む x86 ベースの PC - リトルエンディアン マシンで実行している場合)、共通フィールドの出力が正しいため、'

第三に、しかし、あなたは見ていないppi_header->pph_len! 特定のフィールドが PPI ヘッダーに存在するという保証はありません。フィールドごとに、PPI ヘッダーの長さを超えたかどうかを確認して、存在するかどうかを確認する必要があります。

Mountain Lion の Retina MBP で PPI ヘッダーを使用してキャプチャしたとき、ヘッダーの長さは 32 バイトで、存在する唯一のフィールドは 802.11-Common フィールドでした - 802.11n MAC+PHY 拡張フィールドは存在しませんでした(そして私たちのネットワークは 802.11n ネットワークです)。コードが 802.11n MAC+PHY 拡張フィールドを調べていると考えている場合、実際には 802.11 パケットの 802.11 MAC ヘッダーを調べている可能性があります。

于 2012-10-22T09:20:56.037 に答える