ooze.c
上传用户:nilegod
上传日期:2007-01-08
资源大小:220k
文件大小:4k
源码类别:

网络截获/分析

开发平台:

C/C++

  1. /*
  2.     ping -- ettercap plugin -- ping a host
  3.     Copyright (C) 2001  ALoR <alor@users.sourceforge.net>, NaGA <crwm@freemail.it>
  4.     This program is free software; you can redistribute it and/or modify
  5.     it under the terms of the GNU General Public License as published by
  6.     the Free Software Foundation; either version 2 of the License, or
  7.     (at your option) any later version.
  8.     This program is distributed in the hope that it will be useful,
  9.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11.     GNU General Public License for more details.
  12.     You should have received a copy of the GNU General Public License
  13.     along with this program; if not, write to the Free Software
  14.     Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  15. */
  16. #include <unistd.h>
  17. #include <fcntl.h>
  18. #include <stdlib.h>
  19. #include <time.h>
  20. #include <sys/time.h>
  21. #include "../../src/include/ec_main.h"
  22. #include "../../src/include/ec_plugins.h"
  23. #include "../../src/include/ec_inet_structures.h"
  24. #include "../../src/include/ec_inet.h"
  25. #include "../../src/include/ec_inet_forge.h"
  26. char Ettercap_Version[] = VERSION;                       // required -- for compatibility
  27. char PlugIn_Info[] = "Ping a host.";
  28. short PlugIn_Version = 4;
  29. void PlugIn_Start(char**argv)
  30. {
  31.    char *buf;
  32.    int sock, MTU, i, reply=0;
  33.    char MyMAC[6], DestMAC[6];
  34.    char MyIP[16];
  35.    ETH_header  *HEther;
  36.    IP_header *HIP;
  37.    char numero[5];
  38.    int num;
  39.    TIME_DECLARE;
  40.    if (!strcmp(Host_Dest.ip, ""))
  41.    {
  42.       Plugin_Output("nNo destination host selected !!n");
  43.       return;
  44.    }
  45.    if (!strcmp(Host_Dest.ip, Inet_MyIPAddress()))
  46.    {
  47.       Plugin_Output("nThis plugin doesn't work on myself !!n");
  48.       return;
  49.    }
  50.    Plugin_Output("nHow many ping ? ");
  51.    Plugin_Input(numero, 5, P_BLOCK);
  52.    num = atoi(numero);
  53.    sock = Inet_OpenRawSock(Options.netiface);
  54.    Inet_GetIfaceInfo(Options.netiface, &MTU, NULL, NULL, NULL);
  55.    Inet_GetMACfromString(Inet_MyMACAddress(), MyMAC);
  56.    //Inet_GetMACfromString(Host_Dest.mac, DestMAC);
  57.    memcpy (DestMAC, Inet_MacFromIP(inet_addr(Host_Dest.ip)), 6);
  58.    strncpy(MyIP,Inet_MyIPAddress(),16);
  59.    buf = Inet_Forge_packet( ETH_HEADER + IP_HEADER + ICMP_HEADER );
  60.    for (i=0; i<num; i++)
  61.    {
  62.          Inet_Forge_ethernet( buf, MyMAC, DestMAC, ETH_P_IP );
  63.          Inet_Forge_ip( buf + ETH_HEADER,
  64.                         inet_addr(MyIP),
  65.                         inet_addr(Host_Dest.ip),
  66.                         sizeof(ICMP_header),
  67.                         0xe77e,
  68.                         0,
  69.                         IPPROTO_ICMP );
  70.          Inet_Forge_icmp( buf + ETH_HEADER + IP_HEADER, ICMP_ECHO, 0, NULL, 0 );
  71.          Inet_SendRawPacket(sock, buf, ETH_HEADER + IP_HEADER + ICMP_HEADER);
  72.          usleep(1000);
  73.    }
  74.    Inet_Forge_packet_destroy( buf );
  75.    Plugin_Output("n%d ICMP echo requests sent to %s. waiting for replies...nn", num, Host_Dest.ip);
  76.    buf = Inet_Forge_packet( MTU );
  77.    fcntl(sock, F_SETFL, O_NONBLOCK);
  78.    TIME_START;
  79.    do
  80.    {
  81.       short pkttype, len;
  82.       len = Inet_GetRawPacket(sock, buf, MTU, &pkttype);
  83.       TIME_FINISH;
  84.       if (len > 0 && pkttype == PACKET_HOST)
  85.       {
  86.          HEther = (ETH_header *) buf;
  87.          if ( ntohs(HEther->type) == ETH_P_IP )
  88.          {
  89.             HIP = (IP_header *)(HEther + 1);
  90.             if (HIP->proto != IPPROTO_ICMP) continue;
  91.             if (HIP->source_ip != inet_addr(Host_Dest.ip)) continue;
  92.             reply++;
  93.             Plugin_Output(" ICMP reply num %2d from %s after %.5f secondsn", reply, Host_Dest.ip, TIME_ELAPSED );
  94.          }
  95.       }
  96.    } while ( (TIME_ELAPSED < 3) && (reply < num) );
  97.    if (!reply) Plugin_Output("nNo replies within 3 seconds !! (host could be down)n");
  98. close(sock);
  99. }
  100. /* EOF */