winpcap 发包工具

本工具主要用来进行网络协议的调试,主要方法是,对现场数据抓包,然后将数据包带回交给开发人员,开发人员将该数据包重新发送和处理,模拟现场环境以便于调试和分析。

(一)使用方法
命令行下输入sendpack.exe test.pcap
参数:
sendpack.exe:源码编译出来的可执行程序
test.pcap:需要发送的数据包抓包文件
接下来,程序会列出本机上所有的网卡,并要求输入一个网卡序号,并在此网卡上发送数据包:
在这里插入图片描述
输入完毕后,可以在wireshark等抓包工具中看到该网卡发送的数据包:
在这里插入图片描述

注意:本程序运行前必须要安装winpcap开发包

(二)简要介绍
本程序使用了winpcap开发包来完成pcap文件读取和指定网卡的发送,主要有如下几个步骤:

  1. 使用pcap_open_live打开发送数据包的网卡。
  2. 使用pcap_open_offline打开离线抓包文件。
  3. 调用pcap_loop发送数据包,其中的参数是pcap_open_live函数返回的pcap句柄,用于在回调函数中使用此句柄发送回调中接收的数据包。
  4. 回调函数packet_handler中发送数据包。

源码较为简单,只有四个文件,详细的实现可以参看工程代码,结合百度,对初学者来说也很容易掌握。
工程地址:点击下载源码。
此下载地址中有多个工程,其中的sendpack即此文中的发包项目,主要代码如下:

#include <windows.h>
#include <winsock2.H>
#include <Iptypes.h >
#include <iphlpapi.h>
#include <string>
#include <iostream>
#include <vector>
#include <stdlib.h>
#include <string.h>
#include <dbghelp.h>
#include <conio.h>
#include "include\\pcap.h"
#include "include\\pcap\\pcap.h"
#include "NetCardInfo.h"

#include "sendpack.h"



#pragma comment(lib,"dbghelp.lib")
#pragma comment(lib,"./lib\\wpcap.lib")
#pragma comment(lib,"ws2_32.lib")

using namespace std;

int g_packnum = 0;


//第一个参数argument是从函数pcap_loop()传递过来的。注意:这里的参数就是指 pcap_loop中的最后一个参数
//第二个参数pcap_pkthdr 表示捕获到的数据包基本信息, 包括时间, 长度等信息.
//第三个参数pcap_content表示捕获到的数据包的内容
//另外 : 回调函数必须是全局函数或静态函数
static void packet_handler(u_char* param, const struct pcap_pkthdr* header, const u_char* pkt_data)
{
	if ((header->caplen != header->len) || (header->caplen >= WINPCAP_MAX_PACKET_SIZE) || (header->caplen <= 0))
	{
		printf("packet_handler packet len:%u or caplen:%d error\r\n", header->len, header->caplen);
		return;
	}

	int ret = pcap_sendpacket((pcap_t*)param, pkt_data, header->caplen);
	if (ret)
	{
		printf("packet_handler send packet number:%u length:%d error\r\n", g_packnum, header->len);
	}
	g_packnum++;
}



