Информация о доступных Wi-Fi сетях

Тема в разделе "FASM", создана пользователем Marylin, 19 фев 2023.

Метки:
  1. Marylin

    Marylin Active Member

    Публикаций:
    0
    Регистрация:
    17 фев 2023
    Сообщения:
    110
    Всем привет! Пишу на ассемблере fasm.
    Функцией WlanGetNetworkBssList() получаю информацию о доступных Wi-Fi сетях в своей зоне.
    Она возвращает данные в структуру "WLAN_BSS_ENTRY", поля которой вывожу на консоль.

    Код (ASM):
    1.  
    2. format   pe console
    3. entry    start
    4. include 'win32ax.inc'
    5. include 'equates\wlanapi.inc'
    6. ;//----------
    7. .data
    8. negVer      dd  0
    9. wlanHndl    dd  0
    10. bssAddr     dd  0
    11. nextBss     dd  0
    12. itemCount   dd  0
    13. divide      dd  1000*1000
    14. gHz         dq  0
    15. align 16
    16. buff        db  0
    17. ;//----------
    18. .code
    19. start:   invoke  SetConsoleTitle,<'*** WlanGetNetworkBssList ***',0>
    20. ;//----- Попытка подключиться к службе Wireless
    21.          invoke  WlanOpenHandle,2,0,negVer,wlanHndl
    22.          or      eax,eax
    23.          jz      @f
    24.         cinvoke  printf,<10,' WlanOpen Error! Adapter is not working.',0>
    25.          jmp     @exit
    26.  
    27. ;//----- Запрашиваем GUID своего интерфейса
    28. @@:      invoke  WlanEnumInterfaces,[wlanHndl],0,buff
    29.          mov     eax,dword[buff]
    30.          add     eax,8       ;//<--- указатель на GUID
    31.  
    32. ;//----- Читаем записи BSS доступных сетей
    33.          invoke  WlanGetNetworkBssList,[wlanHndl],eax,0,0,0,0,buff
    34.          mov     esi,dword[buff]
    35.          mov     [bssAddr],esi
    36.  
    37. ;//----- Запоминаем данные структуры "WLAN_BSS_LIST"
    38.          mov     eax,[esi+WLAN_BSS_LIST.dwTotalSize]
    39.          mov     ebx,[esi+WLAN_BSS_LIST.dwNumberOfItems]
    40.          mov     [itemCount],ebx
    41.          push    esi
    42.         cinvoke  printf,<10,' BSS total size :  %d bytes',\
    43.                          10,' Number of items:  %d',10,10,0>,eax,ebx
    44.         cinvoke  printf,<' Ssid             Rssi    Power  ',\
    45.                          ' Freq       Speed      Device MAC          IeOffs       IeSize',10,\
    46.         ' ------------------------------------------------------------------------------------------------',0>
    47.          pop     esi
    48.          lea     esi,[esi+WLAN_BSS_LIST.wlanBssEntries]
    49.          mov     [nextBss],esi
    50.  
    51. ;//**** Обход массива структур "WLAN_BSS_ENTRY" всех доступных сетей *****************
    52. @parseBss:
    53.          mov     esi,[nextBss]
    54.          lea     eax,[esi+WLAN_BSS_ENTRY.dot11Ssid+4]
    55.          mov     ebx,[esi+WLAN_BSS_ENTRY.lRssi]
    56.          mov     ecx,[esi+WLAN_BSS_ENTRY.uLinkQuality]
    57.          mov     edx,[esi+WLAN_BSS_ENTRY.ulChCenterFrequency]
    58.          push    0 edx
    59.          finit
    60.          fild    qword[esp]  ;//<--- частота из кГц в ГГц
    61.          fidiv   [divide]
    62.          fstp    [gHz]
    63.          add     esp,8
    64.          push    esi esi esi
    65.         cinvoke  printf,<10,' %-15s %d dB   %3d %%   %0.2f GHz   ',0>,eax,ebx,ecx,\
    66.                          dword[gHz],dword[gHz+4]
    67.  
    68. ;//----- Находим наибольшее значение из "набора скоростей передачи данных Wi-Fi"
    69.          pop     edi
    70.          mov     ecx,[edi+WLAN_BSS_ENTRY.wlanRateSet]   ;// реально элементов в наборе (всего макс.126)
    71.          lea     esi,[edi+WLAN_BSS_ENTRY.wlanRateSet+4] ;// линк на начало
    72.          xor     eax,eax
    73.          mov     ebx,eax
    74. @findMaxSpeed:
    75.          lodsw
    76.          and     ax,7FFFh        ;// ст.бит определяет базовую скорость - игнорируем
    77.          cmp     ebx,eax
    78.          ja      @fack
    79.          xchg    ebx,eax         ;// EBX = макс скорость
    80. @fack:   loop    @findMaxSpeed
    81.          shr     ebx,1           ;//<---- по формуле: Speed = Rate * 0,5 (или /2)
    82.         cinvoke  printf,<'%d Mbit/s  ',0>,ebx
    83.  
    84. ;//----- Выводим МАС-адрес устройства (макрос лежит в инклуде wlanapi.inc)
    85.          pop     esi
    86.          lea     eax,[esi+WLAN_BSS_ENTRY.dot11Bssid]
    87.          GetMac  eax
    88.  
    89. ;//----- BLOB со всеми деталями интерфейса "IE" (формат полей см.в спеке 802.11)
    90. ;//----- здесь просто показываем его размер + смещение от начала текущей "WLAN_BSS_ENTRY"
    91.          pop     esi
    92.         cinvoke  printf,<'   0x%08X   %d byte',0>,\
    93.                          [esi+WLAN_BSS_ENTRY.ulIeOffset],\
    94.                          [esi+WLAN_BSS_ENTRY.ulIeSize]
    95.  
    96. ;//----- Переход к структуре "WLAN_BSS_ENTRY" сл.доступной сети..
    97. ;//----- размер этой структуры статичный, и равен 360-байт
    98.          add     [nextBss],360
    99.          dec     [itemCount]
    100.          jz      @exit
    101.          jmp     @parseBss
    102.  
    103. @exit:   invoke  WlanFreeMemory,[bssAddr]
    104.         cinvoke  getch
    105.         cinvoke  exit,0
    106. ;//----------
    107. section '.idata' import data readable
    108. library  msvcrt,'msvcrt.dll',kernel32,'kernel32.dll',wlanapi,'wlanapi.dll'
    109. import   msvcrt,printf,'printf',getch,'_getch',exit,'exit'
    110. import   wlanapi,WlanOpenHandle,'WlanOpenHandle',\
    111.                  WlanEnumInterfaces,'WlanEnumInterfaces',\
    112.                  WlanGetNetworkBssList,'WlanGetNetworkBssList',\
    113.                  WlanFreeMemory,'WlanFreeMemory'
    114. include  'api\kernel32.inc'

    [​IMG]

    В результате получаю такую картину, но хотелось-бы добавить сюда стоку с вендором устройства.
    Вычислить его можно двумя способами - или залезть в BLOB (адрес имеем в столбце "IeOffs") и проверить элемент №221, или-же скачать базу OUI (размер txt-файла 5МБ), где к МАС-адресам привязывается вендор. Тесты в отладчике показали, что производитель не всегда сбрасывает в BLOB свой паспорт, а потому я решил использовать второй вариант с базой МАС.

    Но база по ссылке огромная, и включает в себя не только девайсы Wireless, но в основном и Ethernet адаптеры, которые (в данном случае) мне не нужны. Здесь проще создать свою базу в формате fasm'a, прописав в неё пару сотен вендоров. Поэтому просьба, кому не в лом посмотрите, что у вас возвращает исполняемый файл в скрепке, а я по логам ваших МАС-адресов вытащу их из глобальной базы по ссылке. По сути, из 6-байтного значения МАС нужны только первые 3-байта (мл.три это № девайса внутри вендора).

    Но если можно будет обработать оригин/базу каким-нибудь скриптом (чтобы изменить её формат), было-бы вообще прекрасно! Лично я в скриптах не особо разбираюсь, а потому даже и не пытался. Вот пример, что есть, и во-что его требуется преобразить:

    Код (Text):
    1. ;//---- Имеем в оригин.базе
    2.      20-44-3A   (hex)      Schneider Electric Asia Pacific Ltd
    3.      20443A     (base 16)  Schneider Electric Asia Pacific Ltd
    4.      13F East Wing, Warwick House, Taikoo Place
    5.      Quarry Bay  
    6.      Hong Kong
    7.  
    8.      5C-24-79   (hex)      Baltech AG
    9.      5C2479     (base 16)  Baltech AG
    10.      Lilienthalstrasse 27
    11.      Hallbergmoos    85399
    12.      Germany
    13.  
    14. ;//---- Перевести скриптом в такой формат
    15. dd  0x20443A
    16. db  'Schneider Electric Asia Pacific Ltd - Hong Kong ',0
    17. dd  0x5C2479
    18. db  'Baltech AG - Germany                            ',0
     

    Вложения:

    • BssList.png
      BssList.png
      Размер файла:
      44,6 КБ
      Просмотров:
      385
    • Wlan.zip
      Размер файла:
      1,2 КБ
      Просмотров:
      120
  2. R81...

    R81... Active Member

    Публикаций:
    0
    Регистрация:
    1 фев 2020
    Сообщения:
    141
    Какие еще в Жапу скрипты в редакторе не хотите вручную набирать команды короче чем ваш пост.
    P.S. У меня несколько глючный на больших для него файлах DOS ME-7
    так что возможны ошибки.
     

    Вложения:

    • XLIST.Txt
      Размер файла:
      1,4 МБ
      Просмотров:
      146
    Marylin нравится это.
  3. Marylin

    Marylin Active Member

    Публикаций:
    0
    Регистрация:
    17 фев 2023
    Сообщения:
    110
    R81..., вооо, спасибо большое!