winpcap 发包工具

news2024/10/6 20:31:06

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

(一)使用方法
命令行下输入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抓包,可以看到该网卡发送的所有的数据包。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux0.12-10-chr_drv

[466页] 第10章 字符设备驱动程序 466–10-1-总体功能 466–10-1-1-终端驱动程序基本原理 467–10-1-2-Linux支持的终端设备类型 468–10-1-3-终端基本数据结构 472–10-1-4-规范模式和非规范模式 473–10-1-5-控制台终端和串行终端设备 476–10-1-6-终端驱动程序接口 476–…

【微信小程序】如何获取用户手机号授权登录

一. 前置条件 目前该接口针对非个人开发者&#xff0c;且完成了认证的小程序开放&#xff08;不包含海外主体&#xff09;&#xff0c;也就是说只针对企业认证小程序开放。若用户举报较多或被发现在不必要场景下使用&#xff0c;微信有权永久回收该小程序的该接口权限。在使用…

到底什么是CIDR(无类域间路由)?做网络的一定得懂这个术语!

CIDR&#xff08;无类域间路由&#xff09;是一种用于对互联网IP地址进行聚合和分配的技术。它通过改变IP地址的分配方式&#xff0c;有效地解决了IPv4地址空间不足的问题。 本文将详细介绍CIDR的原理、使用方法以及它对互联网的影响&#xff0c;还会针对CIDR出三道例题&#x…

使用SolVES 模型与多技术融合快速实现生态系统服务功能社会价值评估

生态系统服务是人类从自然界中获得的直接或间接惠益&#xff0c;可分为供给服务、文化服务、调节服务和支持服务4类&#xff0c;对提升人类福祉具有重大意义&#xff0c;且被视为连接社会与生态系统的桥梁。自从启动千年生态系统评估项目&#xff08;Millennium Ecosystem Asse…

金融学学习笔记第3章

第3章 管理财务健康状况和业绩 一、财务报表的功能 财务报表有三个重要的经济功能: (1)向公司的所有者和债权人提供关于公司目前状况及过去财务表现的信息。 (2)为所有者及债权人设定经营目标,对管理层施加限制提供了便捷的方式。 (3)为财务计划提供了方便的模式。 二、…

【马蹄集】第十二周作业

第十二周作业 目录 MT2056 二阶前缀和MT2057 门票MT2058 最大的平均值MT2068 高数考试MT2069 等差 MT2056 二阶前缀和 难度&#xff1a;黄金    时间限制&#xff1a;1秒    占用内存&#xff1a;128M 题目描述 在一个直角坐标系上&#xff0c;有 n n n 个坐标上有元素值&…

发表计算机SCI期刊,有哪些建议? - 易智编译EaseEditing

要发SCI论文&#xff0c;首先得写一篇论文&#xff0c;然后再向SCI期刊投稿&#xff1a; 计算机SCI论文是一种重要的学术论文&#xff0c;需要遵循一定的写作规范和要求。以下是一些写作建议&#xff1a; 选择合适的标题和摘要。 标题应该简明扼要&#xff0c;能够准确反映论…

UE Http Server 插件说明

1. Create Http Server 创建Http服务器。 Port : 监听端口&#xff0c;范围 1 - 65535&#xff0c;要保证系统唯一&#xff0c;不然会监听失败。 2. Bind 绑定网页路由回调。 Target &#xff1a;HttpServer 对象 Http Path: 绑定路径&#xff0c;如 ”/index“ Http Verbs…

基于IMX8 实时ethercat的手机机器人方案设计

结构&#xff1a; 1、下述结构为操控手柄&#xff0c;用于采集人手运动信号&#xff0c;传递至上位机&#xff0c;对其他设备进行遥操控 2、手柄内含4个电机旋转副的手柄机械臂&#xff0c;内置16位分辨率旋转编码器记录角位移&#xff1b; 3、上位机连接手柄电机、器械电机…

【Java递归】一篇文章带你了解,什么是递归 ,递归的特点,递归应用场景,递归练习题

