Linux- 自定义一个ARP请求

自定义一个ARP请求或响应,并使用AF_PACKET套接字发送,需要手动创建整个以太网帧。

下面是一个简单的C代码示例,用于发送一个ARP请求,查询给定IP地址的MAC地址:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <net/ethernet.h>
#include <net/if.h>
#include <netinet/if_ether.h>
#include <netinet/ip.h>
#include <linux/if_packet.h>
#include <unistd.h>#define TARGET_IP "192.168.1.1"
#define INTERFACE_NAME "eth0"int main() {int sockfd;struct sockaddr_ll sll;struct ifreq ifr;unsigned char packet[ETH_FRAME_LEN];// Open socketsockfd = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));if (sockfd == -1) {perror("socket");exit(EXIT_FAILURE);}// Get interface indexstrncpy(ifr.ifr_name, INTERFACE_NAME, IFNAMSIZ);if (ioctl(sockfd, SIOCGIFINDEX, &ifr) == -1) {perror("ioctl");close(sockfd);exit(EXIT_FAILURE);}// Set index and protocolsll.sll_ifindex = ifr.ifr_ifindex;sll.sll_protocol = htons(ETH_P_ARP);// ARP framestruct ether_header *eh = (struct ether_header *) packet;struct ether_arp *arp = (struct ether_arp *)(packet + sizeof(struct ether_header));// Ethernet headermemset(eh->ether_dhost, 0xff, ETH_ALEN);  // Destination MAC is broadcastmemset(eh->ether_shost, 0xaa, ETH_ALEN);  // Set source MAC to whatever you wanteh->ether_type = htons(ETHERTYPE_ARP);// ARP packetarp->arp_hrd = htons(ARPHRD_ETHER);arp->arp_pro = htons(ETH_P_IP);arp->arp_hln = ETH_ALEN;arp->arp_pln = sizeof(in_addr_t);arp->arp_op = htons(ARPOP_REQUEST);// Source MAC and IPmemset(arp->arp_sha, 0xaa, ETH_ALEN);     // Set source MAC to whatever you wantarp->arp_spa[0] = 192; arp->arp_spa[1] = 168; arp->arp_spa[2] = 1; arp->arp_spa[3] = 10; // Source IP// Destination MAC and IPmemset(arp->arp_tha, 0x00, ETH_ALEN);     // Destination MAC is unknowninet_pton(AF_INET, TARGET_IP, arp->arp_tpa);// Sendif (sendto(sockfd, packet, sizeof(struct ether_header) + sizeof(struct ether_arp), 0, (struct sockaddr*)&sll, sizeof(sll)) == -1) {perror("sendto");close(sockfd);exit(EXIT_FAILURE);}close(sockfd);return 0;
}

注意:运行此代码需要root权限,因为使用AF_PACKET需要对网络接口有完全的访问权限。而且,确保修改代码中的TARGET_IP和INTERFACE_NAME为我们想要查询的目标IP和我们使用的网络接口名。

这只是一个简单示例,可以根据需要进行修改和扩展。


Q1: 如何设置mac地址为 00:15:5d:31:81:8c?

A1: 为了设置MAC地址为00:15:5d:31:81:8c,不能使用memset,因为memset会将同一个值设置到所有的字节中。对于MAC地址,每个字节可能有不同的值。

所以,我们需要明确地为每个字节设置对应的值。

unsigned char mac[6] = {0x00, 0x15, 0x5d, 0x31, 0x81, 0x8c};
memcpy(eh->ether_shost, mac, ETH_ALEN);

这里我们使用memcpy来复制预定义的MAC地址到eh->ether_shost

Q2: 使用memcpy来复制预定义的MAC地址到eh->ether_shost时需要考虑网络字节序吗?

A2: 不需要。MAC地址不受字节序的影响。

当我们谈论网络字节序时,我们通常指的是4字节的IPv4地址或2字节的端口号等整数值,它们在不同的架构上可能有不同的存储方式(大端序或小端序)。

但MAC地址只是一个6字节的序列,不被视为一个整数值。因此,当复制或传输MAC地址时,不需要进行字节序转换。只需确保按正确的顺序使用地址的各个部分。

为了更清晰地解释这一点,我们需要先理解为什么需要考虑字节序的问题,以及在何种情况下不需要考虑。

字节序

