Добрый день, всем! Мне необходимо написать Firewall. Воспользовавшись статьей – «Способы фильтрации сетевого траффика в Windows 9x/2000/Net.2003 Server». Я написал драйвер в котором при приходе пакета вызывается следующая функция: hookproc proc PacketHeaderWORD, PacketWORD, PacketLength:WORD, RecvInterfaceIndex:WORD,SendInterfaceIndex:WORD,RecvLinkNextHopWORD, SendLinkNextHopWORD mov eax,PF_DROP ret hookproc endp Эта функция удаляет все пакеты. Но т.к. Firewall должен отбрасывать только определенные пакеты я сделал следующее. Т.к. в DDK написано то что PacketHeader является указателем на структуру IPHeader я объявил переменную: ipp IPHeader <> и выше описанную функцию переделал к следующему виду: hookproc proc PacketHeaderWORD, PacketWORD, PacketLength:WORD, RecvInterfaceIndex:WORD,SendInterfaceIndex:WORD,RecvLinkNextHopWORD, SendLinkNextHopWORD mov eax,[PacketHeader] mov dword ptr [ipp],eax .if ipp.iph_ttl==128 mov eax,PF_DROP .endif mov eax,PF_PASS ret hookproc endp Т.е. если ttl пакета равен 128 то пакет отбрасывать иначе пропускать. Устанавливаю драйвер. Запускаю ping и вижу что ответы на ping отсылаются. Если убрать условие то все пакеты отбрасываются и на ping это видно. Как сделать это условие чтобы оно работало непонимаю. Порядок байт сетевой и локальный проверял. Используя сниффер смотрел как в оригинале выследит то или иное поле. Поле ttl в ping равно 128. Остальные поля пробовал результат такой же как и с ttl. P.S. Всех с наступающим Новым годом.
Мне кажется я путаюсь в указателях. В Visual C работает так: IPPacket *ipp; ipp=(IPPacket *)PacketHeader; if (ipp->iphTTL==128) return PF_DROP; return PF_PASS; Делаю в ассемблере: ipp IPHeader <> mov eax,[PacketHeader] mov dword ptr [ipp],eax .if ipp.iph_ttl == 128 mov eax,PF_DROP ret .endif mov eax,PF_PASS И почему то условие не срабатывает. В Visual C IPPacket вынесена в отдельный h файл. В ассемблере описана в pfhook.inc файл был взят с данного сайта. Мне кажется я путаю с указателями. Подскажите что не так, а то диплом надо дописывать.
Григорий Я не понял IPHeader у вас структура или указатель на структуру ? может лучше так : Код (Text): mov eax,[PacketHeader] assume eax:ptr IPHeader .if [eax].iph_ttl == 128 mov eax,PF_DROP ret .endif mov eax,PF_PASS assume eax:nothing
итого Код (Text): hookproc proc PacketHeader:DWORD, Packet:DWORD, PacketLength:WORD, RecvInterfaceIndex:WORD,SendInterfaceIndex:WORD,RecvLinkNextHop:DWORD, SendLinkNextHop:DWORD mov eax, [PacketHeader] mov eax, [eax + IPHeader.iph_ttl] cmp eax, 128 jne __exit mov eax, PF_DROP ret __exit: mov eax, PF_PASS ret hookproc endp
Григорий Есть сорец на данном сайте, сорец FireWall`а от SteelRat, он сделал попытку портирования под винды FreeBSD`шного ipfw и на ассемблере, думаю вам будет интересно
Огромное всем спасибо!!! Все заработало. Полный код драйвера прилогаю как и обещал. В нем устанавливается Hook и условие на Ip адрес отправителя. Ещё раз всем спасибо!!!
Огромное всем спасибо!!! Все заработало. Код драйвера прилагаю, как и обещал. В нем устанавливается Hook и производится проверка на адрес отправителя. Все остальные части Firewall реализованы в другом модуле. Пока его дописываю. Еще раз всем спасибо!!!