📄 ec_inet_linux.c
字号:
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 + -