arp欺骗原理以及实现方式

我们知道了arp的作用,那么此时我们怎么可以用他来进行攻击呢?在一个局域网中,我们怎么实现呢?

原理:

这样B就可以做到中间人了,可以接受到两个主机的数据了。换句话来说,在同一个局域网内,我们要黑掉一个主机,只需要构建大量的arp应答,把自己的mac地址发送给要黑掉的主机,这样他发送的所有数据都会经过你的主机,如果你不管,也不转发,那么,恭喜你,成功让他的主机无法上网了。但是其实现在就算是黑掉也没什么用,因为https中经过加密,还有认证,一改数据就会被发现。所以没有什么意义。但是你可以黑掉同一个局域网中的另一台主机,让他无法上网。

说来说去,原理我知道了,但是我们应该怎么实现呢?此时我们就要回忆一下套接字类型了,有三种。流式套接字,数据报套接字,原始套接字。流式套接字对应的是tcp,数据包套接字是udp,那么答案已经出来了吧,不错,我们可以用原始套接字来实现伪造arp数据包。那么怎么实现呢?代码如下:

#include <iostream>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ether.h>
#include <cstring>
#include <unistd.h>
#define BUF_SIZE 1024
#define DST_SIZE 7
#define SRC_SIZE 7
int main()
{
    int sockfd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ARP));
    if (sockfd < 0)
    {
        std::cout << "socket fail" << std::endl;
        exit(1);
    }
    unsigned char buffer[1024];
    memset(buffer, 0, 1024);
    while (true)
    {
        ssize_t s = recvfrom(sockfd, buffer, 1024, 0, nullptr, nullptr);
        if (s < 0)
        {
            std::cout << "recvfrom fail" << std::endl;
            exit(2);
        }
        // 以太网数据包头
        std::cout << "以太网数据包报头" << std::endl;
        unsigned short type = 0;
        unsigned char dst[DST_SIZE] = "";
        unsigned char src[SRC_SIZE] = "";
        type = ntohs(*(unsigned short *)(buffer + 12));
        for (size_t i = 0; i < 6; i++)
            dst[i] = buffer[i];
        for (size_t i = 6; i < 12; i++)
            src[i - 6] = buffer[i];
        printf("目的mac:%x%x%x%x%x%x", dst[0], dst[1], dst[2], dst[3], dst[4], dst[5]);
        printf("源mac:%x%x%x%x%x%x", src[0], src[1], src[2], src[3], src[4], src[5]);
        printf("类型:%x", type);
        std::cout << std::endl;
        // arp协议数据报头
        std::cout << "arp数据包报头" << std::endl;
        // 硬件类型
        unsigned short hardware;
        // 协议类型
        unsigned short pro;
        // 硬件地址长度
        unsigned char hardware_len;
        // 协议长度
        unsigned char pro_len;
        // op
        unsigned short op;
        // 发送方mac地址
        unsigned char src_mac[7] = "\0";
        // 发送方ip地址
        std::string src_ip;
        // 目的mac地址
        unsigned char dst_mac[7] = "\0";
        // 目的ip地址
        std::string dst_ip;
        ///
        hardware = ntohs(*(unsigned short *)(buffer + 14));

        pro = ntohs(*(unsigned short *)(buffer + 16));

        hardware_len = buffer[18];

        pro_len = buffer[19];

        op = ntohs(*(unsigned short *)(buffer + 20));

        for (size_t i = 22; i < 28; i++)
            src_mac[i - 22] = buffer[i];

        src_ip = inet_ntoa(*(in_addr *)(buffer + 28));

        for (size_t i = 32; i < 38; i++)
            dst_mac[i - 32] = buffer[i];

        dst_ip = inet_ntoa(*(in_addr *)(buffer + 38));
        /
        printf("硬件类型:%x ", hardware);
        printf("协议类型:%x ", pro);
        printf("硬件长度:%x ", hardware_len);
        printf("协议长度:%x ", pro_len);
        printf("op:%x ", op);
        printf("源mac:%x%x%x%x%x%x ", src_mac[0], src_mac[1], src_mac[2], src_mac[3], src_mac[4], src_mac[5]);
        std::cout << "源ip" << src_ip << " ";
        printf("目的mac:%x%x%x%x%x%x ", dst_mac[0], dst_mac[1], dst_mac[2], dst_mac[3], dst_mac[4], dst_mac[5]);
        std::cout << "目的ip" << dst_ip << " ";
        std::cout << std::endl;
    }
    // 完成之后关闭文件
    close(sockfd);
    return 0;
}

以上是我实现的一个类似于抓包工具(不是抓包工具,就是类似于)。他可以获取我们局域网中的所有数据包。并且可以解析。这个代码只有读取,没有发送,因为我用的是云服务器,这个云服务器所在局域网不是我所在的(害怕弄出麻烦来)。所以我就只进行了读取,但是如果你想测试的话,可以试试,用sendto就可以,但是在用sendto时,我们有几个地方与udp中使用的不一样,这个我就不在这里详细说了,想知道的小伙伴可以私信问或是上网查查。那么此时我们应该怎么用呢?测试如下:

