驱动层改包神器windivert

本文介绍了如何在Windows环境下使用Windivert开发包进行驱动层的数据包捕获和修改。Windivert提供了应用层接口,允许开发者修改IP层及以上的TCP/UDP层内容,但无法修改MAC层。与wireshark的winpcap相比,Windivert会替换原始数据包,而winpcap则不影响原始包的发送。示例代码展示了如何将DNS请求的目标IP改为8.8.8.8。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文简要介绍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地址。
注意:

  1. 工程项目同目录下要有windivert64.sys和windivert.dll。而且位数要匹配,比如,64位程序需要64位驱动windivert64.sys和64位windivert.dll。
  2. #include "windivert.h"要放在#include "windivert_device.h"之前。


#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
#endif




int 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同时开启抓包,截图如下:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值