1

xCodeでlibpcapを使用して次のコードを記述しました

#include<pcap.h>
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
#include<ctype.h>
#include<unistd.h>
#define MAXBYTES2CAPTURE 2048


void processPacket(u_char *arg,const struct pcap_pkthdr* pkthdr,const u_char* packet){
    int i=0,*counter=(int*)arg;
    printf("Packet Count:%d\n",++(*counter));
    printf("Recived Packet Size:%d\n",pkthdr->len);
    printf("Payload:\n");
    for(i=0;i<pkthdr->len;i++){
        if(isprint(packet[i]))
           printf("%c",packet[i]);
        else
            printf(". ");
        if((i%16==0&&i!=0)||i==pkthdr->len-1)
            printf("\n");
    }
}

int main(){
    int count=0;
    pcap_t *descr=NULL;
    char errbuf[PCAP_ERRBUF_SIZE];
    memset(errbuf,0,PCAP_ERRBUF_SIZE);
    descr=pcap_open_live("en1", MAXBYTES2CAPTURE, 1, 512, errbuf);
    if(descr!=NULL)
        pcap_loop(descr, -1, processPacket,(u_char*)&count);
    else
        printf("ERROR");


        return 0;
}

xCode 4.4から実行しているときに「エラー」が表示されますが、製品ディレクトリに移動してターミナルで次のように実行すると:

sudo ./TCP_packet
password:******** 


私はすでに setuid(0) を使用していますが、まだ xCode では動作しません!!!
では、このプログラムを xCode で root として実行するにはどうすればよいですか? xCode で行う必要がある設定はありますか? xCode ver:4.4
OSX:10.7 Lion
ありがとう

4

4 に答える 4

3

ビルド後に root が所有するアプリを setuid にする必要があります。

プログラムを機能させたい場合は、次のことを行う必要があります。

chown root:wheel TCP_packet
chmod u+s TCP_packet

これにより、root 権限で実行できるようになり、パケット キャプチャ デバイスにアクセスできるようになります。

Wireshark をインストールした場合は、ユーザー アカウントがグループに追加されているはずです。これにより、パケット キャプチャを実行するために必要なデバイスaccess_bpfへのアクセスが許可されます。/dev/bpf*

このヘルパーの前は、次のことを行っていました: sudo chgrp admin /dev/bpf*; sudo chmod g+r /dev/bpf*、これにより、次の再起動までパケット キャプチャ デバイスへのアクセスが許可されました。

于 2012-10-23T13:47:16.833 に答える
0

または、デバッグしていて、これをrootとして実行したいためです。ルートとしてXcodeを起動するだけです。

cd /Applications/Xcode.app/Contents/MacOS/
sudo ./Xcode

プロジェクトに移動すると、準備が整います。

楽しみ。

〜モーセ

于 2012-10-26T21:12:18.603 に答える
0

/dev/bpf*ファイルを chmod するように人々が言っ​​ている理由がわかりません。自分自身をグループに追加するだけでaccess_bpf、ユーザー アカウントがパケット フィルター デバイスにアクセスできるようになります。

に移動しApple menu > System Preferences... > Users & Groups、必要に応じてパネルのロックを解除し、 をクリックしてドロップダウンから+選択し、グループに名前を付けて作成します。次に、展開して、ユーザー アカウントが追加されていることを確認します。Groupaccess_bpfGroups

私のために働きます。sudoパケットをキャプチャするために使用する必要はありません。(またはchmodすべてのブート)

于 2012-10-23T21:23:53.533 に答える
0

setuid は system()、fork()、または exec() 呼び出しでのみ機能するため、これは役に立ちません

あなたができることはchmod u+s TCP_packetルートユーザーとしてです。これはあなたが望むことをします

于 2012-10-23T13:40:43.253 に答える