
Ваяем сниффер собственными руками
Xakep, номер #034, стр. 034-075-1
Horrific (smiandr@mail.ru www.x-c-r.com) & Лозовский Александр (klouniz@mail.ru)
Я думаю, ты знаешь, что такое sniffer и для чего он нужен. Скорей всего в твоем арсенале уже существует пара тварей с этим гордым названием. Но настоящий Х-мэн должен сам уметь создать своего боевого друга. Сегодня тебе предстоит познакомиться с основами этого нелегкого труда. Для тех, кто только проснулся, сообщаю: пакетный сниффер - это программа, которая принимает и сохраняет пакеты из сети, причем не всегда адресованные данному интерфейсу. Хорошо звучит? Очень сильно отдает твоими любимыми средствами получения информации - хороший троян, соколиный глаз, большое ухо, горячий утюг :). И вот именно этого монстра нам предстоит сегодня создать собственными руками.
Первый раз в первый класс
Любая работа с сетью - сидение в чате, заливка патчей для M$-WC - есть обмен информацией. Она пакуется в пакеты и если надо, то фрагментируется (bo to frag, хе-хе...). К пакетам цепляется заголовок, содержащий сведения для его доставки, и они отправляются по IP адресу. Нет, конечно, есть еще маска подсети (255.255.255.0), нужная для отделения адреса компа от адреса сети. Но это на сегодня не колышет.
В Win9x отправкой и приемом данных занимается Winsock. В первой версии этой библы вообще не было ничего для прямой работы с пакетами, а про прямой доступ к сетевухе MS вообще забыла. Ну что поделаешь, если у их программеров склероз. Во второй версии уже появились функции для работы с пакетами. Ты мне не поверишь, но они не работают :). Ну нельзя сказать, что совсем, но работают не так, как нам хочется.
На первый взгляд все безнадежно, и написать sniffer без прямого доступа к сетевухе или пакетам мы не сможем. Но это только первый взгляд, потому что мы можем обойти MS и все же получить прямой доступ к сетевухе. Для этого есть уже готовая библиотека packet.dll (ее, кстати, пользует известный "DSniff"). Вот и мы ее сегодня поюзаем. В ней уже есть все необходимые функции для работы с пакетами, самые нужные из которых я сейчас и опишу в качестве курса лекций :).
Назад в школу
function PacketGetAdapteames(
pAdapterDescs: PChar;
nAdapterDescs: USLONG;
pnAdapterDescsMax: PUINT
): BOOL; stdcall;
Эта функция возвращает список доступных сетевых адаптеров. Функция возвращает TRUE, если все путем, FALSE - если произошла ошибка.
PAdapterDescs - после вызова, сюда запишутся имена и адреса доступных адаптеров. Ты должен сюда передать массив из структур типа ADAPTER_DESC. Его длину можешь установить в 4, потому что в среднестатистическом компе не бывает больше 2-3 адаптеров.
NadapterDescs - длина массива.
PnAdapterDescsMax - сюда запишут, сколько адаптеров реально установлено в компе.
function PacketOpenAdapter(
Adapteame: LPSTR
): DWORD; stdcall;
Открываем инсталлированный адаптер. В качестве параметра нужно указать имя, которое ты получил после вызова PacketGetAdapteames. Функция возвращает указатель на адаптер.
function PacketAllocatePacket(
AdapterObject: LPADAPTER
): DWORD; stdcall;

















































































































