`
wx1568444409
  • 浏览: 14587 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

利用winpacp抓取网络数据库包并保存文件

 
阅读更多

`#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;

}`

转载于:https://my.oschina.net/Thekillersohot/blog/744409

分享到:
评论

相关推荐

    如何解决 WinPacp 的数据库问题(解决方案).md

    如何解决 WinPacp 的数据库问题(解决方案).md

    winpacp.rar

    本篇文章将详细介绍如何利用WinPACP来抓取网络数据包,获取MAC地址,并通过pcap_compile()函数进行过滤操作,以及如何查询网卡的速率。 首先,让我们理解网络数据包捕获的基本概念。在计算机网络中,数据包是信息...

    如何解决 WinPacp 的网络问题(解决方案).md

    如何解决 WinPacp 的网络问题(解决方案).md

    使用WinPcap抓取ipv4和ipv6数据包

    在“使用WinPcap抓取ipv4和ipv6数据包”这个主题中,我们将深入探讨如何利用WinPcap库来同时处理IPv4和IPv6的数据包。 首先,IPv4和IPv6是互联网协议的主要版本。IPv4是广泛使用的地址协议,它提供了32位的地址空间...

    socket_port_scan.rar_winpacp

    总的来说,"socket_port_scan.rar_winpacp"项目提供了一个使用winpacp库进行端口扫描的示例,展示了如何利用C++进行网络编程,理解并实现网络通信中的关键概念。对于学习网络编程和安全的开发者来说,这是一个很好的...

    TMAC.rar_tmac_winpacp

    标题中的"TMAC.rar_tmac_winpacp"表明这是一个与网络嗅探和ARP欺骗相关的程序,其中"TMAC"可能是“Terminal MAC Changer”的缩写,用于改变或模拟MAC(Media Access Control)地址。"Winpcap"是Windows平台上的一个...

    WpdPack 4.12 winpacp的开发库

    2. **创建项目**:在IDE中创建一个新的工程,并引入winpacp库相关头文件。 3. **设备枚举**:调用枚举函数获取设备列表,用户可以选择要操作的设备。 4. **设备连接**:选择设备后,使用`WpdOpenDevice`打开连接。 5...

    易语言调用wincap实现网卡抓包

    首先,我们需要熟悉WinPcap提供的API函数,如`pcap_open_live()`用于打开一个网络接口,`pcap_loop()`或`pcap_next()`用于接收数据包,以及`pcap_dump_open()`和`pcap_dump()`用于将捕获的数据包保存到文件等。...

    VC基于winpacp的嗅探器

    总的来说,"VC基于winpcap的嗅探器"是一个利用VC++编程语言和winpcap库开发的实用工具,它可以帮助网络管理员、安全专家或开发人员深入了解网络流量,进行故障排查、安全审计和性能优化。通过深入学习和实践,我们...

    WinPacpDemo.zip

    WinPacp是一个用于Windows平台的网络包捕获库,它允许开发者直接与网络接口卡交互,接收并解析网络流量,为网络监控、性能测试、故障排查等提供强大支持。 在描述中提到,这个示例程序可以直接运行,这意味着它包含...

    ensp+wireshark+VirtualBox+winPacp

    标题中的"ensp+wireshark+VirtualBox+winPacp"暗示了这是一个关于网络技术的实践教程,其中涉及到了几个关键工具:eNSP(Enterprise Network Simulation Platform)、Wireshark、VirtualBox以及winPcap。让我们逐一...

    winpcap库文件

    WinPcap库文件是用于网络数据包捕获和分析的重要工具,主要应用于Windows操作系统上的C++编程环境。本文将深入探讨WinPcap的核心概念、功能、使用方法以及在VC++6.0和VS2008中的应用。 WinPcap是由意大利...

    winpcap sniffer

    - **打开网络接口**:使用`pcap_open_live()`函数选择要监听的网络接口,并设置捕获参数。 - **设置过滤器**:使用`pcap_compile()`和`pcap_setfilter()`可以设定数据包过滤规则,只捕获满足条件的包。 - **开始捕获...

    installshield中常用的prq文件

    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 ...

    winpcap4.0.2(最稳定版本)wpdack(winpcap开发包)

    WinPCAP 4.0.2 是一个非常重要的网络数据包捕获和分析库,尤其在网络安全、网络监控以及协议开发等领域中具有广泛的应用。它为Windows操作系统提供了一个底层的接口,允许应用程序直接访问网络接口卡(NIC)的数据包...

    NM34_ia64.exe

    Microsoft Network Monitor(NM)是微软附带的一款免费网络协议数据分析工具(Microsoft Network Monitor),其不仅仅可以抓包,而且基于抓包记录做一些简单的分析功能。NM其应该是基于libpacp和winpacp进行开发的,...

    WinPcap3.0版(驱动程序+开发包+帮助文档)

    WinPcap是一个强大的网络数据包捕获和网络分析工具,主要在Windows操作系统上使用。...通过驱动程序、开发包和帮助文档的结合,开发者可以更高效地利用WinPcap实现各种网络应用,同时提升他们的网络编程技能。

    winpcap安装包

    - 应用开发:开发者可以利用WinPcap构建自己的网络诊断工具、入侵检测系统或者网络测试工具。 总之,WinPcap是Windows平台上进行网络数据包操作的强大工具,无论对于网络管理员还是软件开发者,都是不可或缺的。...

    ARP包的封装 发送 捕获与解析软件开发 -----毕业论文

    - **Sniffer封装功能介绍**:Sniffer可以通过抓取网络中的数据包,并将其以可读的形式展示出来,方便用户了解网络通信的具体情况。 - **Sniffer捕获功能介绍**:Sniffer支持实时捕获网络数据包,并提供详细的过滤...

    如何安装 WinPacp(解决方案).md

    如何安装 WinPacp(解决方案).md

Global site tag (gtag.js) - Google Analytics