字节序是指在多字节数据中,较高有效位和较低有效位的存放顺序。主要有两种字节序:

  1. 大端序 (Big-Endian):较高的有效位被保存在地址较小的存储器地址中,而较低的有效位被保存在地址较大的存储器地址中。
  2. 小端序 (Little-Endian):较低的有效位被保存在地址较小的存储器地址中,而较高的有效位则被保存在地址较大的存储器地址中。

这对于如整数、端口号、IP地址等数据结构很重要,因为它们可能由多个字节组成,并且在不同的机器或平台上可能有不同的存储顺序。

MAC地址

现在,考虑MAC地址,它是一个由6字节组成的序列,通常表示为XX:XX:XX:XX:XX:XX的形式。例如,00:1A:2B:3C:4D:5E

这6个字节从左到右是MAC地址的序列,而不是一个单一的大数字。因此,当我们复制或传输MAC地址时,只需要确保这6个字节按照相同的顺序被复制或传输。不需要像处理整数或IP地址那样担心整个结构的字节序。

为了进一步简化:将MAC地址想象为一个6个字节的数组。当我们复制这个数组时,只是按照数组的顺序一个接一个地复制每个字节,而不需要考虑字节之间的相对顺序,因为数组的顺序已经定义了这些字节的相对位置。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/105040.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

530. 二叉搜索树的最小绝对差

给你一个二叉搜索树的根节点 root &#xff0c;返回 树中任意两不同节点值之间的最小差值 。 差值是一个正数&#xff0c;其数值等于两值之差的绝对值。 题解&#xff1a;使用中序遍历来实现 代码如下&#xff1a; public int getMinimumDifference(TreeNode root) {int pre …

利用Python提取将Excel/PDF文件数据

使用Python来创建一个接口&#xff0c;用于接收Excel文件资源链接&#xff0c;下载文件并执行指定的操作&#xff0c;然后返回处理后的数据。以下是一个基本的示例&#xff0c;展示如何使用Flask来创建这样的接口。请注意&#xff0c;这是一个简化的示例&#xff0c;您可能需要…

JVM第三讲:JVM 基础-字节码的增强技术详解

JVM 基础-字节码的增强技术详解 本文是JVM第三讲&#xff0c;JVM 基础-字节码的增强技术。在上文中&#xff0c;着重介绍了字节码的结构&#xff0c;这为我们了解字节码增强技术的实现打下了基础。字节码增强技术就是一类对现有字节码进行修改或者动态生成全新字节码文件的技术…

人大金仓分析型数据库COPY装载数据

目录 文件装载 STDIN装载 \copy装载数据 输入格式 错误隔离 优化性能 COPY FROM将文件或标准输入中的数据复制到表中&#xff0c;并将数据附加到表内容中。 COPY是非并行的&#xff1a;使用master实例在单个进程中加载数据。建议仅对非常小的数据文件使用COPY。主机上的后…

Stable Diffusion 动画animatediff-cli-prompt-travel

基于 sd-webui-animatediff 生成动画或者动态图的基础功能,animatediff-cli-prompt-travel突破了部分限制,能让视频生成的时间更长,并且能加入controlnet和提示词信息控制每个片段,并不像之前 sd-webui-animatediff 的一套关键词控制全部画面。 动图太大传不上来,凑合看每…

python 并发请求,转发

python 并发请求&#xff0c;转发 http://t.csdnimg.cn/snSm5 另外&#xff1a;如果想要随机入参&#xff0c;可以参考加入随机数 #codingutf-8 import requests import json import threading import time import uuid import random class postrequests(): def init(self):…

css 块元素、行内元素、行内块元素相互转换

在HTML和CSS中&#xff0c;元素可以分为三类&#xff1a;块级元素&#xff08;Block-level Elements&#xff09;、内联元素&#xff08;Inline Elements&#xff09;和内联块级元素&#xff08;Inline-block Elements&#xff09;。 块级元素&#xff08;Block-level Elements…

10月14日,每日信息差

今天是2023年10月14日&#xff0c;以下是为您准备的8条信息差 第一、中国石油摘得日本碳信用实货交易首单。据了解&#xff0c;日本交易所集团旗下的东京证券交易所11日宣布&#xff0c;交易二氧化碳排放量的“碳信用市场”正式开始运营 第二、前三季度全国铁路投产新线1402公…

【C++】哈希对unordered_map和unodered_set的封装

