免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3303 | 回复: 5
打印 上一主题 下一主题

[C] 参照man packet写的程序抓包错误 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-02-27 23:14 |只看该作者 |倒序浏览
我看到了两篇文章:
http://blog.chinaunix.net/space. ... =blog&id=142804
http://blog.chinaunix.net/space. ... og&cuid=1895542
这个链接里面都有。
这个程序抓包打印后的结果是错误的,可是我不知道错在哪里了。
程序清单:
  1. /*
  2. *  Low level network programming in Linux using PF_PACKET
  3. *  Need root privileges
  4. */

  5. #include <stdio.h>
  6. #include <string.h>
  7. #include <stdlib.h>
  8. #include <sys/errno.h>
  9. #include <sys/socket.h>
  10. #include <sys/ioctl.h>
  11. #include <netinet/ip.h>
  12. #include <arpa/inet.h>
  13. #include <linux/if_arp.h> //#include <linux/if_ether.h> //#include <linux/if_packet.h>
  14. #include <unistd.h>

  15. #define RED "\e[31m\e[1m"
  16. #define GREEN "\E[32m\E[1m"
  17. #define YELLOW "\E[33m\E[1m"
  18. #define BLUE "\E[34m\E[1m"  
  19. #define NORMAL "\e[m"

  20. int get_nic_index(int fd, const char* nic_name)
  21. {
  22.         struct ifreq ifr;
  23.         if (nic_name == NULL)
  24.                    return -1;
  25.         memset(&ifr, 0, sizeof(ifr));
  26.         strncpy(ifr.ifr_name, nic_name, IFNAMSIZ);
  27.         if (ioctl(fd, SIOCGIFINDEX, &ifr) == -1) {
  28.                 perror(GREEN"SIOCGIFINDEX ioctl error"NORMAL);
  29.                 return -1;
  30.         }
  31.         return ifr.ifr_ifindex;
  32. }

  33. int set_Iface_promisc(int fd, int dev_id)
  34. {
  35.         struct packet_mreq mr;
  36.         memset(&mr, 0, sizeof(mr));
  37.         mr.mr_ifindex = dev_id;
  38.         mr.mr_type = PACKET_MR_PROMISC;
  39.         if (setsockopt(fd, SOL_PACKET, PACKET_ADD_MEMBERSHIP,&mr,sizeof(mr))==-1) {
  40.                 return -1;
  41.         }
  42.         return 0;
  43. }

  44. int set_nic_promisc(int sockfd, const char *nic_name)
  45. {
  46.         struct ifreq ethreq;
  47.         strncpy(ethreq.ifr_name, nic_name, IFNAMSIZ);
  48.         ioctl(sockfd, SIOCGIFFLAGS, &ethreq);
  49.         ethreq.ifr_flags |= IFF_PROMISC;
  50.         ioctl(sockfd, SIOCSIFFLAGS, &ethreq);
  51.         return 0;
  52. }

  53. int main(int argc, char **argv)
  54. {
  55.         if (argc != 3) {
  56.                 printf("usage: ./a.out <nic_name> <packets num to be capture>\n");
  57.                 exit(1);
  58.         }

  59.         int pktfd;
  60.         int maxpak = 0, ipak = 0;
  61.         int fromlen;
  62.         char buffer[BUFSIZ];
  63.         struct iphdr *iph;
  64.         struct sockaddr_ll sll;

  65.         /* Low level socket */
  66.         pktfd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
  67.         if (pktfd == -1) {
  68.                 perror(RED"Unable to create low level socket"NORMAL);
  69.                 return -1;
  70.         }

  71.         memset(&sll, 0, sizeof(sll));
  72.         sll.sll_family = AF_PACKET;
  73.         sll.sll_protocol = htons(ETH_P_ALL);
  74.         sll.sll_ifindex = get_nic_index(pktfd, argv[1]);


  75.         if (bind(pktfd, (struct sockaddr *) &sll, sizeof(sll)) != 0) {
  76.                 perror(YELLOW"bind error"NORMAL);
  77.                 goto FAIL;
  78.         }
  79.         set_nic_promisc(pktfd, argv[1]);

  80.         //if (set_Iface_promisc(pktfd, sll.sll_ifindex) == -1) {
  81.         //        fprintf(stderr, BLUE"set promisc failed! \n"NORMAL);
  82.         //        goto FAIL;
  83.         //}

  84.         maxpak = atoi(argv[2]);
  85.         while (!maxpak || ipak < maxpak) {
  86.                 fromlen = recv(pktfd, buffer, BUFSIZ, MSG_TRUNC);
  87.                 printf("Buffer Length: %d bytes\n", fromlen);
  88.                 iph = (struct iphdr *) (buffer + sizeof(struct ethhdr));
  89.                 printf("IP Packet from: %s\n", inet_ntoa(*(struct in_addr*)&iph->saddr));
  90.                 printf("IP Packet To: %s\n", inet_ntoa(*(struct in_addr*)&iph->daddr));
  91.                 printf("IP Protocol: %#x\n", iph->protocol);
  92.                 printf("Buffer Content: %s\n\n", buffer);
  93.                 ipak++;
  94.         }

  95.         return 0;

  96. FAIL:
  97.         close(pktfd);
  98.         return -1;
  99. }
