Опытный
 
Профиль
Группа: Участник
Сообщений: 287
Регистрация: 12.3.2013
Репутация: нет Всего: нет
|
Здравствуйте. Пытаюсь отправить пакет, софт говорит что отправка прошла успешно, но в результате, судя по фаерволу, соединения не появляется, а вместо этого в разделе открытых портов фаервол пишет local:any Вот сам код | Код | //IP-заголовок 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; //TCP-заголовок 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;
function CheckSum(var Buffer; Size : integer) : Word; type TWordArray = array[0..1] of Word; var ChkSum : longWord; i : Integer; begin ChkSum := 0; i := 0; while Size > 1 do begin ChkSum := ChkSum + TWordArray(Buffer)[i]; inc(i); Size := Size - SizeOf(Word); end; if Size=1 then ChkSum := ChkSum + Byte(TWordArray(Buffer)[i]); ChkSum := (ChkSum shr 16) + (ChkSum and $FFFF); ChkSum := ChkSum + (Chksum shr 16); Result := Word(ChkSum); end;
procedure go; var wsaData : TWSAData; FSocket:TSocket; op,nTimeOver:integer; ipHeader:iph; FromIp:string; j,RandIp:integer; Buffer:array[0..3] of string; DestIp:Pchar; TCPHeader:tcph; i,port:integer; ChecksumSize,TcpHeaderLen:integer; DataPointer:pointer; TCPIP:array[0..4096] of char; SockAddr_in:TSockAddr; begin port:=80; DestIp:='67.228.172.2'; 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:=SizeOf(ipHeader); ipHeader.ip_tos:=0; //Приоритет пакета ipHeader.ip_id:=1; //id-пакета ipHeader.ip_offset:=0; //смещение ipHeader.ip_ttl:=128; //время жизни пакета ipHeader.ip_protocol:=IPPROTO_TCP; //протокол FromIp:=''; For j:=0 to 3 do begin RandIp:=random(254)+1; Fromip:=Fromip+IntToStr(RandIp); if (j<3) then Fromip:=Fromip+'.'; end; ipHeader.ip_saddr:=inet_addr(pchar(FromIp)); ipHeader.ip_daddr:=inet_addr(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-пакета, которая расчитывается ниже //Расчет контрольной суммы ChecksumSize:=0; 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 := 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));
SockAddr_in.sin_family:=AF_INET; SockAddr_in.sin_port:=TCPHeader.th_dport; SockAddr_in.sin_addr.S_addr:=ipHeader.ip_daddr;
// После чего его нужно отправить if sendto(FSocket,TCPIP,ChecksumSize,0,SockAddr_in,Sizeof(SockAddr_In))=SOCKET_ERROR then MessageBox(0,Pchar(syserrormessage(WSAGetLastError)),'',0) else ShowMessage('Send ok'); end;
|
Вопрос, что я делаю не правильно? Как отправить пакет? заренее благодарен Это сообщение отредактировал(а) lollollollol - 18.4.2013, 20:59
|