我开了两个端口,一个是用来删除arp缓存中的默认网关的地址的,一个来运行。我们可以清楚的看见,这个我删除了之后,有一个arp的应答,所以我们可以得知,在这之前,肯定有一个请求。

所以这里也证明了网络中是有Arp请求和应答的,你可以等一会,你会看见另一个arp请求,这个就证明了他是有时间限制的。(时间可能有点长)

最后最后,小伙伴们千万不要胡乱试,这个如果出了差错的话,额......不过可以在虚拟机上进行试试。最后,如果大家看完本章内容有所收获的话,希望点一下赞吧!谢谢!!

如果有小伙伴对网络的数据包怎么发送与接收不清楚的,也不要太着急,下一次会发整个网络中的数据包是怎么发和怎么收的。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

STM32 PVD掉电检测功能的使用方法

STM32 PVD掉电检测功能的使用方法 前言 在实际应用场景中&#xff0c;可能会出现设备电源电压异常下降或掉电的情况&#xff0c;因此&#xff0c;有时候需要检测设备是否掉电&#xff0c;或者在设备掉电的瞬间做一些紧急关机处理&#xff0c;比如保存重要的用户数据&#xff…

gRPC 一种现代、开源、高性能的远程过程调用 (RPC) 可以在任何地方运行的框架

背景介绍 gRPC 是一种现代开源高性能远程过程调用 &#xff08;RPC&#xff09; 可以在任何环境中运行的框架。它可以有效地连接服务 在数据中心内和数据中心之间&#xff0c;具有对负载平衡、跟踪、 运行状况检查和身份验证。它也适用于最后一英里 分布式计算&#xff0c;用于…

qt-C++笔记之addAction和addMenu的区别以及QAction的使用场景

qt-C笔记之addAction和addMenu的区别以及QAction的使用场景 code review! 文章目录 qt-C笔记之addAction和addMenu的区别以及QAction的使用场景1.QMenu和QMenuBar的关系与区别2.addMenu和addAction的使用场景区别3.将QAction的信号连接到槽函数4.QAction的使用场景5.将例1修改…

新能源汽车生产污废水需要哪些工艺及设备

新能源汽车的快速发展带来了许多环境问题&#xff0c;其中之一就是生产过程中产生的污废水。由于新能源汽车的生产过程与传统汽车有所不同&#xff0c;因此需要采用特定的工艺和设备来处理和处理这些废水。 首先&#xff0c;新能源汽车生产过程中产生的污废水主要来自洗涤和冷却…

【稳定检索|投稿优惠】2024年机电控制系统与机械工程国际会议(ICMECSME 2024)

2024年机电控制系统与机械工程国际会议(ICMECSME 2024) 2024 International Conference on Mechanical and Electrical Control Systems and Mechanical Engineering(ICMECSME) 一、【会议简介】 2024年智慧交通与城市建设工程国际会议(ICSTUCE 2024)将在中国广州盛大开幕。这场…

C语言——字符函数和字符串函数(二)

&#x1f4dd;前言&#xff1a; 上一篇文章C语言——字符函数和字符串函数&#xff08;一&#xff09;对字符函数和字符串函数strlen&#xff0c;strcpy和strncpy&#xff0c;strcat和strncat进行了初步的讲解 这篇文章主要再讲解几个我们常用到的其他字符串函数&#xff08;附…

2023-12-14 二叉树的最大深度和二叉树的最小深度以及完全二叉树的节点个数

二叉树的最大深度和二叉树的最小深度以及完全二叉树的节点个数 104. 二叉树的最大深度 思想&#xff1a;可以使用迭代法或者递归&#xff01;使用递归更好&#xff0c;帮助理解递归思路&#xff01;明确递归三部曲–①确定参数以及返回参数 ②递归结束条件 ③单层逻辑是怎么样…

JavaWeb项目中已经导入依赖却报错依赖不存在

问题描述 在使用 Maven Servlet Tomcat 来搭建 JavaWeb 项目时&#xff0c;在 pom.xml 中正确引入了依赖&#xff0c;编码过程中也能够正常使用。但是在启动 Tomcat 之后&#xff08;启动时或启动后&#xff09;&#xff0c;却报错显示该依赖不存在。 可能原因 pom.xml 的…

项目篇 | 图书管理系统 | 图像加载与绘制

项目篇 | 图书管理系统 | 图像加载与绘制 基本介绍 首先解释清楚什么叫图像加载与绘制,意思就是说项目中需要用到一些图片资源(各种图标),我们要在图书管理系统中展示这些图片,就需要先导入图片到项目中,再加载图片资源(通过资源路径)、绘制图片(即展示)。 注:如果…