复制代码
执行:
./a.out ppp0 20
然后我在浏览器里面刷新了bbs.chinaunix.net,得到的结果
  1. Buffer Length: 63 bytes
  2. IP Packet from: 224.19.190.172
  3. IP Packet To: 1.0.0.1
  4. IP Protocol: 0x35
  5. Buffer Content: E

  6. Buffer Length: 60 bytes
  7. IP Packet from: 217.211.0.0
  8. IP Packet To: 0.0.160.2
  9. IP Protocol: 0x50
  10. Buffer Content: E

  11. Buffer Length: 60 bytes
  12. IP Packet from: 39.63.0.0
  13. IP Packet To: 0.0.160.2
  14. IP Protocol: 0x50
  15. Buffer Content: E

  16. Buffer Length: 60 bytes
  17. IP Packet from: 160.179.0.0
  18. IP Packet To: 0.0.160.2
  19. IP Protocol: 0x50
  20. Buffer Content: E

  21. Buffer Length: 60 bytes
  22. IP Packet from: 191.177.0.0
  23. IP Packet To: 0.0.160.2
  24. IP Protocol: 0x50
  25. Buffer Content: E

  26. Buffer Length: 60 bytes
  27. IP Packet from: 147.66.0.0
  28. IP Packet To: 0.0.160.2
  29. IP Protocol: 0x50
  30. Buffer Content: E

  31. Buffer Length: 60 bytes
  32. IP Packet from: 244.107.0.0
  33. IP Packet To: 0.0.160.2
  34. IP Protocol: 0x50
  35. Buffer Content: E

  36. Buffer Length: 60 bytes
  37. IP Packet from: 253.128.163.180
  38. IP Packet To: 1.0.0.1
  39. IP Protocol: 0x35
  40. Buffer Content: E

  41. Buffer Length: 59 bytes
  42. IP Packet from: 124.104.1.74
  43. IP Packet To: 1.0.0.1
  44. IP Protocol: 0x35
  45. Buffer Content: E

  46. Buffer Length: 60 bytes
  47. IP Packet from: 32.199.73.255
  48. IP Packet To: 1.0.0.1
  49. IP Protocol: 0x35
  50. Buffer Content: E

  51. Buffer Length: 58 bytes
  52. IP Packet from: 156.212.67.134
  53. IP Packet To: 1.0.0.1
  54. IP Protocol: 0x35
  55. Buffer Content: E

  56. Buffer Length: 64 bytes
  57. IP Packet from: 239.186.96.69
  58. IP Packet To: 1.0.0.1
  59. IP Protocol: 0x35
  60. Buffer Content: E

  61. Buffer Length: 60 bytes
  62. IP Packet from: 211.222.99.206
  63. IP Packet To: 1.0.0.1
  64. IP Protocol: 0x35
  65. Buffer Content: E

  66. Buffer Length: 70 bytes
  67. IP Packet from: 110.242.12.194
  68. IP Packet To: 1.0.0.1
  69. IP Protocol: 0x35
  70. Buffer Content: E

  71. Buffer Length: 140 bytes
  72. IP Packet from: 35.7.190.172
  73. IP Packet To: 129.128.0.1
  74. IP Protocol: 0x68
  75. Buffer Content: E

  76. Buffer Length: 60 bytes
  77. IP Packet from: 171.44.0.0
  78. IP Packet To: 0.0.160.2
  79. IP Protocol: 0x50
  80. Buffer Content: E

  81. Buffer Length: 240 bytes
  82. IP Packet from: 208.24.1.74
  83. IP Packet To: 129.128.0.1
  84. IP Protocol: 0x5e
  85. Buffer Content: E

  86. Buffer Length: 58 bytes
  87. IP Packet from: 56.247.84.130
  88. IP Packet To: 1.0.0.1
  89. IP Protocol: 0x35
  90. Buffer Content: E

  91. Buffer Length: 145 bytes
  92. IP Packet from: 174.157.73.255
  93. IP Packet To: 129.128.0.1
  94. IP Protocol: 0x49
  95. Buffer Content: E

  96. Buffer Length: 506 bytes
  97. IP Packet from: 16.68.67.134
  98. IP Packet To: 129.128.0.1
  99. IP Protocol: 0x7b
  100. Buffer Content: E
复制代码
这个无论从IP地址还是Protocol(6, 17)看来都是明显错误的。希望有牛人可以帮忙看看,因为我读手册(man packet)发现好像貌似没有什么问题。
谢谢了。

论坛徽章:
0
2 [报告]
发表于 2011-02-28 11:18 |只看该作者
抓到非ip包时当做ip包解析了。

如果只想抓IP包的话,创建socket时使用htons(ETH_P_IP),或者先解析ethhdr的h_proto,为ETH_P_IP时再做进一步解析。

论坛徽章:
0
3 [报告]
发表于 2011-02-28 13:33 |只看该作者
本帖最后由 LaoLiulaoliu 于 2011-02-28 14:26 编辑

回复 2# csern


    我用wireshark听过了相同的过程,就是能多出来几个DNS的报文,其他的都是和chinaunix的通信,所以才断定这个是错误的。
    我家是拨号上网pppoe

论坛徽章:
0
4 [报告]
发表于 2011-02-28 17:06 |只看该作者
我又在虚拟机里面测试了一下,居然是正确的,见鬼,谢谢2楼的热情回复,让我又多懂了一点点

论坛徽章:
0
5 [报告]
发表于 2011-02-28 17:58 |只看该作者
我怀疑是ppp0和一般的网络接口(如:eth0)的格式不同。但是不知道wireshark是怎么弄的,晚上回家改成ETH_P_IP 试试

论坛徽章:
0
6 [报告]
发表于 2011-02-28 23:40 |只看该作者
找到问题了,pppoe拨号的报文在网络层和IP层之间有
PPP-over-Ethernet Session (6 bytes)
Point-to-Point Protocol (2 bytes) Protocol: IP (0x0021)

网络层的Type: PPPoE Session (0x8864)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP