WinPcap编程(一)
0.
按着文档顺序写的。
开发环境:win10+VS2013。
配置WinPcap环境就不多说。直接给网址:http://blog.sina.com.cn/s/blog_57432f380101qh3n.html
内容大多是函数解释+碰到的问题的解决方案。学习&&警示。
1.获取适配器列表
获取适配器的目的是:获取本机有哪些适配器,便于之后选择用哪个适配器抓包。
首先,先了解一个数据类型pcap_if/pcap_if_t,这是一个链表结构,用来存储本机的所有适配器。
struct pcap_if {
struct pcap_if *next;
char *name;
char *description;
struct pcap_addr *addresses;
bpf_u_int32 flags;
};
typedef struct pcap_if pcap_if_t;
备注:
第一是一个pcap_if的链表指向下一个设备接口;
第二个是设备的实际的名字,这个名字是机器能识别的名字,供pcap_open_live()调用;
第三个是设备的文本描述符,这个描述符就是人们能够识别的文本符号;有可能为null。
第四个是一个地址指针,指向的是一系列接口(pcap_addr)的第一个指针;
第五个是一个标志位,目前这个标志位主要是不是loopback设备。
然后,获取适配器列表的函数是:
int pcap_findalldevs_ex ( char * source ; struct pcap_rmauth * auth; pcap_if_t ** alldevs; char * errbuf; )
备注:
1.source可以使用上面设置好的source,也可以使用:PCAP_SRC_FILE_STRING 或者 PCAP_SRC_IF_STRING,分别是文件和接口的字符串。"file://", "rpcap://"。
2.auth是远程登录信息(pcap_rmauth),有用户名、密码、类型。用户名和密码都是字符指针,类型有:RPCAP_RMTAUTH_NULL 和 RPCAP_RMTAUTH_PWD。多为BULL。
3.alldevs用于存储返回的接口信息。我们要事先定义pcap_if_t *alldevs,这是一个链表,存储接口信息。
4.errbuf出错信息。
5.返回值为0则顺利;-1代表出现错误。
最后,释放设备函数:
void pcap_freealldevs (pcap_if_t *alldevsp)
释放内存。
原装代码:
#define WIN32
#include "pcap.h" void main()
{
pcap_if_t *alldevs, *d;
int i = ;
char errbuf[PCAP_ERRBUF_SIZE];
/* PCAP_ERRBUF_SIZE =256在pcap.h中定义*/ if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf) == -) /* 这个API用来获得网卡的列表 */
{
fprintf(stderr, "Error in pcap_findalldevs: %s\n", errbuf);
//errbuf参数 当有异常情况发生时,这个参数会被PCAP填充为某3个特定的错误字串
return;
} /* 显示列表的响应字段的内容*/
for (d = alldevs; d; d = d->next)
{
printf("%d. %s,%s\n", ++i, d->name,d->addresses);
if (d->description) {
printf(" (%s)\n", d->description);
//system("pause");
}
else
printf(" (No description available)\n");
}
if (i == )
{
printf("\nNo interfaces found! Make sure WinPcap is installed.\n");
return;
} /*We don't need any more the device list. Free it */
pcap_freealldevs(alldevs);
system("pause");
}
2.获取适配器的高级信息。
每一个pcap_if_t中包含一个pcap_addr。pcap_addr中包含这个设备的高级信息。
struct pacap_addr{
struct pcap_addr *next;
struct sockaddr *addr;
struct sockaddr *netmask;
struct sockaddr *broadaddr;
struct sockaddr *dstaddr; /*destination*/
};
备注:
第二个,地址列表;
第三个,掩码列表;
第四个,广播地址列表;
第五个,目的地址列表。
然后,1中获得适配器列表的链表结构后,从头开始遍历,把pcap_if_t中pcap_addr的信息给输出出来就OK了。
#define WIN32
#include "pcap.h" #ifndef WIN32
#include <winsock.h>
#include <wininet.h>
#include <ws2def.h>
#include<WS2tcpip.h>
#else
#include <winsock.h>
#endif // 函数原型
void ifprint(pcap_if_t *d);
char *iptos(u_long in);
char* ip6tos(struct sockaddr *sockaddr, char *address, int addrlen); int main()
{
pcap_if_t *alldevs;
pcap_if_t *d;
char errbuf[PCAP_ERRBUF_SIZE + ];
char source[PCAP_ERRBUF_SIZE + ]; printf("Enter the device you want to list:\n"
"rpcap:// ==> lists interfaces in the local machine\n"
"rpcap://hostname:port ==> lists interfaces in a remote machine\n"
" (rpcapd daemon must be up and running\n"
" and it must accept 'null' authentication)\n"
"file://foldername ==> lists all pcap files in the give folder\n\n"
"Enter your choice: "); fgets(source, PCAP_ERRBUF_SIZE, stdin);
source[PCAP_ERRBUF_SIZE] = '\0'; /* 获得接口列表 */
if (pcap_findalldevs_ex(source, NULL, &alldevs, errbuf) == -)
{
fprintf(stderr, "Error in pcap_findalldevs: %s\n", errbuf);
exit();
} /* 扫描列表并打印每一项 */
for (d = alldevs; d; d = d->next)
{
ifprint(d);
} pcap_freealldevs(alldevs); system("pause");
return ;
} /* 打印所有可用信息 */
void ifprint(pcap_if_t *d)
{
pcap_addr_t *a;
char ip6str[]; /* 设备名(Name) */
printf("%s\n", d->name); /* 设备描述(Description) */
if (d->description)
printf("\tDescription: %s\n", d->description); /* Loopback Address*/
printf("\tLoopback: %s\n", (d->flags & PCAP_IF_LOOPBACK) ? "yes" : "no"); /* IP addresses */
for (a = d->addresses; a; a = a->next) {
printf("\tAddress Family: #%d\n", a->addr->sa_family); switch (a->addr->sa_family)
{
case AF_INET:
printf("\tAddress Family Name: AF_INET\n");
if (a->addr)
printf("\tAddress: %s\n", iptos(((struct sockaddr_in *)a->addr)->sin_addr.s_addr));
if (a->netmask)
printf("\tNetmask: %s\n", iptos(((struct sockaddr_in *)a->netmask)->sin_addr.s_addr));
if (a->broadaddr)
printf("\tBroadcast Address: %s\n", iptos(((struct sockaddr_in *)a->broadaddr)->sin_addr.s_addr));
if (a->dstaddr)
printf("\tDestination Address: %s\n", iptos(((struct sockaddr_in *)a->dstaddr)->sin_addr.s_addr));
break; case AF_INET6:
printf("\tAddress Family Name: AF_INET6\n");
if (a->addr)
printf("\tAddress: %s\n", ip6tos(a->addr, ip6str, sizeof(ip6str)));
break; default:
printf("\tAddress Family Name: Unknown\n");
break;
}
}
printf("\n");
}
/* 将数字类型的IP地址转换成字符串类型的 */
#define IPTOSBUFFERS 12
char *iptos(u_long in)
{
static char output[IPTOSBUFFERS][ * + + ];
static short which;
u_char *p; p = (u_char *)∈
which = (which + == IPTOSBUFFERS ? : which + );
sprintf_s(output[which], "%d.%d.%d.%d", p[], p[], p[], p[]);
return output[which];
} char* ip6tos(struct sockaddr *sockaddr, char *address, int addrlen)
{
socklen_t sockaddrlen; #ifdef WIN32
sockaddrlen = sizeof(struct sockaddr_in6);
#else
sockaddrlen = sizeof(struct sockaddr_storage);
#endif if (getnameinfo(sockaddr,
sockaddrlen,
address,
addrlen,
NULL,
,
NI_NUMERICHOST) != ) address = NULL; return address;
}
辅助函数,IP转字符串
WinPcap编程(一)的更多相关文章
- WinPcap编程入门实践
转自:http://www.cnblogs.com/blacksword/archive/2012/03/19/2406098.html WinPcap可能对大多数人都很陌生,我在这里就先简单介绍一下 ...
- WinPcap编程(二)
0. 这一次具体讲抓包的两种方法. (建议)清除ARP表,最好自己写个批处理命令.快一点. 1.0 抓包步骤 步骤很简单:先打开适配器列表 --> 选择适配器 --> 通过遍历链表的方式到 ...
- winPcap编程之环境搭建(一)
之前用winPcap做过一个拦截网络数据包的程序,作为当时的网络编程课程的课程设计,现在重新学习一下. 工具:codeblocks 要用到的一些东西:WinPcap.exe与winPcap一些库文件 ...
- winpcap编程设置过滤器之指定获取某个网站的数据
下面,我将以 乱世隋唐页游 为例,通过编码获取这里面的数据. 游戏图: 我是乱世隋唐的网址是:www.917st.com 这个是官网网址的服务器地址. 42.62.0.14 我玩的游戏服是84区.网 ...
- WinPcap编程(三)
1.过滤器设置 设置过滤器,得到你想要的哪种类型的包.Like WireShark. 过程:编译过滤器,然后设置过滤器.直接上参考文档的代码: if (d->addresses != NULL) ...
- WinPcap编程(前言&&学习)
计算机网络课设要求用WinPcap写对ARP包的接收与发送. 所以学了一下WinPcap的内容. 参考的博客: http://blog.csdn.net/htttw/article/details/7 ...
- c语言Winpcap编程构造并接收解析arp包
/* 程序功能: 1.构造arp包,并发送.程序参数顺序:源IP.目的IP.mac地址.flag 2.获取网络中的ARP数据包,解析数据包的内容.程序参数:日志文件名 winpacp中文技术文档(基本 ...
- [补] winpcap编程——EAP协议与EAPSOCKET实现
EAP SOCKET Implement Mentohust 时间:20161115,大二上 ## 准备. 什么是 EAP 协议 ? WIKI : https://en.wikipedia.org/w ...
- winPcap编程之不用回调方法捕获数据包(五 转)
这一次要分析的实例程序跟上一讲非常类似(“打开适配器并捕获数据包”),略微不同的一点是本次将pcap_loop()函数替换成了pcap_next_ex()函数.本节的重点也就是说一下这两个函数之间的差 ...
随机推荐
- uvalive4513
https://vjudge.net/problem/UVALive-4513 终于做出来了......... 各种sb错误,最后对拍出来了,还没改对..................... 快半天 ...
- 未能导入activex控件,请确保它正确注册
这个错误"未能导入activex控件,请确保它正确注册"昨天下午让我和我同事花费了3个小时来调试这个错误,在使用VS2010的winfrom编程时加入com组件的时候,报这个错误( ...
- JSP ---- 声明、表达式、脚本、注释
声明 在 JSP 页面中 , 可以声明一个或者多个合法的变量和方法 , 声明后的变量和方法可以在本 JSP 页面的任何位置使用 , 并将在 JSP 页面初始化时被初始化 语法格式如下 : <!% ...
- ★ Linked List Cycle II -- LeetCode
证明单链表有环路: 本文所用的算法 能够 形象的比喻就是在操场其中跑步.速度快的会把速度慢的扣圈 能够证明,p2追赶上p1的时候.p1一定还没有走完一遍环路,p2也不会跨越p1多圈才追上 我们能够 ...
- mysql内核源代码深度解析 缓冲池 buffer pool 整体概述
http://blog.csdn.net/cjcl99/article/details/51063078
- (转载)linux那点事儿(上)
原文地址:http://www.cnblogs.com/fnng/archive/2012/03/19/2407162.html 本文只是转载供自己学习之用 本文算是学linux的学习笔记吧!其实li ...
- windows使用python调用wget批处理下载数据
wget是linux/unix下通常使用的下载http/ftp的数据,使用非常方便,其实wget目前经过编译,也可在windows下使用.最近需要下载大量的遥感数据,使用了python写了批处理下载程 ...
- Hex编码 十六进制编码
import java.io.UnsupportedEncodingException; import java.net.URLEncoder; /** * HEX字符串与字节码(字符串)转换工具 ...
- ASP.NET 打包下载文件
使用的类库为:ICSharpCode.SharpZipLib.dll 一种是打包整个文件夹,另一种是打包指定的多个文件,大同小异: using ICSharpCode.SharpZipLib.Zip; ...
- Unity3D GUI之自定义风格组件
GUI中可以使用一些默认的组件,里面的最后一个参数一般情况下,不设置就是默认的 ,当然也可以进行手动的指定,比如: GUI.Button(new Rect(0,0,100,100),"开始游 ...