Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2006.05.07;
Скачать: [xml.tar.bz2];

Вниз

отправка сообщения icmp - reply под Windows XP   Найти похожие ветки 

 
zag2art   (2006-01-07 16:29) [0]

Подскажите пожалуйса.

Пытаюсь отправить несколько сообщений icmp - reply (тип 0) в сеть под Виндовс ХР - не выходит не как. (делаю это при помощи сырых сокетов). меняю тип на 8 - то есть на icmp - реквест все работает... Может винда как-то запрещает мне их отсылать???  С чем вобще это может быть связано???

код прилогаю


 TIcmp = packed record
  icmp_type: byte;   // Type of message
  icmp_code: byte;   // Type "sub code" (zero for echos)
  icmp_cksum: word;  // 1"s complement checksum
  icmp_id: Word;  // Unique ID (the instance handle)
  icmp_seq: Word;   // Tracks multiple pings
  icmp_data: array [0 .. 0] of Char;  // The start of optional data
 end;
 PIcmp = ^TIcmp;

implementation

// контрольная сумма
function cksum(P: Pointer; L: Integer): Word;
var
 ck: LongWord;
begin
 ck:=0;
 while (l>1) do
 begin
   ck:=ck + PWord(P)^;
   inc(Integer(P),2);
   dec(l,2);
 end;
 if l=1 then ck:=ck+PByte(P)^;

 ck:=(ck shr 16) + (ck and $ffff);
 ck:=ck+(ck shr 16);
 result:=not Word(ck);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 raw_sock, icmpsize, i: Integer;
 WSAData: TWSAData;
 eIcmp: PIcmp;
 sockaddr: TSockAddr;
const
 optval: integer = 1;
begin
 if (WSAStartup($202, WSAData) = 0) then
 begin
   //сооздаем сырой сокет
   raw_sock:=socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
   if (raw_sock<>-1) then
   begin
     // формируем пакет
     GetMem(eIcmp,1024);;
     eIcmp^.icmp_type:=0; //тип пакета
     eIcmp^.icmp_code:=0; //код - всегда ноль для типа реплай
     eIcmp^.icmp_cksum:=0;//контрольная сумма вычисляется позднее (по проверенному алгоритму)
     eIcmp^.icmp_id:=0012; //  идентификаторы пакета могут быть любыми
     eIcmp^.icmp_seq:=0010;//  см. выше

     // данные берутся из эдита1
     for i:=0 to  length(edit1.Text)-1 do PChar(@eIcmp^.icmp_data)[i]:=edit1.Text[i+1];

     icmpsize:=8+length(edit1.text);

     eIcmp^.icmp_cksum:=cksum(eIcmp,icmpsize);

     sockAddr.sin_family := AF_INET;
     sockAddr.sin_addr.S_addr:=inet_addr("192.168.7.12");

     icmpsize:=sendto(raw_sock, eIcmp^, icmpsize, 0, @sockaddr, SizeOf(sockaddr));
     // здесь возвращает отправленое число байт
     // причем говорит что отправил все как надо, хотя ВинДамп говорит, что нет...
     memo1.Lines.Add(IntToStr(icmpsize));

   end;
 end;
end;



 
Fay ©   (2006-01-07 16:42) [1]

А что в настройках брендмауэра?


 
isasa ©   (2006-01-08 12:57) [2]

Ну раз ICMP, то что говорит?
ping 192.168.7.12


 
Fay ©   (2006-01-08 13:27) [3]

2 isasa ©   (08.01.06 12:57) [2]

ping.exe может иметь персональную индульгенцию 8)


 
zag2art   (2006-01-09 08:50) [4]

пинг говорит все ок, да и вооще дело не в том работает ли пинг..
пинг работает по схеме:
 1 пингующий комп посылает icmp - реквест
 2 комп который пингуют, получая этот реквест, отсылает обратно пакет icmp реплай

мне же нужно отсылать на другой комп именно пакеты icmp РЕПЛАЙ (тип 0)... причем нужно отсылать много и без всяких предварительных рекветсов... Именно для этого и нужны сырые сокеты.

Теперь о том, что и как получается:

Когда я посылаю реквест (для тестирования) - я естественно получаю ответ... (то есть я вижу как мой покет выходит, так сказать, с моего компа и наблюдаю реакцию, то бишь ответ от 192.168.7.12)

Но как только я меняю тип пакета на 0 (реплай), то пакет даже не покидает моего компа...  Именно в этом и есть вся загвоздка....


 
Fay ©   (2006-01-09 09:17) [5]

2 zag2art   (09.01.06 8:50) [4]
У меня такое ощущение, что Вам на ксакеп.ру.

З.Ы.
An application must call one WSACleanup call for every successful WSAStartup


 
zag2art   (2006-01-10 15:09) [6]