int main(int argc, char** argv) {

	if (argc < 2)
	{
		printf("caution!\r\nusage: sendpack.exe test.pcap\r\n");
		return TRUE;
	}

	string filename = argv[1];
	HANDLE hf = CreateFileA(filename.c_str(), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_DELETE | FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);
	if (hf == INVALID_HANDLE_VALUE)
	{
		printf("pcap file:%s not found!\r\n", filename.c_str());
		return FALSE;
	}
	else {
		CloseHandle(hf);
	}

	int ret = 0;
	WSADATA wsa = { 0 };
	ret = WSAStartup(0x0202, &wsa);

	unsigned long ip = 0;
	unsigned char mac[MAC_ADDRESS_SIZE] = { 0 };
	unsigned long gatewayip = 0;
	unsigned long netmask = 0;
	string devname = NetCardInfo::selectNetcard(&ip, &netmask, &gatewayip, mac);

	string pcapdevname = string(WINPCAP_NETCARD_NAME_PREFIX) + devname;

	char ebuf[PCAP_ERRBUF_SIZE] = { 0 };
	// dev name must be such as "\\Device\\NPF_{DA2E76C1-BC02-49F0-BB36-D71FD590E80E}"

	/*
device是指定要打开的网络设备的字符串; 在具有2.2或更高版本内核的Linux系统上,可以使用“any”或NULL的设备参数来捕获来自所有接口的数据包。

snaplen指定要捕获的最大字节数。如果该值小于捕获的数据包的大小,则该数据包的第一个snaplen字节将被捕获并作为数据包数据提供。
在大多数(如果不是全部)网络中,值65535应该足以捕获数据包中可用的所有数据。

promisc指定是否将接口置于混杂模式。(注意,即使这个参数是假的,接口也可能在混杂模式下出于某些其他原因。)现在,这不适用于“任何”设备;
如果提供了“any”或NULL的参数,则将忽略promisc标志。

to_ms指定读取超时(以毫秒为单位)。读取超时用于安排在看到数据包时读取不一定立即返回,但是在一次操作中,
等待一段时间才能允许更多数据包到达并从操作系统内核读取多个数据包。
并非所有平台都支持读取超时; 在没有的平台上,读取超时被忽略。对于支持读取超时的平台,
to_ms的零值将导致读取永远等待,以允许足够的数据包到达,没有超时。

errbuf用于返回错误或警告文本。当pcap_open_live()失败并返回NULL时,它将被设置为错误文本。
当pcap_open_live()成功时,errbuf也可能设置为警告文本; 为了检测这种情况,
调用者在调用pcap_open_live()之前应该在errbuf中存储一个零长度的字符串,并且如果errbuf不再是零长度字符串,则向用户显示警告。

*/
	pcap_t* pcaptsend = pcap_open_live(pcapdevname.c_str(), WINPCAP_MAX_PACKET_SIZE, PCAP_OPENFLAG_PROMISCUOUS, 1000, ebuf);
	if (pcaptsend == NULL)
	{
		printf("pcap_open_live:%s error:%s\r\n,or winpcap not installed!", pcapdevname.c_str(), ebuf);
		_getch();
		return 0;
	}

	if (ebuf[0])
	{
		printf("%s\r\n", ebuf);
	}

	ret = pcap_setbuff(pcaptsend, WINPCAP_MAX_BUFFER_SIZE);
	if (ret == -1)
	{
		printf("pcap_setbuff size:%d error:%s\n", WINPCAP_MAX_BUFFER_SIZE, ebuf);
		_getch();
		return FALSE;
	}

	if (ebuf[0])
	{
		printf("%s\r\n", ebuf);
	}

	pcap_t* pcaptf = pcap_open_offline(filename.c_str(), ebuf);
	if (pcaptf <= 0)
	{
		printf("pcap_open_offline:%s error:%s\r\n", filename.c_str(), ebuf);
		_getch();
		return 0;
	}

	if (ebuf[0])
	{
		printf("%s\r\n", ebuf);
	}

	//第一个参数是winpcap的句柄;
	//第二个是指定捕获的数据包个数, 如果为 -1则无限循环捕获, 除非出现错误则停止抓包;如果为0,表示处理所有数据包,读取到EOF时结束;
	//第三个参数是回调函数
	//第四个参数user是留给用户使用的;

	g_packnum = 0;

	ret = pcap_loop(pcaptf, 0, packet_handler, (unsigned char*)pcaptsend);

	if (ebuf[0])
	{
		printf("%s\r\n", ebuf);
	}

	pcap_close(pcaptsend);

	pcap_close(pcaptf);

	WSACleanup();

	printf("send pcap file ok\r\n");

	_getch();

	return 0;
}

项目运行截图如下:

在这里插入图片描述

在图中指定的网卡上,用wireshark抓包,可以看到该网卡发送的所有的数据包。

在此基础上,可以实现修改mac地址、ip地址、循环发送、发送特定协议的数据包、修改数据包等扩展功能开发。

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

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

相关文章

Visual Studio插件DevExpress CodeRush v22.1- 支持C# 10

