ЖУРНАЛ ХАКЕР

Ваяем сниффер собственными руками

Xakep, номер #034, стр. 034-075-3


Тест удачен

Я запустил свой сниффер и одновременно пингонул соседнюю машину. После пинга я посмотрел в файл лога, созданный сниффером. Ты тоже можешь увидеть этот лог на рисунке 4. Честно сказать, разобраться в чем-то здесь очень тяжело, но иногда это единственный способ. Примерчик получился простейший, и его еще можно очень сильно улучшить. Например, опрос сетевухи лучше убрать в отдельный поток, что улучшит скорость опроса, и прога не будет выглядеть тормознутой.

Гуд бай, Америка!

После появления рубрики "Кодинг" ко мне повалили письма с просьбой добавить в нее описания сетевых прог. Возможно твоя мечта когда-нибудь сбудется. Но главное - начало этому положено. Исходники примера, как всегда, ты можешь взять с моего сайта www.cysoft.com/vr-online/. Там же есть и необходимые заголовочные файлы. Только одно предупреждение - пример работает только в Win9x. В NT и тем более в win2000 прога будет материться как прапорщик.

Итак, мне осталось только подвести итог. Мы написали простейший сниффер с использованием Борман Delphi. И пусть теперь кто-нибудь скажет, что на Delphi это невозможно. Возможно все, надо только постараться.

P.S. Совсем недавно мне посчастливилось познакомиться с совершенно новым типом снифферов. Этот гад ворует газеты из моего почтового ящика :). Да не из мыльника, а из реального ящика, который висит в подъезде. Слушай, ты, сниффер хренов. Поймаю, ноги вырву :).

Объявление переменных

private

{ Private declarations }

NumPack,NumByt: integer;

FAdapterDescs: array[0..4-1] of ADAPTER_DESC;

FAdapterName: String;

NADO: Boolean;

FhAdapter: DWORD;

FpPacket: LPPACKET;

FuBuffer: Array [0..1520] oF ChaR;

Bytes: DWord;

LogF: TFileStream;

Обработчик события OnCreate

procedure TForm1.FormCreate(Sender: TObject);

var

FadapterCount:Integer;

Begin

//Получим доступн. адаптеры

PacketGetAdapterNames(@FAdapterDescs, 4, @FAdapterCount);

//Получим имя адаптера

FAdapterName:= StrPas (@FAdapterDescs[0].SzAdapterDesc);

//Расскажем о юзаемом адаптере

Edit2.Text:= FAdapterName;

NumPack:=0; NumByt:= 0;

end;

Обработчик OnClick

procedure TForm1.Button1Click(Sender: TObject);

var

i: integer;

FuMac: array[0..5] of UCHAR;

begin

FhAdapter:= PacketOpenAdapter(FAdapterDescs[0].szAdapterName);

IF FhAdapter=0 then

begin

MessageDlg ('Не могу открыть адаптер.',mtError,[mbIgnore],0);

exit;

end;

//Получить описание адаптера

PacketAdapterDesc(LPADAPTER(FhAdapter),

@FuBuffer[0], sizeof(FuBuffer), @i);

//Получить MAC адрес

PacketGetAddress(LPADAPTER(FhAdapter),

@FuMac[0], 6, @i);

//Установить фильтр для входящих пакетов

PacketSetFilter(LPADAPTER(FhAdapter),

NDIS_PACKET_TYPE_PROMISCUOUS);

FpPacket := LPPACKET( PacketAllocatePacket(LPADAPTER(FhAdapter)) );

IF (FpPacket= Nil) then

begin

MessageDlg ('Облом',mtError,[mbNo],0);

PacketCloseAdapter(LPADAPTER(FhAdapter));

HALT;

end;

//Пора определить буфер и его размер

PacketInitPacket(FpPacket, @FuBuffer[0], 1520);

Назад на стр. 034-075-2  Содержание  Вперед на стр. 034-075-4