libpcap 抓iPhone包 查找关键字

tcpdump ,wireshark 都是基于libpcap的 ,需求是需要检查别人app是否调用了我们的接口

iOS 5之后 苹果引入了RVI(remote virtual interface)机制 ,手机通过USB线连接mac , 然后使用rvictl 并加上UDID就可以再Mac上创建虚拟网络接口rvi ,tcpdump ,wireshark都能用

rvistl -s 

FCAD2315-7F89-4CE7-BD47-0B14E4D35895.png
出现 SUCCEEDED 就算成功了

#include 
#include 
#include 
#include 
#include 
#include 


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,所以手动添加了

你可能感兴趣的:(libpcap 抓iPhone包 查找关键字)