下面,我将以 乱世隋唐页游 为例,通过编码获取这里面的数据。

游戏图:

我是乱世隋唐的网址是: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官网有,我这里不想讲。

现在开始编程实现获取这个游戏的数据:

  1. #include "pcap.h"
  2.  
  3. int main()
  4. {
  5. pcap_if_t *alldevs;
  6. pcap_if_t *d;
  7. int inum;
  8. int i=;
  9. pcap_t *adhandle;
  10. int res;
  11. char errbuf[PCAP_ERRBUF_SIZE];
  12. struct tm *ltime;
  13. char timestr[];
  14. struct pcap_pkthdr *header;
  15. const u_char *pkt_data;
  16. time_t local_tv_sec;
  17. u_int netmask;
  18. char packet_filter[] = "dst host 42.62.0.7";
  19. struct bpf_program fcode;
  20.  
  21. /* 获取本机设备列表 */
  22. if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf) == -)
  23. {
  24. fprintf(stderr,"Error in pcap_findalldevs: %s\n", errbuf);
  25. exit();
  26. }
  27.  
  28. /* 打印列表 */
  29. for(d=alldevs; d; d=d->next)
  30. {
  31. printf("%d. %s", ++i, d->name);
  32. if (d->description)
  33. printf(" (%s)\n", d->description);
  34. else
  35. printf(" (No description available)\n");
  36. }
  37.  
  38. if(i==)
  39. {
  40. printf("\nNo interfaces found! Make sure WinPcap is installed.\n");
  41. return -;
  42. }
  43.  
  44. printf("Enter the interface number (1-%d):",i);
  45. scanf("%d", &inum);
  46.  
  47. if(inum < || inum > i)
  48. {
  49. printf("\nInterface number out of range.\n");
  50. /* 释放设备列表 */
  51. pcap_freealldevs(alldevs);
  52. return -;
  53. }
  54.  
  55. /* 跳转到已选中的适配器 */
  56. for(d=alldevs, i=; i< inum- ;d=d->next, i++);
  57.  
  58. /* 打开设备 */
  59. if ( (adhandle= pcap_open(d->name, // 设备名
  60. , // 要捕捉的数据包的部分
  61. // 65535保证能捕获到不同数据链路层上的每个数据包的全部内容
  62. PCAP_OPENFLAG_PROMISCUOUS, // 混杂模式
  63. , // 读取超时时间
  64. NULL, // 远程机器验证
  65. errbuf // 错误缓冲池
  66. ) ) == NULL)
  67. {
  68. fprintf(stderr,"\nUnable to open the adapter. %s is not supported by WinPcap\n", d->name);
  69. /* 释放设列表 */
  70. pcap_freealldevs(alldevs);
  71. return -;
  72. }
  73.  
  74. printf("\nlistening on %s...\n", d->description);
  75.  
  76. /* 设置过滤器 */
  77. if (d->addresses != NULL)
  78. /* 获取接口第一个地址的掩码 */
  79. netmask=((struct sockaddr_in *)(d->addresses->netmask))->sin_addr.S_un.S_addr;
  80. else
  81. /* 如果这个接口没有地址,那么我们假设这个接口在C类网络中 */
  82. netmask=0xffffff;
  83. if(pcap_compile(adhandle,&fcode,packet_filter,,netmask)>=)
  84. {
  85. //设置过滤器
  86. if (pcap_setfilter(adhandle, &fcode)<)
  87. {
  88. fprintf(stderr,"\nError setting the filter.\n");
  89. /* 释放设备列表 */
  90. pcap_freealldevs(alldevs);
  91. return -;
  92. }
  93. }
  94. else
  95. {
  96. fprintf(stderr,"\nError setting the filter.\n");
  97. /* 释放设备列表 */
  98. pcap_freealldevs(alldevs);
  99. return -;
  100. }
  101.  
  102. /* 释放设备列表 */
  103. pcap_freealldevs(alldevs);
  104.  
  105. /* 获取数据包 */
  106. while((res = pcap_next_ex( adhandle, &header, &pkt_data)) >= ){
  107.  
  108. if(res == )
  109. /* 超时时间到 */
  110. continue;
  111.  
  112. /* 将时间戳转换成可识别的格式 */
  113. local_tv_sec = header->ts.tv_sec;
  114. ltime=localtime(&local_tv_sec);
  115. strftime( timestr, sizeof timestr, "%H:%M:%S", ltime);
  116.  
  117. printf("%s,%.6d len:%d\n", timestr, header->ts.tv_usec, header->len);
  118. }
  119.  
  120. if(res == -){
  121. printf("Error reading the packets: %s\n", pcap_geterr(adhandle));
  122. return -;
  123. }
  124.  
  125. return ;
  126. }

