Как получить локальный IP с помощью WinPcap?

Тема в разделе "WASM.BEGINNERS", создана пользователем _sheva740, 8 ноя 2011.

  1. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    Пишут что можно с помощью PacketGetNetInfoEx()
    Дают пример.

    Код (Text):
    1. ; if(PacketGetNetInfoEx(adapterlist[open-1],&ipbuff,&npflen))
    2. ;    {
    3. ;        sin=*(struct sockaddr_in *)&(ipbuff.Broadcast);
    4. ;        printf("[Broadcast:]\t%.16s\t",inet_ntoa(sin.sin_addr));
    5. ;
    6. ;        sin=*(struct sockaddr_in *)&(ipbuff.SubnetMask);
    7. ;        printf("[SubnetMask:]\t%.16s\n",inet_ntoa(sin.sin_addr));
    8. ;
    9. ;        sin=*(struct sockaddr_in *)&(ipbuff.IPAddress);
    10. ;        printf("[IPAddress:]\t%.16s\t",inet_ntoa(sin.sin_addr));
    11. ;        myip=ntohl(sin.sin_addr.s_addr);
    Структуры
    Код (Text):
    1. ;   typedef struct npf_if_addr {
    2. ;       struct sockaddr_storage IPAddress;  ///< IP address.
    3. ;       struct sockaddr_storage SubnetMask; ///< Netmask for that address.
    4. ;       struct sockaddr_storage Broadcast;  ///< Broadcast address.
    5. ;   }npf_if_addr;
    6.  
    7. npf_if_addr struct
    8.     IPAddress   sockaddr_in  <>
    9.     SubnetMask  sockaddr_in  <>
    10.     Broadcast   sockaddr_in  <>
    11. npf_if_addr ends
    12.  
    13. ipbuff  npf_if_addr <>
    14. sin sockaddr_in <>
    Помогите перевести в masm это ...

    Код (Text):
    1.        sin=*(struct sockaddr_in *)&(ipbuff.IPAddress);
    2.         printf("[IPAddress:]\t%.16s\t",inet_ntoa(sin.sin_addr));
    Пожа-а-а-алуйта!
    Спасибо.)))
     
  2. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    Если перевести это на masm, то ...
    Код (Text):
    1.        sin=*(struct sockaddr_in *)&(ipbuff.IPAddress);
    2.         printf("[IPAddress:]\t%.16s\t",inet_ntoa(sin.sin_addr));
    ... так правильно?


    Код (Text):
    1. mov eax, ha
    2. invoke  PacketGetNetInfoEx, dword ptr [eax], addr ipbuff, 16
    3. lea esi,ipbuff
    4. lea ecx,(npf_if_addr ptr [esi]).IPAddress
    5. lea eax,(in_addr  ptr [ecx]).S_un.S_addr
    6. invoke  inet_ntoa,eax
    Подскажите пожалуйста !!!
    ))
     
  3. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    Пытаюсь найти локальный ip.
    Чего-то бред какой-то выдает (((
    Код (Text):
    1. .386
    2. .model      flat,stdcall
    3. option      casemap:none
    4. include     \masm32\include\windows.inc
    5. include     \masm32\include\kernel32.inc
    6. include     \masm32\include\masm32.inc
    7. include     \masm32\include\user32.inc
    8. include     \masm32\include\wsock32.inc
    9. include     ..\packet\packet.inc
    10. include     ..\wpcap\wpcap.inc
    11.  
    12. includelib  \masm32\lib\kernel32.lib
    13. includelib  \masm32\lib\masm32.lib
    14. includelib  \masm32\lib\user32.lib
    15. includelib  \masm32\lib\wsock32.lib
    16. includelib  ..\packet\packet.lib
    17. includelib  ..\wpcap\wpcap.lib
    18.  
    19. getip       PROTO :DWORD
    20.  
    21. .data
    22.     szformat            db '%hS',0
    23.     szErrOpenDev        db 'Unable to open the adapter.',0
    24.     crlf            db 13,10,0
    25.     szErrpcap_findalldevs   db '[-] Error in pcap_findalldevs',0
    26.     DevSelection        dd 1
    27. .data?
    28.  
    29.     adhandle            pcap_t          <?>
    30.     alldevs             pcap_if_t           <?>
    31.     errbuf          db [PCAP_ERRBUF_SIZE]   dup (?)
    32.     buffsz          db [MAX_PATH]       dup (?)
    33. .code
    34. start:
    35.     invoke  pcap_findalldevs,addr alldevs,addr errbuf
    36.     .if (eax == -1)
    37.         invoke  StdOut, addr szErrpcap_findalldevs                         
    38.     .endif
    39.     mov eax,1
    40.     assume  ecx:ptr pcap_if
    41.     mov ecx,alldevs
    42.     assume  edx:ptr pcap_if
    43.     mov edx,alldevs
    44.  
    45.     .while  (eax != DevSelection)
    46.         assume  edx:ptr pcap_if
    47.         mov edx,[ecx].next
    48.         mov ecx,edx
    49.         inc eax
    50.     .endw      
    51.     invoke  wsprintf,addr buffsz, addr szformat,[edx]._name
    52.     invoke  pcap_open_live,addr buffsz,\    ;имя устройства
    53.                     0,0,0,0
    54.     mov adhandle,eax
    55.  
    56.     .if !eax
    57.         invoke  StdOut, addr szErrOpenDev
    58.         invoke  pcap_freealldevs,alldevs
    59.         jmp __exit
    60.     .endif
    61.  
    62.     invoke  getip, adhandle
    63.     invoke  pcap_freealldevs,alldevs
    64. __exit:
    65.     invoke  ExitProcess,0
    66. ;===================================================================
    67. .data
    68. szformatMAC_t       db 'ip Address: %s ',0
    69. npf_if_addr struct
    70.     IPAddress       sockaddr_in  <>
    71.     SubnetMask  sockaddr_in  <>
    72.     Broadcast       sockaddr_in  <>
    73. npf_if_addr ends
    74.  
    75. ipbuff  npf_if_addr <>
    76. sin sockaddr_in <>
    77.  
    78. .code
    79. getip  proc ha:DWORD
    80.     mov eax, ha
    81.     invoke  PacketGetNetInfoEx, dword ptr [eax], addr ipbuff, 16;= MAX_NETWORK_ADDRESSES
    82.     lea esi,ipbuff
    83.     lea ecx,(npf_if_addr ptr [esi]).IPAddress
    84.     lea eax,(in_addr  ptr [ecx]).S_un.S_addr
    85.     invoke  inet_ntoa,eax
    86.     push    eax
    87.     push    offset szformatMAC_t
    88.     push    offset buffsz
    89.     call    wsprintf
    90.     invoke  StdOut, addr buffsz
    91.     invoke  StdOut, addr crlf
    92.     ret
    93. getip endp
    94. end start
    Кто пользовал эту PacketGetNetInfoEx() отзовитесь !!!