问题标签 [raw-sockets]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
sockets - 处理来自原始套接字的 Ip 标头时取消引用指针错误
void parse_message(char *buffer, int len) {
}
错误:取消引用指向不完整类型的指针
我在头文件中包含了 netinet/ip.h。上面的代码是为了访问 IP 头中包含的 ttl 值而编写的。使用原始套接字。
python - python中原始套接字的网络接口?
我正在为 Python 中的无线网桥编写一个小型配置实用程序,使用带有 Ethernet II proto 0x8888 的原始套接字。有几个关于 python 原始套接字的教程,但它们似乎都对网络接口(“eth0”、“eth1”等)进行了硬编码,我不想这样做,因为每台计算机可能有不同的网络接口(在我的笔记本电脑上是“wlan0”)。
我当前的工作代码是(不幸的是硬编码的“wlan0”):
有什么方法可以在当前系统上获取网络接口名称,而不必对其进行硬编码?
我已经尝试过 INADDR_ANY,但这也不起作用。
linux - 使用 RAW 套接字在 Linux 上捕获传出的 icmpv6 数据包
我正在尝试捕获从 Linux 上的主机发出的传入和传出 icmpv6 数据包。我已经编写了以下程序来做到这一点。在这个程序中,我们可以捕获传入的数据包而不是传出的数据包。捕获对于 icmpv4 数据包(代码的注释部分)工作正常,但对于 icmpv6 数据包它是一个问题。我对使用包过滤(Berkley Packet Filter)机制不感兴趣,与我在下面使用的方法相比,它有点侵入性。你能告诉我是否还有其他东西可以用来做这件事吗?或者Linux是否提供任何其他机制来做到这一点?
linux - 在 MAC 层访问无线接口 (802.11) (Linux)
我花了最后几天阅读手册页、文档和谷歌提出的任何其他内容,但我想我现在比开始时更加困惑。
这就是我想做的事情:我想在使用 C/C++ 的 Linux 系统上通过无线接口 (802.11) 使用我自己的第 3-x 层协议发送和接收数据包。到目前为止,一切都很好。我不需要信标、关联或任何与 AP/SSID 相关的东西。但是,对于数据传输,我希望 MAC 层表现得“像往常一样”,这意味着单播数据包被 ACK、重传、退避等。我还想享受扩展的 QoS 功能(802.11e 有 4 个队列和不同的访问类别)。另一方面,混杂模式不是问题,我只需要广播数据包和发送到特定站的数据包。
什么是正确的方法?大多数关于原始套接字访问的文档似乎都集中在网络嗅探上,这并没有帮助。我已经玩了一段时间的监控模式,但从我到目前为止所读到的,在监控模式等下接收到的数据包没有被确认。如果没有监控模式,还有什么替代方案?使用ad hoc 模式和 unix 原始套接字?还是我必须摆弄司机?
我不是在寻找一个完整的解决方案,只是一些好的想法,从哪里开始。我通读了 socket(2)、socket(7) 和 packet(7) 的手册页,但这对 MAC 层在不同模式下的行为没有帮助。
提前致谢。
c - 同步后检索 ack
我编写了一个小工具,它只是在你给它的任何 ip 和端口号上抛出一个 syn 数据包——当我弹出 Wireshark 时,发送的数据包看起来很好,没有错误或任何东西,它看起来就像你的典型 TCP SYN包。
由于某种原因,ACK 不是由服务器发送的。所以,有两个问题;一、没有ACK响应。第二,我什至不知道如何通过我的程序接收 ack 响应(bind()?)。
我从网上找到的 syn flooder 中修改了一些代码,因为在我看来,一些脚本小子代码很容易理解,但我担心它可能会遗漏一些东西,并且可能是服务器 ACK 拒绝的结果。代码已被修改,因此 syn 请求是从合法 IP 地址发送的。以下代码显示了我的 ip+tcp 标头:
所以,我发送那个,没有回复。我错过了什么?
java - winpcap/libpcap 与原始套接字
我开始了一个需要使用网络级数据包(例如 IP/ICMP/UDP/TCP 数据包)的项目。
有两种主要的处理方法:原始套接字和 Winpcap/libpcap。
我知道 pcap 在操作系统上安装驱动程序并允许程序员捕获和发送数据包。另一方面,原始套接字在 Windows 7 或更高版本中有一些限制。
该项目需要向路由器发送一些 IP/ICMP/UDP/TCP 数据包并分析响应,例如IP-Identifier
, TTL
, ... 。我也希望它适用于 Linux 和 Windows。
你能列出这两种方法的比较吗?
c - RAW Socket - Ethertype 和接收算法 - C
我正在使用 C 语言中的原始套接字。我需要发送和接收原始以太网数据包。数据包应以 IEEE 802.3 标头开头:
MAC DST [0-5] - MAC SRC [6-11] - ETH 类型 [12-13]
用wireshark捕获数据包我看到以下结构:
MAC DST [0-5] - MAC SRC [6-11] - 长度 [12-13] - 拖车 [14-58]-....
这是我的代码:
这只是wireshark的“问题”吗?有任何想法吗?
我的第二个问题是关于原始消息的接收。该过程卡在recvfrom上。
这是我的代码:
你可以帮帮我吗?
提前致谢!
c - 在 Linux 上嗅探数据包时过滤网络堆栈中的数据包?
我有一个低级网络/Linux 大师的问题,
我必须为我大学的一个安全项目构建两个工具。第一个工具是 ARP 中毒攻击者,它会从远程主机毒化 ARP 缓存,以检索他发送到另一台主机的数据。我使用 RAW 套接字在 C 中编写了这个工具,它运行良好,我能够拦截从主机 A 传输到主机 B 以及从主机 B 传输回主机 A 的数据。
问题出现在编写第二个工具时,它是一个嗅探器,其目的是读取/编辑/丢弃来自主机 A 或主机 B 的数据包。我想象了一个系统,当我发现来自这些主机之一的数据包时,我的程序将问我是否要让这个数据包通过,如果我想修改它,或者我只是想丢弃它。我使用在 linux 中激活了 IP 转发
我能够读取在两台主机之间传输的所有数据。但我不知道如何编辑/删除这些数据包,因为 linux 的网络堆栈负责管理来自我的网络接口的数据包的输入和输出。如果你愿意,我只是充当被动攻击者。
我的第一个想法是禁用 ip 转发并自己管理数据包的路由。但是当我禁用 ip 转发时,我根本无法从 A 或 B 获取任何数据,这是因为 linux 的网络堆栈会在内核模式下自动丢弃 IP 地址不是我的计算机的数据包。
然后我尝试激活混杂模式,但这是不必要的,因为该模式仅在物理层上运行(查看以太网接收数据包中的目标 MAC 地址是否与本地接口上的 MAC 地址匹配)。所以基本上,混杂模式可以帮助我们避免 linux 堆栈的物理过滤器,而不是逻辑过滤器(我收到的数据包中的目标 IP 地址是 B 的 IP 地址而不是我的,所以 linux 的网络堆栈只是丢弃数据包)。
所以我的问题是,我怎样才能设法编辑我收到的数据包并将它们发回,或者如果我愿意的话就简单地丢弃它们。我知道这是一个棘手的问题,我已经进行了一些研究以自己找到解决方案,但我没有找到令人满意的答案。
我知道iptables有一个解决方案,我们可以要求他让来自某个 IP 地址的一些数据包通过,但我不想要涉及第三方工具的解决方案,我想将所有内容封装在我的程序中。
供参考,开发环境是Linux/Ubuntu Kernel 3.0.0-16,一切都是用C语言制作的。
c - 在笔记本电脑之间建立直接的点对点 Wi-Fi 通信
TL;DR 在底部可用
我一直在想办法让两台笔记本电脑(都运行 Ubuntu)能够来回传递基本消息,而无需通过无线网络连接它们,无论是通过 AP 还是 ad-hoc . 我想在此重申,ad-hoc 网络不是我想要的,我在这里看到了许多类似的问题作为答案。
我想我要问的是:我如何实现这一目标?我真正需要的是一台计算机能够发送一个数据包,然后另一台计算机通过某种数据包嗅探器来接收它。
目前:我的两台笔记本电脑都处于监控模式(通过从 aircrack-ng 的 airmon-ng 创建的 mon0 接口),以便它们可以嗅探附近的流量(使用 Wireshark、tcpdump、tcpcump.org 的示例 libpcap 代码,并打开一个原始套接字,然后打印出所有的数据包。我每个都试过只是因为我认为一个人可以做一些不同的事情/遗漏一些东西)。我还有一个非常基本的程序,包括打开一个原始套接字以将精心制作的以太网帧发送到空中,但我无法让我的两台机器看到对方的数据包。在每台机器上运行的嗅探器只能看到从该机器发出的数据包(除了附近的信标/来自该区域 wifi 的控制流量)。
需要注意的一些可能很重要的事情是:
- 我发送的数据包在 Wireshark(仅在发送机器上)中显示为格式错误的 802.11 数据包(可能是因为我现在只是用垃圾数据填充它们)。我的印象是我的另一台笔记本电脑也会将它们视为格式错误的数据包,但它什么也没得到
- 我使用的套接字来自对套接字(PF_PACKET,SOCK_RAW,ETH_P_ALL)的调用。原始套接字是我最近才知道的,所以我可能会误解它们的工作原理,但我的印象是我可以手工制作第 2 层数据包并直接发送到电线/空气中。
如果你对我为什么要做这样的事情感到好奇,那部分是出于好奇,部分是出于对我正在从事的项目的研究。我想简化/自动化设置 ad-hoc 网络的过程,而我在这里要做的是让笔记本电脑进行一次小型交换,以找出他们将要创建的 adhoc 网络的细节和然后自动建立/加入该网络,而不是由任何一个人明确设置网络或让两个人预先决定网络的名称等,并让两台计算机不断尝试连接到该特定网络。
如果我以正确的方式进行此过程而不是我的代码是否有效,我更感兴趣,如果有人认为我发布我的(非常基本,取自 Stack Overflow 上的另一篇文章)原始套接字代码会有所帮助,我可以。
编辑:如果我能让它工作,我很乐意发布一整套带有说明的代码。我在互联网上找不到关于这个主题的太多有用信息,我很乐意为未来尝试做同样事情的人提供它。
TL; DR我想从一台笔记本电脑发送一个数据包,然后通过某种数据包嗅探器在另一台笔记本电脑上接收它。不涉及 wifi 网络或 ad-hoc 网络。类似于为了发送少量数据而欺骗 AP 的信标帧(或类似帧)的东西。
编辑2:经过一番思考,也许我正在寻找某种原始的802.11使用?直接控制 wifi 收音机?这样的事情可能吗?
c - 一小时后 PING 超时
我有一段代码将 ping 命令作为更大代码的一部分来实现。
这是场景:
- 使用“-c”或“-t”选项运行 ping。
- 随后通过 Ctrl+C 终止
- 大约一个小时后,我观察到 ping 失败。
这是“套接字”调用: sock = socket(IP_AF_INET, IP_SOCK_RAW, IP_IPPROTO_ICMP);
在从套接字调用 recv 之前,将超时值设置为 1 秒。当 ping 失败时,我观察到 errno 设置为 EAGAIN。
我尝试了一些测试,我认为这是由于按下 Ctrl+C 时套接字未关闭造成的。
我的问题是:如果我不像上面提到的场景那样关闭套接字,我会面临什么问题?