Перебор IP адресов

Тема в разделе "WASM.A&O", создана пользователем 984259h, 27 авг 2011.

  1. 984259h

    984259h New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2007
    Сообщения:
    194
    Всем доброго времени суток, мне необходимо перебрать определенный диапазон IP адресов.
    У меня допустим есть диапазон адресов 1.1.1.1-255.255.255.255 это если IPv4 я перебираю след. образом
    Код (Text):
    1.        BYTE iCounterOfIP[4];
    2.        memset(iCounterOfIP,0,sizeof(iCounterOfIP));
    3.        memcpy(iCounterOfIP,FirstIP,sizeof(FirstIP));
    4.        int kPosition,mPosition,iPosition,jPosition = 3;
    5.        while
    6.        {
    7.           ConnectAndCheck(iCounterOfIP);                      
    8.           if (iCounterOfIP[jPosition]++ == LastIP[jPosition])
    9.           {
    10.              iCounterOfIP[jPosition] = 0;
    11.              kPosition = jPosition;
    12.              if (iCounterOfIP[--kPosition]++ == LastIP[kPosition])
    13.              {
    14.                 iCounterOfIP[kPosition] = 0;
    15.                 mPosition = kPosition;
    16.                 if (iCounterOfIP[--mPosition]++ == LastIP[mPosition])
    17.                 {
    18.                    iCounterOfIP[mPosition] = 0;
    19.                    iPosition = mPosition;
    20.                    if (iCounterOfIP[--iPosition]++ == LastIP[iPosition])
    21.                    {
    22.                        iCounterOfIP[iPosition] = 0;
    23.                        break;
    24.                    }
    25.                 }
    26.              }
    27.           }
    28.        }
    FirstIP - это массив 1.1.1.1
    LastIP - собственно 255.255.255.255
    но это для ip ver 4 а для ip ver 6 мне придется делать 16 условий (if ...) ?
    Какие есть способы более правильного перебора ? я понимаю что для ipv4 будет один способ, для ipv6 - другой.
    Заранее спасибо.
     
  2. Kaimi

    Kaimi Андрей

    Публикаций:
    0
    Регистрация:
    15 апр 2010
    Сообщения:
    120
    Ну, например:
    Код (Text):
    1. char start_ip[] = "127.0.0.1";
    2. char end_ip[] = "127.0.1.5";
    3.    
    4. for(unsigned long i = htonl(inet_addr(start_ip)), j = htonl(inet_addr(end_ip)); i <= j; i++)
    5. {
    6.     printf("%u.%u.%u.%u\n", (i>>24) & 0xFF, (i>>16) & 0xFF, (i>>8) & 0xFF, i & 0xFF);
    7. }
     
  3. KIV

    KIV Member

    Публикаций:
    0
    Регистрация:
    16 июл 2009
    Сообщения:
    231
    Только вот IPv6 ваша программа будет перебирать очень-очень долго. Ведь всего вариантов IPv6 - 2 ^ 128.
    Для оценки могу сказать, что если перебирать по одному миллиону адресов в секунду, то на полный перебор уйдут миллиарды лет.
    Вам придётся полностью менять алгоритм для IPv6, чтобы исключить полный перебор.
     
  4. 984259h

    984259h New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2007
    Сообщения:
    194
    Kaimi
    ну это понятно можно сразу кидать ipv4 в DWORD менять местами октеты потом увеличивать и менять назад но такой вариант подходить наверно только ipv4
    а какие есть варианты для ipv6 ?
     
  5. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    Может для 6 применить подход - "по частям",
    "Может возьмете частями?" как-то сказал Шура Балаганов. ))

    Код (Text):
    1. ;В этой функции мы можем установить ограничения по перебору IP – адресов.
    2. ;В том варианте, что выше охвачен диапазон с 192.168.1.0 -192.168.1.17.
    3.  
    4.  
    5. seed            dd 12345
    6. IP          db 20 dup(0)
    7. s_ip_start      db "192.168.",0
    8. p               db '.'
    9. spc             db 0
    10. numBuffer       db ?
    11. .
    12. .
    13. .
    14.  
    15. ;============================================================
    16. gen proc max_num:dword
    17. mov eax,08088405h
    18. xor edx,edx
    19. mul seed
    20. inc eax
    21. mov seed,eax
    22. mul max_num
    23. ret
    24. gen endp
    25. ;============================================================
    26.  
    27. ;============================================================
    28. gen_IP proc uses ebx
    29. invoke Sleep,50
    30. invoke GetTickCount
    31. mov seed,eax
    32. mov ebx,4
    33.  
    34. pushad
    35. invoke lstrcpy,ADDR IP,ADDR s_ip_start
    36. invoke gen,1    ; ------------------------------- 1
    37. inc edx
    38. invoke dwtoa, edx, ADDR numBuffer
    39. invoke lstrcat,ADDR IP,ADDR numBuffer
    40. invoke lstrcat,ADDR IP,ADDR p
    41. invoke gen,17   ; ------------------------------- 17   
    42. inc edx
    43. invoke dwtoa, edx, ADDR numBuffer
    44. invoke lstrcat,ADDR IP,ADDR numBuffer
    45. invoke lstrcat,ADDR IP,ADDR spc
    46. popad
    47.  
    48. ret
    49. gen_IP endp
    50. ;============================================================
    51. .
    52. .
    53. .
    54. call gen_IP
     
  6. 984259h

    984259h New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2007
    Сообщения:
    194
    KIV
    я согласен полностью. И не только для ipv6 для ipv4 2^32 на локальной машине вроде бистро а если еще что то с каждым делать то тоже долго будет .
    это да вот собственно и спрашиваю как правильно в принципе думаю так как и для ipv4.
     
  7. KIV

    KIV Member

    Публикаций:
    0
    Регистрация:
    16 июл 2009
    Сообщения:
    231
    Скажите полную задачу. Зачем вы сейчас хотите перебирать адреса?
    Потому что пока видно только одну задачу - "вывести все адреса". Такая задача, разумеется, решается только полным перебором.
     
  8. asmdev

    asmdev New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2006
    Сообщения:
    12
    Попробу распараллелить. Как-нибуть так:
    Код (Text):
    1.   mov    eax, $8000'0000
    2.   mov    ecx, $9000'0000
    3.   mov    edx, $a000'0000
    4.   mov    edi, $b000'0000
    5.   mov    esi, $c000'0000
    6.   mov    ebx, $d000'0000
    7.   mov    r8d, $e000'0000
    8.   mov    r9d, $f000'0000
    9.   mov    ebp, 1
    10. @@:
    11.   add    eax, ebp
    12.   add    ecx, ebp
    13.   add    edx, ebp
    14.   add    edi, ebp
    15.   add    esi, ebp
    16.   add    ebx, ebp
    17.   add    r8d, ebp
    18.   add    r9d, ebp
    19.   jnz    @b
    20.  
    21.   mov    eax, $1000'0000
    22.   mov    ecx, $2000'0000
    23.   mov    edx, $3000'0000
    24.   mov    edi, $4000'0000
    25.   mov    esi, $5000'0000
    26.   mov    ebx, $6000'0000
    27.   mov    r8d, $7000'0000
    28.   mov    r9d, $8000'0000
    29. @@:
    30.   sub    ecx, ebp
    31.   sub    edx, ebp
    32.   sub    edi, ebp
    33.   sub    esi, ebp
    34.   sub    ebx, ebp
    35.   sub    r8d, ebp
    36.   sub    r9d, ebp
    37.   sub    eax, ebp
    38.   jnz    @b
    У меня на компе скорость в разы быстрее чем:
    Код (Text):
    1. xor    eax, eax
    2. @@:
    3. add    eax, 1
    4. jnz    @b
    Хватит ли у тебя регистров? (ebp можно заменить на константу, esp заменяет r8 или r9) Ещё надо регистры чтобы делать dword IP -> asciiDec IP , безо всяких push pop .

    Так как у тебя диапазон то в конце циклов ещё будет CMP инструкция.
     
  9. asmdev

    asmdev New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2006
    Сообщения:
    12
    С ASCII важно знать сколько чисел (1,2,3) в каждых из четырёх частей.
    Код (Text):
    1.   startIP        db "20.20.100.1"
    2.   endIP          db "20.20.220.9"
    Увеличиваем 1 до тех пор пока она не станет равна 9ти. Если 100 != 220 то увеличиваем 100 на еденицу и запускаем цикл 1->9.

    если имеется такой вариант:
    Код (Text):
    1.  
    2.    startIP        db "20.20.10.1"
    3.   endIP          db "20.20.220.9"
    то преобразуемего в такой:
    Код (Text):
    1.   startIP        db "20.20.10.1"
    2.   middleIP_1   db "20.20.99.9"
    3.   middleIP_2   db "20.20.100.1"
    4.   endIP          db "20.20.220.9"
    и работаем сначала по startIP+middleIP_1 а потом по middleIP_2+endIP


    очень не советую заниматься dword ip -> asciiDec ip преобразованием, очень долго.
     
  10. asmdev

    asmdev New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2006
    Сообщения:
    12
    Я надеюсь ты понял что более одного условия ни для ipv4 ни для ipv6 не надо в случае если мы не говорим об ascii.