
Ваяем сниффер собственными руками
Xakep, номер #034, стр. 034-075-2
Распределение пакета. AdapterObject - указатель на адаптер, который ты получил после вызова PacketOpenAdapter. Функция возвращает указатель на подготовленный пакет.
procedure PacketFreePacket(
plpPacket: LPPACKET
); stdcall;
Уничтожить созданный пакет, не освобождая буфер.
procedure PacketInitPacket(
plpPacket: LPPACKET;
Buffer: PChar;
Length: USLONG); stdcall;
Связывает с пакетом буфер под получаемые данные.
PlpPacket - пакет созданный с помощью PacketAllocatePacket
Buffer - буфер.
Length - длина буфера.
function PacketReceivePacket(
AdapterObject: LPADAPTER;
plpPacket: LPPACKET;
Sync: Boolean;
BytesReceived: PULONG
): Boolean; stdcall;
Ну, это самое вкусное - получение пакета.
AdapterObject - указатель на адаптер.
PlpPacket - полученный пакет :).
Sync - режим получения пакета (синхронный или асинхронный).
BytesReceived - сколько байт получили (это архиважно для идентификации приложения, пославшего пакет).
Если ты будешь использовать асинхронный режим, то тебе придется еще пользоваться функцией PacketWaitPacket для ожидания пакета. Для нас это лишнее усложнение задачи, поэтому я этим гемором заниматься не буду.
procedure PacketCloseAdapter(
AdapterObject: LPADAPTER
); stdcall;
Эта функция закрывает открытый адаптер.
Вперед, к светлому будущему
С основными функциями покончено. Этого достаточно для написания простейшего сниффера. Как видишь, ни в одной из функций нет указаний на IP адреса или порт. Как ты думаешь, почему? Как же тогда отправляются пакеты? Да очень просто. Мы здесь работаем на самом низком из возможного сетевом уровне, а здесь порты не хиляют. Все это ты должен ручками обрабатывать в структуре LPPACKET.
Теперь перейдем к примеру, в процессе которого я покажу тебе еще, как определить MAC-адрес и как установить фильтр для входящих пакетов.
Пошкодим
Запускай Delphi. Брось на форму 4 компонента TLabel. Два компонента Tedit и две кнопки. Постарайся сделать это, как на рисунке 1.
Теперь дадим названия всем этим компонентам:
Label1: Свойство Caption='Всего байт'.
Label2: Свойство Caption='0'.
Label3: Свойство Caption='Файл лога'.
Label4: Свойство Caption='Исп. Адаптер'.
Button1: Свойство Caption='START!'.
Button2: Свойство Caption='STOP'.
Все, форма готова. Если ты все правильно делал, то у тебя получится нечто похожее на рисунок.
Сетевой кодинг
Теперь можно переходить к кодингу. Объяви в разделе private переменные, указанные как "Объявление переменных". Все эти переменные понадобятся нам во время кодинга. Как только все объявишь, создай обработчик события для формы OnCreate и напиши там текст, указанный во врезке 2 "Обработчик события OnCreate". Теперь создай обработчик события OnClick для кнопки Button1. Там напиши все, что указано относительно "Обработчика OnClick".
Пример готов, можешь его компилировать. Более полный вариант исходника ты можешь забрать у меня на сайте. Здесь я привел необходимый минимум непосредственной работы с сетью. Все что касается оформления - я опустил, чтобы не забивать место журнала. Если ты давно уже кодишь на Delphi, то без проблем и сам улучшишь этот маленький сниффер. Ну а если ты начинающий, то бегом ко мне на сайт.