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()函数.本节的重点也就是说一下这两个函数之间的差 ...
随机推荐
- Pick-up sticks - POJ 2653 (线段相交)
题目大意:有一个木棒,按照顺序摆放,求出去上面没有被别的木棍压着的木棍..... 分析:可以维护一个队列,如果木棍没有被压着就入队列,如果判断被压着,就让那个压着的出队列,最后把这个木棍放进队列, ...
- hdoj 2141 Can you find it?【二分查找+暴力】
Can you find it? Time Limit: 10000/3000 MS (Java/Others) Memory Limit: 32768/10000 K (Java/Others ...
- maven常用插件配置
1.maven-jar-plugin插件 <!-- 排除资源文件中的properties文件,不需要打到jar中,后面通过assembly插件打包到conf目录中 --><plugi ...
- SQL 按月统计(两种方式) 分类: SQL Server 2014-08-04 15:36 154人阅读 评论(0) 收藏
(1)Convert 函数 select Convert ( VARCHAR(7),ComeDate,120) as Date ,Count(In_code) as 单数,Sum(SumTrueNum ...
- STL 六大组件 功能与运用
STL 提供六大组件,彼此可以组合套用: 1 容器(containers):各种数据结构,如vector,list,deque,set,map,用来存放数据,从实现的角度来看,STL容器是一种clas ...
- mapreduce实战:统计美国各个气象站30年来的平均气温项目分析
气象数据集 我们要写一个气象数据挖掘的程序.气象数据是通过分布在美国各地区的很多气象传感器每隔一小时进行收集,这些数据是半结构化数据且是按照记录方式存储的,因此非常适合使用 MapReduce 程序来 ...
- Hive数据导入
可以通过多种方式将数据导入hive表 1.通过外部表导入 用户在hive上建external表,建表的同时指定hdfs路径,在数据拷贝到指定hdfs路径的同时,也同时完成数据插入external表. ...
- java.sql.SQLException: Invalid parameter object type. Expected 'java.util.Map' but found 'java.lang.String 转载
java.sql.SQLException: Invalid parameter object type. Expected 'java.util.Map' but found 'java.lang. ...
- eclipse删除空行
1.打开源码编辑器 2.使用快捷键Ctrl+f 3.在Find输入框中输入:^\s*\n 4.Replace With输入框的值为空 5.在[Options]选中的"Regular expr ...
- unlocker208安装之后看不到Apple macos选项,解决办法.
前段时间升级了win10,最新的unlocker208安装以后看不到mac os的选项,为什么呢?我们在管理员允许win-install.cmd的过程中,会在cmd中看到这么一句话:LookupErr ...