博主&#xff1a;東方幻想郷 专栏分类&#xff1a;Java | 从入门到入坟 Java递归 ⭐ 递归的定义⭐ 递归的特点⭐ 递归应用场景⭐ 简单例子⭐ 递归练习题&#x1f30c; 练习题模板&#x1f3f4;‍☠️ 练习题答案&#xff1a; ⭐ 递归的定义 &#x1f31f;递归是一种在方法通过调…

使用echocollect e将西门子PLC数据转发至SQL Server数据库

一 背景 随着工业4.0和工业大数据的发展&#xff0c;越来越多的制造型企业开始应用大型数据库来收集和分析数据&#xff0c;以辅助生产运营的决策。在制造工厂中实时收集和分析设备数据能够优化生产流程、减少停机时间并提高效率。然而&#xff0c;这些必要的设备数据通常被“…

在线教育平台小程序,打造高效学习新模式

随着科技的不断发展和互联网的普及&#xff0c;线上教育已经成为了现代人们获取知识、提升自我、实现梦想的重要途径。伴随而来的是线上教育平台的极度竞争。如何才能在这个竞争激烈的市场中脱颖而出&#xff1f;构建一个高效的、符合学生需求的线上教育课堂小程序非常关键。 …

性能测试重要知识与TPS上不去原因分析,测试进阶之路卷起来...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 常见性能测试术语…

阿里P7晒出工资条,看完扎心了……

前几天&#xff0c;有位老铁私信我&#xff0c;说看到某95后学弟晒出阿里P7的工资单&#xff0c;他是真酸了…想狠补下技术&#xff0c;努力冲一把大厂。 为了帮到他&#xff0c;也为了大家能在最短的时间内做面试复习&#xff0c;我把软件测试面试系列都汇总在这一篇文章了。 …

基于OpenCV和PyQt5的跳绳计数器应用程序

基于OpenCV和PyQt5的跳绳计数器应用程序 介绍 本文将介绍一个基于OpenCV和PyQt5的跳绳计数器应用程序。该程序可以使用计算机摄像头来检测跳绳动作&#xff0c;并计算跳绳次数。本文将介绍程序的实现方法和实现细节&#xff0c;包括背景减除算法和轮廓检测算法的使用。 背景…

Linux(云计算)期末复习资料

1&#xff1a;linux概述 ​ Linux是一种自由、开放源代码的操作系统&#xff0c;它最初由芬兰的Linus Torvalds在1991年开发&#xff0c;目前已经成为世界上最流行的操作系统之一。Linux操作系统的特点是免费、稳定、安全、可定制、可移植性强、支持多任务、多用户等。 2&…

[VRTK4.0]安装VRTKv4Tilia软件包导入程序

学习目标&#xff1a; 演示如何从Unitv资源商店安装VRTKv4Tilia包导入器,以轻松访问VRTKv4Tilia包&#xff0c;这些包为构建XR体验提供了各种有用的功能. 简述&#xff1a; 推荐使用2022.2.11F1以上版本来进行VRTK使用&#xff0c;我们可以从Unity资产商店导入Tilia包管理器&am…

Windows和Kali上使用proxychains代理流量

Windows和Kali上使用proxychains代理流量 PS. 本文演示都是在kali进行的&#xff0c;如有出入还请联系我哦1. Linux(Debian)1.1. 检查一下是否有proxychains1.2 修改config文件 2. Linux(Debian)安装proxychians43. Windows3.1 下载3.2 配置 4. Windows下的配置5. 测试 PS. 写这…

你知道黑客是什么样?

1 前言 现代人的生活离不开互联网&#xff0c;提到互联网人们总会想到一个词&#xff0c;那就是黑客。对于黑客大家对他们的了解却只局限于电影、电视中他们“无处不在”的可怕和他们“翻手为云覆手为雨”的技术中。但真正的黑客到底是什么&#xff1f; 2 什么是黑客 笔挺的…

【STL模版库】模拟实现list类模版 {深度剖析list迭代器,实现list深拷贝}

一、核心结构 template <class T> struct list_node{ //[1]T _data; //[2]list_node *_next; //指向下一个节点list_node *_prev; //指向前一个节点list_node(const T &val T()):_data(val),_next(nullptr),_prev(nullptr){} };template <class T> class Myl…