&#x1f680;write in front&#x1f680; &#x1f4dc;所属专栏&#xff1a; C学习 &#x1f6f0;️博客主页&#xff1a;睿睿的博客主页 &#x1f6f0;️代码仓库&#xff1a;&#x1f389;VS2022_C语言仓库 &#x1f3a1;您的点赞、关注、收藏、评论&#xff0c;是对我最大…

Paddle build_cinn_pass_test源码阅读(fluid目录下)

代码位置在 paddle\fluid\framework\paddle2cinn\build_cinn_pass_test.cc &#xff0c;因为paddle CINN和PIR部分依旧在高频更新&#xff0c;所以各位看到的可能和我的不一样 inline bool CheckNodeExisted(const std::unordered_set<Node*>& nodes,const std::str…

Godot 单元测试

前言 单元测试是我们常用的功能&#xff0c;Godot作为一个游戏&#xff0c;单元测试和热重载是我们常用的功能。这里我们讲解最简单的单元测试的情况。 Godot 配置 我们添加一个最简单的节点&#xff0c;挂载一个最简单的脚本。 添加测试方法&#xff08;只能是静态方法&…

【Python】Python语言基础(中)

第十章 Python的数据类型 基本数据类型 数字 整数 整数就是整数 浮点数 在编程中&#xff0c;小数都称之为浮点数 浮点数的精度问题 print(0.1 0.2) --------------- 0.30000000000000004 ​​1.可以通过round()函数来控制小数点后位数 round(a b)&#xff0c;则表示…

Linux该如何学习,给你支招

如果你已经确定对 Linux 产生了兴趣&#xff0c;那么接下来我们介绍一下学习 Linux 的方法。这只是自己关于学习Linux的建议。 一、如何去学习 学习大多类似庖丁解牛&#xff0c;对事物的认识一般都是由浅入深、由表及里的过程&#xff0c;循序才能渐进。学习 Linux 同样要有一…

关于RNNoise、webrtc_ns、三角带通滤波器、对数能量

语音特征参数MFCC提取过程详解 其中讲解了&#xff1a;三角带通滤波器 、计算每个滤波器组输出的对数能量、对数能量、经离散余弦变换&#xff08;DCT&#xff09;得到MFCC系数 推荐阅读某乎这位大佬的全部文章&#xff1a; 下面是几篇出自这位大佬的很好的文章&#xff1a; …

SSH 基础学习使用

什么是SSH 1.SSH SSH&#xff08;Secure Shell&#xff09; 是较可靠&#xff0c;专为远程登录会话和其他网络服务提供安全性的协议&#xff0c;利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。 实际应用中&#xff0c;主要用于保证远程登录和远程通信的安全&#…

微信小程序入门讲解【超详细】

一. 微信小程序简介 1.1 什么是小程序 2017年度百度百科十大热词之一 微信小程序&#xff08;wei xin xiao cheng xu&#xff09;&#xff0c;简称小程序&#xff0c;英文名Mini Program&#xff0c;是一种不需要下载安装即可使用的应用( 张小龙对其的定义是无需安装&#xf…

如何创建自定义前端组件?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

VScode运行C/C++

VScode运行C/C VScode的安装这里不讲 一、mingw64的下载 二、VS code打开文件夹与创建C文件 ----------------这一步给萌新看&#xff0c;有C和VScode的基础可跳过---------------- 1.创建一个文件夹 2.vscode打开刚刚创建的文件夹 3.新建文件&#xff0c;在输入文件名1.c后…

Unity实现摄像机向屏幕中间发射射线射击物体

1.创建一个准星放在屏幕中间 外部找个PNG透明图&#xff0c;拖到Unity文件夹&#xff0c;右上角改成精灵sprite2d 2.添加到UI画布 3.写脚本 首先&#xff0c;我们需要引入一些 "工具"&#xff0c;就像我们在玩游戏时要先下载游戏客户端一样。这里的 "工具&quo…

iOS- flutter flavor 多环境Configurations配置

一、点击PROJECT的Runner&#xff0c;选择Info选项&#xff0c;在Configurations下方的号添加不同环境的配置&#xff0c;如下图&#xff1a; 二、选择TAGETS的Runner项目&#xff0c;选择Build Settings选项&#xff0c;在输入框输入package&#xff0c;为不同环境配置相应的…