⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ec_inet_linux.c

📁 Ettercap最初设计为交换网上的sniffer
💻 C
📖 第 1 页 / 共 2 页
字号:
   static struct sockaddr_ll dest;   static struct ifreq ifr;#else   static struct sockaddr dest;#endif   if (first_time)   {      memset(&dest, 0, sizeof (dest));      first_time = 0;      #if defined (HAVE_PF_PACKET) && defined (NETPACKET_PACKET_H)         memset(&ifr, 0, sizeof(ifr));         strncpy(ifr.ifr_name, Options.netiface, sizeof(ifr.ifr_name));         if ( ioctl(sock, SIOCGIFINDEX, &ifr) < 0)            ERROR_MSG("ioctl(SIOCGIFINDEX)");         dest.sll_family = AF_PACKET;         dest.sll_ifindex = ifr.ifr_ifindex;         dest.sll_protocol = htons(ETH_P_ALL);      #else         strncpy(dest.sa_data, Options.netiface, sizeof (dest.sa_data));      #endif   }   sent = sendto(sock, buffer, len, 0, (struct sockaddr *)&dest, sizeof(dest));   if (sent < len)   {      while (errno == ENOBUFS)      {         usleep(5000);         sent = sendto(sock, buffer, len, 0, (struct sockaddr *)&dest, sizeof(dest));         if (sent == len) return (sent);      }      Error_msg("ec_inet_linux:%d sendto() %d(%d) | ERRNO : %d | %s \n", __LINE__, len, sent, errno, strerror(errno));   }   return (sent);}int Inet_SetPromisc(char *iface){   int sock;   struct ifreq ifr;   DEBUG_MSG("Inet_SetPromisc\tiface: %s", iface);   sock = Inet_OpenRawSock(iface);   memset(&ifr, 0, sizeof(ifr));   strncpy(ifr.ifr_name, iface, sizeof(ifr.ifr_name));   if ( ioctl(sock, SIOCGIFFLAGS, &ifr) < 0 )      ERROR_MSG("ioctl(SIOCGIFFLAGS)");   memset(&old_ifr, 0, sizeof(old_ifr));   old_ifr.ifr_flags = ifr.ifr_flags;              //save old flags   if (!(ifr.ifr_flags & IFF_PROMISC))   {      ifr.ifr_flags |= IFF_PROMISC;      if ( ioctl(sock, SIOCSIFFLAGS, &ifr) < 0 )      // promisc mode         ERROR_MSG("ioctl(SIOCSIFFLAGS) | promisc on");      atexit(Inet_Restore_ifr);   }   Inet_CloseRawSock(sock);   return 0;}void Inet_Restore_ifr(void){   int sock;   struct ifreq ifr;   DEBUG_MSG("Inet_Restore_ifr");   sock = Inet_OpenRawSock(Options.netiface);   memset(&ifr, 0, sizeof(ifr));   strncpy(ifr.ifr_name, Options.netiface, sizeof(ifr.ifr_name));   ifr.ifr_flags = old_ifr.ifr_flags;   if ( ioctl(sock, SIOCSIFFLAGS, &ifr) < 0 )     // flag restoring      ERROR_MSG("ioctl(SIOCSIFFLAGS) | flag restoring");   Inet_CloseRawSock(sock);}void Inet_DisableForwarding(void){   FILE *fd;   fd = fopen("/proc/sys/net/ipv4/ip_forward", "r");   if (fd == NULL)      Error_msg("failed to open /proc/sys/net/ipv4/ip_forward");   fscanf(fd, "%c", &IpForward_status);   fclose(fd);   DEBUG_MSG("Inet_DisableForwarding from %c", IpForward_status);   atexit(Inet_RestoreForwarding);   fd = fopen("/proc/sys/net/ipv4/ip_forward", "w");   if (fd == NULL)      Error_msg("failed to open /proc/sys/net/ipv4/ip_forward");   fprintf(fd, "0");   fclose(fd);}void Inet_RestoreForwarding(void){   FILE *fd;   if (strcmp(ECThread_getname(pthread_self()), PROGRAM)) return;   fd = fopen("/proc/sys/net/ipv4/ip_forward", "w");   if (fd == NULL)      Error_msg("failed to open /proc/sys/net/ipv4/ip_forward");   DEBUG_MSG("Inet_RestoreForwarding to %c", IpForward_status);   fprintf(fd, "%c", IpForward_status );   fclose(fd);}char *Inet_MacFromIP(unsigned long ip){   int sock_raw;   static struct arpreq ar;   struct sockaddr_in *sa_in;   DEBUG_MSG("Inet_MacFromIP");   memset((char *)&ar, 0, sizeof(ar));   strncpy(ar.arp_dev, Options.netiface, sizeof(ar.arp_dev));   sa_in = (struct sockaddr_in *)&ar.arp_pa;   sa_in->sin_family = AF_INET;   sa_in->sin_addr.s_addr = ip;   sock_raw =Inet_OpenRawSock(Options.netiface);   if (ioctl(sock_raw, SIOCGARP, (caddr_t)&ar) == -1)  // not in cache... try to find it...   {      struct recv_packet recvpck;      char MyMAC[6];      u_long MyIP;      int MTU, sock;      TIME_DECLARE;      DEBUG_MSG("Inet_MacFromIP -- try to find it");      sock = Inet_OpenRawSock(Options.netiface);      Inet_GetIfaceInfo(Options.netiface, &MTU, MyMAC, &MyIP, NULL);      if (ip == MyIP) {         DEBUG_MSG("Inet_MacFromIP -- try to find me... ;)");         memcpy(&ar.arp_ha.sa_data, MyMAC, ETHER_ADDR_LEN);         Inet_CloseRawSock(sock);         Inet_CloseRawSock(sock_raw);         return (char *) ar.arp_ha.sa_data;      }      recvpck.buf = Inet_Forge_packet( MTU + ALIGN_ETH_TO_WORD );      recvpck.aligned = recvpck.buf + ALIGN_ETH_TO_WORD;      Inet_Forge_ethernet( recvpck.aligned, MyMAC, ETH_BROADCAST, ETH_P_ARP );      Inet_Forge_arp(recvpck.aligned + ETH_HEADER, ARPOP_REQUEST,                         MyMAC, MyIP,                         ARP_BROADCAST, ip );      Inet_SendRawPacket(sock, recvpck.aligned, ETH_HEADER + ARP_HEADER);		memset(recvpck.aligned, 0, MTU);      fcntl(sock, F_SETFL, O_NONBLOCK);      TIME_START;      do      {         int len;         short pkttype;         ETH_header *ethpkt;         ARP_header *arppkt;         len = Inet_GetRawPacket(sock, recvpck.aligned, MTU, &pkttype);         ethpkt = (ETH_header *)recvpck.aligned;         arppkt = (ARP_header *)(ethpkt + 1);         TIME_FINISH;         if (len > 0 && pkttype == PACKET_HOST && ethpkt->type == htons(ETH_P_ARP) && arppkt->opcode == htons(ARPOP_REPLY))         {            if ( *(unsigned long *)arppkt->source_ip == ip )            {               memcpy(&ar.arp_ha.sa_data, &arppkt->source_add, ETHER_ADDR_LEN);               Inet_Forge_packet_destroy( recvpck.buf );               Inet_CloseRawSock(sock);               Inet_CloseRawSock(sock_raw);               return (char *) ar.arp_ha.sa_data;            }         }      } while ( TIME_ELAPSED < 0.5 );		Inet_Forge_packet_destroy( recvpck.buf );      Inet_CloseRawSock(sock);      Inet_CloseRawSock(sock_raw);      return ETH_BROADCAST;  // workaround for non local ip   }   Inet_CloseRawSock(sock_raw);   return (char *) ar.arp_ha.sa_data;}#ifdef PERMIT_HTTPS// ARP ENTRY MANAGEMENT ---------------------------unsigned long SavedIP;unsigned char SavedMAC[6];void Inet_UnSetARPEntry(void){   struct arpreq req;   int sockfd;   struct sockaddr_in *sa_in;   DEBUG_MSG("Inet_UnSetARPEntry");   sockfd = socket(AF_INET, SOCK_DGRAM, 0);   memset((char *) &req, 0, sizeof(req));   sa_in = (struct sockaddr_in *)&req.arp_pa;   sa_in->sin_family = AF_INET;   sa_in->sin_addr.s_addr = SavedIP;   req.arp_flags = ATF_PERM | ATF_COM;   memcpy(req.arp_ha.sa_data, SavedMAC, 6);   strlcpy(req.arp_dev, Options.netiface, sizeof(req.arp_dev));   ioctl(sockfd, SIOCDARP, &req);   close(sockfd);}int Inet_SetARPEntry(unsigned long IP, char MAC[6]){   struct arpreq req;   int sockfd;   struct sockaddr_in *sa_in;   int retval;   DEBUG_MSG("Inet_SetARPEntry");   sockfd = socket(AF_INET, SOCK_DGRAM, 0);   memset((char *) &req, 0, sizeof(req));   sa_in = (struct sockaddr_in *)&req.arp_pa;   sa_in->sin_family = AF_INET;   sa_in->sin_addr.s_addr = IP;   req.arp_flags = ATF_PERM | ATF_COM;   memcpy(req.arp_ha.sa_data, MAC, 6);   strlcpy(req.arp_dev, Options.netiface, sizeof(req.arp_dev));   retval = ioctl(sockfd, SIOCSARP, &req);   close(sockfd);   SavedIP=IP;   memcpy(SavedMAC, MAC, 6);   atexit(Inet_UnSetARPEntry);   return retval;}// ROUTE MANAGEMENT ---------------------------struct rtentry{    unsigned long int rt_pad1;    struct sockaddr_in rt_dst;    struct sockaddr_in rt_gateway;    struct sockaddr_in rt_genmask;    unsigned short int rt_flags;    short int rt_pad2;    unsigned long int rt_pad3;    unsigned char rt_tos;    unsigned char rt_class;    short int rt_pad4;    short int rt_metric;    char *rt_dev;    unsigned long int rt_mtu;    unsigned long int rt_window;    unsigned short int rt_irtt;};void Inet_UnsetRoute(void){    int skfd;    struct rtentry rt;    DEBUG_MSG("Inet_UnsetRoute");    skfd = socket(AF_INET, SOCK_DGRAM, 0);    memset((char *)&rt,0, sizeof(struct rtentry));    rt.rt_dst.sin_family=AF_INET;    rt.rt_dst.sin_addr.s_addr=inet_addr("1.0.0.1");    rt.rt_genmask.sin_family=AF_INET;    rt.rt_genmask.sin_addr.s_addr=inet_addr("255.255.255.255");    rt.rt_flags=5;    rt.rt_dev=Options.netiface;    ioctl(skfd, SIOCDELRT, &rt);    rt.rt_dst.sin_addr.s_addr=inet_addr("1.0.0.0");    rt.rt_gateway.sin_family=AF_INET;    rt.rt_gateway.sin_addr.s_addr=inet_addr("1.0.0.1");    rt.rt_genmask.sin_addr.s_addr=inet_addr("255.0.0.0");    rt.rt_flags=3;    ioctl(skfd, SIOCDELRT, &rt);    close(skfd);}void Inet_SetRoute(void){    int skfd;    struct rtentry rt;    DEBUG_MSG("Inet_SetRoute");    skfd = socket(AF_INET, SOCK_DGRAM, 0);    memset((char *)&rt,0, sizeof(struct rtentry));    rt.rt_dst.sin_family=AF_INET;    rt.rt_dst.sin_addr.s_addr=inet_addr("1.0.0.1");    rt.rt_genmask.sin_family=AF_INET;    rt.rt_genmask.sin_addr.s_addr=inet_addr("255.255.255.255");    rt.rt_flags=5;    rt.rt_dev=Options.netiface;    ioctl(skfd, SIOCADDRT, &rt);    rt.rt_dst.sin_addr.s_addr=inet_addr("1.0.0.0");    rt.rt_gateway.sin_family=AF_INET;    rt.rt_gateway.sin_addr.s_addr=inet_addr("1.0.0.1");    rt.rt_genmask.sin_addr.s_addr=inet_addr("255.0.0.0");    rt.rt_flags=3;    ioctl(skfd, SIOCADDRT, &rt);    close(skfd);    atexit(Inet_UnsetRoute);}#endif/* EOF */// vim:ts=3:expandtab

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -