`#include "stdafx.h"
#include <stdio.h>
#include <tchar.h>
#include <WinSock2.h>
#include <Windows.h>
#include "pcap.h"
#include <stdlib.h>
#include <iostream>
#include <string>
#include "remote-ext.h"
#include <atlstr.h>
#include <cstdio>
using namespace std;
#pragma comment(lib, "Packet.lib")
#pragma comment(lib, "wpcap.lib")
#pragma comment(lib, "ws2_32")
#define FILENAME "PcapFile.pcap" //抓包文件名
void WriteTraceFile( u_char *data, u_long length);
BOOL IsProcessExist();
struct ether_header
{
u_int8_t ether_dhost[6]; /* destination eth addr /
u_int8_t ether_shost[6]; / source ether addr /
u_int16_t ether_type; / packet type ID field */
};
typedef struct ip_address
{
u_char byte1;
u_char byte2;
u_char byte3;
u_char byte4;
} ip_address;
/* IPv4 首部 */
typedef struct header_tcp
{
u_short src_port;
u_short dst_port;
u_int seq;
u_int ack_seq;
u_short doff:4,hlen:4,fin:1,syn:1,rst:1,psh:1,ack:1,urg:1,ece:1,cwr:1;
u_short window;
u_short check;
u_short urg_ptr;
}tcp_header;
typedef struct ip_header
{
u_char ver_ihl; // 版本 (4 bits) + 首部长度 (4 bits)
u_char tos; // 服务类型(Type of service)
u_short tlen; // 总长(Total length)
u_short identification; // 标识(Identification)
u_short flags_fo; // 标志位(Flags) (3 bits) + 段偏移量(Fragment offset) (13 bits)
u_char ttl; // 存活时间(Time to live)
u_char proto; // 协议(Protocol)
u_short crc; // 首部校验和(Header checksum)
ip_address saddr; // 源地址(Source address)
ip_address daddr; // 目的地址(Destination address)
u_int op_pad; // 选项与填充(Option + Padding)
} ip_header;
int main()
{
if (IsProcessExist())
{
return 0;
}
cout<<"请输入过滤规则:";
char Cin_vlaue[1024]="";
memset(Cin_vlaue,0,1024);
gets(Cin_vlaue);
char packet_filter[1024];
sprintf(packet_filter ,"%s" ,Cin_vlaue);
u_int netmask;
pcap_if_t *alldevs;
pcap_if_t *d;
pcap_if_t *d2;
int inum;
int i=0;
pcap_t *adhandle;
char errbuf[PCAP_ERRBUF_SIZE];struct bpf_program fcode;
u_short srcPort, destPort;
/* 获取设备列表 */
if (pcap_findalldevs(&alldevs, errbuf) == -1)
{
fprintf(stderr,"错误!: %s\n", errbuf);
exit(1);
}
cout<<"请选择网卡:"<<endl;
/* 数据列表 */
for(d=alldevs; d; d=d->next)
{
printf("%d. %s", ++i, d->name);
if (d->description)
printf(" (%s)\n", d->description);
else
printf("(无可用网卡描述!)\n");
}
if(i==0)
{
printf("\n没有找到接口!.\n");
Sleep(2000);
return 1;
}
printf("请输入网卡编号:(1-%d):",i);
scanf("%d", &inum);
if(inum < 1 || inum > i)
{
printf("\n 输入有误.\n");
pcap_freealldevs(alldevs);
return 0;
}
/* 转到选择的设备 */
for(d=alldevs, i=0; i< inum-1;d=d->next, i++)
;
/* 打开设备 */
if ( (adhandle= pcap_open_live(d->name, //设备名
65536, // 捕捉完整的数据包
1 , // 模式
1, // 超时
errbuf // 错误缓冲
) ) == NULL)
{
printf("Unable to open the adapter");
pcap_freealldevs(alldevs);
}
pcap_addr *dev_addr = d->addresses;
if(d->addresses != NULL)
/* 获得接口第一个地址的掩码 */
netmask=((struct sockaddr_in *)(d->addresses->netmask))->sin_addr.S_un.S_addr;
else
/* 如果接口没有地址,就假设一个C类掩码 */
netmask=0xffffff;
printf("\nlistening on %s...\n", d->description);
//编译过滤器
if (pcap_compile(adhandle, &fcode, packet_filter, 1, netmask) <0 )
{
fprintf(stderr,"Unable to compile the packet filter. Check the syntax.\n");
/* 释放设备列表 */
pcap_freealldevs(alldevs);
int x;
scanf("%d",&x);
return -1;
}
//设置过滤器
if (pcap_setfilter(adhandle, &fcode)<0)
{
fprintf(stderr,"nError setting the filter.\n");
/* 释放设备列表 */
pcap_freealldevs(alldevs);
return -1;
}
printf("listening on %s...\n", d->description);
/* 释放设备列表 */
pcap_freealldevs(alldevs);
/* 开始捕获 */
int ret;
struct pcap_pkthdr *header;
const u_char *pkt_data;
while ((ret = pcap_next_ex(adhandle, &header, &pkt_data)) >= 0)
{
ether_header *eh = (ether_header *)pkt_data;
if(ret == 0)
{
//超时
continue;
}
if (header->len > 0)
{
ip_header *ip =(ip_header *) (pkt_data +sizeof(ether_header));
WriteTraceFile((u_char*)pkt_data,sizeof(ether_header)+ntohs(ip->tlen));//写数据
}
}
return 0;
}
void WriteTraceFile( u_char *data, u_long length)
{
FILE *pFile;
long fileleng;
DWORD ticks = ::GetTickCount();
if (!(pFile=fopen(FILENAME,"r")))
{
pFile = fopen(FILENAME, "wb");
pcap_file_header pfHeader;
pfHeader.magic = 0xA1B2C3D4;
pfHeader.version_major = PCAP_VERSION_MAJOR;
pfHeader.version_minor = PCAP_VERSION_MINOR;
pfHeader.thiszone = 0;
pfHeader.sigfigs = 0;
pfHeader.snaplen = 0x0000FFFF;
pfHeader.linktype = 1;
if (pFile!=NULL)
{
fwrite((void *)&pfHeader, sizeof(pcap_file_header), 1, pFile);
}
}
else
{
fileleng=_filelength(_fileno(pFile));
fclose(pFile);
if (fileleng==0)
{
pFile = fopen(FILENAME, "wb");
pcap_file_header pfHeader;
pfHeader.magic = 0xA1B2C3D4;
pfHeader.version_major = PCAP_VERSION_MAJOR;
pfHeader.version_minor = PCAP_VERSION_MINOR;
pfHeader.thiszone = 0;
pfHeader.sigfigs = 0;
pfHeader.snaplen = 0x0000FFFF;
pfHeader.linktype = 1;
fwrite((void *)&pfHeader, sizeof(pcap_file_header), 1, pFile);
}
else
{
pFile = fopen(FILENAME, "ab");
}
}
if (pFile == NULL)
return;
pcap_pkthdr pktHeader;
pktHeader.ts.tv_sec = ticks/1000;
pktHeader.ts.tv_usec = (ticks%1000)*1000;
pktHeader.caplen = length;
pktHeader.len = length;
fwrite((void *)&pktHeader, sizeof(pcap_pkthdr), 1, pFile);
fwrite((void *)data, sizeof(u_char), length, pFile);
if (pFile!=NULL)
{
fclose(pFile);
}
pFile=NULL;
}
BOOL IsProcessExist()
{
HANDLE m_mutex = ::CreateMutex(NULL, TRUE, "PacpMutex");
if (GetLastError() == ERROR_ALREADY_EXISTS)
{
return TRUE;
}
return FALSE;
}`
相关推荐
如何解决 WinPacp 的数据库问题(解决方案).md
本篇文章将详细介绍如何利用WinPACP来抓取网络数据包,获取MAC地址,并通过pcap_compile()函数进行过滤操作,以及如何查询网卡的速率。 首先,让我们理解网络数据包捕获的基本概念。在计算机网络中,数据包是信息...
如何解决 WinPacp 的网络问题(解决方案).md
在“使用WinPcap抓取ipv4和ipv6数据包”这个主题中,我们将深入探讨如何利用WinPcap库来同时处理IPv4和IPv6的数据包。 首先,IPv4和IPv6是互联网协议的主要版本。IPv4是广泛使用的地址协议,它提供了32位的地址空间...
总的来说,"socket_port_scan.rar_winpacp"项目提供了一个使用winpacp库进行端口扫描的示例,展示了如何利用C++进行网络编程,理解并实现网络通信中的关键概念。对于学习网络编程和安全的开发者来说,这是一个很好的...
标题中的"TMAC.rar_tmac_winpacp"表明这是一个与网络嗅探和ARP欺骗相关的程序,其中"TMAC"可能是“Terminal MAC Changer”的缩写,用于改变或模拟MAC(Media Access Control)地址。"Winpcap"是Windows平台上的一个...
2. **创建项目**:在IDE中创建一个新的工程,并引入winpacp库相关头文件。 3. **设备枚举**:调用枚举函数获取设备列表,用户可以选择要操作的设备。 4. **设备连接**:选择设备后,使用`WpdOpenDevice`打开连接。 5...
首先,我们需要熟悉WinPcap提供的API函数,如`pcap_open_live()`用于打开一个网络接口,`pcap_loop()`或`pcap_next()`用于接收数据包,以及`pcap_dump_open()`和`pcap_dump()`用于将捕获的数据包保存到文件等。...
总的来说,"VC基于winpcap的嗅探器"是一个利用VC++编程语言和winpcap库开发的实用工具,它可以帮助网络管理员、安全专家或开发人员深入了解网络流量,进行故障排查、安全审计和性能优化。通过深入学习和实践,我们...
WinPacp是一个用于Windows平台的网络包捕获库,它允许开发者直接与网络接口卡交互,接收并解析网络流量,为网络监控、性能测试、故障排查等提供强大支持。 在描述中提到,这个示例程序可以直接运行,这意味着它包含...
标题中的"ensp+wireshark+VirtualBox+winPacp"暗示了这是一个关于网络技术的实践教程,其中涉及到了几个关键工具:eNSP(Enterprise Network Simulation Platform)、Wireshark、VirtualBox以及winPcap。让我们逐一...
WinPcap库文件是用于网络数据包捕获和分析的重要工具,主要应用于Windows操作系统上的C++编程环境。本文将深入探讨WinPcap的核心概念、功能、使用方法以及在VC++6.0和VS2008中的应用。 WinPcap是由意大利...
- **打开网络接口**:使用`pcap_open_live()`函数选择要监听的网络接口,并设置捕获参数。 - **设置过滤器**:使用`pcap_compile()`和`pcap_setfilter()`可以设定数据包过滤规则,只捕获满足条件的包。 - **开始捕获...
InstallShield-常用prq文件 SetupPrerequisites Microsoft .NET Framework.prq Microsoft .NET Framework 4.5 Full.prq Microsoft .NET Framework 4.5.2 Full.prq Microsoft .NET Framework 4.7.2 Full.prq ...
WinPCAP 4.0.2 是一个非常重要的网络数据包捕获和分析库,尤其在网络安全、网络监控以及协议开发等领域中具有广泛的应用。它为Windows操作系统提供了一个底层的接口,允许应用程序直接访问网络接口卡(NIC)的数据包...
Microsoft Network Monitor(NM)是微软附带的一款免费网络协议数据分析工具(Microsoft Network Monitor),其不仅仅可以抓包,而且基于抓包记录做一些简单的分析功能。NM其应该是基于libpacp和winpacp进行开发的,...
WinPcap是一个强大的网络数据包捕获和网络分析工具,主要在Windows操作系统上使用。...通过驱动程序、开发包和帮助文档的结合,开发者可以更高效地利用WinPcap实现各种网络应用,同时提升他们的网络编程技能。
- 应用开发:开发者可以利用WinPcap构建自己的网络诊断工具、入侵检测系统或者网络测试工具。 总之,WinPcap是Windows平台上进行网络数据包操作的强大工具,无论对于网络管理员还是软件开发者,都是不可或缺的。...
- **Sniffer封装功能介绍**:Sniffer可以通过抓取网络中的数据包,并将其以可读的形式展示出来,方便用户了解网络通信的具体情况。 - **Sniffer捕获功能介绍**:Sniffer支持实时捕获网络数据包,并提供详细的过滤...
如何安装 WinPacp(解决方案).md