ARP请求拦截及响应

news2024/11/25 6:39:23

一、前言

本文主要是介绍如何对arp请求包进行拦截,并代替系统进行响应。对arp请求进行拦截,需要在驱动中进行,具体代码如下文所示。(本文仅供参考)

二、环境

	OS Ubuntu 20.04.6 LTS
	Linux ubuntu 5.15.0-71-generic

三、源码

驱动代码如下(arp_hook.c):

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/netfilter.h>
#include <linux/netfilter_ipv4.h>
#include <linux/if_ether.h>
#include <linux/if_arp.h>
#include <linux/netfilter_arp.h>
#include <linux/skbuff.h>
#include <linux/ip.h>
#include <linux/udp.h>
#include <linux/tcp.h>
#include <linux/if_packet.h>
#include <linux/netdevice.h>
#include <net/arp.h>

#define MAC_arg(x) x[0],x[1],x[2],x[3],x[4],x[5]

 void print_arp_packet(struct sk_buff *skb) {
    struct arphdr *arp;
	unsigned char *arp_ptr;
	__be32 sip, tip;
	unsigned char *sha, *tha;

	arp = (struct arphdr *)skb->data;
	arp_ptr = (unsigned char *)(arp+1);
	
	sha = arp_ptr;
	memcpy(&sip, arp_ptr+ETH_ALEN, 4);
	tha = arp_ptr+ETH_ALEN + 4;
	memcpy(&tip, arp_ptr+ETH_ALEN+4+ETH_ALEN, 4);
	
	printk(KERN_INFO "ARP ar_op=%s sha=%02x:%02x:%02x:%02x:%02x:%02x sip=%pI4 tha=%02x:%02x:%02x:%02x:%02x:%02x tip=%pI4\n", 
		(ntohs(arp->ar_op)==ARPOP_REQUEST ? "Request" : "Response") , MAC_arg(sha),&sip, MAC_arg(tha), &tip);
}

//构建arp响应包
void arp_response(struct sk_buff *skb, const struct nf_hook_state *state){
	struct arphdr *arp = NULL;
    unsigned char *data = NULL;
	unsigned char src_hw[ETH_ALEN] = {0}, dest_hw[ETH_ALEN] = {0};
	__be32 src_ip, dest_ip;

	arp = (struct arphdr *)skb->data;
	data = (unsigned char *)(arp+1);

	//从包中拷贝mac地址等信息
	memcpy(&src_ip, data + ETH_ALEN + 4 + ETH_ALEN, 4); //新包源ip=旧包目的ip
	memcpy(dest_hw, data, ETH_ALEN);	//新包目的MAC=旧包源MAC
	memcpy(&dest_ip, data + ETH_ALEN, 4); //新包目的ip=旧包源ip

	//获取本机mac
	memcpy(src_hw, state->in->dev_addr, ETH_ALEN);

	arp_send(ARPOP_REPLY, ETH_P_ARP, dest_ip, state->in, src_ip, dest_hw, src_hw, dest_hw);
	/*arp_send(int type, int ptype, __be32 dest_ip,
	      struct net_device *dev, __be32 src_ip,
	      const unsigned char *dest_hw, const unsigned char *src_hw,
	      const unsigned char *target_hw)
		  */
}

// 定义钩子函数
static unsigned int arp_hook_func(void *priv, struct sk_buff *skb, const struct nf_hook_state *state)
{
    struct ethhdr *eth_header = NULL;
    struct arphdr *arp_header = NULL;
	
	//长度不对直接返回
    if (skb->len < sizeof(struct ethhdr) + sizeof(struct arphdr)) {
		return NF_ACCEPT;
	}

	//获取以太网头部指针
	eth_header = eth_hdr(skb);
    if (htons(ETH_P_ARP) != eth_header->h_proto){
        return NF_ACCEPT;
	}
	
	//判断是否为ARP请求报文
	//(需要注意的是邻居发的针对于网关IP的ARP请求的处理,但正常没有此情况发生,故此处暂时不处理)
	arp_header = arp_hdr(skb);
	if (htons(ARPOP_REQUEST) != arp_header->ar_op) {
		return NF_ACCEPT;
	}
	
	//只处理固定接口名的arp报文
    if (strcmp(skb->dev->name, "enp1s0") == 0)
    {
		print_arp_packet(skb);
		arp_response(skb, state);
		
        return NF_DROP;
    }
	
    return NF_ACCEPT;
}