恢复Django 项目

随笔记录 目录 1. 重建Mysql DB 2. 启动Django 项目 2.1 确保你的系统上已安装pip工具。你可以使用以下命令来检查pip是否已安装 2.2 安装Packages 2.2.1 安装Django 2.2.2 安装pymysql 2.2.3 安装 kafka 2.2.4 安装 requests 2.2.5 安装simplepro 2.2.6 安装libjp…

亿赛通电子文档安全管理系统 SQL注入漏洞复现

0x01 产品简介 亿赛通电子文档安全管理系统&#xff08;简称&#xff1a;CDG&#xff09;是一款电子文档安全加密软件&#xff0c;该系统利用驱动层透明加密技术&#xff0c;通过对电子文档的加密保护&#xff0c;防止内部员工泄密和外部人员非法窃取企业核心重要数据资产&…

【深度学习】强化学习(五)深度强化学习

文章目录 一、强化学习问题1、交互的对象2、强化学习的基本要素3、策略&#xff08;Policy&#xff09;4、马尔可夫决策过程5、强化学习的目标函数6、值函数7、深度强化学习1. 背景与动机2. 关键要素3. 成功案例4. 挑战和未来展望5. 核心概念和方法总结 一、强化学习问题 强化学…

如何用 Cargo 管理 Rust 工程系列 甲

以下内容为本人的学习笔记&#xff0c;如需要转载&#xff0c;请声明原文链接 微信公众号「ENG八戒」https://mp.weixin.qq.com/s/ceMTUzRjDoiLwjn_KfZSrg 这几年 Rust 可谓是炙手可热的新兴编程语言了&#xff0c;而且被投票为最受程序员喜爱的语言。它很现代&#xff0c;专门…

GitHub Universe 2023 Watch Party in Shanghai:在开源世界中找到真我

文章目录 ⭐ 前言⭐ “我”的开源之旅⭐ 为什么要做开源⭐ 要如何做好开源⭐ 开源的深度影响⭐ 小结 ⭐ 前言 周末有幸参加了在上海举行的 GitHub Universe 2023 Watch Party&#xff0c;这是一个充满激情和活力的开源开发者日。我有幸聆听了一场特别令人印象深刻的演讲&#…

Linux,Windows或macOS系统的电脑怎样才能投屏到手机?

很多人都知道手机投屏到电脑的方法&#xff0c;但想要反过来的时候&#xff0c;却束手无策。 如果你想要将电脑投屏到手机&#xff0c;无论你的电脑是Windows&#xff0c;Linux还是macOS系统&#xff0c;无论你的手机是安卓、iOS还是鸿蒙&#xff0c;都可以用下面这个方法实现电…

深度探索Linux操作系统 —— Linux图形原理探讨

系列文章目录 深度探索Linux操作系统 —— 编译过程分析 深度探索Linux操作系统 —— 构建工具链 深度探索Linux操作系统 —— 构建内核 深度探索Linux操作系统 —— 构建initramfs 深度探索Linux操作系统 —— 从内核空间到用户空间 深度探索Linux操作系统 —— 构建根文件系统…

老杨说运维 | 年末大盘点!擎创CEO实时盘点运维大干货,不容错过

2023年即将走到尾声&#xff0c;对于擎创而言&#xff0c;这一年是颇具成长和成就的一年。我们庆幸获得了更多客户的信任&#xff0c;也为他们达到下一个运维阶段提供了充足的助力。 越多的实践就会带来越多新的理解和可优化的经验。这一年来&#xff0c;擎创在运维数据治理、智…

Java的struts2+MySQL+jsp实现登录、注册以及文件上传

Java的struts2MySQLjsp实现登录、注册以及文件上传 项目结构 项目所需jar包文件 jar包下载地址&#xff1a;https://download.csdn.net/download/qq_43001132/88629520 数据库设计SQL CREATE TABLE db_users ( id INT(10) NOT NULL AUTO_INCREMENT, username VARCHAR(50) …

50种css常用的代码(实用)

目录 1、文字超出部分显示省略号 2、中英文自动换行 3、文字阴影 4、设置placeholder的字体样式 5、不固定高宽 div 垂直居中的方法 6、设置滚动条样式 7、实现隐藏滚动条同时又可以滚动 8、创建渐变背景 9、悬停效果&#xff08;Hover&#xff09; 10、改变链接的样…

Unity | Shader基础知识(第五集:案例<小彩球>)

目录 一、本节介绍 1 上集回顾 2 本节介绍 二、原理分析 1 现实中出现彩色的原因 2 软件里的彩色的原理 3 方案 三、 实现数字由【-1,1】映射为【0,1】 1 结论 2 原理 四、代码实现 1 注意事项 2 详解结构体appdata_base 3 接收数据 4 映射数据 5 输出给SV_TAR…