驱动层改包神器windivert

2023-11-03 05:40
文章标签 驱动 神器 改包 windivert

本文主要是介绍驱动层改包神器windivert,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文简要介绍windows下驱动层kit开发包windivert的改包操作。

windivert官网:windivert官网资料
下载源码后,双击 *.vcxproj工程文件或者拖入vs,即可打开相应的工程,点击build即可完成项目编译。

windivert核心代码运行于驱动层,但是也提供了应用层的接口,通过这些应用层接口,开发者可以实现对windows平台上数据包的任意修改。不过需要注意的是:windivert只能修改ip层以及以后的tcp层(udp层)和数据部分的内容,而不能修改mac层以及相对应的链路层。wireshark中winpcap开发包可以修改数据包中的任意内容(包括mac层),但是windivert是用修改后的数据包替换掉原来的包,修改后原来的数据包不见了,而wireshark是修改后原来的数据包的发送不受影响,当然修改后的数据包也可以发送出去。从这点上看,两个开发包各有优劣

代码如下。
例子代码主要是将dns的目的ip地址改为了8.8.8.8,可以抓包看到修改后的数据包。数据包发送前被修改,但是并不需要修改接收的包的ip地址。
注意,工程项目同目录下要有windivert64.sys和windivert.dll。而且位数要匹配,比如,64位程序需要64位驱动windivert64.sys和64位windivert.dll。

#include <windows.h>
#include <stdio.h>#include "./windivert_device.h"
#include "./windivert.h"#pragma comment(lib,"./windivert.lib")#pragma comment(lib,"windivert.lib")#ifdef WINDIVERT_KERNEL
#undef WINDIVERT_KERNEL
#endifint mainwork() {int result = 0;char* packet = malloc(0x10000);int packetLen = 0x10000;WINDIVERT_ADDRESS addr;UINT32 recvSize = 0;PWINDIVERT_IPHDR iphdr;WINDIVERT_TCPHDR tcphdr;WINDIVERT_UDPHDR udphdr;// 打开过滤对象HANDLE mHandle = WinDivertOpen("udp.DstPort == 53", //过滤规则WINDIVERT_LAYER_NETWORK, //过滤的层0, 0);if (mHandle == INVALID_HANDLE_VALUE) //开启过滤对象,可以通过错误码识别错误{result = GetLastError();return;  //error}while (1){result = WinDivertRecv(mHandle,  // windivert对象packet, packetLen,  //char* packet和buff长度&recvSize,   // int 实际读取的数据长度&addr);// 接收过滤到的网络包内容if (result == 0) //WINDIVERT_ADDRESS{result = GetLastError();break;// error}//  网络包头部解析result = WinDivertHelperParsePacket(packet, recvSize,&iphdr, NULL, NULL, NULL, NULL,&tcphdr, &udphdr, NULL, NULL, NULL, NULL);if (result == 0){result = GetLastError();break;// error}*(DWORD*)(packet + 16) = 0X08080808;// 计算校验和result = WinDivertHelperCalcChecksums(packet, packetLen, &addr, 0);// 把修改后的包发送出去result = WinDivertSend(mHandle, packet, packetLen, &recvSize, &addr);if (result == 0){result = GetLastError();break;// send error}}}int main(int argc, char** argv) {mainwork();return 0;
}

wireshark同时开启抓包,截图如下:
在这里插入图片描述

这篇关于驱动层改包神器windivert的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/335961

相关文章

基于Python+PyQt5打造一个跨平台Emoji表情管理神器

《基于Python+PyQt5打造一个跨平台Emoji表情管理神器》在当今数字化社交时代,Emoji已成为全球通用的视觉语言,本文主要为大家详细介绍了如何使用Python和PyQt5开发一个功能全面的... 目录概述功能特性1. 全量Emoji集合2. 智能搜索系统3. 高效交互设计4. 现代化UI展示效果

Python+PyQt5实现MySQL数据库备份神器

《Python+PyQt5实现MySQL数据库备份神器》在数据库管理工作中,定期备份是确保数据安全的重要措施,本文将介绍如何使用Python+PyQt5开发一个高颜值,多功能的MySQL数据库备份工具... 目录概述功能特性核心功能矩阵特色功能界面展示主界面设计动态效果演示使用教程环境准备操作流程代码深度解

如何在Ubuntu上安装NVIDIA显卡驱动? Ubuntu安装英伟达显卡驱动教程

《如何在Ubuntu上安装NVIDIA显卡驱动?Ubuntu安装英伟达显卡驱动教程》Windows系统不同,Linux系统通常不会自动安装专有显卡驱动,今天我们就来看看Ubuntu系统安装英伟达显卡... 对于使用NVIDIA显卡的Ubuntu用户来说,正确安装显卡驱动是获得最佳图形性能的关键。与Windo

Python+PyQt5开发一个Windows电脑启动项管理神器

《Python+PyQt5开发一个Windows电脑启动项管理神器》:本文主要介绍如何使用PyQt5开发一款颜值与功能并存的Windows启动项管理工具,不仅能查看/删除现有启动项,还能智能添加新... 目录开篇:为什么我们需要启动项管理工具功能全景图核心技术解析1. Windows注册表操作2. 启动文件

嵌入式Linux之使用设备树驱动GPIO的实现方式

《嵌入式Linux之使用设备树驱动GPIO的实现方式》:本文主要介绍嵌入式Linux之使用设备树驱动GPIO的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、设备树配置1.1 添加 pinctrl 节点1.2 添加 LED 设备节点二、编写驱动程序2.1

嵌入式Linux驱动中的异步通知机制详解

《嵌入式Linux驱动中的异步通知机制详解》:本文主要介绍嵌入式Linux驱动中的异步通知机制,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、异步通知的核心概念1. 什么是异步通知2. 异步通知的关键组件二、异步通知的实现原理三、代码示例分析1. 设备结构

基于Python打造一个智能单词管理神器

《基于Python打造一个智能单词管理神器》这篇文章主要为大家详细介绍了如何使用Python打造一个智能单词管理神器,从查询到导出的一站式解决,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 项目概述:为什么需要这个工具2. 环境搭建与快速入门2.1 环境要求2.2 首次运行配置3. 核心功能使用指

usb接口驱动异常问题常用解决方案

《usb接口驱动异常问题常用解决方案》当遇到USB接口驱动异常时,可以通过多种方法来解决,其中主要就包括重装USB控制器、禁用USB选择性暂停设置、更新或安装新的主板驱动等... usb接口驱动异常怎么办,USB接口驱动异常是常见问题,通常由驱动损坏、系统更新冲突、硬件故障或电源管理设置导致。以下是常用解决

Ubuntu系统怎么安装Warp? 新一代AI 终端神器安装使用方法

《Ubuntu系统怎么安装Warp?新一代AI终端神器安装使用方法》Warp是一款使用Rust开发的现代化AI终端工具,该怎么再Ubuntu系统中安装使用呢?下面我们就来看看详细教程... Warp Terminal 是一款使用 Rust 开发的现代化「AI 终端」工具。最初它只支持 MACOS,但在 20

IDEA中的Kafka管理神器详解

《IDEA中的Kafka管理神器详解》这款基于IDEA插件实现的Kafka管理工具,能够在本地IDE环境中直接运行,简化了设置流程,为开发者提供了更加紧密集成、高效且直观的Kafka操作体验... 目录免安装:IDEA中的Kafka管理神器!简介安装必要的插件创建 Kafka 连接第一步:创建连接第二步:选