免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 思一克
打印 上一主题 下一主题

给出一个 netdump 程序, 抓包用的. 如果改进了,也希望贴出 [复制链接]

论坛徽章:
0
1 [报告]
发表于 2005-01-07 20:18 |显示全部楼层

给出一个 netdump 程序, 抓包用的. 如果改进了,也希望贴出

还不错,呵呵
不过你这个功能稍微太弱了点
我帮你改了改,你原来的只能收到IP层的数据,而且只能有针对性的收,现在可以收链路层也就是以太网包
而且是大小各个类型统吃,呵呵
  1. #include <stdio.h>;
  2. #include <unistd.h>;
  3. #include <sys/socket.h>;
  4. #include <netinet/in.h>;
  5. #include <arpa/inet.h>;  
  6. #include <netinet/ip.h>;
  7. #include <string.h>;
  8. #include <netdb.h>;
  9. #include <netinet/tcp.h>;
  10. #include <netinet/udp.h>;
  11. #include <stdlib.h>;
  12. #include <unistd.h>;
  13. #include <signal.h>;
  14. #include <net/if.h>;
  15. #include <sys/ioctl.h>;
  16. #include <sys/stat.h>;
  17. #include <fcntl.h>;
  18. #include <linux/if_ether.h>;

  19. void die(char *why, int n)
  20. {
  21.   perror(why);
  22.   exit(n);
  23. }


  24. int do_promisc(char *nif, int sock )
  25. {
  26.         struct ifreq ifr;
  27.        
  28.         strncpy(ifr.ifr_name, nif,strlen(nif)+1);
  29.           if((ioctl(sock, SIOCGIFFLAGS, &ifr) == -1))
  30.           {        
  31.             die("ioctl", 2);
  32.           }
  33.           ifr.ifr_flags |= IFF_PROMISC;
  34.          
  35.           if(ioctl(sock, SIOCSIFFLAGS, &ifr) == -1 )
  36.           {
  37.             die("ioctl", 3);
  38.           }

  39. }

  40. char buf[2*32767];

  41. main()
  42. {
  43.         struct sockaddr_in addr;
  44.         struct ethhdr *peth;
  45.         struct iphdr *pip;                                                                                                                                                                       
  46.         struct tcphdr *ptcp;
  47.         struct udphdr *pudp;
  48.         /*add more protocol head here....*/
  49.        
  50.         int sock, r, len;                                                                                                                                                                       
  51.         char *data;
  52.         char *ptemp;
  53.        
  54.         char ss[32], dd[32];     
  55.         int i;

  56.           if((sock = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL))) == -1)
  57.                 die("socket", 1);

  58.         do_promisc("eth0", sock);
  59.   
  60.           for(;;)
  61.         {
  62.                     len = sizeof(addr);
  63.                     r = recvfrom(sock,(char *)buf,sizeof(buf), 0, (struct sockaddr *)&addr,&len);
  64.                     buf[r] = 0;
  65.                 ptemp = buf;
  66.                 /*which can get source mac address and destnation address, and which network packet, here is OSI-2, link layer*/
  67.                 peth = (struct ethhdr *)ptemp;
  68.                
  69.                 ptemp += sizeof(struct ethhdr);
  70.                 /*which get IP layer informations, includes which transport protocol, source and destnation IP address...*/               
  71.                     pip = (struct iphdr *)ptemp;

  72.                 /*       
  73.                   * which can get transport layer informations, such as: transport socket port, transport layer includes
  74.                   * TCP, UDP, ICMP, IGMP......, can get which transport protocol from IP header
  75.                   */
  76.                 ptemp += sizeof(struct iphdr);
  77.                 switch(pip->;protocol)
  78.                 {
  79.                         case        IPPROTO_TCP:
  80.                                 ptcp = (struct tcphdr *)ptemp;
  81.                                 printf("TCP pkt:\n");
  82.                                 /*
  83.                                   * and your service code....
  84.                                   */
  85.                         break;

  86.                         case        IPPROTO_UDP:
  87.                                 pudp = (struct udphdr *)ptemp;
  88.                                     printf("UDP pkt:\n len:%d payload len:%d from %s:%d to %s:%d\n",
  89.                                                            r,
  90.                                                            ntohs(pudp->;len),
  91.                                                            strcpy(ss, inet_ntoa(*(struct in_addr*)&(pip->;saddr))),
  92.                                                            ntohs(pudp->;source),
  93.                                                            strcpy(dd, inet_ntoa(*(struct in_addr*)&(pip->;daddr))),
  94.                                                            ntohs(pudp->;dest)
  95.                                 );
  96.                                 /*
  97.                                   * and your service code....
  98.                                   */
  99.                         break;

  100.                         case         IPPROTO_ICMP:
  101.                                 printf("ICMP pkt:\n");
  102.                         break;
  103.                                
  104.                         case         IPPROTO_IGMP:
  105.                                 printf("IGMP pkt:\n");
  106.                         break;

  107.                         /*
  108.                           .
  109.                           .
  110.                           .
  111.                           .
  112.                           .
  113.                           */
  114.                         default:
  115.                                 printf("Unkown pkt, protocl:%d\n", pip->;protocol);
  116.                         break;
  117.                 }
  118.            }       
  119. }
