2

tcp.h を使用してこの単純な C プログラムをコンパイルするのを手伝ってくれませんか? バイトオーダーが「# ifdef __FAVOR_BSD」で設定されていないため、「mitmc.c:82: error: struct tcphdr has no member named th_off」を取得する

これは、一部の人にとってはおそらく単純な問題です。私はこのプログラムをコンパイルしようとしています。これは、本の中間ユーティリティの単純な男です。Linux で gcc を使用してコンパイルします (Windows には posix ライブラリがなかったため)。

最初にこのエラーが発生しました:

mitmc.c: In function âcorrupt_ip_pktâ:
mitmc.c:82: error: âstruct tcphdrâ has no member named âth_offâ
mitmc.c:109: error: âstruct udphdrâ has no member named âuh_ulenâ

これは、「/usr/include/netinet/tcp.h」で th_off が次の場合にのみ定義されているためです # ifdef __FAVOR_BSD

しかし、 #define _BSD_SOURCE を追加して定義すると (features.h http://www.linuxquestions.org/questions/programming-9/tcp-hdr-variables-388003/に設定されているため)、全体が得られますその他のエラーのセット:

$ gcc mitmc.c
/tmp/ccuzRcNp.o: In function `corrupt_ip_pkt':
mitmc.c:(.text+0x15f): undefined reference to `libnet_do_checksum'
mitmc.c:(.text+0x174): undefined reference to `libnet_geterror'
mitmc.c:(.text+0x231): undefined reference to `libnet_do_checksum'
mitmc.c:(.text+0x242): undefined reference to `libnet_geterror'
mitmc.c:(.text+0x296): undefined reference to `libnet_do_checksum'
mitmc.c:(.text+0x2a7): undefined reference to `libnet_geterror'
/tmp/ccuzRcNp.o: In function `pkt_handler':
mitmc.c:(.text+0x346): undefined reference to `libnet_write_raw_ipv4'
mitmc.c:(.text+0x357): undefined reference to `libnet_geterror'
/tmp/ccuzRcNp.o: In function `main':
mitmc.c:(.text+0x466): undefined reference to `libnet_init'
mitmc.c:(.text+0x4ae): undefined reference to `libnet_get_hwaddr'
mitmc.c:(.text+0x4c6): undefined reference to `libnet_geterror'
mitmc.c:(.text+0x590): undefined reference to `strlcat'
mitmc.c:(.text+0x5c0): undefined reference to `strlcat'
mitmc.c:(.text+0x5df): undefined reference to `pcap_lookupdev'
mitmc.c:(.text+0x63c): undefined reference to `pcap_lookupnet'
mitmc.c:(.text+0x697): undefined reference to `pcap_open_live'
mitmc.c:(.text+0x6fc): undefined reference to `pcap_compile'
mitmc.c:(.text+0x715): undefined reference to `pcap_perror'
mitmc.c:(.text+0x736): undefined reference to `pcap_setfilter'
mitmc.c:(.text+0x74f): undefined reference to `pcap_perror'
mitmc.c:(.text+0x767): undefined reference to `pcap_freecode'
mitmc.c:(.text+0x7ad): undefined reference to `pcap_loop'
mitmc.c:(.text+0x7cd): undefined reference to `pcap_perror'
mitmc.c:(.text+0x7e6): undefined reference to `pcap_close'
mitmc.c:(.text+0x7f3): undefined reference to `libnet_destroy'
collect2: ld returned 1 exit status

助けてくれてありがとう。

さらに、ところで、コンパイラ エラーに引用符ではなく â が含まれることがあるのはなぜですか? ありがとう、bashでLANG = Cを使用すると引用符が修正されました。

ここで回答して、フォーマットを使用できるようにします。優秀な!libnet-config が、設定のためにコマンドラインで使用できるバイナリであることを知りませんでした。ですから、他の初心者にとっては、

$ libnet-config  --defines
-D_BSD_SOURCE -D__BSD_SOURCE -D__FAVOR_BSD -DHAVE_NET_ETHERNET_H
$ libnet-config --libs
-lnet

それをエスケープするので、コマンドとして実行されます

$ gcc -Wall `libnet-config --defines` mitmc.c -o mitmc `libnet-config --libs` -lpcap
mitmc.c: In function 'main':
mitmc.c:232: warning: implicit declaration of function 'strlcat'
/tmp/ccSDMkcZ.o: In function `main':
mitmc.c:(.text+0x590): undefined reference to `strlcat'
mitmc.c:(.text+0x5c0): undefined reference to `strlcat'
collect2: ld returned 1 exit status

助けてくれてありがとう、それが正しい答えです。現在、コードは openbsd 用に書かれているようです (wikipedia Strlcpy を参照)。strlcat を strncpy に置き換えて、最善を尽くすだけだと思います。SUCCESS、コンパイルしました!FFSさん、

$ sudo ./mitmc
pcap_compile: syntax error

ああ、それは私の使い方です。

ありがとうヴラド、ありがとうエレミヤ!

4

1 に答える 1

3

を使用するには、コンパイラ/リンカに特定のフラグを指定する必要がありますlibnet。あなたの場合、プログラムで使用している関数の定義が見つからないため、リンカーエラーが発生します。libnet明らかに、これはとにリンクする必要があるためですlibpcap。それを正しくするには、次のようなことを試してください。

gcc -Wall `libnet-config --defines` mitmc.c -o mitmc `libnet-config --libs` -lpcap
于 2011-02-28T00:09:42.780 に答える