насчет wsacleanup да и closesocket согласен... ну и бог с ними, дело было не в них... оказывается дело то в версии винды... У меня XP SP2, а во втором сервиспаке (да и в 2003) M$ очень урезала сырые сокеты... теперь все исходящие пакеты подверкаются строгой проверке... и то что не нравиться M$ в сеть не выпускается... ;(

Проблема разрешилась при помощи патча на TCPIP.SYS, нашел инфу на рсдн.ру

Но всем все-равно спасибо...

З.Ы.
Fay> а есть какая-нибудь "конкретная" ссылочка на хакере.ру на данную тематику?


 
Fay ©   (2006-01-10 15:22) [7]

2 zag2art   (10.01.06 15:09) [6]
Я хотел сказать, что не знаю других применений сабжа, кроме DoS-атак, а на данном форуме такие потуги обычно не имею поддержки.


 
Bakset   (2006-01-12 22:34) [8]

Люди а дайте пожалуйста пример работающего пинга на RAW сокетах все перерыл нету нормальной инфы под дельфи. Нужно использовать в многопоточном приложении. Indy не пашет нифига во много потоков...


 
Fay ©   (2006-01-13 14:40) [9]

2 Bakset   (12.01.06 22:34) [8]
> нету нормальной инфы под дельфи
Под что есть?
> Indy не пашет нифига во много потоков...
В смысле?


 
Bakset   (2006-01-15 11:48) [10]

встречал под с++ но так как у меня от него несварение желудка :) то он отпадает... а насчет инди то при создании в каждом потоке нифига не работает... говорит что не пингуется хотя все ок... если же не делать во много потоков а последовательно то все работает. Но последовательно сами понимаете не подходит... даже CriticalSection не помогает, хрень вощем.
вот код:

 if DataIpClass.DataNeedPing=true then
   begin
   CriticalSection.Enter;

   IdIcmpClient:=TIdIcmpClient.Create(Application);
   IdIcmpClient.Host:=DataIpClass.IPAdress;
   IdIcmpClient.ReceiveTimeout:=wait_for_ping_response;
   stat:=0;
   c:=0;

   repeat
     IdIcmpClient.Ping;
     if IdIcmpClient.ReplyStatus.FromIpAddress=DataIpClass.IPAdress then
       stat:=1;
     inc(c);
   until (stat=1) or (c>=1);
   IdIcmpClient.Free;

   CriticalSection.Leave;
   end


 
Fay ©   (2006-01-15 12:04) [11]

2 Bakset   (12.01.06 22:34) [8]
Не ку?
http://www.ladia.ru/cpp/network/zdrt31.php


 
Bakset   (2006-01-15 14:33) [12]

блин опять си... :) ну не люблю я его... :) C# допустим это другое дело...
а на дельфях не у кого нет?


 
Fay ©   (2006-01-15 14:36) [13]

2 Bakset   (15.01.06 14:33) [12]
MSDN Вы тоже в переводе на Delphi читаете?


 
Bakset   (2006-01-15 14:39) [14]

не будем здесь устраивать перепалку... понятно что если уж совсем заклин то деватся некуда приходится разбиратся и переводить под дельфи но вопрос то этот стандартный решений полно вот и спрашиваю...


 
Fay ©   (2006-01-15 14:42) [15]

2 Bakset   (15.01.06 14:39) [14]
Может оно Вам и не надо вовсе? Неделя прошла, а у Вас всё ещё "несварение желудка"...


 
Bakset   (2006-01-15 18:49) [16]

ну не неделю :) вопрос такой вяло текущий... просто пинг во многих случаях не работает, файрвол, нат и прочие вещи, иногда думаю совсем от него отказатся... но как опция наверно пусть всеже будет...


 
Bakset   (2006-01-17 22:13) [17]

