gpt4 book ai didi

由于 endianess 错误,无法使用 tcp.h 编译简单程序?

转载 作者:可可西里 更新时间:2023-11-01 02:40:20 31 4
gpt4 key购买 nike

帮我用 tcp.h 编译这个简单的 C 程序?获取“mitmc.c:82: error: struct tcphdr has no member named th_off”因为字节顺序没有用“#ifdef __FAVOR_BSD”设置

这对你们中的一些人来说可能是一个简单的问题。我正在尝试编译 this程序,书中的一个简单的中间人实用程序。在 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 编写的(请参阅维基百科 Strlcpy)。我想我会用 strncpy 替换 strlcat 并希望最好。 SUCCESS,编译成功!哦,FFS,

$ sudo ./mitmc
pcap_compile: syntax error

啊,这只是我的用法。

谢谢 Vlad,谢谢 Jeremiah!

最佳答案

为了使用 libnet,您必须为编译器/链接器指定特定的标志。在您的情况下,您会看到链接器错误,因为它找不到您在程序中使用的函数的定义。显然,这是因为您需要链接libnetlibpcap。为了让它正确,请尝试类似的东西:

gcc -Wall `libnet-config --defines` mitmc.c -o mitmc `libnet-config --libs` -lpcap

关于由于 endianess 错误,无法使用 tcp.h 编译简单程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5136980/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com