DevExpress CodeRush是一个强大的Visual Studio .NET 插件&#xff0c;它利用整合技术&#xff0c;通过促进开发者和团队效率来提升开发者体验。为Visual Studio IDE增压、消除重复的代码并提高代码质量&#xff0c;可以快速思考、自动化测试、可视化调试和重构。 CodeRush v2…

有了 IP 地址,为什么还要用 MAC 地址?

MAC地址等价于快递包裹上的收件人姓名。 MAC地址更多是用于确认对方信息而存在的。就如同快递跨越几个城市来到你面前&#xff0c;快递员需要和你确认一下收件人是否正确&#xff0c;才会把包裹交给你一样。 IP66在线查IP地址位置&#xff1a;https://www.ip66.net/?utm-sour…

软件设计师 数据库刷题项并包含知识点总结

**两级映像 有概念模式和内模式跟物理独立性相关&#xff0c;有外模式和概念模式跟逻辑独立性相关 ** 属性列就是RS共同拥有的ABC&#xff0c;一般去除后面的&#xff0c;所以就只有前面三个ABC&#xff0c;元组就是有没有自然连接成功的&#xff0c;就是R.AS.A R.BS.B… 选项里…

希望所有计算机专业同学都知道这些老师

C语言教程——翁凯老师、赫斌 翁恺老师是土生土长的浙大码农&#xff0c;从本科到博士都毕业于浙大计算机系&#xff0c;后来留校教书&#xff0c;一教就是20多年。 翁恺老师的c语言课程非常好&#xff0c;讲解特别有趣&#xff0c;很适合初学者学习。 郝斌老师的思路是以初学…

Linux-初学者系列6_kvm虚拟机

速通配置kvm虚拟机 通过虚拟化技术将一台计算机虚拟为多台逻辑计算机。 在一台计算机上同时运行多个逻辑计算机&#xff0c;每个逻辑计算机可以运行不同的操作系统&#xff0c;并且应用程序都可以在相互独立的空间内运行互不影响&#xff0c;提高计算机的工作效率。 一、 配置…

【STM32】STM32使用RFID读卡器

STM32使用RFID读卡器 RFID卡片 ID卡&#xff08;身份标识&#xff09;&#xff1a;作用就是比如你要输入学号&#xff0c;你刷卡直接就相当于输入学号&#xff0c;省去了输入的过程 IC卡&#xff1a;集成电路卡&#xff0c;是将一种微电子芯片嵌入卡片之中 RFID的操作 1、…

设计模式之代理模式

文章目录 1、代理模式基本介绍2、Jdk中的动态代理2.1、场景推导2.2、Jdk动态代理 3、静态代理4、代理模式的关键点5、代理模式和适配器模式的比较6、代理模式UML图 1、代理模式基本介绍 代理模式的定义: 为其他对象提供一种代理以控制对这个对象的访问。在某些情况下&#xf…

I2C通信协议原理和MPU6050

一、串口通讯 只能在两个设备之间进行 若要三台设备两两通信&#xff0c;则每个设备得需要两组窗口&#xff0c;为3组相互独立的窗口通讯 为解决这个问题&#xff1a;设计了总线通讯&#xff0c;有多种&#xff0c;I2C为其中一种 二、I2C通信 &#xff08;1&#…

VMware虚拟机三种网络模式详解之NAT(地址转换模式)

VMware虚拟机三种网络模式详解 NAT&#xff08;地址转换模式&#xff09; 二、NAT&#xff08;地址转换模式&#xff09; 刚刚我们说到&#xff0c;如果你的网络ip资源紧缺&#xff0c;但是你又希望你的虚拟机能够联网&#xff0c;这时候NAT模式是最好的选择。NAT模式借助虚拟…

进攻即是最好的防御!19个练习黑客技术的在线网站

前言 进攻即是最好的防御&#xff0c;这句话同样适用于信息安全的世界。这里罗列了19个合法的来练习黑客技术的网站&#xff0c;不管你是一名开发人员、安全工程师、代码审计师、渗透测试人员&#xff0c;通过不断的练习才能让你成为一个优秀安全研究人员。以下网站希望能给各…