复制代码
[/code]

论坛徽章:
0
2 [报告]
发表于 2005-01-07 20:40 |显示全部楼层

给出一个 netdump 程序, 抓包用的. 如果改进了,也希望贴出

顺便建议一下,我觉得精华区应该更精华一些!
不能是版主就精华哦

论坛徽章:
0
3 [报告]
发表于 2005-01-08 10:02 |显示全部楼层

给出一个 netdump 程序, 抓包用的. 如果改进了,也希望贴出

原帖由 "win_hate" 发表:


的情况么?

有则改之,无则加勉
没别的意思,只想c/c++版更好,本贴楼主好象是版主吧?

论坛徽章:
0
4 [报告]
发表于 2005-01-10 09:59 |显示全部楼层

给出一个 netdump 程序, 抓包用的. 如果改进了,也希望贴出

[quote]原帖由 "思一克"][/quote 发表:

那就请楼主把WIN的程序贴出来看看嘍
WIN下面不用别的库也能做到这个地步吗?

论坛徽章:
0
5 [报告]
发表于 2005-01-10 10:24 |显示全部楼层

给出一个 netdump 程序, 抓包用的. 如果改进了,也希望贴出

好啊,leo_guo@jisung.cn,我很少写WIN程序

论坛徽章:
0
6 [报告]
发表于 2005-01-10 10:48 |显示全部楼层

给出一个 netdump 程序, 抓包用的. 如果改进了,也希望贴出

谢谢,收到!
只能收到第三层IP层的包啊,依然收不到以太网包,还是有差距

论坛徽章:
0
7 [报告]
发表于 2005-01-10 12:48 |显示全部楼层

给出一个 netdump 程序, 抓包用的. 如果改进了,也希望贴出

呵呵,你的程序和我的程序实际上有本质的区别,虽然改动很小
你的程序依然是建立在IP SOCKET的基础上的,只能针对IP层某种协议数据包处理,在处理一种协议包时就不能处理另外一种协议包了.
而我给你改的,是建立在设备上的,是面对所有基于以太网协议的数据包处理.概念要搞清楚.

另回assiss:
精华不精华是无所谓的,是精华又能怎么样呢,目的是把问题搞清楚,只要在CU里可以看贴子回贴子就可以了,是精华又不发钱的想不到我的一句话会有这么多问题出现,呵呵!
我只是提出一点看法而已,既然有那么多讨论就多说几句,首先我声明我不是一个程序员,所以是抱着学习的态度来这里,我只是一个做嵌入底层软件的,和大家差的远.
其次我的建议只是个人看法,对于精华我依然认为要更精华,我对精华的定义是能引导别人进步,解决别人的难题,精华应该出现在最好的基础上的,如果我是版主我会等大家都畅所欲言欲言到一定程度之后再来评定该不该是精华,针对此贴,光有一点程序是远远不能称为精华的,至少应该还有相关的说明,我们的贴子里有吗???否则,精华多了还有精华的意义吗?
OK,气氛好了,继续跟贴

论坛徽章:
0
8 [报告]
发表于 2005-01-10 13:46 |显示全部楼层

给出一个 netdump 程序, 抓包用的. 如果改进了,也希望贴出

不用比了,strcpy不能去掉的,这也是个知识点啊

论坛徽章:
0
9 [报告]
发表于 2005-01-11 10:39 |显示全部楼层

给出一个 netdump 程序, 抓包用的. 如果改进了,也希望贴出

呵呵,教人学坏啊
好,我来配个讲解:
本程序的作用是起到ARP欺骗.首先说一下ARP的作用:
ARP的作用是获取目的IP机器的MAC地址,然后在根据这个MAC地址和IP地址和目标机器进行信息交互,有一点比较重要的就是每个机器在正常工作的情况下只会接受MAC地址是广播地址和MAC地址是自己MAC地址的网络包.
所以加入机器A想和机器B通信,过程如下:

1.A发一个ARP包(这是广播包,谁都可以收到),想去获取机器B的MAC
2.机器B接收到该ARP包并确人是给自己的,返回一个ARP包,告诉A他的MAC
3.A根据获取的MAC进行网络交互

本程序的作用是:
接收到任何一个机器发出来的ARP请求包,立马回一个ARP返回包,里面返回的MAC地址是随机的(够狠,这样网络里的MAC地址和IP地址对应关系就会乱掉了,这样整个网络的数据交互就瘫痪了,哈哈
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP