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

网络截获/分析

开发平台:

C/C++

  1. /*
  2.     ettercap -- illithid -- the sniffer module
  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 <stdlib.h>
  18. #include <sys/time.h>
  19. #include <string.h>
  20. #include <unistd.h>
  21. #include <fcntl.h>
  22. #include <errno.h>
  23. #include <signal.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. #include "include/ec_buffer.h"
  29. #include "include/ec_error.h"
  30. #include "include/ec_dissector.h"
  31. #ifdef DEBUG
  32.    #include "include/ec_debug.h"
  33. #endif
  34. // global data
  35. short IPIDD=0, IPIDS=0;
  36. int SeqS=0, AckS=0, SeqD=0, AckD=0,
  37.     ByteSentS=0, ByteSentD=0, PacketSentS=0,
  38.     PacketSentD=0, datalenS=0, datalenD=0;
  39. int sock, G_PortSource, G_PortDest, IP1, IP2;
  40. int Connection_Mode=1;
  41. unsigned char MAC1[6];
  42. unsigned char MAC2[6];
  43. unsigned char MyMAC[6];
  44. // protos...
  45. int Illithid_ARPBased_GetData(char *iface, char proto, char *IPsource, int PortSource, char *IPdest, int PortDest, char *MAC1, char *MAC2);
  46. int Illithid_ARPBased_GetConnections(char *iface, char *IP1p, char *IP2p, char *MAC1, char *MAC2);
  47. int Illithid_PublicARP_GetConnections(char *iface, char *IP1p, char *IP2p, char *MAC1, char *MAC2);
  48. int Illithid_IPBased_GetConnections(char *iface, char *IP1p, char *IP2p);
  49. int Illithid_MACBased_GetConnections(char *iface, char *MAC1p, char *MAC2p);
  50. int Illithid_ToBeSniffed(char *source, int psource, char *dest, int pdest, SNIFFED_DATA *data);
  51. int Illithid_ToBeSniffed_ip(char *source, char *dest, CONNECTION *data);
  52. void Illithid_GetConnections(short mode, char *iface, char *IP1p, char *IP2p, char *MAC1p, char *MAC2p);
  53. void Illithid_Reset_Conn(void);
  54. //---------------------------
  55. void Illithid_Reset_Conn(void)
  56. {
  57.    int i;
  58.    char *buf1, *buf2, *pck_to_send;
  59.    if (ByteSentS || ByteSentD)
  60.    {
  61. #ifdef DEBUG
  62.    Debug_msg("Illithid_Reset_Conn");
  63. #endif
  64.       buf1 = Inet_Forge_packet( ETH_HEADER + IP_HEADER + TCP_HEADER );
  65.       pck_to_send = buf1;
  66.       pck_to_send += Inet_Forge_ethernet( pck_to_send, MyMAC, MAC2, ETH_P_IP );
  67.       pck_to_send += Inet_Forge_ip( pck_to_send, IP1, IP2, TCP_HEADER, IPIDD+PacketSentD+1, 0, IPPROTO_TCP);
  68.       pck_to_send += Inet_Forge_tcp( pck_to_send, G_PortSource, G_PortDest, SeqD+datalenD+ByteSentD, AckD-ByteSentS, TH_RST | TH_ACK, 0, 0);
  69. #ifdef DEBUG
  70.    Debug_msg("Illithid_Reset_Conn -- packet 1");
  71. #endif
  72.       buf2 = Inet_Forge_packet( ETH_HEADER + IP_HEADER + TCP_HEADER );
  73.       pck_to_send = buf2;
  74.       pck_to_send += Inet_Forge_ethernet( pck_to_send, MyMAC, MAC1, ETH_P_IP );
  75.       pck_to_send += Inet_Forge_ip( pck_to_send, IP2, IP1, TCP_HEADER, IPIDS+PacketSentS+1, 0, IPPROTO_TCP);
  76.       pck_to_send += Inet_Forge_tcp( pck_to_send, G_PortDest, G_PortSource, SeqS+datalenS+ByteSentS, AckS-ByteSentD, TH_RST | TH_ACK, 0, 0);
  77. #ifdef DEBUG
  78.    Debug_msg("Illithid_Reset_Conn -- packet 2");
  79. #endif
  80.       for(i=0; i<5; i++)
  81.       {
  82.          Inet_SendRawPacket(sock, buf1, ETH_HEADER + IP_HEADER + TCP_HEADER );
  83.          Inet_SendRawPacket(sock, buf2, ETH_HEADER + IP_HEADER + TCP_HEADER );
  84.          usleep(1000);
  85.       }
  86.    }
  87. #ifdef DEBUG
  88.    Debug_msg("Illithid_Reset_Conn_END");
  89. #endif
  90. }
  91. int Illithid_ARPBased_GetData(char *iface, char proto, char *IPsource, int PortSource, char *IPdest, int PortDest, char *MAC1p, char *MAC2p)
  92. {
  93.    int MTU, Illithid_pid;
  94.    short pkttype;
  95.    struct in_addr addr;
  96.    ETH_header *eth;
  97.    IP_header *ip;
  98.    TCP_header *tcp;
  99.    unsigned char *data;
  100.    char nchars;
  101.    char tosendchar[150];
  102.    char *ins_pck;
  103.    u_char *buffer;
  104.    SNIFFED_DATA data_to_test;
  105. #ifdef DEBUG
  106.    Debug_msg("Illithid_ARPBased_GetData -- %c [%s:%d] [%s:%d] -- [%s] [%s]", proto, IPsource, PortSource, IPdest, PortDest, MAC1, MAC2);
  107. #endif
  108.    if ((Illithid_pid = fork()))
  109.       return Illithid_pid;
  110.    strcpy(program_argv0, "illidata");
  111.    if (proto == 'T') exit_func(Illithid_Reset_Conn);
  112.    sock = Inet_OpenRawSock(iface);
  113.    Inet_GetIfaceInfo( iface, &MTU, MyMAC, NULL, NULL);
  114.    G_PortSource = PortSource;
  115.    G_PortDest = PortDest;
  116.    inet_aton(IPsource,&addr);
  117.    IP1 = addr.s_addr;
  118.    inet_aton(IPdest,&addr);
  119.    IP2 = addr.s_addr;
  120.    Inet_GetMACfromString(MAC1p, MAC1);
  121.    Inet_GetMACfromString(MAC2p, MAC2);
  122.    fcntl(sock,F_SETFL,O_NONBLOCK);
  123.    fcntl(pipe_inject_stod[0], F_SETFL, O_NONBLOCK);
  124.    fcntl(pipe_inject_dtos[0], F_SETFL, O_NONBLOCK);
  125.    ins_pck = Inet_Forge_packet(MTU);
  126.    buffer = Inet_Forge_packet(MTU);
  127.    for (;;)
  128.    {
  129.       int len;
  130.       char ok;
  131.       //memset(buffer, 0, MTU);
  132.       len = Inet_GetRawPacket(sock, buffer, MTU, &pkttype);
  133.       if (len > 0 && pkttype == PACKET_HOST)
  134.       {
  135.          eth = (ETH_header *)buffer;
  136.          if ( ntohs(eth->type) == ETH_P_IP )
  137.          {
  138.             ip = (IP_header *)(eth+1);
  139.             ok = 0;
  140.             if (ip->dest_ip==IP1 && ip->source_ip==IP2)
  141.             {
  142.                memcpy(eth->dest_mac, MAC1, 6);
  143.                memcpy(eth->source_mac, MyMAC, 6);
  144.                ok = 1;
  145.             }
  146.             if (ip->dest_ip==IP2 && ip->source_ip==IP1)
  147.             {
  148.                memcpy(eth->dest_mac, MAC2, 6);
  149.                memcpy(eth->source_mac, MyMAC, 6);
  150.                ok = 2;
  151.             }
  152.             if (ok && ip->proto == IPPROTO_TCP && proto == 'T')
  153.             {
  154.                tcp = (TCP_header *) ((int)ip + ip->h_len * 4);
  155.                if (ntohs(ip->frag_and_flags) & IP_OFFMASK) goto send;
  156.                strcpy(data_to_test.ip_source, inet_ntoa(*(struct in_addr *)&ip->source_ip) );
  157.                strcpy(data_to_test.ip_dest, inet_ntoa(*(struct in_addr *)&ip->dest_ip) );
  158.                data_to_test.source_port = ntohs(tcp->source);
  159.                data_to_test.dest_port = ntohs(tcp->dest);
  160.                if ( Illithid_ToBeSniffed(IPsource,PortSource, IPdest, PortDest, &data_to_test) )
  161.                {
  162.                   if (ok == 1)
  163.                   {
  164.                      SeqS = ntohl(tcp->seq);
  165.                      AckS = ntohl(tcp->ack_seq);
  166.                      tcp->seq = htonl(SeqS+ByteSentS);
  167.                      tcp->ack_seq = htonl(AckS-ByteSentD);
  168.                      IPIDS = ntohs(ip->ident);
  169.                      ip->ident = htons(IPIDS+PacketSentS);
  170.                      data = (char *)((int)tcp + tcp->doff * 4);
  171.                      datalenS = (int)ip + ntohs(ip->t_len) - (int)data;
  172.                      ip->checksum = 0;
  173.                      tcp->checksum = 0;
  174.                      ip->checksum = Inet_Forge_ChecksumIP( (unsigned short *) ip, sizeof(IP_header));
  175.                      if (tcp->doff*4 > sizeof(TCP_header))
  176.                      {
  177.                          char *pointer;
  178.                          pointer=(char *)(tcp + 1);
  179.                          Inet_Forge_RemoveTimeStamp(pointer,tcp->doff*4-sizeof(TCP_header));
  180.                      }
  181.                      tcp->checksum = Inet_Forge_Checksum((unsigned short *)tcp, IPPROTO_TCP, ntohs(ip->t_len)-ip->h_len*4, IP2, IP1);
  182.                   }
  183.                   else
  184.                   {
  185.                      SeqD = ntohl(tcp->seq);
  186.                      AckD = ntohl(tcp->ack_seq);
  187.                      tcp->seq = htonl(SeqD+ByteSentD);
  188.                      tcp->ack_seq = htonl(AckD-ByteSentS);
  189.                      IPIDD = ntohs(ip->ident);
  190.                      ip->ident = htons(IPIDD+PacketSentD);
  191.                      data = (char *)((int)tcp + tcp->doff * 4);
  192.                      datalenD = (int)ip + ntohs(ip->t_len) - (int)data;
  193.                      ip->checksum = 0;
  194.                      tcp->checksum = 0;
  195.                      ip->checksum = Inet_Forge_ChecksumIP( (unsigned short *) ip, sizeof(IP_header));
  196.                      if (tcp->doff*4 > sizeof(TCP_header))
  197.                      {
  198.                          char *pointer;
  199.                          pointer=(char *)(tcp + 1);
  200.                          Inet_Forge_RemoveTimeStamp(pointer,tcp->doff*4-sizeof(TCP_header));
  201.                      }
  202.                      tcp->checksum = Inet_Forge_Checksum((unsigned short *)tcp, IPPROTO_TCP, ntohs(ip->t_len)-ip->h_len*4, IP2, IP1);
  203.                   }
  204.                }
  205.             }
  206. send:       if (ok) Inet_SendRawPacket(sock, buffer, len);
  207.          }
  208.       }
  209.       else
  210.          usleep(1000);
  211.       nchars = read(pipe_inject_stod[0],tosendchar,MAX_INJECT);
  212.       if (nchars > 0)
  213.       {
  214.          char *pck_to_send;
  215.          pck_to_send = ins_pck;
  216.          pck_to_send += Inet_Forge_ethernet( pck_to_send, MyMAC, MAC2, ETH_P_IP );
  217.          if (proto == 'T')
  218.          {
  219.             pck_to_send += Inet_Forge_ip( pck_to_send, IP1, IP2, TCP_HEADER+nchars, IPIDD+PacketSentD+1, 0, IPPROTO_TCP);
  220.             pck_to_send += Inet_Forge_tcp( pck_to_send, PortSource, PortDest, SeqD+datalenD+ByteSentD, AckD-ByteSentS, TH_PSH | TH_ACK, tosendchar, nchars);
  221.          }
  222.          else if (proto == 'U')
  223.          {
  224.             pck_to_send += Inet_Forge_ip( pck_to_send, IP1, IP2, UDP_HEADER+nchars, IPIDD+PacketSentD+1, 0, IPPROTO_UDP);
  225.             pck_to_send += Inet_Forge_udp( pck_to_send, PortSource, PortDest, tosendchar, nchars);
  226.          }
  227.          Inet_SendRawPacket(sock, ins_pck, pck_to_send-ins_pck);
  228.          ByteSentD+=nchars;
  229.          PacketSentD++;
  230.       }
  231.       nchars = read(pipe_inject_dtos[0],tosendchar,MAX_INJECT);
  232.       if (nchars > 0)
  233.       {
  234.          char *pck_to_send;
  235.          pck_to_send = ins_pck;
  236.          pck_to_send += Inet_Forge_ethernet( pck_to_send, MyMAC, MAC1, ETH_P_IP );
  237.          if (proto == 'T')
  238.          {
  239.             pck_to_send += Inet_Forge_ip( pck_to_send, IP2, IP1, TCP_HEADER+nchars, IPIDS+PacketSentS+1, 0, IPPROTO_TCP);
  240.             pck_to_send += Inet_Forge_tcp( pck_to_send, PortDest, PortSource, SeqS+datalenS+ByteSentS, AckS-ByteSentD, TH_PSH | TH_ACK, tosendchar, nchars);
  241.          }
  242.          else if (proto == 'U')
  243.          {
  244.             pck_to_send += Inet_Forge_ip( pck_to_send, IP2, IP1, UDP_HEADER+nchars, IPIDS+PacketSentS+1, 0, IPPROTO_UDP);
  245.             pck_to_send += Inet_Forge_udp( pck_to_send, PortDest, PortSource, tosendchar, nchars);
  246.          }
  247.          Inet_SendRawPacket(sock, ins_pck, pck_to_send-ins_pck);
  248.          ByteSentS+=nchars;
  249.          PacketSentS++;
  250.       }
  251.    }
  252. }
  253. int Illithid_ARPBased_GetConnections(char *iface, char *IP1p, char *IP2p, char *MAC1p, char *MAC2p)
  254. {
  255.    int Illithid_pid;
  256. #ifdef DEBUG
  257.    Debug_msg("Illithid_ARPBased_GetConnections -- [%s] [%s] [%s] [%s]", IP1p, IP2p, MAC1p, MAC2p);
  258. #endif
  259.    if (!(Illithid_pid = fork()))
  260.       Illithid_GetConnections(ARPBASED, iface, IP1p, IP2p, MAC1p, MAC2p);
  261.    else
  262.       return Illithid_pid;
  263.    return 0;
  264. }
  265. int Illithid_PublicARP_GetConnections(char *iface, char *IP1p, char *IP2p, char *MAC1p, char *MAC2p)
  266. {
  267.    int Illithid_pid;
  268. #ifdef DEBUG
  269.    Debug_msg("Illithid_PublicARP_GetConnections -- [%s] [%s] [%s] [%s]", IP1p, IP2p, MAC1p, MAC2p);
  270. #endif
  271.    if (!(Illithid_pid = fork()))
  272.       Illithid_GetConnections(PUBLICARP, iface, IP1p, IP2p, MAC1p, MAC2p);
  273.    else
  274.       return Illithid_pid;
  275.    return 0;
  276. }
  277. int Illithid_IPBased_GetConnections(char *iface, char *IP1p, char *IP2p)
  278. {
  279.       int Illithid_pid;
  280. #ifdef DEBUG
  281.    Debug_msg("Illithid_IPBased_GetConnections -- [%s] [%s]", IP1p, IP2p);
  282. #endif
  283.    if (!(Illithid_pid = fork()))
  284.            Illithid_GetConnections(IPBASED, iface, IP1p, IP2p, "", "");
  285.    else
  286.       return Illithid_pid;
  287.    return 0;
  288. }
  289. int Illithid_MACBased_GetConnections(char *iface, char *MAC1p, char *MAC2p)
  290. {
  291.       int Illithid_pid;
  292. #ifdef DEBUG
  293.    Debug_msg("Illithid_MACBased_GetConnections -- [%s] [%s]", MAC1p, MAC2p);
  294. #endif
  295.    if (!(Illithid_pid = fork()))
  296.       Illithid_GetConnections(MACBASED, iface, "", "", MAC1p, MAC2p);
  297.    else
  298.       return Illithid_pid;
  299.    return 0;
  300. }
  301. void Illithid_GetConnections(short mode, char *iface, char *IP1p, char *IP2p, char *MAC1p, char *MAC2p)
  302. {
  303.    int len, MTU;
  304.    short pkttype;
  305.    struct in_addr addr;
  306.    ETH_header *eth;
  307.    IP_header *ip;
  308.    TCP_header *tcp;
  309.    UDP_header *udp;
  310.    CONNECTION data_to_ettercap;
  311.    SNIFFED_DATA sniff_data_to_ettercap;
  312.    u_char *buffer;
  313.    u_long IP_Test, NetMask;
  314.    int Act_Connection_Mode;
  315.    strcpy(program_argv0, "illithid");
  316.    inet_aton(IP1p,&addr);
  317.    IP1 = addr.s_addr;
  318.    inet_aton(IP2p,&addr);
  319.    IP2 = addr.s_addr;
  320.    Inet_GetMACfromString(MAC1p, MAC1);
  321.    Inet_GetMACfromString(MAC2p, MAC2);
  322.    sock = Inet_OpenRawSock(iface);
  323.    Inet_GetIfaceInfo( iface, &MTU, MyMAC, &IP_Test, &NetMask);
  324.    if (mode > PUBLICARP)
  325.        Inet_SetPromisc(iface);
  326.    else
  327.       IP_Test=IP_Test&NetMask;
  328.    buffer = Inet_Forge_packet(MTU);
  329.    for (;;)
  330.    {
  331.       if (getppid() == 1) exit(0);
  332.       memset(&data_to_ettercap, 0, sizeof(CONNECTION));
  333.       memset(&sniff_data_to_ettercap, 0, sizeof(SNIFFED_DATA));
  334.       memset(buffer, 0, MTU);
  335.       len = Inet_GetRawPacket(sock, buffer, MTU, &pkttype);
  336.       Act_Connection_Mode=Connection_Mode;
  337.       if (len > 0 && ( mode > PUBLICARP || pkttype == PACKET_HOST))
  338.       {
  339.          char ok1 = 0;
  340.          eth = (ETH_header *)buffer;
  341.          memcpy(data_to_ettercap.mac_source,eth->source_mac,6);
  342.          if (mode == MACBASED)
  343.          {
  344.             if ( memcmp(eth->source_mac, MAC1, 6) != 0 && memcmp(eth->source_mac, MAC2, 6) != 0 ) continue;
  345.             if ( memcmp(eth->dest_mac, MAC1, 6) != 0 && memcmp(eth->dest_mac, MAC2, 6) != 0 ) continue;
  346.             ok1 = 1;
  347.          }
  348.          if ( ntohs(eth->type) == ETH_P_IP )
  349.          {
  350.             ip = (IP_header *)(eth+1);
  351.             strcpy(data_to_ettercap.ip_source, inet_ntoa(*(struct in_addr *)&ip->source_ip) );
  352.             strcpy(data_to_ettercap.ip_dest, inet_ntoa(*(struct in_addr *)&ip->dest_ip) );
  353.             strcpy(sniff_data_to_ettercap.ip_source, inet_ntoa(*(struct in_addr *)&ip->source_ip) );
  354.             strcpy(sniff_data_to_ettercap.ip_dest, inet_ntoa(*(struct in_addr *)&ip->dest_ip) );
  355.             if ( mode == IPBASED && Illithid_ToBeSniffed_ip(IP1p, IP2p, &data_to_ettercap) ) ok1 = 1;
  356.             if ( mode == ARPBASED && (ip->dest_ip==IP1 || ip->source_ip==IP2) && (((ip->dest_ip&NetMask)!=IP_Test || (ip->source_ip&NetMask)!=IP_Test)
  357.                  || (ip->dest_ip==IP1 && ip->source_ip==IP2)))
  358.             {
  359.                memcpy(eth->dest_mac, MAC1, 6);
  360.                memcpy(eth->source_mac, MyMAC, 6);
  361.                ok1 = 1;
  362.             }
  363.             if ( mode == ARPBASED && (ip->dest_ip==IP2 || ip->source_ip==IP1) && (((ip->dest_ip&NetMask)!=IP_Test || (ip->source_ip&NetMask)!=IP_Test)
  364.                  || (ip->dest_ip==IP2 && ip->source_ip==IP1)))
  365.             {
  366.                memcpy(eth->dest_mac, MAC2, 6);
  367.                memcpy(eth->source_mac, MyMAC, 6);
  368.                ok1 = 1;
  369.             }
  370.             if (mode == PUBLICARP && !Act_Connection_Mode) ok1=1;
  371.             if ( mode == PUBLICARP && !strcmp(data_to_ettercap.ip_dest,IP1p))
  372.             {
  373.                memcpy(eth->dest_mac, MAC1, 6);
  374.                memcpy(eth->source_mac, MyMAC, 6);
  375.                ok1 = 1;
  376.             }
  377.             else
  378.             if ( mode == PUBLICARP && !strcmp(data_to_ettercap.ip_dest,IP2p))
  379.             {
  380.                memcpy(eth->dest_mac, MAC2, 6);
  381.                memcpy(eth->source_mac, MyMAC, 6);
  382.                ok1 = 1;
  383.             }
  384.             else
  385.             if ( mode == PUBLICARP && (ip->dest_ip&NetMask)!=IP_Test)
  386.             {
  387.                if (!strcmp(IP1p,""))
  388.                   memcpy(eth->dest_mac, MAC2, 6);
  389.                else
  390.                   memcpy(eth->dest_mac, MAC1, 6);
  391.                memcpy(eth->source_mac, MyMAC, 6);
  392.                ok1 = 1;
  393.             }
  394.             memcpy(data_to_ettercap.mac_dest,eth->dest_mac,6);
  395.             if ( ok1 && ip->proto == IPPROTO_TCP)
  396.             {
  397.                unsigned char *data;
  398.                int datalen;
  399.                tcp = (TCP_header *) ((int)ip + ip->h_len * 4);
  400.                if (!( ntohs(ip->frag_and_flags) & IP_OFFMASK))
  401.                {
  402.                   data = (char *)((int)tcp + tcp->doff * 4);
  403.                   datalen = (int)ip + ntohs(ip->t_len) - (int)data;
  404.                   if (Act_Connection_Mode)
  405.                   {
  406.                       data_to_ettercap.source_port = ntohs(tcp->source);
  407.                       data_to_ettercap.dest_port = ntohs(tcp->dest);
  408.                       data_to_ettercap.source_seq = ntohl(tcp->seq) + datalen;
  409.                       data_to_ettercap.dest_seq = ntohl(tcp->seq) + datalen;
  410.                       data_to_ettercap.flags = tcp->flags;
  411.                       data_to_ettercap.proto = 'T';
  412.                       data_to_ettercap.datalen = datalen;
  413.                       Dissector_Connections( mode, IPPROTO_TCP, (u_char *)tcp, &data_to_ettercap, Act_Connection_Mode);
  414.                       Buffer_Put(pipe_with_illithid, &data_to_ettercap, sizeof(CONNECTION));
  415.                   }
  416.                   else
  417.                   {
  418.                       sniff_data_to_ettercap.source_port = ntohs(tcp->source);
  419.                       sniff_data_to_ettercap.dest_port = ntohs(tcp->dest);
  420.                       sniff_data_to_ettercap.seq = ntohl(tcp->seq);
  421.                       sniff_data_to_ettercap.ack_seq = ntohl(tcp->ack_seq);
  422.                       sniff_data_to_ettercap.flags = tcp->flags;
  423.                       sniff_data_to_ettercap.proto = 'T';
  424.                       datalen = (datalen > MAX_DATA) ? MAX_DATA : datalen;
  425.                       sniff_data_to_ettercap.datasize = datalen;
  426.                       memset(&sniff_data_to_ettercap.data, 0, sizeof(sniff_data_to_ettercap.data));
  427.                       memcpy(&sniff_data_to_ettercap.data, data, datalen);
  428.                       Dissector_Connections( mode, IPPROTO_TCP, (u_char *)tcp, &sniff_data_to_ettercap, Act_Connection_Mode);
  429.                       Buffer_Put(pipe_with_illithid_data, &sniff_data_to_ettercap, sizeof(SNIFFED_DATA));
  430.                   }
  431.                }
  432.             }
  433.             if ( ok1 && ip->proto == IPPROTO_UDP)
  434.             {
  435.                unsigned char *data;
  436.                int datalen;
  437.                udp = (UDP_header *) ((int)ip + ip->h_len * 4);
  438.                if (!( ntohs(ip->frag_and_flags) & IP_OFFMASK))
  439.                {
  440.                   data =  (char *)((int)udp + UDP_HEADER);
  441.                   datalen = ntohs(udp->len) - UDP_HEADER;
  442.                   if (Act_Connection_Mode)
  443.                   {
  444.                      data_to_ettercap.source_port = ntohs(udp->source);
  445.                      data_to_ettercap.dest_port = ntohs(udp->dest);
  446.                      data_to_ettercap.proto = 'U';
  447.                      data_to_ettercap.datalen = datalen;
  448.                      Dissector_Connections( mode, IPPROTO_UDP, (u_char *)udp, &data_to_ettercap, Act_Connection_Mode);
  449.                      Buffer_Put(pipe_with_illithid, &data_to_ettercap, sizeof(CONNECTION));
  450.                   }
  451.                   else
  452.                   {
  453.                      sniff_data_to_ettercap.source_port = ntohs(udp->source);
  454.                      sniff_data_to_ettercap.dest_port = ntohs(udp->dest);
  455.                      sniff_data_to_ettercap.proto = 'U';
  456.                      datalen = (datalen > MAX_DATA) ? MAX_DATA : datalen;
  457.                      sniff_data_to_ettercap.datasize = datalen;
  458.                      memset(&sniff_data_to_ettercap.data, 0, sizeof(sniff_data_to_ettercap.data));
  459.                      memcpy(&sniff_data_to_ettercap.data, data, datalen);
  460.                      Dissector_Connections( mode, IPPROTO_UDP, (u_char *)udp, &sniff_data_to_ettercap, Act_Connection_Mode);
  461.                      Buffer_Put(pipe_with_illithid_data, &sniff_data_to_ettercap, sizeof(SNIFFED_DATA));
  462.                   }
  463.                }
  464.             }
  465.             if (mode <= PUBLICARP && ok1 && Act_Connection_Mode) Inet_SendRawPacket(sock, buffer, len);
  466.          }
  467.       }
  468.    }
  469. }
  470. int Illithid_ToBeSniffed(char *source, int psource, char *dest, int pdest, SNIFFED_DATA *data)
  471. {
  472.    char s=0, ps=0, d=0, pd=0;
  473.    if (psource == 0) ps = 1;
  474.    if (pdest == 0) pd = 1;
  475.    if (!strcmp(source, "")) s = 1;
  476.    if (!strcmp(dest, "")) d = 1;
  477.    if (s || !strcmp(source, data->ip_source))
  478.       if (ps || psource == data->source_port)
  479.       {  s = 1;   ps = 1;  }
  480.    if (s || !strcmp(source, data->ip_dest))
  481.       if (ps || psource == data->dest_port)
  482.       {  s = 1;   ps = 1;  }
  483.    if (d || !strcmp(dest, data->ip_source))
  484.       if (pd || pdest == data->source_port)
  485.       {  d = 1;   pd = 1;  }
  486.    if (d || !strcmp(dest, data->ip_dest))
  487.       if (pd || pdest == data->dest_port)
  488.       {  d = 1;   pd = 1;  }
  489.    return ( s && ps && d && pd );
  490. }
  491. int Illithid_ToBeSniffed_ip(char *source, char *dest, CONNECTION *data)
  492. {
  493.    char s=0, d=0;
  494.    if (!strcmp(source, "")) s = 1;
  495.    if (!strcmp(dest, "")) d = 1;
  496.    if (s || !strcmp(source, data->ip_source)) s = 1;
  497.    if (s || !strcmp(source, data->ip_dest)) s = 1;
  498.    if (d || !strcmp(dest, data->ip_source)) d = 1;
  499.    if (d || !strcmp(dest, data->ip_dest)) d = 1;
  500.    return ( s && d );
  501. }
  502. /* EOF */