//定义钩子结构体
struct nf_hook_ops arp_hook = {
	.hook = arp_hook_func,
	.pf = NFPROTO_ARP, 
	.hooknum = NF_ARP,
	.priority = NF_IP_PRI_FIRST
};

static int __init arp_hook_init(void)
{
	nf_register_net_hook(&init_net, &arp_hook);

    printk(KERN_INFO "ARP hook module loaded\n");
    return 0;
}

static void __exit arp_hook_exit(void)
{
    nf_unregister_net_hook(&init_net, &arp_hook);
    printk(KERN_INFO "ARP hook module unloaded\n");
}

module_init(arp_hook_init);
module_exit(arp_hook_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("zhazha");
MODULE_DESCRIPTION("ARP hook Module");

Makefile如下:

# Makefile for driver

KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)

obj-m += arp_hook.o

all: driver

driver:
	$(MAKE) -C $(KDIR) M=$(PWD) modules

clean:
	$(MAKE) -C $(KDIR) M=$(PWD) clean

运行结果:
运行日志
抓包结果
其它:
加载驱动命令:insmod arp_hook.ko
卸载驱动命令:remod arp_hook
查看驱动是否已经加载:lsmod | grep arp_hook
linux日志查看:tail -f /var/log/syslog
arp表查看命令:arp -a

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

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

相关文章

Java培训班出来能找到工作吗?有没有想详细了解的呢

参加Java培训班可以提升你的编程技能和就业竞争力&#xff0c;但能否找到工作还取决于多个因素&#xff0c;如个人能力、市场需求、就业竞争等。参加Java培训班可以帮助你获得系统的Java编程知识和实践经验&#xff0c;了解行业最佳实践和流行的技术框架。这有助于你在面试时展…

SpringBoot案例-部门管理-删除

目录 查看页面原型&#xff0c;明确需求 页面原型 需求 阅读接口文档 思路分析 功能接口开发 控制层&#xff08;Controllre类&#xff09; 业务层&#xff08;Service类&#xff09; 持久层&#xff08;Mapper类&#xff09; 接口测试 前后端联调 查看页面原型&a…

Linux进程管理命令

一、进程 程序由一条条指令构成&#xff0c;在运行一个程序的时候就是把这些指令从第一条执行到最后一条&#xff0c;而进程是一个正在运行的程序。 比如说&#xff0c;一个main.c文件是不可以直接运行的&#xff0c;对main.c进行编译链接之后生成一个main.exe&#xff08;在W…

QT学习笔记-QT安装oracle oci驱动

QT学习笔记-QT安装oracle oci驱动 0、背景1、环境以及条件说明2、编译驱动2.1 下载oracle instant client2.2 编译qt oci驱动2.2.1 修改oci.pro2.2.2 MinGW64构建套件编译2.2.3 MSVC2019_64构建套件编译 3、访问数据库运行成功 0、背景 在使用QT开发应用的过程中&#xff0c;往…

Mysql SUBSTRING_INDEX - 按分隔符截取字符串

作用&#xff1a; 按分隔符截取字符串 语法&#xff1a; SUBSTRING_INDEX(str, delimiter, count) 属性&#xff1a; 参数说明str必需的。一个字符串。delimiter必需的。分隔符定义&#xff0c;是大小写敏感&#xff0c;且是多字节安全的count必须的。大于0或者小于0的数值…

案例分析丨大数据平台和应用测试,应该关注哪些点?

互联网的发展催生了大数据行业的诞生和发展。大数据平台和大数据应用成为了各家排兵布阵的重要之地。那么&#xff0c;从测试的视角来看&#xff0c;大数据平台和应用的测试&#xff0c;我们应该关注哪些点呢&#xff1f; 换个姿势看问题。今天我们从问题域的角度来聊一聊。 什…

【数据处理-番外篇】手写了几个数据处理,都是用的递归

博主&#xff1a;_LJaXi Or 東方幻想郷 专栏&#xff1a; JavaScript | 脚本语言 开发工具&#xff1a;Vs Code 数据处理 对象修改结构判断两对象是否全等(只针对对象未做其他类型)复杂结构去重我写的破代码(没用,逻辑,结构都不对) 一些原理我也不讲了&#xff0c;我就是记录一…

MySQL不走索引的情况分析

