Firewall своими руками

Тема в разделе "WASM.NETWORKS", создана пользователем Григорий, 17 дек 2006.

  1. Григорий

    Григорий New Member

    Публикаций:
    0
    Регистрация:
    28 сен 2006
    Сообщения:
    32
    Добрый день, всем! Мне необходимо написать Firewall. Воспользовавшись статьей –
    «Способы фильтрации сетевого траффика в Windows 9x/2000/Net.2003 Server». Я написал драйвер в котором при приходе пакета вызывается следующая функция:

    hookproc proc PacketHeader:lol: WORD, Packet:lol: WORD, PacketLength:WORD,
    RecvInterfaceIndex:WORD,SendInterfaceIndex:WORD,RecvLinkNextHop:lol: WORD,
    SendLinkNextHop:lol: WORD

    mov eax,PF_DROP

    ret
    hookproc endp

    Эта функция удаляет все пакеты. Но т.к. Firewall должен отбрасывать только определенные пакеты я сделал следующее. Т.к. в DDK написано то что PacketHeader является указателем на структуру IPHeader я объявил переменную:
    ipp IPHeader <>

    и выше описанную функцию переделал к следующему виду:

    hookproc proc PacketHeader:lol: WORD, Packet:lol: WORD, PacketLength:WORD,
    RecvInterfaceIndex:WORD,SendInterfaceIndex:WORD,RecvLinkNextHop:lol: WORD,
    SendLinkNextHop:lol: WORD

    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. Всех с наступающим Новым годом.
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    всегда PF_PASS бужет возвращаться.
     
  3. Григорий

    Григорий New Member

    Публикаций:
    0
    Регистрация:
    28 сен 2006
    Сообщения:
    32
    Спасибо за ответ. Буду пробывать. Как сделаю так выложу работающую функцию.
     
  4. Григорий

    Григорий New Member

    Публикаций:
    0
    Регистрация:
    28 сен 2006
    Сообщения:
    32
    Мне кажется я путаюсь в указателях. В 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 файл был взят с данного сайта. Мне кажется я путаю с указателями. Подскажите что не так, а то диплом надо дописывать.
     
  5. AB_Celitel

    AB_Celitel New Member

    Публикаций:
    0
    Регистрация:
    9 июл 2005
    Сообщения:
    72
    Адрес:
    Россия, г.Иваново
    Григорий

    Я не понял IPHeader у вас структура или указатель на структуру ?

    может лучше так :
    Код (Text):
    1. mov eax,[PacketHeader]
    2. assume eax:ptr IPHeader
    3. .if  [eax].iph_ttl == 128
    4.  mov eax,PF_DROP
    5. ret
    6. .endif
    7. mov eax,PF_PASS
    8. assume eax:nothing
     
  6. P_F

    P_F New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2006
    Сообщения:
    116
    Адрес:
    Russia
    итого :)
    Код (Text):
    1. hookproc proc PacketHeader:DWORD, Packet:DWORD, PacketLength:WORD,
    2.         RecvInterfaceIndex:WORD,SendInterfaceIndex:WORD,RecvLinkNextHop:DWORD,
    3.         SendLinkNextHop:DWORD
    4.        
    5.         mov  eax, [PacketHeader]    
    6.         mov  eax, [eax + IPHeader.iph_ttl]
    7.         cmp  eax, 128
    8.         jne  __exit
    9.            mov  eax, PF_DROP
    10.            ret
    11.        
    12. __exit:
    13.         mov eax, PF_PASS
    14.         ret
    15. hookproc endp
     
  7. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Григорий
    Есть сорец на данном сайте, сорец FireWall`а от SteelRat, он сделал попытку портирования под винды FreeBSD`шного ipfw и на ассемблере, думаю вам будет интересно
     
  8. Григорий

    Григорий New Member

    Публикаций:
    0
    Регистрация:
    28 сен 2006
    Сообщения:
    32
    Огромное всем спасибо!!! Все заработало. Полный код драйвера
    прилогаю как и обещал. В нем устанавливается Hook и условие
    на Ip адрес отправителя. Ещё раз всем спасибо!!!
     
  9. Григорий

    Григорий New Member

    Публикаций:
    0
    Регистрация:
    28 сен 2006
    Сообщения:
    32
    Огромное всем спасибо!!! Все заработало. Код драйвера прилагаю, как и обещал. В нем устанавливается Hook и производится проверка на адрес отправителя. Все остальные части Firewall реализованы в другом модуле. Пока его дописываю. Еще раз всем спасибо!!!
     
  10. yoanm

    yoanm New Member

    Публикаций:
    0
    Регистрация:
    24 дек 2006
    Сообщения:
    1
    Григорий
    Григорий, мне очень нужна ваша помощь, как с вами связаться?
     
  11. Григорий

    Григорий New Member

    Публикаций:
    0
    Регистрация:
    28 сен 2006
    Сообщения:
    32
    Добрый день,yoanm!
    Связаться со мной просто, через e-mail.
    Пиши на адрес: Perepiskas@yandex.ru