скан диапозона ip [delphi]

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by OPF_Nik, 18 Feb 2010.

  1. OPF_Nik

    OPF_Nik New Member

    Joined:
    6 Nov 2009
    Messages:
    36
    Likes Received:
    3
    Reputations:
    -5
    народ подскажите, есть диапозон, например 127.0.0.1-127.0.255.255, как идеи можете предложить, что бы просканить весь диапозон?
     
  2. =Zeus=

    =Zeus= Member

    Joined:
    10 Aug 2009
    Messages:
    213
    Likes Received:
    54
    Reputations:
    5
    В интернете есть куча исходников на эту тему. Есть идея воспользоваться гуглом и не морочить другим мозги.
     
  3. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Даже тут на форуме были примеры этого.
    работает всё по принципу. типа так:
    Code:
    start_addr := inet_addr('127.0.0.1');
    stop_addr := inet_addr('127.0.255.255');
    
    while start_addr <> stop_addr do
    begin
     выполняешь свои действия
     asm
      mov eax, start_addr
      bswap eax
      inc eax
      bswap eax
      mov start_addr, eax
     end;
    end;
    
    т.е. ты определишь начальный и конечный адрес. Затем просто увеличиваешь начальный на 1 и так пока он не станет равным конечному.
    Но т.к. в IP порядок байт обратный тому который хранится в памяти, то для увеличения придется поменять порядок байт, что и делает инструкция bswap
     
  4. flacs

    flacs Member

    Joined:
    28 Jan 2009
    Messages:
    81
    Likes Received:
    31
    Reputations:
    6
    Code:
      function IpToInt(ip: string): dword; // превращаем IP в число
      begin
        result := inet_addr(PChar(ip));
        result := (result shl 24) or (result and $FF00 shl 8) or
                  (result and $FF0000 shr 8) or (result shr 24);
      end;
    
      function IntToIP(i: DWORD): string;  // число в IP
      var kk: DWORD;
      begin
        kk:=(i shl 24) or (i and $FF00 shl 8) or
            (i and $FF0000 shr 8) or (i shr 24);
        Result:= inet_ntoa(in_addr(kk))
      end;
    
      procedure Scan;
      begin
        AddrTo:=IpToInt(IpTo); AddrFrom:=IpToInt(IpFrom);
        for i:=AddrTo to AddrFrom do ping_addr(IntToIp(i));
      end;
    
    
     
  5. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    2 flacs вот какраз bswap и выполняет
    kk:=(i shl 24) or (i and $FF00 shl 8) or (i and $FF0000 shr 8) or (i shr 24);
    только выполняет это всё намного быстрее

    или как вариант можно юзать апишку из winsock - ntohl она считай и реализует эти действия
     
    #5 slesh, 19 Feb 2010
    Last edited: 19 Feb 2010
  6. sn0w

    sn0w Статус пользователя:

    Joined:
    26 Jul 2005
    Messages:
    1,023
    Likes Received:
    1,311
    Reputations:
    327
    канал какой? лвс или че еще? для лвс делал арпсканер
     
  7. rankor777

    rankor777 Elder - Старейшина

    Joined:
    11 Jan 2008
    Messages:
    15
    Likes Received:
    23
    Reputations:
    0
    Ужас, зачем вам в делфи вставки на асме? Для ускорения чтоли? xD
    Сканить порты лучше внешним сканером (VNC ByPass Auth например), потому как они лучше по-любому.