Взять свой(и) IP адрес(а) в ядре

Тема в разделе "WASM.NETWORKS", создана пользователем SteelRat, 14 мар 2006.

  1. SteelRat

    SteelRat New Member

    Публикаций:
    0
    Регистрация:
    26 авг 2004
    Сообщения:
    409
    Есть драйвер NDIS, как мне взять свой IP адрес кроме копания реестра :dntknw: ?

    Вопрос непростой, т.к. потокол IP и драйвер лежат на разных уровнях OSI ;) (это к теме EvilsInterrupt)
     
  2. DedMazday

    DedMazday New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2006
    Сообщения:
    11




    Ну разве что из идущих пакетов.
     
  3. SteelRat

    SteelRat New Member

    Публикаций:
    0
    Регистрация:
    26 авг 2004
    Сообщения:
    409


    К сожалению не подходит :dntknw: Если машину с драйвером использовать как шлюз, то...

    Это для firewall, что бы обрабатывать правила типа

    add 100 allow ip from me to any

    Когда у машины динамический IP
     
  4. Folk Acid

    Folk Acid New Member

    Публикаций:
    0
    Регистрация:
    23 авг 2005
    Сообщения:
    432
    Адрес:
    Ukraine
    Имхо можно узнать MAC (по тем же пакетам) а зная его, определить IP. Возьми какой-нибудь сниффер и посмотри в каком пакете приходит IP. Может получится.



    Хотя имхо зачем заморачиваться на NDIS если можно выцепить из юзер-моде или настроек винды
     
  5. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    Вот кусок кода вытаскивающий адрес из реестра:


    Код (Text):
    1. PUNICODE_STRING                uAdapName = Adapter->MyOpenBlock->RootDeviceName;
    2.     PWCHAR                         p = RVATOVA(uAdapName->Buffer, uAdapName->Length << 1);
    3.     UNICODE_STRING                 uName;
    4.     OBJECT_ATTRIBUTES              obj;
    5.     HANDLE                         KeyHandle;
    6.  
    7.     if (Adapter->Type != NdisMedium802_3) return;
    8.  
    9.     while (*(p-1) != '\\') p--;
    10.  
    11.     DbgPrint("Adap %ws %ws", p, Adapter->MyOpenBlock->BindDeviceName->Buffer);
    12.  
    13.     swprintf(Name, L"\\registry\\machine\\system\\CurrentControlSet\\Services\\Tcpip\\Par ameters\\Interfaces\\%ws", p);
    14.  
    15.     RtlInitUnicodeString(&uName, Name);
    16.  
    17.     InitializeObjectAttributes(
    18.             &obj,
    19.             &uName,
    20.             OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
    21.             NULL,
    22.             NULL
    23.             );
    24.  
    25. status = ZwOpenKey(&KeyHandle, KEY_ALL_ACCESS, &obj);
    26.  
    27.     if (NT_SUCCESS(status))
    28.     {
    29.         Adapter->IpAddress = ReadIpAddress(KeyHandle, L"IPAddress");
    30.  
    31.         if (!Adapter->IpAddress)
    32.         {
    33.             Adapter->IpAddress = ReadIpAddress(KeyHandle, L"DhcpIPAddress");
    34.             DbgPrint("Get dhcp ip");
    35.         }
    36.  
    37.         Adapter->SubnetMask = ReadIpAddress(KeyHandle, L"SubnetMask");
    38.  
    39.         if (!Adapter->SubnetMask)
    40.         {
    41.             Adapter->SubnetMask = ReadIpAddress(KeyHandle, L"DhcpSubnetMask");
    42.         }
    43.  
    44.         Adapter->Gateway = ReadIpAddress(KeyHandle, L"DefaultGateway");
    45.  
    46.         ZwClose(KeyHandle);
    47.     }
    48.  
    49. ULONG
    50.   ReadIpAddress(
    51.         IN HANDLE KeyHandle,
    52.         IN PWCHAR ValName
    53.         )
    54. {
    55.     UNICODE_STRING                 uName;
    56.     WCHAR                          Name[MAX_PATH];
    57.     PKEY_VALUE_PARTIAL_INFORMATION Info = (void*)&Name;
    58.     CHAR                           aName[MAX_PATH];
    59.     ULONG                          ResLen;
    60.  
    61.     RtlInitUnicodeString(&uName, ValName);
    62.  
    63.     ZwQueryValueKey(
    64.           KeyHandle,
    65.           &uName,
    66.           KeyValuePartialInformation,
    67.           Info,
    68.           sizeof(Name),
    69.           &ResLen
    70.           );
    71.  
    72.     wcstombs(aName, (PWCHAR)&Info->Data, -1);
    73.  
    74.     return inet_addr(aName);
    75. }
    76.  
    77. u32_t inet_addr(const char *cp)
    78. {
    79.     u32_t address;
    80.     u32_t shift;
    81.     u32_t sym;
    82.  
    83.     address = 0;
    84.     shift = 0;
    85.  
    86.     while (*cp)
    87.     {
    88.         sym = 0;
    89.  
    90.         while ((*cp != '.') && (*cp != '\0'))
    91.         {
    92.            if ((*cp < '0') || (*cp > '9')) return 0;
    93.  
    94.             sym = sym*10 + (u32_t)(*cp - '0');
    95.             ++cp;
    96.         }
    97.  
    98.         address += sym << shift;    
    99.         shift += 8;
    100.  
    101.         if (*cp++ == '\0') break;
    102.     }
    103.  
    104.     return address;
    105. }




    Извини за беспорядочные куски кода, просто я их вытаскивал из своей программы.
     
  6. SteelRat

    SteelRat New Member

    Публикаций:
    0
    Регистрация:
    26 авг 2004
    Сообщения:
    409
    Ms Rem

    Спасибо ;) Не люблю копаться в реестре... Придётся всё таки вместо одного правила делать 2 или 3, в зависимости от кол-ва адаптеров или в реестр лезть... Во фре предупреждали - использование "me" влечёт большие вычислительные расходы :dntknw: