Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.05.07;
Скачать: CL | DM;

Вниз

отправка сообщения 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;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.037 c
3-1142083485
Temper
2006-03-11 16:24
2006.05.07
sql+delphi, передача параметров из хранимой процедуры в приложени


2-1145291122
ArcSin
2006-04-17 20:25
2006.05.07
Помогите уменьшить прогу


2-1145522700
Zaq123
2006-04-20 12:45
2006.05.07
Как создать текстовый файл с кодовой страницей 866?


9-1122608595
Kevinson
2005-07-29 07:43
2006.05.07
2D анимация в Opengl.


3-1142354432
Juice
2006-03-14 19:40
2006.05.07
Абсолютное значение (модуль) поля