程序运行截图:

我这里获取到四个本地网络适配器。但是实质上我的笔记本只有俩个物理网卡,一个无线,一个有线。后面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】之间的数据都是购买粮食的数量

  1. #include "pcap.h"
  2.  
  3. int main()
  4. {
  5. pcap_if_t *alldevs;
  6. pcap_if_t *d;
  7. int inum;
  8. int i=;
  9. pcap_t *adhandle;
  10. int res;
  11. char errbuf[PCAP_ERRBUF_SIZE];
  12. struct tm *ltime;
  13. char timestr[];
  14. struct pcap_pkthdr *header;
  15. const u_char *pkt_data;
  16. time_t local_tv_sec;
  17. u_int netmask;
  18. char packet_filter[] = "dst host 42.62.0.7";
  19. struct bpf_program fcode;
  20.  
  21. /* 获取本机设备列表 */
  22. if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf) == -)
  23. {
  24. fprintf(stderr,"Error in pcap_findalldevs: %s\n", errbuf);
  25. exit();
  26. }
  27.  
  28. /* 打印列表 */
  29. for(d=alldevs; d; d=d->next)
  30. {
  31. printf("%d. %s", ++i, d->name);
  32. if (d->description)
  33. printf(" (%s)\n", d->description);
  34. else
  35. printf(" (No description available)\n");
  36. }
  37.  
  38. if(i==)
  39. {
  40. printf("\nNo interfaces found! Make sure WinPcap is installed.\n");
  41. return -;
  42. }
  43.  
  44. printf("Enter the interface number (1-%d):",i);
  45. scanf("%d", &inum);
  46.  
  47. if(inum < || inum > i)
  48. {
  49. printf("\nInterface number out of range.\n");
  50. /* 释放设备列表 */
  51. pcap_freealldevs(alldevs);
  52. return -;
  53. }
  54.  
  55. /* 跳转到已选中的适配器 */
  56. for(d=alldevs, i=; i< inum- ;d=d->next, i++);
  57.  
  58. /* 打开设备 */
  59. if ( (adhandle= pcap_open(d->name, // 设备名
  60. , // 要捕捉的数据包的部分
  61. // 65535保证能捕获到不同数据链路层上的每个数据包的全部内容
  62. PCAP_OPENFLAG_PROMISCUOUS, // 混杂模式
  63. , // 读取超时时间
  64. NULL, // 远程机器验证
  65. errbuf // 错误缓冲池
  66. ) ) == NULL)
  67. {
  68. fprintf(stderr,"\nUnable to open the adapter. %s is not supported by WinPcap\n", d->name);
  69. /* 释放设列表 */
  70. pcap_freealldevs(alldevs);
  71. return -;
  72. }
  73.  
  74. printf("\nlistening on %s...\n", d->description);
  75.  
  76. /* 设置过滤器 */
  77. if (d->addresses != NULL)
  78. /* 获取接口第一个地址的掩码 */
  79. netmask=((struct sockaddr_in *)(d->addresses->netmask))->sin_addr.S_un.S_addr;
  80. else
  81. /* 如果这个接口没有地址,那么我们假设这个接口在C类网络中 */
  82. netmask=0xffffff;
  83. if(pcap_compile(adhandle,&fcode,packet_filter,,netmask)>=)
  84. {
  85. //设置过滤器
  86. if (pcap_setfilter(adhandle, &fcode)<)
  87. {
  88. fprintf(stderr,"\nError setting the filter.\n");
  89. /* 释放设备列表 */
  90. pcap_freealldevs(alldevs);
  91. return -;
  92. }
  93. }
  94. else
  95. {
  96. fprintf(stderr,"\nError setting the filter.\n");
  97. /* 释放设备列表 */
  98. pcap_freealldevs(alldevs);
  99. return -;
  100. }
  101.  
  102. /* 释放设备列表 */
  103. pcap_freealldevs(alldevs);
  104.  
  105. /* 获取数据包 */
  106. while((res = pcap_next_ex( adhandle, &header, &pkt_data)) >= ){
  107.  
  108. if(res == )
  109. /* 超时时间到 */
  110. continue;
  111.  
  112. /* 将时间戳转换成可识别的格式 */
  113. local_tv_sec = header->ts.tv_sec;
  114. ltime=localtime(&local_tv_sec);
  115. strftime( timestr, sizeof timestr, "%H:%M:%S", ltime);
  116.  
  117. printf("%s,%.6d len:%d\n", timestr, header->ts.tv_usec, header->len);
  118.  
  119. /* 打印包 */
  120. int len = header->caplen + ;
  121. for (i=;i<len; i++)
  122. {
  123. printf("%.2x ", pkt_data[i-]);
  124. if(pkt_data[i-]==0x7e)
  125. {
  126. printf("==找到了后五位数据是,%.2x %.2x %.2x %.2x %.2x\n",pkt_data[i],pkt_data[i+],pkt_data[i+],pkt_data[i+],pkt_data[i+]);
  127. }
  128. if ( (i % ) == )
  129. printf("\n");
  130.  
  131. }
  132.  
  133. printf("\n-----------------------------------------------------------------\n");
  134. }
  135.  
  136. if(res == -){
  137. printf("Error reading the packets: %s\n", pcap_geterr(adhandle));
  138. return -;
  139. }
  140.  
  141. return ;
  142. }

