Работа с NetBIOS

Фленов Михаил

Xakep, номер #050, стр. 050-080-2


6) Length - длина буфера. По этому числу библиотека сможет узнать, сколько данных ты хочешь отправить в сеть или получить.

7) Параметр CallName - это имя удаленного приложения.

8) Противоположность предыдущему Name - имя твоей программы.

9) Далее идет RTO - время ожидания (time-out) при получении данных. Учти, что ты указываешь число единиц времени, а одна единица равна 500 миллисекундам. Одна секунда равна 1000 миллисекундам, а значит, если указать число 2, то мы попросим ожидать приема ровно 1 секунду.

10) Противоположностью предыдущему является STO - время ожидания отправки данных по сети. Также указывается в единицах, где одна единица равна 500 миллисекундам.

11) PostPrc указывает на процедуру, которую необходимо выполнить после выполнения команды в асинхронном режиме. Такая процедура должна иметь вид:

TNCBPostProc = procedure(P: PNCB);

Это значит, что она обязана иметь один и только один параметр в виде переменной типа PNCB, т.е. указатель на структуру TNCB.

Если ты работаешь в доисторическом Windows 3.11 (мои соболезнования), то этот параметр будет состоять из пары параметров Post_Offs и Post_Seg (указатель на сегмент и смещение).

12) Lana_Num - номер адаптера, с которым необходимо работать.

13) Cmd_Cplt - это код выполнения команды. Здесь также при асинхронной работе будет стоять значение $ff или константа NRC_PENDING.

14) Reserved - зарезервированный параметр. Должен равняться нулю.

15) Event - удобная фишка Win32 - событие. Его удобно использовать при работе в асинхронном режиме, когда необходимо узнать моменты окончания выполнения асинхронной операции.

Как работает пример

Я не буду описывать весь пример, потому что для него уже не остается места, но дам несколько замечаний. Прежде чем использовать протокол NetBIOS, я вызываю свою функцию NbLanaEnum, в которой происходит перечисление всех доступных в компьютере сетевых устройств. Для этого используется NetBIOS команда NCB_ENUM.

После этого запускается цикл для всех найденных устройств (LANA). Внутри цикла я, по идее, должен просто определить MAC-адрес устройства - но не тут-то было. В NetBIOS, прежде чем использовать любой LANA, его надо обнулить. Для этого я вызываю свою процедуру NbReset, в которой выполняю NetBIOS команду NCB_RESET. Не пренебрегай обнулением, даже если уверен, что программа сработает без этой команды. Никогда нельзя быть уверенным на 100%.

А теперь, после перечисления и обнуления, я смело могу вызывать свою функцию NbGetMacAddr, которая как раз и определит соответствующий устройству МАС-адрес.

Когда будешь разбираться с кодом, то обрати внимание на одну закомментированную строку:

NCB.CallName[0] := Byte('*');

Если в параметре CallName указать звездочку, то ты указываешь локальную машину, и необязательно знать ее NetBIOS. Если нужна удаленная тачка, то делай именно так, как в примере.

Шкодинг

В этой статье я рассказал теорию, которую нельзя объяснить с помощью только примера. Без понимания всего описанного невозможно изучать NetBIOS. Но небольшой пример у меня для тебя все же есть. Я написал небольшую программку, которая по NetBIOS имени компьютера определяет его MAC-адрес. Этот пример находится на диске вместе с необходимым заголовочным файлом для Delphi и на моем сайте в разделе Хакер-Исходники.

Назад на стр. 050-080-1  Содержание  Вперед на стр. 050-080-3