
Ваяем сниффер собственными руками
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);