Hadoop基础学习---5、MapReduce概述和WordCount实操(本地运行和集群运行)、Hadoop序列化

1、MapReduce概述 1.1 MapReduce定义 MapReduce是一个分布式运算程序的编程框架&#xff0c;是用户开发“基于Hadoop的数据分析应用”的核心框架。 MapReduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序&#xff0c;并发运行在一个Had…

【计算机系统基础bomb lab】CSAPP实验:Bomb Lab

【计算机系统基础bomb lab】CSAPP实验&#xff1a;Bomb Lab CSAPP 实验&#xff1a;Bomb Lab实验内容简述实验环境实验过程&#xff1a;phase 1phase 1 调试过程 实验过程&#xff1a;phase 2phase 2 调试过程 实验过程&#xff1a;phase 3phase 3 调试过程 实验过程&#xff1…

Java字符串知多少:String、StringBuffer、StringBuilder

一、String 1、简介 String 是 Java 中使用得最频繁的一个类了&#xff0c;不管是作为开发者的业务使用&#xff0c;还是一些系统级别的字符使用&#xff0c; String 都发挥着重要的作用。String 是不可变的、final的&#xff0c;不能被继承&#xff0c;且 Java 在运行时也保…

C++的cout详解

2023年5月20日&#xff0c;周六早上&#xff1a; 我发现我找不到非常详细的cout类的成员函数&#xff0c;只好自己写了。 不定期更新。 cout的继承关系 cout类继承自ostream类&#xff0c;ostream类继承自ios类&#xff0c;ios类继承自ios_base类 cout类拥有的所有成员函数 …

pg事务:事务的处理

事务的处理 事务块 从事务形态划分可分为隐式事务和显示事务。隐式事务是一个独立的SQL语句&#xff0c;执行完成后默认提交。显示事务需要显示声明一个事务&#xff0c;多个sql语句组合到一起称为一个事务块。 事务块通过begin&#xff0c;begin transaction&#xff0c;st…

QT学习记录(三)绘图

按照下面两个教程学习 QT学习教程&#xff08;全面&#xff09;_Strive--顾的博客-CSDN博客_qt学习 天山老妖S的博客_QT开发(3)_51CTO博客 1、绘图 VC项目右键增加QT GUI Class&#xff0c;在QT Designer中编辑DlgDraw.ui 在DlgDraw中重载函数 void DlgDraw::paintEvent(Q…

C++之堆排

堆排的原理和结构&#xff1a; 堆排序是一种常见的排序算法&#xff0c;基于堆这种数据结构实现。堆是一种特殊的树形数据结构&#xff0c;它满足以下两个条件&#xff1a; 堆是一棵完全二叉树。 堆的任意节点的值&#xff0c;都必须大于等于&#xff08;或小于等于&#xff0…

基于ROS2的costmap中Obstacle Layer中对障碍物信息的增加与删除机制的方案调研。

文章目录 1.背景2.目标3. 障碍物信息添加方式发送数据的数据结构与接收数据的数据结构 4. 障碍物清理机制4.1 可调参数4.2 优化光追算法4.3 障碍物跟踪 1.背景 基于costmap地图&#xff0c;使用navigation导航时&#xff0c;会出现由于激光雷达/图像测距的局限性&#xff0c; …

由浅入深Netty粘包与半包解决方案

目录 1 粘包现象2 半包现象3 现象分析4 解决方案4.1 方法1&#xff1a;短链接4.2&#xff1a;方法2&#xff1a;固定长度4.3 方法3&#xff1a;固定分隔符4.4 方法4&#xff1a;预设长度 1 粘包现象 服务端代码 public class HelloWorldServer {static final Logger log Logg…

【libcurl 】win32 构建 Release版本 修改cmakelist 链接openssl1.1.*

以下库均已MD的构建以vs2019 V142构建MD构建 直接换用了一个openssl库,libcurl连接报错 $(ProjectDir)..\..\..\3rdparty\openssl\xdw_openssl1_1_1\lib\win32\libcrypto.lib