winpcap编程设置过滤器之指定获取某个网站的数据
下面,我将以 乱世隋唐页游 为例,通过编码获取这里面的数据。
游戏图:
我是乱世隋唐的网址是:www.917st.com
这个是官网网址的服务器地址。 42.62.0.14
我玩的游戏服是84区。网址是:www.s84.917st.com
我所在区的服务器地址是: 42.62.0.7
winpcap里有一个过滤器字符串。凡是发送给这个服务器的内容,我都要获取到。我们需要设置它为:dst host 42.62.0.7 表示目标主机地址是42.62.0.7
如果我要获取从这个服务器发来的数据,需要设置过滤器字符串:src host 42.62.0.7
关于字符串过滤器的语法,winpcap官网有,我这里不想讲。
现在开始编程实现获取这个游戏的数据:
- #include "pcap.h"
- int main()
- {
- pcap_if_t *alldevs;
- pcap_if_t *d;
- int inum;
- int i=;
- pcap_t *adhandle;
- int res;
- char errbuf[PCAP_ERRBUF_SIZE];
- struct tm *ltime;
- char timestr[];
- struct pcap_pkthdr *header;
- const u_char *pkt_data;
- time_t local_tv_sec;
- u_int netmask;
- char packet_filter[] = "dst host 42.62.0.7";
- struct bpf_program fcode;
- /* 获取本机设备列表 */
- if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf) == -)
- {
- fprintf(stderr,"Error in pcap_findalldevs: %s\n", errbuf);
- exit();
- }
- /* 打印列表 */
- for(d=alldevs; d; d=d->next)
- {
- printf("%d. %s", ++i, d->name);
- if (d->description)
- printf(" (%s)\n", d->description);
- else
- printf(" (No description available)\n");
- }
- if(i==)
- {
- printf("\nNo interfaces found! Make sure WinPcap is installed.\n");
- return -;
- }
- printf("Enter the interface number (1-%d):",i);
- scanf("%d", &inum);
- if(inum < || inum > i)
- {
- printf("\nInterface number out of range.\n");
- /* 释放设备列表 */
- pcap_freealldevs(alldevs);
- return -;
- }
- /* 跳转到已选中的适配器 */
- for(d=alldevs, i=; i< inum- ;d=d->next, i++);
- /* 打开设备 */
- if ( (adhandle= pcap_open(d->name, // 设备名
- , // 要捕捉的数据包的部分
- // 65535保证能捕获到不同数据链路层上的每个数据包的全部内容
- PCAP_OPENFLAG_PROMISCUOUS, // 混杂模式
- , // 读取超时时间
- NULL, // 远程机器验证
- errbuf // 错误缓冲池
- ) ) == NULL)
- {
- fprintf(stderr,"\nUnable to open the adapter. %s is not supported by WinPcap\n", d->name);
- /* 释放设列表 */
- pcap_freealldevs(alldevs);
- return -;
- }
- printf("\nlistening on %s...\n", d->description);
- /* 设置过滤器 */
- if (d->addresses != NULL)
- /* 获取接口第一个地址的掩码 */
- netmask=((struct sockaddr_in *)(d->addresses->netmask))->sin_addr.S_un.S_addr;
- else
- /* 如果这个接口没有地址,那么我们假设这个接口在C类网络中 */
- netmask=0xffffff;
- if(pcap_compile(adhandle,&fcode,packet_filter,,netmask)>=)
- {
- //设置过滤器
- if (pcap_setfilter(adhandle, &fcode)<)
- {
- fprintf(stderr,"\nError setting the filter.\n");
- /* 释放设备列表 */
- pcap_freealldevs(alldevs);
- return -;
- }
- }
- else
- {
- fprintf(stderr,"\nError setting the filter.\n");
- /* 释放设备列表 */
- pcap_freealldevs(alldevs);
- return -;
- }
- /* 释放设备列表 */
- pcap_freealldevs(alldevs);
- /* 获取数据包 */
- while((res = pcap_next_ex( adhandle, &header, &pkt_data)) >= ){
- if(res == )
- /* 超时时间到 */
- continue;
- /* 将时间戳转换成可识别的格式 */
- local_tv_sec = header->ts.tv_sec;
- ltime=localtime(&local_tv_sec);
- strftime( timestr, sizeof timestr, "%H:%M:%S", ltime);
- printf("%s,%.6d len:%d\n", timestr, header->ts.tv_usec, header->len);
- }
- if(res == -){
- printf("Error reading the packets: %s\n", pcap_geterr(adhandle));
- return -;
- }
- return ;
- }
程序运行截图:
我这里获取到四个本地网络适配器。但是实质上我的笔记本只有俩个物理网卡,一个无线,一个有线。后面3,4选项是虚拟机模拟出来的,这里不用管。因为我目前还没用虚拟机。1选项,表示获取的是物理有线网卡,2选项,表示获取的是物理无线网卡。我目前上网用无线WIFI ,所以选择2
我现在在向游戏里说话,说80个0.,字符0的ascii码为0x30 那么在获取到的数据包里应该会出现80个0x30
运行截图:
游戏截图:
果然出现了我们预期的结果,出现了80个 30
我现在说一下本人获取包一些经验,用在世界说话,获取包的结构。
这里的结果,可以得知:
数据的前五个字节是 06 01 06 81 21
数据的后五个字节是 02 0a 0b 01 15
也就是说,凡是在这个中间的都是说话的内容。
现在,我决定在做一个操作,就是买粮食,127个
如图:
127的十六进制是0x7F, 如果数据没加密的话,那么就可以获取到数据 0x7F
但是数据包里的十六进制数据像0x7F的数据有很多,怎么确定这个数据就是我们购买数量的数据呢,其实很简单。就是根据它的前后数据判断就可以得出了。
只有这一个数据,对我们太有利了,哈哈。 【23 04 01 04】 7f 【04 0a 02 02 0a】
现在我准备购买126个数量的粮食,十六进制是7E,在截获包。
截获的包:
哈哈,已经找到了,那么我们就可以,我们总结
凡是出现在【04 01 04 7e】 和【04 0a 02 02 0a】之间的数据都是购买粮食的数量
- #include "pcap.h"
- int main()
- {
- pcap_if_t *alldevs;
- pcap_if_t *d;
- int inum;
- int i=;
- pcap_t *adhandle;
- int res;
- char errbuf[PCAP_ERRBUF_SIZE];
- struct tm *ltime;
- char timestr[];
- struct pcap_pkthdr *header;
- const u_char *pkt_data;
- time_t local_tv_sec;
- u_int netmask;
- char packet_filter[] = "dst host 42.62.0.7";
- struct bpf_program fcode;
- /* 获取本机设备列表 */
- if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf) == -)
- {
- fprintf(stderr,"Error in pcap_findalldevs: %s\n", errbuf);
- exit();
- }
- /* 打印列表 */
- for(d=alldevs; d; d=d->next)
- {
- printf("%d. %s", ++i, d->name);
- if (d->description)
- printf(" (%s)\n", d->description);
- else
- printf(" (No description available)\n");
- }
- if(i==)
- {
- printf("\nNo interfaces found! Make sure WinPcap is installed.\n");
- return -;
- }
- printf("Enter the interface number (1-%d):",i);
- scanf("%d", &inum);
- if(inum < || inum > i)
- {
- printf("\nInterface number out of range.\n");
- /* 释放设备列表 */
- pcap_freealldevs(alldevs);
- return -;
- }
- /* 跳转到已选中的适配器 */
- for(d=alldevs, i=; i< inum- ;d=d->next, i++);
- /* 打开设备 */
- if ( (adhandle= pcap_open(d->name, // 设备名
- , // 要捕捉的数据包的部分
- // 65535保证能捕获到不同数据链路层上的每个数据包的全部内容
- PCAP_OPENFLAG_PROMISCUOUS, // 混杂模式
- , // 读取超时时间
- NULL, // 远程机器验证
- errbuf // 错误缓冲池
- ) ) == NULL)
- {
- fprintf(stderr,"\nUnable to open the adapter. %s is not supported by WinPcap\n", d->name);
- /* 释放设列表 */
- pcap_freealldevs(alldevs);
- return -;
- }
- printf("\nlistening on %s...\n", d->description);
- /* 设置过滤器 */
- if (d->addresses != NULL)
- /* 获取接口第一个地址的掩码 */
- netmask=((struct sockaddr_in *)(d->addresses->netmask))->sin_addr.S_un.S_addr;
- else
- /* 如果这个接口没有地址,那么我们假设这个接口在C类网络中 */
- netmask=0xffffff;
- if(pcap_compile(adhandle,&fcode,packet_filter,,netmask)>=)
- {
- //设置过滤器
- if (pcap_setfilter(adhandle, &fcode)<)
- {
- fprintf(stderr,"\nError setting the filter.\n");
- /* 释放设备列表 */
- pcap_freealldevs(alldevs);
- return -;
- }
- }
- else
- {
- fprintf(stderr,"\nError setting the filter.\n");
- /* 释放设备列表 */
- pcap_freealldevs(alldevs);
- return -;
- }
- /* 释放设备列表 */
- pcap_freealldevs(alldevs);
- /* 获取数据包 */
- while((res = pcap_next_ex( adhandle, &header, &pkt_data)) >= ){
- if(res == )
- /* 超时时间到 */
- continue;
- /* 将时间戳转换成可识别的格式 */
- local_tv_sec = header->ts.tv_sec;
- ltime=localtime(&local_tv_sec);
- strftime( timestr, sizeof timestr, "%H:%M:%S", ltime);
- printf("%s,%.6d len:%d\n", timestr, header->ts.tv_usec, header->len);
- /* 打印包 */
- int len = header->caplen + ;
- for (i=;i<len; i++)
- {
- printf("%.2x ", pkt_data[i-]);
- if(pkt_data[i-]==0x7e)
- {
- printf("==找到了后五位数据是,%.2x %.2x %.2x %.2x %.2x\n",pkt_data[i],pkt_data[i+],pkt_data[i+],pkt_data[i+],pkt_data[i+]);
- }
- if ( (i % ) == )
- printf("\n");
- }
- printf("\n-----------------------------------------------------------------\n");
- }
- if(res == -){
- printf("Error reading the packets: %s\n", pcap_geterr(adhandle));
- return -;
- }
- return ;
- }
本人不会贴发包的源码,以防有人用作非法用途。如果想要发送封包,请自行学习winpcap
winpcap编程设置过滤器之指定获取某个网站的数据的更多相关文章
- 【VS开发】使用WinPcap编程(2)——打开网络设备并且开始捕获数据包
这里需要特别强调的一个数据结构是pcap_t,它相当于一个文件描述符,代表一个已经打开的设备.我们对这个设备进行操作,就是对这个文件描述符进行操作. 首先是打开一个已知的设备,使用pcap_open( ...
- 通过Iframe在A网站页面内嵌入空白页面的方式,跨域获取B网站的数据返回给A网站!
以下代码只是为演示该方法具体是如何操作的,实际的意义并不大. 其实这个方法还可以解决很多方面的跨域操作,以下两点为我工作中遇到的情况! 比如A系统中打开B系统页面的时候,获取B系统页面高度,A系统中可 ...
- WinPcap编程入门实践
转自:http://www.cnblogs.com/blacksword/archive/2012/03/19/2406098.html WinPcap可能对大多数人都很陌生,我在这里就先简单介绍一下 ...
- c语言Winpcap编程构造并接收解析arp包
/* 程序功能: 1.构造arp包,并发送.程序参数顺序:源IP.目的IP.mac地址.flag 2.获取网络中的ARP数据包,解析数据包的内容.程序参数:日志文件名 winpacp中文技术文档(基本 ...
- WinPcap编程(二)
0. 这一次具体讲抓包的两种方法. (建议)清除ARP表,最好自己写个批处理命令.快一点. 1.0 抓包步骤 步骤很简单:先打开适配器列表 --> 选择适配器 --> 通过遍历链表的方式到 ...
- MFC+WinPcap编写一个嗅探器之零(目录)
零零散散写了三天,完成了编写嗅探器的文章,旨在让自己加深印象,是初学者少走一些弯路.因为先前未接触MFC,之后也不打算精通,完全是0基础,所以文章技术含量不高,但难点基本上都都包括了,凑合这看吧,接下 ...
- 背水一战 Windows 10 (101) - 应用间通信: 通过协议打开指定的 app 并传递数据以及获取返回数据, 将本 app 沙盒内的文件共享给其他 app 使用
[源码下载] 背水一战 Windows 10 (101) - 应用间通信: 通过协议打开指定的 app 并传递数据以及获取返回数据, 将本 app 沙盒内的文件共享给其他 app 使用 作者:weba ...
- MFC+WinPcap编写一个嗅探器之二(界面)
选择新建->项目->MFC应用程序->基于对话框完成,这里文件名为sniffer 打开资源视图中的Dialog列表,打开项目总默认创建的话框,将对话框中的所有控件删除,之后按照最终效 ...
- HBase Filter 过滤器之 Comparator 原理及源码学习
前言:上篇文章HBase Filter 过滤器概述对HBase过滤器的组成及其家谱进行简单介绍,本篇文章主要对HBase过滤器之比较器作一个补充介绍,也算是HBase Filter学习的必备低阶魂技吧 ...
随机推荐
- Can't remove netstandard folder from output path (.net standard)
https://developercommunity.visualstudio.com/content/problem/30940/cant-remove-netstandard-folder-fro ...
- YTU 2586: 填空题B-字画鉴别
2586: 填空题B-字画鉴别 时间限制: 1 Sec 内存限制: 128 MB 提交: 509 解决: 131 题目描述 注:本题只需要提交填写部分的代码,请按照C语言方式提交. 古玩店老板小勇 ...
- codeforces 686B B. Little Robber Girl's Zoo(水题)
题目链接: B. Little Robber Girl's Zoo //#include <bits/stdc++.h> #include <vector> #include ...
- 并不对劲的bzoj1861: [Zjoi2006]Book 书架
传送门-> 这题的正确做法是splay维护这摞书. 但是并不对劲的人选择了暴力(皮这一下很开心). #include<algorithm> #include<cmath> ...
- BZOJ_3881_[Coci2015]Divljak_AC自动机+dfs序+树状数组
BZOJ_3881_[Coci2015]Divljak_AC自动机+dfs序+树状数组 Description Alice有n个字符串S_1,S_2...S_n,Bob有一个字符串集合T,一开始集合是 ...
- BZOJ_5343_[Ctsc2018]混合果汁_二分答案+主席树
BZOJ_5343_[Ctsc2018]混合果汁_二分答案+主席树 题意:给出每个果汁的价格p,美味度d,最多能放的体积l.定义果汁混合后的美味度为果汁的美味度的最小值. m次询问,要求花费不大于g, ...
- [Usaco2018 Feb] New Barns
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=5192 [算法] 维护树的直径,在树上离一个点最远的点一定是一条直径的端点. ...
- 《Microsoft COCO Captions Data Collection and Evaluation Server》论文笔记
出处:CVPR2015 Motivation 本文描述了MSCoco标题数据集及评估服务器(Microsoft COCO Caption dataset and evaluation server), ...
- 记重大失误(SQLserver数据回滚)ApexSQL
敲了一天代码,脑壳昏,更改数据时忘记加where条件,该数据库又未备份.修改了1800条数据..当时那个着急啊. 各种找解决方法,最后使用ApexSQL Log 完美解决.赞一个 ApexSQL L ...
- 13_传智播客iOS视频教程_OC程序的编译链接
C程序的编译.链接.执行怎么来的?在.C文件里面写上符合C语言部分的源代码.OC也是一样的.记住:OC程序的后缀名是.m. 为什么要链接?第一个.o的目标文件里面它启动不了.因为它没有启动代码我们要加 ...