5

私は独自のスニファーを作成しようとしていました (楽しみのためだけに)、Mac で作業しています。私は、スニッフィングに非常に優れたライブラリである libpcap を使用しています。そこで、5 つのパケットをスニッフィングする次の単純なスニファーを使用しました (C で記述されています)。

#include <pcap.h>
#include "hacking.h"

void pcap_fatal(const char *failed_in, const char *errbuf) {
     printf("Fatal Error in %s: %s\n", failed_in, errbuf);
     exit(1);
}

int main() {
    struct pcap_pkthdr header;
    const u_char *packet;
    char errbuf[PCAP_ERRBUF_SIZE];
    char *device;
    pcap_t *pcap_handle;
    int i;

device = pcap_lookupdev(errbuf);
if(device == NULL)
    pcap_fatal("pcap_lookupdev", errbuf);

printf("Sniffing on device %s\n", device);

pcap_handle = pcap_open_live(device, 4096, 1, 0, errbuf);
if(pcap_handle == NULL)
    pcap_fatal("pcap_open_live", errbuf);

for(i=0; i < 5; i++) {
    packet = pcap_next(pcap_handle, &header);
    printf("Got a %d byte packet\n", header.len);
    dump(packet, header.len);
}

pcap_close(pcap_handle);

}

ご参考までに、はい、本 (Hacking: The Art of Exploitation) から引用し、少し修正しました。問題は、これを Linux で実行すると、問題なく完全に動作することです。しかし、これを Mac で実行すると、機能せず、パケットをキャプチャしません。

あなたの誰かが助けることができますか?前もって感謝します!

4

3 に答える 3

1

「pcap_lookupdev で致命的なエラーが発生しました」というエラー メッセージが表示される場合、問題は Sascha によると、パケットをキャプチャする権限がないことです。 このメッセージが表示された場合は、 を使用してプログラムを実行するsudoか、たとえば /dev/bpf* デバイスの所有権を自分に変更してみてください (これは で行う必要がありますsudo)。ただし、「「en0」でスニッフィングする」と言っているのは、おそらく「デバイスen0でスニッフィング」と出力しているためであり、その場合pcap_lookupdev()は失敗していません。

「pcap_open_live で致命的なエラー」が発生した場合、それもパーミッションに問題がある可能性がありますが、パーミッションが原因でエラーが発生することはほとんどありませpcap_lookupdev()ん。

「Fatal Error in」というエラー メッセージが表示されない場合、問題はおそらく、Petesh が指摘したように、タイムアウトとして 0 を指定したことです。タイムアウトとして 0 が指定されている場合、pcap_loop()pcap_dispatch()pcap_next()、およびpcap_next_ex()は、アプリケーションにパケットを提供する前に無期限に待機できます。Linux や Solaris などの一部のプラットフォームでは無期限に待機しませんが、*BSD や OS X などの他のプラットフォームでは無期限に待機する可能性があります。1 秒である 1000 のタイムアウトを試してください。たとえば、それが tcpdump の機能です。

于 2013-02-23T23:59:38.170 に答える
0

Petesh に加えて: 詳細については、マンページ (ターミナルの「man pcap」) を確認してください。

それは述べています:

BSD の場合 (これには Mac OS X が含まれます):

          You must have read access to /dev/bpf* on systems that don't have a cloning
          BPF device, or to /dev/bpf on systems that do.  On BSDs with a devfs  (this
          includes  Mac OS X), this might involve more than just having somebody with
          super-user access setting the ownership or permissions on the BPF devices -
          it  might  involve  configuring  devfs  to set the ownership or permissions
          every time the system is booted, if the system even supports  that;  if  it
          doesn't  support  that,  you might have to find some other way to make that
          happen at boot time.
于 2013-02-23T12:37:30.587 に答える