Как определить локальный МАС моей сетевой с помощью WinPcap?

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

  1. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    Добрый день.
    Подскажите как определить МАС адрес моей сетевухи
    но чтобы с помощью либы WinPcap.
    Имя и дескриптор определяю, а вот МАС и 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. .data
    20.     crlf                            db 13,10,0
    21.     szErrpcap_findalldevs    db "Error in pcap_findalldevs",0
    22.     szformat                     db "%hS",0
    23.     compteur                    dd 0
    24. .data?
    25.     alldevs                        pcap_if_t    <?>
    26.     errbuf                         db [PCAP_ERRBUF_SIZE]    dup (?)
    27.     buffsz                         db [MAX_PATH]        dup (?)
    28. .code
    29. start:
    30.  
    31.     invoke    pcap_findalldevs,addr alldevs,addr errbuf
    32.     .if (eax == -1)
    33.         invoke    StdOut, addr szErrpcap_findalldevs
    34.     .endif
    35.  
    36.     assume    ecx:ptr pcap_if
    37.     mov   ecx,alldevs  
    38.     inc     compteur
    39. @@: push   ecx  
    40.     invoke   wsprintf,addr buffsz, addr szformat,[ecx]._name
    41.     invoke   StdOut, addr buffsz
    42.     invoke   StdOut, addr crlf
    43.     pop    ecx
    44.     push   ecx                              ;|
    45.  
    46.     invoke    wsprintf,addr buffsz, addr szformat,[ecx].description
    47.     invoke    StdOut, addr buffsz
    48.     invoke    StdOut, addr crlf
    49.     pop    ecx
    50.     push   ecx
    51.     .if ([ecx].next)
    52.         invoke   StdOut, addr crlf
    53.         pop    ecx
    54.         mov   ecx,[ecx].next
    55.         inc   compteur
    56.         jmp   @B
    57.     .else
    58.         pop   ecx
    59.     .endif  
    60.     assume   ecx:nothing
    61.     invoke   pcap_freealldevs,alldevs
    62.     invoke   ExitProcess,0
    63. end start
    Не хочу просто в проект тулить еще и iphlpapi. Или придется?
    Подскажите кто знает плиззз )))
     
  2. T800

    T800 Member

    Публикаций:
    0
    Регистрация:
    7 дек 2006
    Сообщения:
    293
    Адрес:
    Moscow
    _sheva740
    OID_802_3_PERMANENT_ADDRESS - для получения реального MAC (прошитого в EEPROM)
    OID_802_3_CURRENT_ADDRESS - для получения MAC, который используется системой
     
  3. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    T800
    Спасибо!
    Вот нашел пример как читать-писать из под winpcap (ее packet.dll)
    Код (Text):
    1. int getmac(pcap_t* ha, char* pStr)
    2. {
    3.   PPACKET_OID_DATA    pOidData;
    4.   CHAR pAddr[sizeof(PACKET_OID_DATA)+5];
    5.   ZeroMemory(pAddr, sizeof(PACKET_OID_DATA)+5);
    6.   pOidData = (PPACKET_OID_DATA) pAddr;
    7.   pOidData->Oid = OID_802_3_CURRENT_ADDRESS; ///<<<<<<<<<<<<<<
    8.   pOidData->Length = 6;
    9.   if(PacketRequest(ha->adapter, FALSE, pOidData)) ///<<<<<<<<<<<< FALSE - читать TRUE - внести изминения
    10.   {    
    11.       sprintf(pStr, "%.02X:%.02X:%.02X:%.02X:%.02X:%.02X",
    12.           pOidData->Data[0],pOidData->Data[1],pOidData->Data[2],
    13.           pOidData->Data[3],pOidData->Data[4],pOidData->Data[5]);
    14.   }else{
    15.       return 0;
    16.   }
    17.   return 1;
    .

    Не подскажете как перевести структурку из с в masm
    Код (Text):
    1. ;struct _PACKET_OID_DATA {
    2. ;    ULONG Oid;            ///< OID code. See the Microsoft DDK documentation or the file ntddndis.h
    3. ;                               ///< for a complete list of valid codes.
    4. ;    ULONG Length;  ///< Length of the data field
    5. ;    UCHAR Data[1]; ///< variable-lenght field that contains the information passed to or received
    6. ;                              ///< from the adapter.
    7. ;   };
    ......... Так ????
    Код (Text):
    1.   PACKET_OID_DATA struct
    2.     Oid            DWORD 0
    3.     Lengthz      DWORD 0
    4.     Dataz            BYTE 256 dup( 0 )
    5. PACKET_OID_DATA ends
     
  4. Igor1024

    Igor1024 Васил Троянов Боянов (Azis)

    Публикаций:
    0
    Регистрация:
    15 окт 2010
    Сообщения:
    345
    Адрес:
    Sliven, Bulgaria
    Dataz вроде бы должно лишь байт занимать, а не 256.
     
  5. T800

    T800 Member

    Публикаций:
    0
    Регистрация:
    7 дек 2006
    Сообщения:
    293
    Адрес:
    Moscow
    Igor1024
    Это только хидер описан с первым элементом.
     
  6. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    Igor1024
    Ну да, только хидер.
    T800
    Значит правильно?
    ))
     
  7. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    T800
    Не могу понять ((( ошибка - 000006 - неверный дискриптор после
    invoke PacketRequest, adhandle, 0,esi
    Код (Text):
    1. param_m proc param:DWORD
    2. local tmp[256]:BYTE
    3. local pOidData: PACKET_OID_DATA
    4. local pAddr[sizeof(PACKET_OID_DATA)+5]: BYTE
    5.  
    6.  
    7.     invoke  StdOut, addr szparam_m
    8.     invoke  StdOut, addr crlf  
    9.  
    10.     invoke  pcap_findalldevs,addr alldevs,addr errbuf
    11.     .if (eax == -1)
    12.         invoke  StdOut, addr szErrpcap_findalldevs                         
    13.     .endif
    14.     mov eax,1
    15.     assume  ecx:ptr pcap_if
    16.     mov ecx,alldevs
    17.  
    18.     assume  edx:ptr pcap_if
    19.     mov edx,alldevs
    20.    
    21.     .while  (eax != DevSelection) ; DevSelection =1
    22.         assume  edx:ptr pcap_if
    23.         mov edx,[ecx].next
    24.         mov ecx,edx
    25.         inc eax
    26.     .endw      
    27.     invoke  wsprintf,addr buffsz, addr szformat,[edx]._name
    28.     invoke pcap_open_live,addr buffsz,\
    29.                                      65536,\
    30.                                     1,\
    31.                                     1000,\ 
    32.                                     addr errbuf
    33.     mov adhandle,eax
    34.  
    35.     .if !eax
    36.         invoke  StdOut, addr szErrOpenDev
    37.         invoke  pcap_freealldevs,alldevs
    38.         jmp __exit
    39.     .endif
    40.  
    41.     invoke  RtlZeroMemory, addr pAddr,sizeof(PACKET_OID_DATA)+5
    42.     assume  esi:ptr PACKET_OID_DATA
    43.     lea esi,pAddr
    44.     mov dword ptr [esi].Oid,1010101h; == OID_802_3_PERMANENT_ADDRESS
    45.     mov dword ptr [esi].Lengthz,6
    46.  
    47. int 3
    48.     invoke  PacketRequest,  pcap_t ptr [adhandle].adapter, 0,esi
    49.     invoke  wsprintf,addr buffsz, addr szformatMAC,[esi].Dataz,\
    50.                         [esi].Dataz+1,\
    51.                         [esi].Dataz+2,\
    52.                         [esi].Dataz+3,\
    53.                         [esi].Dataz+4,\
    54.                         [esi].Dataz+5
    55.     invoke  StdOut, addr buffsz
    56.     invoke  StdOut, addr crlf
    57.     invoke  pcap_freealldevs,alldevs
    58. __exit: ret
    59. param_m endp
    В примере выше конечно нужно - invoke PacketRequest, pcap_t ptr [adhandle].adapter, 0,esi
    но не могу найти как выглядит структура pcap_t
    Не подскажете ?
    plz )))
     
  8. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland