0

私のUbuntu仮想マシンのIPアドレスは192.168.1.110です。他のすべてはうまく見えます。コードの何が問題なのかわかりません。たぶん私は間違ったパッケージヘッダー構造を使用していますか?以下は私のコードと出力です。繰り返しますが、私のホストIPは192.168.1.110であるはずであり、今のところポートは間違いなく間違っています。

sudo ./sniffall 0
84.72.137.105:38055  192.168.1.105:56652
192.168.1.105:56652  174.141.213.124:28073
84.72.137.105:38055  192.168.1.105:56652
192.168.1.105:56652  174.141.213.124:28073
84.72.137.105:38055  192.168.1.105:56652


#include <pcap.h>
#include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netinet/ip.h>
#include <netinet/if_ether.h>
#include <netinet/ether.h>
#include <sys/socket.h>
#include <netinet/tcp.h>

void getPacket(u_char *args, const struct pcap_pkthdr *pkthdr, const u_char *packet){
    struct ip *ip;
    struct tcphdr *tcp;
    ip = (struct ip*)(packet+sizeof(struct ether_header));
    tcp = (struct tcphdr*)(packet+sizeof(struct ether_header)+sizeof(struct ip));

    char* src = inet_ntoa(ip->ip_src);

    printf("%s:%d ",src,tcp->source);
    char* dst = inet_ntoa(ip->ip_dst);
    printf(" %s:%d\n", dst, tcp->dest);

}

int main(int argc, char *argv[]){
    char errbuf[PCAP_ERRBUF_SIZE], *device;
    device = argv[1];
    pcap_t *handle;
    handle = pcap_open_live(device, BUFSIZ, 1, 1000, errbuf);
    if(!handle){
        device = pcap_lookupdev(errbuf);
        handle = pcap_open_live(device, BUFSIZ, 1, 1000, errbuf);
        if(!handle){
                printf("Couldn't open device %s: %s\n", device, errbuf);
        }
    }

    pcap_loop(handle, 5, getPacket, NULL);
    return 0;
}
4

2 に答える 2

2

無差別モードの場合、Pcapはシステム以外のトラフィックを表示します。システムから送受信されていない特定のパケットが表示される理由は、ネットワーク構成に少し依存します。一部のイーサネットスイッチは、どこに行くべきかわからない場合などに、他のシステム宛てのパケットをリークすることがあります。

また、バイトオーダー間で変換する必要があります。現在のほとんどの場合、「ネットワークバイトオーダー」はマシンのバイトオーダーと同じではありません。ポート番号を印刷するには、次のような操作を行う必要があります。

printf("%s:%d ",src,ntohs(tcp->source));

また、struct iphdrの代わりに試してみることもできますstruct ipipヘッダーで名前が付けられた構造体の複数の定義があった例を見たことがありますがiphdr、私にとっては常に正しいものでした。

いつでもtcpdump別のウィンドウで実行して、実際に着信しているパケットを確認できることを忘れないでください。予想よりも多くのトラフィックを受信して​​いる可能性があります。

于 2012-11-21T23:28:57.260 に答える
0

まず、を呼び出した後、を呼び出し、pcap_open_live()それが返されない場合は、プログラムを終了するか、プログラムを書き直して、返された値を処理できるようにします。からサポートされている値の説明については、tcpdump.orgリンク層ヘッダータイプのページを参照してください。pcap_datalink()handleDLT_EN10MBpcap_datalink()

次に、のフィルタをインストールするか、パケットタイプ(イーサネットヘッダーのタイプフィールドなど)をチェックしてパケットがIPv4パケットであることを確認しない限り、パケットがIPv4パケットであると想定しないでください。"ip"

第3に、IPv4パケットのヘッダーが正確にバイト長であると想定しないでください。IPv4ヘッダーの最小長である20になるとsizeof(struct ip)想定しますが、ヘッダーにはオプションが含まれる場合があります。IPv4ヘッダーの「ヘッダー長」フィールドを確認してください(4バイトワード単位であるため、値は5です)。は「20バイト」を意味します)、それをヘッダーの長さとして使用します(5未満の場合はパケットが無効であることを確認してください。次に4を掛けてヘッダーの長さを取得します)。sizeof(struct ip)

第4に、のフィルターをインストールしたか、または単に(後者の場合は、IPv4パケットかどうかを確認する必要があります)、または「プロトコル」をチェックしていない限り、パケットがTCPパケットであると想定しないください。 IPv4ヘッダーのフィールド。値が6(TCPの場合)であることを確認します。"ip and tcp""tcp"

于 2012-11-22T19:00:40.933 に答える