wincap电容平台下的抓包怎么实现的?

本帖子已过去太久远了,不再提供回复功能。计算机网络(1)
winpcap 快速入门 抓包&&发包
本博客将叙述几个关键的winpcap api
研习完本博客,可以最终实现抓包/发包操作
环境描述:
系统: windows 8.1
编译器: visaul stiduo 2015
pcap 执行版本: 4.1.3
pcap 开发包版本: 4.1.2
环境配置:
二、API介绍
int pcap_findalldevs_ex
主要用于获得所有本地的网络接口
char *source: 关于lcoal/remote的设定,如果是查找本地的网路设备,填写PCAP_SRC_IF_STRING
struct pcap_rmtauth *auth: 权限设置,一般填NULL
pcap_if_t **alldevs: 保存扫描结果。struct pcapift保存了设备的信息/描述
char *errbuf: 如果函数出错,则错误信息保存在这里
0 : 成功执行
-1 : 执行失败
pcap_if_t * allD
pcap_if_t *
char errbuf[PCAP_ERRBUF_SIZE];
if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &allDevs, errbuf) & 0) {
printf("pcap_findallDevs_ex failed\n");
for (dev = allD dev-&next != NULL; dev = dev-&next) {
printf("----------------------------\n");
printf("name %s\n", dev-&name);
printf("description :%s\n", dev-&description);
pcap_t* pcap_open
主要用于对指定的网络设备进行抓包/发包
const char *source: 填充pcap_if_t -& name, 用于指定网络设备
int snaplen: 最大接受数据包的大小
int flags: 网络设备的监听模式,一般设置为混杂模式PCAP_OPENFLAG_PROMISCUOUS,即只要经过该网络设备的数据包都会被捕获
int read_timeout: 抓到包之后,并不是立即返回,而是再允许其他的包进入。此参数可能存在系统不支持
struct pcap_rmtauth * auth: 权限,一般传入NULL
char * errbuf: 如果函数出错,存储错误信息
pcap_t * : 执行成功
NULL : 执行失败,错误信息填充在errbuf
int pcap_next_ex()
抓包(抓一次,抓一个)
pcap_t * p: 指定抓包的网络设备,即pcap_open的返回值
struct pcap_pkthdr ** pkt_header: 抓到包的描述,由winpcap自动生成
const u_char ** pkt_data: 存储完整的包数据
1: 成功执行
0 : 超时,此时pkt_header,pkt_data所指向的包并不是有效的
-1 : 出现错误
-2 : 读取离线包时,出现了EOF结束符
int pcap_sendpacket()
pcap_t * p: 指定网络设备,使用此网络设备进行发包
u_char * buf: 数据包
int size: 数据包的大小
0 : 发送成功
-1 : 发送失败
三、综合示例
抓包演示:将抓到的包数据进行打印
#include &stdio.h&
#include &stdlib.h&
#include &pcap.h&
#define HAVE_REMOTE
int main() {
pcap_if_t * allD
pcap_if_t *
char errbuf[PCAP_ERRBUF_SIZE];
if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &allDevs, errbuf) & 0) {
printf("pcap_findallDevs_ex failed\n");
int i = 0;
//找到连接到internet的网络设备,根据自己电脑的环境自行更改i的终值
/*windows下,要使用descroption近似为
Network adapter 'Realtek PCIe GBE Family Controller' on local host
的网络设备 */
for (dev = allDevs, i = 0; i& 4; dev = dev-&next, i++);
if (NULL == (handler = pcap_open(dev-&name, 65535, PCAP_OPENFLAG_PROMISCUOUS, 3000, NULL, errbuf))) {
//设置接受的包大小为65535,即可以接受所有大小的包
printf("err in pcap_open : %s", errbuf);
pcap_pkthdr *pkt_
const u_char *pkt_
for (int j = 0; j & 5; j++) {
printf("%d --------\n", j);
if (1 == pcap_next_ex(handler, &pkt_header, &pkt_data)) {
for (int k = 0; k & 66; k++) {//输出每个包的前66个byte数据
if (k % 15 == 0 && k != 0)//输出美观
printf("\n");
printf("%02x ", *(pkt_data + k));
printf("\n");
getchar();
根据网络协议分层,数据包的格式为“|ethernet|ip|tcp/udp|http|”
具体的网络数据包,博主不打算讲,毕竟是winpcap快速入门,可能后续会推出网络数据包解析的博文
此处的数据包 packet 为博主从wireshare上复制的一个tcp syn的包,发送成功,则wireshark会接到数据大致相同的tcp synack包。如果要在自己的电脑上实现发包,需要自己使用wireshark抓取一个简单的包,复制其中的数据,填充至以下代码中的
packet变量中,然后进行发包测试
#include &stdio.h&
#include &stdlib.h&
#include &pcap.h&
#define HAVE_REMOTE
int main() {
pcap_if_t * allD
pcap_if_t *
char errbuf[PCAP_ERRBUF_SIZE];
if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &allDevs, errbuf) & 0) {
printf("pcap_findallDevs_ex failed\n");
for (dev = allD dev-&next != NULL; dev = dev-&next) {
printf("----------------------------\n");
printf("name %s\n", dev-&name);
printf("description :%s\n", dev-&description);
int i = 0;
//找到连接到internet的网络设备
for (dev = allDevs, i = 0; i& 4; dev = dev-&next, i++);
if (NULL == (handler = pcap_open(dev-&name, 65535, PCAP_OPENFLAG_PROMISCUOUS, 3000, NULL, errbuf))) {
printf("err in pcap_open : %s", errbuf);
unsigned char packet[] = { 0x14,0x14,0x4b,0x80,0x40,0x81,0x54,0xee,
0x75,0x5e,0x6f,0xa8,0x08,0x00,
0x45,0x00, 0x00,0x34,0x77,0x44,0x40,0x00,
0x80,0x06,0x76,0xaf,0x0a,0x0a,0x2d,0xe9, 0x6f,0x0d,0x65,0xd0,
0xc3,0x67,0x00,0x50,0xaf,0xae,0x8c,0x23,0x00,0x00,0x00,0x00,0x80,0x02,0x20,0x00,0x42,0xb6,0x00,0x00,0x02,0x04,0x05,0xb4,0x01,0x03,0x03,0x08,0x01,0x01,0x04,0x02 };
if (1 != pcap_sendpacket(handler, packet, sizeof(packet))) {
printf("pcap_sendpacket failed");
getchar();
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:221次
排名:千里之外
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'君,已阅读到文档的结尾了呢~~
一种改进的基于WinPcap的快速抓包方法,winpcap 抓包,winpcap抓包程序,winpcap抓包原理,winpcap发包抓包程序,winpcap 抓包教程,交换机抓包操作方法,抓包工具使用方法,抓包方法,快速抓包
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
一种改进的基于WinPcap的快速抓包方法
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer--144.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口求一个在C#下用winpcap抓包,并且对数据包分析的源代码_winpcap吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:86贴子:
求一个在C#下用winpcap抓包,并且对数据包分析的源代码收藏
快试试吧,可以对自己使用挽尊卡咯~◆◆
求一个在C#下用winpcap抓包,并且对数据包分析的源代码
2017 高品质新型消声器生产厂家,《江苏邦德》环保部门推荐厂家
抓包的应该好搞,还要对数据包分析,估计难啊!
怎么发包啊
这个网上应该挺多的
登录百度帐号推荐应用如何在VS2013使用winpcap开发网络应用程序
如何在VS2013使用winpcap开发网络应用程序。
1.首先,从下载winpcap.exe和Developer's
Pack.。安装winpcap.exe,并将Developer's Pack进行解压。
2.配置VS2013。在VS2013中新建一个空工程。具体设置如下:
(1)项目 →属性→配置属性→点击C/C++目录,点击展开的目录General,在右侧的Additional Include
Directories中添加Include目录(Include目录在WpdPack中)
(2)项目 →属性→配置属性→点击C/C++目录,在右边的Preprocessor
Definition加上WPCAP,HAVE_REMOTE,WIN32;
(3)项目 →属性→配置属性→点击Linker目录,点击展开的目录General,在右边的Additional Library
Directories中添加lib目录(Lib目录在WpdPack中)
(4)项目 →属性→配置属性→点击Linker目录下的Input,在右侧的Additional
Dependencies中添加wpcap.lib和Packet.lib,ws2_32.lib。
下面是一个例子
// TestWinpcap.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include "pcap.h"
typedef unsigned&&
u8_t;&&&&&&&
signed&&&&
s8_t;&&&&&&&
typedef unsigned&&
u16_t;&&&&&&
signed&&&&
s16_t;&&&&&&
typedef unsigned&&
u32_t;&&&&&&
signed&&&&
s32_t;&&&&&&
struct ether_header
ether_dhost[6];&&&
ether_shost[6];&&&
ether_&&&&&&
void ethernet_protocol_packet_callback(u_char *user_data,
&const struct pcap_pkthdr *packet_header,
&const u_char *packet_content)
ethernet_&&&&&&&&&&&&&&&&&&&&
&struct ether_header
*ethernet_&&&
*mac_&&&&&&&&&&&&&&&&&&&&&&&
&static int packet_number =
1;&&&&&&&&&&&&&
&printf("**************************************************\n");
&printf("捕获第%d个以太网数据包\n", packet_number);
&printf("捕获时间:\n");
&//printf("%s", ctime((const
time_t*)&packet_header-&ts.tv_sec));
&printf("数据包长度:\n");
&printf("%d\n", packet_header-&len);
&printf("-----------&&&
以太网协议&& ------------\n");
&ethernet_protocol = (struct
ether_header*)packet_&
&printf("以太网类型:\n");
&ethernet_type =
ntohs(ethernet_protocol-&ether_type);&&&&&&
&printf("x\n", ethernet_type);
&switch (ethernet_type)
&case 0x0800:
&&printf("上层协议为IP协议\n");
&case 0x0806:
&&printf("上层协议是ARP协议\n");
&case 0x8035:
&&printf("上层协议为RARP协议\n");
&printf("源以太网地址: \n");
&mac_string =
ethernet_protocol-&ether_
&printf("x:x:x:x:x:x\n", *mac_string, *(mac_string
&&*(mac_string + 2), *(mac_string
+ 3), *(mac_string + 4), *(mac_string + 5));
&printf("目的以太网地址: \n");
&mac_string =
ethernet_protocol-&ether_
&printf("x:x:x:x:x:x\n", *mac_string, *(mac_string
&&*(mac_string + 2), *(mac_string
+ 3), *(mac_string + 4), *(mac_string + 5));
&printf("**************************************************\n");
&packet_number++;
int main()
&char errbuf[PCAP_ERRBUF_SIZE];
&int i = 0;
&pcap_if_t *
&pcap_if_t *d;
&struct bpf_program
bpf_&&&&&&&
&char bpf_filter_string[] =
"tcp";&&&&
&bpf_u_int32
net_&&&&&&&&&&&&&&&&
&bpf_u_int32
net_&&&&&&&&&&&&&&&&&&
&if (pcap_findalldevs(&alldevs, errbuf) ==
&&fprintf(stderr, "Error in
pcap_findalldevs: %s\n", errbuf);
&&return -1;
&for (d = d = d-&next)
&&printf("%d. %s", ++i,
&&if (d-&description)
&&&printf("
(%s)\n", d-&description);
&&&printf(" (No
description available)\n");
&if (i == 0)
&&printf("\nNo interfaces found!
Make sure WinPcap is installed.\n");
&&return -2;
&printf("Enter the interface number (1-%d):",
&scanf_s("%d", &inum);
&if (inum & 1 || inum & i)
&&printf("\nInterface number out
of range.\n");
&&pcap_freealldevs(alldevs);
&&return -3;
&for (d = alldevs, i = 0; i & inum - 1; d =
d-&next, i++);
&pcap_lookupnet(d-&name, &net_ip,
&net_mask, errbuf);
&if ((fp =
pcap_open_live(d-&name,&&//
name of the device
&&65536,&&&//
portion of the packet to capture. It doesn't matter in this
&&1,&&&&//
promiscuous mode (nonzero means promiscuous)
&&1000,&&&//
read timeout
&&errbuf&&&//
error buffer
&&)) == NULL)
&&fprintf(stderr, "\nUnable to
open the adapter. %s is not supported by WinPcap\n",
&&return -4;
&if (pcap_compile(fp, &bpf_filter,
bpf_filter_string, 0, net_mask) &
&&fprintf(stderr, "\nUnable to
compile the packet filter. Check the syntax.\n");
&&return -5;
&pcap_setfilter(fp,
&bpf_filter);&&&
&if (pcap_datalink(fp) != DLT_EN10MB)
&pcap_loop(fp, -1,
ethernet_protocol_packet_callback, NULL);
&pcap_close(fp);&&&
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 wincap电容 的文章

 

随机推荐