未建立索引 当数据表没有设计相关索引时&#xff0c;查询会扫描全表。 create table test_temp (test_id int auto_incrementprimary key,field_1 varchar(20) null,field_2 varchar(20) null,field_3 bigint null,create_date date null );expl…

【C++】虚继承(virtual base classes)

【C】虚继承&#xff08;virtual base classes) 文章目录 【C】虚继承&#xff08;virtual base classes)1. 使用原因2. 解决方法3. 例题练习 1. 使用原因 在多重继承(Multiple Inheritance) 的情况下&#xff0c;尤其是菱形继承时&#xff0c;容易出现问题&#xff0c;关于菱…

STM32F429IGT6使用CubeMX配置GPIO点亮LED灯

1、硬件电路 2、设置RCC&#xff0c;选择高速外部时钟HSE,时钟设置为180MHz 3、配置GPIO引脚 4、生成工程配置 5、部分代码 6、实验现象

CentOS7有线未托管,网络连接图标消失

问题描述 网络图标消失&#xff0c;显示“有线 未托管”&#xff0c;且无法连接网络 解决方案 ①编辑文件&#xff1a;vim /etc/sysconfig/network-scripts/ifcfg-ens33 ②删除NM_CONTROLLEDno ③重启网络&#xff1a;service network restart 立马就可以自动连接上网络&…

SqlServer基础之(触发器)

概念&#xff1a; 触发器&#xff08;trigger&#xff09;是SQL server 提供给程序员和数据分析员来保证数据完整性的一种方法&#xff0c;它是与表事件相关的特殊的存储过程&#xff0c;它的执行不是由程序调用&#xff0c;也不是手工启动&#xff0c;而是由事件来触发&#x…

面试热题(两数之和)

给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 你可以按任意顺序返回答…

并发——JDK 提供的并发容器总结

文章目录 一 JDK 提供的并发容器总结二 ConcurrentHashMap三 CopyOnWriteArrayList3.1 CopyOnWriteArrayList 简介3.2 CopyOnWriteArrayList 是如何做到的&#xff1f;3.3 CopyOnWriteArrayList 读取和写入源码简单分析3.3.1 CopyOnWriteArrayList 读取操作的实现3.3.2 CopyOnW…

K8S MetalLB LoadBalancer

1. 简介 kubernetes集群没有L4负载均衡&#xff0c;对外暴漏服务时&#xff0c;只能使用nodePort的方式&#xff0c;比较麻烦&#xff0c;必须要记住不同的端口号。 LoadBalancer&#xff1a;使用云提供商的负载均衡器向外部暴露服务&#xff0c;外部负载均衡器可以将流量路由…

【数学】CF1514 C

Problem - 1514C - Codeforces 题意&#xff1a; 思路&#xff1a; Code&#xff1a; #include <bits/stdc.h>using i64 long long;constexpr int N 2e5 10; constexpr int M 2e5 10; constexpr int mod 998244353;void solve() {int n;std::cin >> n;std:…

图像处理技巧形态学滤波之腐蚀操作

1. 引言 欢迎回来&#xff0c;我的图像处理爱好者们&#xff01;今天&#xff0c;让我们深入研究图像处理领域中的形态学计算。这些非线性的图像处理技术允许我们操纵图像中对象的形状和结构。在本系列中&#xff0c;我们将依次介绍四种基本的形态学操作&#xff1a;腐蚀、膨胀…

走出象牙塔:李郓梁的区块链实践之路丨对话MVP

如何从科研走向实践&#xff1f;李郓梁在社区找到了答案。 作为西安工业大学的硕士研究生&#xff0c;李郓梁从学校的实验室接触区块链技术。通过研读大量论文&#xff0c;李郓梁为区块链多中心化、不可篡改等前沿理论深深着迷&#xff0c;并选择将区块链作为主要研究方向&…

网络原理(JavaEE初阶系列11)

目录 前言&#xff1a; 1.网络原理的理解 2.应用层 2.1自定义协议的约定 2.1.1确定要传输的信息 2.1.2确定数据的格式 3.传输层 3.1UDP 3.1.1UDP报文格式 3.2TCP 3.2.1确认应答 3.2.2超时重传 3.2.3连接管理 3.2.3.1三次握手 3.2.3.2四次挥手 3.2.4滑动窗口 3.…

Invalid bound statement (not found)

在使用Mybatisplus时报错Invalid bound statement (not found)&#xff0c;在此记录一下 先附上解决办法 step 1、启动类加上MapperScan注解 package com.study.test;import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; …