Вот код, если кому понадобится... немного подправил проверил все работает... так что тема закрыта.


  function Ping(Host:string;TimeOut:longint):boolean;
      var
         ICMPHeader : Record
             i_type      : Byte;
             i_code      : Byte;
             i_chksum    : Word;
             i_id        : Longword;
             i_seq       : Word;
             i_timestamp : Longword;
             i_data      : array[1..5] of byte;
             end;

        IPHeader   : Record
             VersionAndLen : Byte; //lower 4 bits = version , higher 4 bits size of header in 32 bits words}
             tos     : Byte;       // Type of service
             total_len : Word;     // total length of the packet
             ident     : Word;     // unique identifier
             frag_and_flags : Word; // flags
             ttl : Byte;
             proto : Byte;           // protocol (TCP, UDP etc)
             checksum : Word;       // IP checksum

             sourceIP : longint;
             destIP : longint;

             // rest is ICMP protocol
             i_type      : Byte;
             i_code      : Byte;
             i_chksum    : Word;
             i_id        : Longword;
             i_seq       : Word;
             i_timestamp : Longword;
             i_data      : array[1..5] of byte;
             end;

        lwsaData : WSAData;
        Sck: TSocket;
        DestLen: Integer;
        Dest: TSockAddr ;
        HostEnt: PHostEnt;

           function CheckCRC(var Addr;Size:word):word;
               var Ptr:^word;
               begin
               Result:=0;
               Ptr:=@Addr;
               while Size > 1 do begin
                     Result:=Result+Ptr^;
                     Inc(Longword(Ptr),2);
                     Dec(Size,2);
                     end;
               if Size > 0 then Result:= Result+Byte(Ptr^);
               Result := Result shr 16 + Result and $0FFFF;
               Result := Result + Result shr 16;
               Result := NOT Word(Result);
               end;

      begin
      Result:=false;
//       if not IsWinsockPresent then Exit;  // winsock not loaded
      // open socket
      if WSAStartup($0101,lwsaData)<>0 then
        exit;
      Sck := Socket(AF_INET,SOCK_RAW,IPPROTO_ICMP);
      if Sck = INVALID_SOCKET then
        begin
        WSACleanup;
        Exit;
        end;
      // wait for socket 1000 ms
      if SetSockOpt(Sck,SOL_SOCKET,SO_RCVTIMEO,PAnsiChar(@TimeOut),SizeOf(TimeOut))=SOCKET_ERROR then
        begin
        CloseSocket(Sck);
        WSACleanup;
        Exit;
        end;
      // fill up structure
      FillChar(ICMPHeader,SizeOf(ICMPHeader),#0);
      with ICMPHeader do begin
           i_type := 8;
           i_code := 0;
           i_id := Longword(HInstance);
           i_seq := 0;
           i_data[1]:=Ord("A");i_data[2]:=Ord("L");i_data[3]:=Ord("O");
           i_data[4]:=Ord("H");i_data[5]:=Ord("A");
           i_timeStamp:=0; {nelze pouzit ??? }
           i_chksum := 0;
           i_chksum:=CheckCRC(ICMPHeader,SizeOf(ICMPHEader));
           end;
      DestLen := SizeOf(Dest);
      Dest.sin_family := AF_INET;
      Dest.sin_port := htons(7);
      // recognition - address in 192.168.1.47 or computername format
      Dest.sin_addr.s_addr := Inet_Addr(PChar(Host));
      if Dest.sin_addr.s_addr = SOCKET_ERROR then begin
         HostEnt := GetHostByName(PChar(Host));
         if HostEnt <> nil then
            begin
            Dest.sin_addr.S_un_b.s_b1 := HostEnt^.h_addr_list^[0];
            Dest.sin_addr.S_un_b.s_b2 := HostEnt^.h_addr_list^[1];
            Dest.sin_addr.S_un_b.s_b3 := HostEnt^.h_addr_list^[2];
            Dest.sin_addr.S_un_b.s_b4 := HostEnt^.h_addr_list^[3];
            end
         else
            begin
            CloseSocket(Sck);
            WSACleanup;
            Exit;
            end;
         end;

      if SendTo(Sck,ICMPHeader,SizeOf(ICMPHeader),0,Dest,SizeOf(Dest))=SOCKET_ERROR then
         begin
         CloseSocket(Sck);
         WSACleanup;
         Exit;
         end;

      if RecvFrom(Sck,IPHeader,SizeOf(IPHeader),0,Dest,DestLen)=SOCKET_ERROR then
         begin
         CloseSocket(Sck);
         WSACleanup;
         Exit;
         end;
      if IPHeader.i_type <> 0 then
         begin
         CloseSocket(Sck);
         WSACleanup;
         Exit;
         end;
      if IPHeader.i_id <> Longword(HInstance) then begin
         CloseSocket(Sck);
         WSACleanup;
         Exit;
         end;
      CloseSocket(Sck);
      WSACleanup;
      Result := true;
      end;



Страницы: 1 вся ветка

Форум: "Сети";
Текущий архив: 2006.05.07;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.012 c
3-1142415011
AlexeyMir
2006-03-15 12:30
2006.05.07
Как выделить права добавленному пользователю на все таблицы в IB?


6-1137350510
Volf_555
2006-01-15 21:41
2006.05.07
Проблема с работой почты через proxy-сервер


15-1145042265
geserx
2006-04-14 23:17
2006.05.07
Проблема с видеокартой


2-1145269028
Leshas
2006-04-17 14:17
2006.05.07
Математическое приложение - разбор формулы


1-1143741211
Mortem
2006-03-30 21:53
2006.05.07
Crt под Delphi





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский