tcpdump ,wireshark 都是基于libpcap的 ,需求是需要检查别人app是否调用了我们的接口
iOS 5之后 苹果引入了RVI(remote virtual interface)机制 ,手机通过USB线连接mac , 然后使用rvictl 并加上UDID就可以再Mac上创建虚拟网络接口rvi ,tcpdump ,wireshark都能用
rvistl -s <UDID>
出现 SUCCEEDED 就算成功了
#include <stdio.h>
#include <stdlib.h>
#include <pcap.h>
#include <errno.h>
#include <netinet/in.h>
#include <arpa/inet.h>
void packet_handler(u_char *user, const struct pcap_pkthdr *header, const u_char *packet)
{
// xxxx 是我们要检索的关键字, 我们的接口信息
// 4是xxxx的长度 , 可以写成strlen("xxxx")
if (memmem(packet,header->len ,"xxxx",4)) {
printf("********************存在xxxx*******************\n");
}
}
int main(int argc ,char * argv[])
{
// pcap_lookupdev()函数用于查找网络设备,返回可被pcap_open_live()函数调用的网络设备名指针。
// pcap_open_live()函数用于打开网络设备,并且返回用于捕获网络数据包的数据包捕获描述字。对于此网络设备的操作都要基于此网络设备描述字。
// pcap_lookupnet()函数获得指定网络设备的网络号和掩码。
// pcap_compile()函数用于将用户制定的过滤策略编译到过滤程序中。
// pcap_setfilter()函数用于设置过滤器。
// pcap_loop()函数pcap_dispatch()函数用于捕获数据包,捕获后还可以进行处理,此外pcap_next()和pcap_next_ex()两个函数也可以用来捕获数据包。
// pcap_close()函数用于关闭网络设备,释放资源。
pcap_t *handle; // 会话句柄
char errbuf[PCAP_ERRBUF_SIZE]; // 存储错误信息的字符串
bpf_u_int32 mask; //所在网络的掩码
bpf_u_int32 net; // 主机的IP地址
struct bpf_program filter; //已经编译好的过滤器
char filter_app[] = ""; //BPF过滤规则,和tcpdump使用的是同一种过滤规则
// 10.241.20.151
/* 探查设备及属性 */
char *dev; //指定需要被抓包的设备 我们在linux下的两个设备eth0和lo分别是网卡和本地环回
dev = pcap_lookupdev(errbuf); //返回第一个合法的设备,我这里是eth0
pcap_lookupnet(dev, &net, &mask, errbuf);
//dev = "lo"; //如果需要抓取本地的数据包,比如过滤表达式为host localhost的时候可以直接指定
/* 以混杂模式打开会话 */
handle = pcap_open_live("rvi0", BUFSIZ, 1, 0, errbuf);
/* 编译并应用过滤器 */
pcap_compile(handle, &filter, filter_app, 0, net);
pcap_setfilter(handle, &filter);
/* 定义输出文件 */
pcap_dumper_t* out_pcap;
// out_pcap = pcap_dump_open(handle,"/Users/DH/Desktop/CheckList/pack.pcap");
/* 截获30个包 */
while(!pcap_loop(handle, 5, packet_handler, NULL))
{
printf("-------\n"); //每8行才会输出一次这个
}
// 下面这个是把结果输出到本地保存成pcap文件的 ,最后一个参数如果写成NULL, 就不输出了
// while(!pcap_loop(handle, 5, packet_handler, (u_char *)out_pcap))
// {
// printf("-------\n"); //每8行才会输出一次这个
// }
/* 刷新缓冲区 */
pcap_dump_flush(out_pcap);
/* 关闭资源 */
pcap_close(handle);
pcap_dump_close(out_pcap);
return 0;
}
dev = pcap_lookupdev(errbuf); 这个没用到 , 返回的是mac当前默认的网卡 en0
这里需要用虚拟出的riv0,所以手动添加了