windows下c++抓包实例
1,第一步是安装WinPcap软件
http://pan.baidu.com/s/1slGiedv这是我放在网盘里的
2,第二步就是下载WpdPack开发包
http://pan.baidu.com/s/1jIFGw3W这是我放在网盘里的
里面有vs2013的安装方法,其实就是把两个文件include和lib文件夹下的内容拷贝到vs下面的相应文件下面
3,就是建立工程项目粘贴一下代码
自己再改改吧
// ConsoleApplication3.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <stdio.h>
#define HAVE_REMOTE
#include <pcap.h>
///
#ifndef WIN32
#include <sys/socket.h>
#include <netinet/in.h>
#else
#include <winsock.h>
#endif
#define _CRT_SECURE_NO_WARNINGS
#pragma comment (lib,"wpcap.lib")
#pragma comment(lib,"ws2_32.lib")
using namespace std;
void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data);
int main()
{
pcap_if_t *alldevs;
pcap_if_t *d;
int inum=0;
int i = 0;
pcap_t *adhandle;
char errbuf[PCAP_ERRBUF_SIZE];
/* 获取本机设备列表 */
if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf) == -1)
{
fprintf(stderr, "Error in pcap: %s\n", errbuf);
exit(1);
}
/* 打印設備列表 */
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没有找到接口!确保安装winpcap.\n");
return -1;
}
printf("输入接口号 (1-%d):", i);
cin >> inum;
if (inum < 1 || inum > i)
{
printf("\n接口号超出范围 .\n");
/* 释放设备列表 */
pcap_freealldevs(alldevs);
return -1;
}
/* 跳转到选中的适配器 */
for (d = alldevs, i = 0; i< inum - 1; d = d->next, i++);
/* 打开设备 */
if ((adhandle = pcap_open(d->name, // 设备名
65536, // 65535保证能捕获到不同数据链路层上的每个数据包的全部内容
PCAP_OPENFLAG_PROMISCUOUS, // 混杂模式
1000, // 读取超时时间
NULL, // 远程机器验证
errbuf // 错误缓冲池
)) == NULL)
{
fprintf(stderr, "\n无法打开适配器 . %s 不支持通过WinPcap \n", d->name);
/* 释放设备列表 */
pcap_freealldevs(alldevs);
return -1;
}
printf("\n监听中 %s...\n", d->description);
/* 释放设备列表 */
pcap_freealldevs(alldevs);
/* 开始捕获 */
pcap_loop(adhandle, 0, packet_handler, NULL);
getchar();
return 1;
}
void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data)
{
struct tm *ltime=NULL;
char timestr[16];
time_t local_tv_sec;
/* 将时间戳转换成可识别的格式 */
local_tv_sec = header->ts.tv_sec;
localtime_s(ltime, &local_tv_sec);//
strftime(timestr, sizeof timestr, "%H:%M:%S", ltime);
printf("%s,%.6d 长度:%d\n", timestr, header->ts.tv_usec, header->len);
}