Здравствуйте форумчане вот возникла необходимость сформировать и отправить tcp пакет, погуглив наше код он был предназначен для ddos атаки, убрав цикл который отправлял несколько пакетов, обьявив некоторые переменные получил код приведенный ниже, но он все равно выдает ошибки, код использует winsock2,кому не трудно посмотрите пожалуйстая,и если не трудно сделайте комментарии основных моментов: как формируется и отправляется пакет.Заранее спасибо.
| Код | iph = record ip_verlen: byte; ip_tos: byte; ip_len: word; ip_id: word; 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;
var Form1: TForm1; ipHeader :iph; TCPHeader: tcph; implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); var WSAdata: TWSAData; FSocket: TSocket; port,op,nTimeOver,i : Integer; 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));
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; ipHeader.ip_offset:=0; ipHeader.ip_ttl:=128; ipHeader.ip_protocol:=IPPROTO_TCP; FromIp:=''; For j:=0 to 3 do begin RandIp:=random(255); Str(Randip,Buffer[j]); end; lstrcat(Fromip,Buffer[0]); lstrcat(Fromip,'.'); lstrcat(Fromip,Buffer[1]); lstrcat(Fromip,'.'); lstrcat(Fromip,Buffer[2]); lstrcat(Fromip,'.'); lstrcat(Fromip,Buffer[3]); ipHeader.ip_saddr:=inet_addr(FromIp); ipHeader.ip_daddr:=inet_addr(DestIp) ;
TCPHeader.th_sport:=htons(Random(65000)); TCPHeader.th_dport:=htons(port); TCPHeader.th_seq:=Random(4294967295); TCPHeader.th_ack:=0; TCPHeader.th_len:=80; TCPHeader.th_flags:=2; TCPHeader.th_win:=htons(65535); TCPHeader.th_upr:=0; TCPHeader.th_checksum:=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 := 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));
if (sendto(FSocket,TCPIP,Size,0,SockAddr_in,Sizeof(So ckAddr_In))=SOCKET_ERROR) then memo1.lines.Add('error'); else memo1.lines.Add('ok'); end;
|
|