2012-02-15 6 views
3

これは私の最初のCアプリですので、いくつかの無知をお許しください。私はスピードの理由から、PythonベースのlibpcapアプリケーションをC言語に移植しています。パケットから情報を抽出する方法を理解している問題があります。それはu_charとして私のハンドラ関数に来る、そしてそこからそれをmungeすることができます。 Pythonでは、私は単に "文字列"をスライスし、そのように私の情報を抽出するだろうが、私はどのように進めるか分からない。Cポインタとメモリ(PCAP&パケット処理)

たとえば、イーサネットフレーム(それぞれ0〜6バイトと7〜11バイト)から宛先MACアドレスと送信元MACアドレスを抽出します。今私が持っている:

void handle_sniffed(u_char *args, const struct pcap_pkthdr *header, const u_char *packet) { 
    u_char *mac_dst = malloc(6*sizeof(u_char)); 
    u_char *mac_src = malloc(6*sizeof(u_char)); 
    memcpy(mac_dst, packet, 6); 
    memcpy(mac_src, packet+6, 6); 
} 

は、私はこれを正しくやっているし、今どのように私はprintfを使用して、たとえば、MACアドレスを表示していますか?

答えて

1

私はあなたがそれをうまくやっていると思います、memcpy()の属性はちょうどいいです、malloc()が正しいです。あなたはメモリが安全に割り当てるために、このようなinline functionを使用することができます/(あなたが各割り当てを確認してください)の割り当てを確認してください。

inline void* s_malloc(size_t size){ 
    void *ptr = malloc(size); 
    if(!ptr){ 
     printf("Allocation failed"); 
     exit(1); 
    } 
    return ptr; 
} 

また、そのためのマクロを書くことができますが、おそらく機能としてそれを使用することはできません。もしあなたがこれをやるより良い方法を持っていれば、私は拡張/編集がうれしいでしょう。

とにかく、あなたの質問に答えてください。 MACアドレスを出力する方法。 prinf()のマニュアルはこちらx respをご覧ください。 Xフォーマット。出力する10進数。

これは、1文字の長い番号を印刷するまで有効です。そこで、printf()に精度2の数字.2を印刷するようにしましょう。また、右側の小数点以下の桁の代わりに「左」のパッドを指定する必要があります。これは-です(マニュアルのすべてを確認してください)。したがって、1バイトのMACを印刷するための完全な文字列は、%-.2Xです。完全な例は次のようになります。

#include <stdio.h> 

int main(){ 
    unsigned char data[6] = {0x00, 0xab, 0x03, 0xff, 0xba, 0x10}; 
    printf("%-.2X:%-.2X:%-.2X:%-.2X:%-.2X:%-.2X\n", data[0], data[1], data[2], 
      data[3], data[4], data[5]); 

    return 0; 
} 

そして結果:あなたはこのような機能を構築することができるものをスピードアップするため

[[email protected] tmp]$ gcc -Wall src.cpp && ./a.out 
00:AB:03:FF:BA:10 

:もちろんあり

void print_mac(const unsigned char *data){ 
    printf("%-.2X:%-.2X:%-.2X:%-.2X:%-.2X:%-.2X\n", data[0], data[1], data[2], 
      data[3], data[4], data[5]); 
} 

// Usage example: 
printf("SrcMAC: "); 
print_mac(packet+6); 
printf("DstMAC: "); 
print_mac(packet); 

がより良い方法かもしれませんこれを行う。私はこれを明確かつ教育的にしようとしましたが、あなたが何かを理解していない場合は、コメントでお気軽にお問い合わせください。

1

最初のCプログラムとしてのパケットスニファ?印象的な。

Cでは、適切な方法は、単一のパケットのレイアウトを含む構造体を作成することです。次に、その構造体に与えられたパケットポインタをキャストして逆参照します。 MACアドレスを保持するlong long。

受信したパケットの仕様がわかる場所を教えてください。次に、一致する構造体を作成する際に役立ちます。

+0

私はちょうどボグ標準イーサネットフレームをキャプチャしています。私はそれを構造体にキャストすることができることを理解しています。そして、私にとってそれは "簡単な"方法です(C言語でもそれを行うには賢い方法だと確信しています)。私は、そのキャストを含むhttp://www.tcpdump.org/pcap.htmlの指示に従っています。私は基本的にPythonコードの1:1ポートを実行したかったので、C言語でもっと多くの作業をしなくてはなりませんでした。これは過去に私の頭を包み込むことができなかったことでした。 – axon

+1

これは、ハードコアの練習方法です。 –

+0

複雑なメモリアクセスを受け入れる方法は、キャストから構造への方法でしょうか?この場合だけでなく、ほとんどの場合ですか? – axon

関連する問題