Диссертация Кочарян С.Г — копия (1195360), страница 7
Текст из файла (страница 7)
В Windows 2000/XP/2003 для такойустановки необходимо наличие в inf-файле секций [DefaultInstall32.Xxx] и[DefaultInstall32.Xxx.Services], где "Ххх" обозначает суффиксы декорированияимен nt, ntx86, ntia64.Использование таких секций и усеченная установка из программыПроводник (то есть без вовлечения Мастера Установки) зачастую даютнеприемлемые результаты, поэтому рекомендуется при установке драйверов48использовать обычный способ установки через Мастера Установки новыхустройств.Установка драйвера при помощи inf-файлов является приемлемым иобщепринятым решением для проведения установки драйвера в системе,особенно если драйвер следует передать для использования другим людям,которые не могут и вовсе не обязаны быть в курсе тонкостей установкиразработанного драйвера.495 Фильтр пакетовОдной из основных функций драйвера является фильтрация пакетов.Проходящих через него пакетов.
Так как мой драйвер является Минипортомпромежуточного звена NDIS. Через него проходят все пакеты, направляемыена сетевые адаптеры, модемы и виртуальные соединения (VPN), а также всеполучаемые пакеты.Для передачи пакетов в NDIS используются специальные пакеты. Приполучении данных из сети драйвер сетевой карты выделяет ресурсы под NDISпакет и помещает в него полученные данные. Также работает и драйверпротокола.NDIS-пакет является структурой NDIS_PACKET которая содержитследующие поля:поле PhysicalCount содержит количество физических страниц впакете;поле TotalLength содержит длину данных в пакете;поля Head, Tail ууказывают на первый и последний буферы пакета;поле Flags – Флаги;закрытые данные для драйвера и минипорта.На рисунке 5.1 показана структура NDIS-пакета.Буферы являются структурой NDIS_BUFFER, которая в свою очередьявляется переименованной структурой MDL.
Структура MDL имеетследующие поля:поле Next указатель на следующий буфер;поля Size содержит размер буфера;поля MdlFlags содержит флаги;поле MappedSystemVa указывает начальный виртуальный адресстраници;поле StartVa указывает начальный виртуальный адрес буфера;50поле ByteCount содержит количество байт в буфере;поле ByteOffset содержит смещение от начала страници.Структура NDIS буфера также отображена на рисунке 5.1.NDIS-пакетPhysicalCountTotalLengthHeadTailFlags...NDIS-буфер 1NextSizeMdlFlagsMappedSystemVaStartVaByteCountByteOffset...NDIS-буфер 2NextSizeMdlFlagsMappedSystemVaStartVaByteCountByteOffset...Ethernet-пакетByteCountNDIS-буфер №1...NDIS-буфер NNextSizeMdlFlagsMappedSystemVaStartVaByteCountByteOffset...NULL...ByteCountNDIS-буфер №2ByteCountNDIS-буфер NРисунок 5.1 – Структура и взаимодействие NDIS пакета, NDIS буфера, исодержащегося в NDIS пакете Ethernet пакетаВ NDIS-пакете данные идут не подряд, а разбиваются кусочки.
За каждыйтакой кусочек отвечает свой буфер. Обычно разные заголовки вложенныхпакетов идут в отдельных буферах это связано с тем что данные заголовкизаполняются разными драйверами, так же весь пакет может быть в одномбуфере, обычно такую структуру имеет пакет, идущий от драйвера сетевойкарты к драйверу протокола.В связи с такой сложной организацией пакета для доступа к данным пакетапришлось разрабатывать специальные функции:51функция GetBufferSize определяет общий размер цепочки буферов;функция GetPacketDataSize определяет размер данных в пакете;функция CopyPacketData копирует весь Ethernet пакет в буфер.На рисунке 5.2 показан принцип заполнения буфера в NDIS-пакете.EthernetIPUDPEthernetIPUDPEthernetданныеданныеданныеARPEthernetIPTCPEthernetIPTCPданныеданныеданныеEthernetIPTCPEthernetIPTCPРисунок 5.2 – Заполнение буферов в NDIS-пакетеДля фильтрации в точках входа MiniportSendPackets и ProtocolReceiveвызывается функция фильтрации FilterIP, которая разрешает или запрещаетпакет в соответствии с действующими правилами.Функция FilterIP копирует содержимое в отдельный буфер, этонеобходимо из-за сложной организации данных в пакете.
После этого онвызывает функцию GetPacketTCPIPInfoEX, которая расшифровывает данныев пакете для TCPIP протокола, если пакет не является TCPIP пакетом, тофункция GetPacketTCPIPInfoEX возвращает false и в результате пакетразрешается для передачи, после чего при помощи функции GetPraviloIDопределяется правило под которое под подает пакет. Если пакет не подпадает,под какое-либо правило, то пакет разрешается для передачи. Также ведётсялогвсехобработанныхпакетов,дляэтоговызываетсяфункцияAddFirewallLog.В функции GetPacketTCPIPInfoEX в начале расшифровывается Ethernetзаголовок, что изображено на рисунке 5.3. Ethernet заголовок на аппаратном и52программном уровне имеет разную структуру из-за того, что часть полей такихрак Преамбула, начальный разделитель и контрольная сумма генерируютсячипом сетевой карты.Ethernet заголовок на аппаратном уровне62 бита2 бита6 байт6 байт2 байтаот 46 до 1500 байт4 байтаПреамбулаНачальныйразделительMAC Адрес назначенияMAC Адрес источникаТип илиразмерДанныеКонтрольнаясуммаEthernet заголовок на программном уровне6 байт6 байт2 байтаот 46 до 1500 байтMAC Адрес назначенияMAC Адрес источникаТип илиразмерДанныеРисунок 5.3 – Ethernet заголовок на програмном и аппаратном уронеДля определения содержимого пакета используется поле тип пакета.
Дляпротокола TCP/IP тип равен 0x0800. IP заголовок начинается сразу после полятип в Ethernet заголовке, то есть со смещение 14 от начала пакета.На рисунке 5.4 изображен IP-заголовок.03Версия7Длина в 32-хбитовых словах15Тип сервисаИдентификацияВремя жизни31Общий размерФлагиПротоколСмещение фрагментаКонтрольная суммаIP Адрес отправителяIP Адрес получателяОпции и заполнеияДанныеРисунок 5.4 – IP заголовокВ IP заголовке для проверки в начале, определяю версию протокола, онадолжна быть равна четырем. После этого из поля iph_verlen получает размерзаголовка в 32-х битовых словах.
Если пакет является TCP пакетом, тоопределяю TCP заголовок и данные в нём. Аналогично поступаю, если пакет53является UDP пакетом. Вся информация об анализе пакета помещается вструктуру TPacketTCPIPInfo.Функция GetPraviloID просматривает таблицу правил и ищет правило, подкоторое подпадает пакет. Если правило чётко указывает что пакет надозапретить или разрешить, то функция возвращает номер правила. А если вправиле указан фильтр, то пакет передаётся в фильтр, который определяет,запретить пакет или нет, если нет, то просматриваются следующие правила.546 Фильтр HTTP трафикаФильтр HTTP трафика простаивает, пакеты и выискивает заголовки HTTPзапросов, после этого расшифровывает их.
Определяет Host и URL после чегопросматривает на совпадение со списками, если фрагмент Host или URLсовпал со списком то пакет содержащий данный запрос удаляется.HTTP основывается на парадигме запросов/ответов. Запрашивающаяпрограмма (обычно она называется клиент) устанавливает связь собслуживающей программой-получателем (обычно называется сервер) ипосылает запрос серверу в следующей форме: метод запроса, URI, версияпротокола, за которой следует MIME-подобное сообщение, содержащееуправляющую информацию запроса, информацию о клиенте и, может быть,тело сообщения. Сервер отвечает сообщением, содержащим строку статуса(включая версию протокола и код статуса - успех или ошибка), за которойследует MIME-подобное сообщение, включающее в себя информацию осервере, метаинформацию о содержании ответа, и, вероятно, само тело ответа.Следует отметить, что одна программа может быть одновременно и клиентоми сервером.
Использование этих терминов в данном тексте относится только кроли, выполняемой программой в течение данного конкретного сеанса связи,а не к общим функциям программы.В Интернет коммуникации обычно основываются на TCP/IP протоколах.Для WWW номер порта по умолчанию – TCP 80, но также могут бытьиспользованы и другие номера портов – это не исключает возможностииспользовать HTTP в качестве протокола верхнего уровня.
Поэтому присоздании фильтра HTTP пакетов должен определять является ли пакет HTTPзапросом или нет в независимости от порта на который или с которого идутпакеты.Для большинства приложений сеанс связи открывается клиентом длякаждого запроса и закрывается сервером после окончания ответа на запрос.55Тем не менее, это не является особенностью протокола. И клиент, и сервердолжны иметь возможность закрывать сеанс связи, например, в результатекакого-нибудь действия пользователя. В любом случае, разрыв связи,инициированный любой стороной, прерывает текущий запрос, независимо отего статуса.Фильтр HTTP трафика фильтрует только запросы так, как в HTTPпротоколе сервер не может передать какие либо данные без запроса.Запрос–этосообщение,посылаемоеклиентомсерверу.Первая строка этого сообщения включает в себя метод, который должен бытьприменен к запрашиваемому ресурсу, идентификатор ресурса и используемуюверсию протокола.
Для совместимости с протоколом HTTP/0.9, существуетдва формата HTTP запроса:простой запрос: «GET» SP Запрашиваемый-URI CRLF;полный запрос: Строка-Статус;*(Общий-Заголовок | Заголовок-Запроса | Заголовок-Содержания) CRLF[Содержание-Запроса ]Если HTTP/1.0 сервер получает Простой-Запрос, он должен отвечатьПростым-Ответом HTTP/0.9. HTTP/1.0 клиент, способный обрабатыватьПолный-Ответ, никогда не должен посылать Простой-Запрос.Запрашиваемый-URI может быть двух типов: абсолютный-URL иотносительный-URL. Абсолютный-URL допускается только при обращении кproxy серверу.
Строка запроса, например, может иметь такой вид:« GET http://www.w3.org/pub/WWW/TheProject.html HTTP/1.0 »Относительный-URL используется при прямом соединении. Например,для « http://www.w3.org/pub/WWW/TheProject.html » необходимо соединится ссерверов www.w3.org, через TCP соединение на 80 порт и послать запрос:« GET /pub/WWW/TheProject.html HTTP/1.0 »На одном сервере может быть несколько обслуживаемы хостов. В запросдобавляется параметр Host который записывается следующим образом:Host: SP Имя_хоста CRLF56Заголовок полного запроса состоит из строк заканчивающихся символамиCRLF и заканчивается пустой строкой то есть символами CRLFCRLF.Для анализа HTTP запросов используется функция FilterHTTP котораяанализирует данные в пакете и если он является HTTP запросом то извлекаетиз него такие данные как URL и Host. Для этого она делит пакет на строкидотех пор пока не поподётся пустая строка или не закончатся данные в пакете.После этого происходит анализ первой строки запроса.Первая строка запроса является простым запросом или Статус строкойполного запроса.Строка Статус начинается со строки с названием метода, за которымследует URI-Запроса и использующаяся версия протокола.
Строка Статусзаканчивается символами CRLF. Элементы строки разделяются пробелами(SP). В Строке Статус не допускаются символы LF и CR, за исключениемзаключающей последовательности CRLF.Строка-Статус: Метод SP URI-Запроса SP «Версия-HTTP» CRLFСледует отметить, что отличие Строки Статус Полного-Запроса от СтрокиСтатус Простого- Запроса заключается в присутствии поля «Версия-HTTP».Для определения является ли первое слова в стороке методом HTTPзапросов вызывается функция IsHTTPMetod. Которая которая вкачествепараметря получает первую строку запроса. В в HTTP запросе могут бытьсдующие методы: GET, HEAD, PUT, POST, DELETE, LINK, UNLINKМетодGETслужитдляполучениялюбойинформации,идентифицированной URI-Запроса. Если URI- Запроса ссылается на процесс,выдающийданные,вкачествеответабудутвыступатьданные,сгенерированные данным процессом, а не код самого процесса (если толькоэто не является выходными данными процесса).Метод GET изменяется на «условный GET», если сообщение запросавключает в себя поле заголовка «If-Modified-Since».