本人不会贴发包的源码,以防有人用作非法用途。如果想要发送封包,请自行学习winpcap

winpcap编程设置过滤器之指定获取某个网站的数据的更多相关文章

  1. 【VS开发】使用WinPcap编程(2)——打开网络设备并且开始捕获数据包

    这里需要特别强调的一个数据结构是pcap_t,它相当于一个文件描述符,代表一个已经打开的设备.我们对这个设备进行操作,就是对这个文件描述符进行操作. 首先是打开一个已知的设备,使用pcap_open( ...

  2. 通过Iframe在A网站页面内嵌入空白页面的方式,跨域获取B网站的数据返回给A网站!

    以下代码只是为演示该方法具体是如何操作的,实际的意义并不大. 其实这个方法还可以解决很多方面的跨域操作,以下两点为我工作中遇到的情况! 比如A系统中打开B系统页面的时候,获取B系统页面高度,A系统中可 ...

  3. WinPcap编程入门实践

    转自:http://www.cnblogs.com/blacksword/archive/2012/03/19/2406098.html WinPcap可能对大多数人都很陌生,我在这里就先简单介绍一下 ...

  4. c语言Winpcap编程构造并接收解析arp包

    /* 程序功能: 1.构造arp包,并发送.程序参数顺序:源IP.目的IP.mac地址.flag 2.获取网络中的ARP数据包,解析数据包的内容.程序参数:日志文件名 winpacp中文技术文档(基本 ...

  5. WinPcap编程(二)

    0. 这一次具体讲抓包的两种方法. (建议)清除ARP表,最好自己写个批处理命令.快一点. 1.0 抓包步骤 步骤很简单:先打开适配器列表 --> 选择适配器 --> 通过遍历链表的方式到 ...

  6. MFC+WinPcap编写一个嗅探器之零(目录)

    零零散散写了三天,完成了编写嗅探器的文章,旨在让自己加深印象,是初学者少走一些弯路.因为先前未接触MFC,之后也不打算精通,完全是0基础,所以文章技术含量不高,但难点基本上都都包括了,凑合这看吧,接下 ...

  7. 背水一战 Windows 10 (101) - 应用间通信: 通过协议打开指定的 app 并传递数据以及获取返回数据, 将本 app 沙盒内的文件共享给其他 app 使用

    [源码下载] 背水一战 Windows 10 (101) - 应用间通信: 通过协议打开指定的 app 并传递数据以及获取返回数据, 将本 app 沙盒内的文件共享给其他 app 使用 作者:weba ...

  8. MFC+WinPcap编写一个嗅探器之二(界面)

    选择新建->项目->MFC应用程序->基于对话框完成,这里文件名为sniffer 打开资源视图中的Dialog列表,打开项目总默认创建的话框,将对话框中的所有控件删除,之后按照最终效 ...

  9. HBase Filter 过滤器之 Comparator 原理及源码学习

    前言:上篇文章HBase Filter 过滤器概述对HBase过滤器的组成及其家谱进行简单介绍,本篇文章主要对HBase过滤器之比较器作一个补充介绍,也算是HBase Filter学习的必备低阶魂技吧 ...

随机推荐

  1. Can't remove netstandard folder from output path (.net standard)

    https://developercommunity.visualstudio.com/content/problem/30940/cant-remove-netstandard-folder-fro ...

  2. YTU 2586: 填空题B-字画鉴别

    2586: 填空题B-字画鉴别 时间限制: 1 Sec  内存限制: 128 MB 提交: 509  解决: 131 题目描述 注:本题只需要提交填写部分的代码,请按照C语言方式提交. 古玩店老板小勇 ...

  3. codeforces 686B B. Little Robber Girl's Zoo(水题)

    题目链接: B. Little Robber Girl's Zoo //#include <bits/stdc++.h> #include <vector> #include ...

  4. 并不对劲的bzoj1861: [Zjoi2006]Book 书架

    传送门-> 这题的正确做法是splay维护这摞书. 但是并不对劲的人选择了暴力(皮这一下很开心). #include<algorithm> #include<cmath> ...

  5. BZOJ_3881_[Coci2015]Divljak_AC自动机+dfs序+树状数组

    BZOJ_3881_[Coci2015]Divljak_AC自动机+dfs序+树状数组 Description Alice有n个字符串S_1,S_2...S_n,Bob有一个字符串集合T,一开始集合是 ...

  6. BZOJ_5343_[Ctsc2018]混合果汁_二分答案+主席树

    BZOJ_5343_[Ctsc2018]混合果汁_二分答案+主席树 题意:给出每个果汁的价格p,美味度d,最多能放的体积l.定义果汁混合后的美味度为果汁的美味度的最小值. m次询问,要求花费不大于g, ...

  7. [Usaco2018 Feb] New Barns

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=5192 [算法] 维护树的直径,在树上离一个点最远的点一定是一条直径的端点.     ...

  8. 《Microsoft COCO Captions Data Collection and Evaluation Server》论文笔记

    出处:CVPR2015 Motivation 本文描述了MSCoco标题数据集及评估服务器(Microsoft COCO Caption dataset and evaluation server), ...

  9. 记重大失误(SQLserver数据回滚)ApexSQL

    敲了一天代码,脑壳昏,更改数据时忘记加where条件,该数据库又未备份.修改了1800条数据..当时那个着急啊. 各种找解决方法,最后使用ApexSQL Log  完美解决.赞一个 ApexSQL L ...

  10. 13_传智播客iOS视频教程_OC程序的编译链接

    C程序的编译.链接.执行怎么来的?在.C文件里面写上符合C语言部分的源代码.OC也是一样的.记住:OC程序的后缀名是.m. 为什么要链接?第一个.o的目标文件里面它启动不了.因为它没有启动代码我们要加 ...