Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 2 3 4 [5] 6 7 8   Вниз
  Печать  
Автор Тема: NDIS InterMediate Driver - Обсуждение  (Прочитано 240035 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
brovy@n
Гость
« Ответ #120 : 22-04-2006 17:00 » 

Да уже допетрил........ Спасиб  Класс!
 ----------------------

Просто ради интересу: где сервак находится, на котором этот сайтец хостица?
а то у меня ужо 3:57, только a.m. и уже 23 число!!!(типа пасха)
Записан
brovy@n
Гость
« Ответ #121 : 22-04-2006 17:00 » 

P.S. На Солдатова только что наткнулся Ага
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #122 : 22-04-2006 18:47 » 

Цитата
Просто ради интересу: где сервак находится, на котором этот сайтец хостица?
а то у меня ужо 3:57, только a.m. и уже 23 число!!!(типа пасха)
Хотя это оффтоп. Но Сервер стоит в Москве и время Сервера -2 часа GMT. Чтобы у тебя показывалось нормальное время, ты должен сам в своих настройках профиля настроить временное смешение. Секция называется "Внешний вид форума". Пункт "Time Offset".
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
aks68
Модератор

il
Offline Offline
Пол: Мужской

« Ответ #123 : 22-04-2006 23:06 » 

Спасибо за совет.
Насчет MPSend и MPSendPackets, то на сколько я понял, первая используется при отправке одного пакета, а вторая отправляет пакеты из массива.
Вро порт, так это я именно про входящие. Вот я что и спрашивал - не пойму точно когда Receive, а когда Send. В документации я где-то вычетал, что для, например, фильтрации можно использовать как первую, так и вторую (т.е. как в модуле минипорта непосредственно перед отправкой, так и в протоколе перед получением). Вот что происходит при принятии пакета? Какая последовательность функций? Receive -> обработка -> Send ?

Добрый день!

1. Насчет MpSend (MiniportSend) и MpSendPackets (MiniportSendPackets) правильно - Send шлет единичный пакет, а SendPackets массив пакетов. К слову сказать SendPackets так-же может послать единичный пакет, если его 3-й аргумент NumberOfPackets установить равным 1. Однако здесь нужно отметить, что обе эти функции - колбэки NDIS-а и только NDIS решает какую из них когда дернуть. В описании функции MiniportSend сказанно, что  MiniportSendPackets доминантная, и что в случае, когда зарегистрированны обе функции NDIS будет вызывать только MiniportSendPackets. Наверное по этому в последних версиях Пастру ее (MiniportSend) вообще незарегистрировали.

2. В NDIS существует 2 независимых потока данных (потока в смысле flow, а не thread Ага ) : ВХОДЯЩИЕ (inbound)пакеты следуют из внешней сети через сетевую карту и драйверы к приложению, а ИСХОДЯЩИЕ (outbound) пакеты следуют от приложений через драйверы наружу. С целью упростить описание я вначале приведу схему взаимодействия Miniport и Protocol драйверов без участия Inter Mediate Driver, а затем вместе с ним.

Путь входящего пакета (без IM).
В тот момент, когда сетевая карта получает данные "снаружи", она тем или иным образом уведомляет об этом минипорт, который в свою очередь преобразует кадр пакета (например Ethernet) в абстракцию используемую NDIS-ом (уже упомянутый здесь NDIS_PACKET) и затем сигнализирует об этом NDIS-у посредством функции NdisMIndicateReceivePacket либо NdisMxxxIndicatrReceieve (в случае Ethernet используется ф-я NdisMEthIndicateReceive). В свою очередь NDIS определяет все драйверы уровня протокола (Protocol Drivers) привязанные к данному минипорту, и для каждого по очереди вызывает их колбэки ProtocolReceive или ProtocolReceivePacket. Таким образом управление по обработке пакета передается в Protocol Driver, который как правило копирует пакет в свой пул данных и затем обрабатывает его как было задумано автором... Разница между ProtocolReceive и ProtocolReceivePacket в том, что ProtocolReceive получает не весь пакет, а только его заголовок и небольшую часть пакета (look ahead buffer) позволяющие быстро определить находится-ли данный пакет в "области интересов" данного Protocol Driver-a. В случае "да" производится "докачка" пакета спомощю ф-и NdisGetReceivedPacket либо чего-то другого и его последующая обработка, в противном случае пакет игнорируется путем возврата статуса NDIS_STATUS_NOT_ACCEPTED.

Путь исходящего пакета (без IM).
В тот момент, когда пакет готов к отправке Protocol Driver вызывает ф-ю NdisSend либо NdisSendPacket  сигнализируя таким образом NDIS-у,  который, основываясь на своих внутренних алгоритмах, определяет вызвать ему MiniportSend либо MinioirtSendPackets и далее управление передается в Miniport Driver...

Описание взаимодействия с IM, я представлю позже - уже поздно иду спать Ага

С уважением,
Акс.
Записан
new_s
Постоялец

by
Offline Offline
Пол: Мужской

« Ответ #124 : 23-04-2006 00:09 » 

а не могли бы вы объяснить(я думаю смый интересный вопрос) как распотрошить пакет?
Записан
aks68
Модератор

il
Offline Offline
Пол: Мужской

« Ответ #125 : 23-04-2006 23:48 » 

а не могли бы вы объяснить(я думаю смый интересный вопрос) как распотрошить пакет?

Добрый день!

В начале я хотел-бы закончить с примерами прохождения пакета, раз уж начал...
Хотя непредставляю, что там из пакета такого можно "выпотрашить"?
Ну тип пакета, IP-адреса, TCP-порты... что-то еще?

С уважением,
Акс.
Записан
aks68
Модератор

il
Offline Offline
Пол: Мужской

« Ответ #126 : 24-04-2006 00:02 » 

Продолжение про пакеты...

Существуют 2 способа подключения IM драйвера:
1. В виде фильтра - при этом соотношение адаптером MP и виртуальным адапрером IM 1:1. Данная схема подходит только для фильтрации пакетов.
2. В виде мултиплексора - при этом соотношение адаптером MP и виртуальным адапрером IM 1:N / N:1. Данная схема подходит для баланса нагрузки.

Нас интересует 1й способ.
При подключении IM драйвера он помещается между драйвером протокола и драйвером минипорта. При этом, что-бы ненарушать порядок взаимодействия, IM драйвер реализует в своей верхней части (upper edge) ф-ции минипорта - для взаимодействия с вышерасположенным драйвером протокола, а в нижней части (lower edge) ф-ции протокола для взаимодействия с низлежащим драйвером минипорта. Порядок взаимодействия частей определяется с помощю связывания компонент взаимодействия, в порядке определяемом при установке IM драйвера. Помимо этого в процессе связывания в области IM драйвера создается виртуальный адаптер для нормальной работы с вышерасположенным драйвером протокола.

Путь входящего пакета (с IM).
1. Сетевая карта получила фрейм Ethernet пакета и MP преобразовал его в NDIS_PACKET
2. MP сигнализирует NDIS-у (так-же, как и в случае без IM)
3. Т.к. адаптер MP связан с "протокольным" концом IM, NDIS вызывает PotocolReceive/ProtocolReceivePacket зарегистрированные IM-ом, и пакет поступает в IM
4. Вначале IM-овский ProtocolReceive(Packet) ведет себя аналогично PD-шному, т.е. анализирует полученые данные чтобы определить что делать с пакетом. Особо подчеркну, что именно здесь должен вступать в игру обработчик правил фильтрации входящих пакетов брэндмауэра (о, блин,  словечко Да что ты говоришь?.....) если таковой имеется.
5. Если после всех проверок система решает пропустить пакет, то IM использует ф-ю NdisMIndicateReceivePacket (здорово выглядит вызов минипортной ф-и из протокольного контекста Ага ) указывая 1м аргументом хэндлер (незнаю как перевести) на контекст привязки вышерасположенного PD к виртуальному адаптеру IM, и таким образом, пакет уходит в PD.

Путь исходящего пакета (с IM).
1. Сформировав пакет PD вызывает NdisSend/NdisSendPacket указывая контекст привязки к виртуальному адаптеру IM, как 1й аргумент.
2. Определив из контекста "куда дуть", NDIS вызывает зарегистрированный IM-ом колбэк MiniportSendPackets.
3. MiniportSendPackets проверяет и копирует пакет, проверяеи состояние MP (> D0), и запускает обработчик правил фильтрации исходящих пакетов брэндмауэра.
4. Если все вышеперечисленное прошло на ОК, то для данного пакета вызывается ф-я NdisSend с указанием на контекст привязки к реальному адаптеру низлежащего MP, и пакет уплывает дальше...


Следует особо отметить, что в отличае от других систем NDIS_PACKET копируется при прохождении с уровня на уровень (а не передается через указатели, как например sk_buf в Linux).


Aks.


Записан
new_s
Постоялец

by
Offline Offline
Пол: Мужской

« Ответ #127 : 24-04-2006 07:55 » 

а не могли бы вы объяснить(я думаю смый интересный вопрос) как распотрошить пакет?

Именно это.
Записан
mamont
Гость
« Ответ #128 : 25-04-2006 07:49 » 

Здравствуйте..
Я тоже пишу IM NDIS драйвер для диплома..
Драйвер должен шифровать исходящие (на определенный адрес) пакеты.. и расшифровывать входящие..
С шифрованием я пока не заморачивался..
пока пытаюсь сделать инкапсуляцию.. т.е. к исходящему пакету приконопатить новый заголовок..
а с входящего снимать..
так вот..
с исходящими пакетами все нормально.. заголовок добавляется (CommView показывает)..
в MpSendPackets отправка реализована..
но как эти пакеты правильно принимать???
в PtRecievePacket написал.. не принимает.. такое впечатление, что просто рубит пакеты..
пробовал в PtRecieve.. тоже не получается..
Посоветуйте чего нибудь...
Может у кого пример есть(работающий) с инкапсуляцией пакетов?
Записан
Uhri
Гость
« Ответ #129 : 26-04-2006 15:32 » 

Спасибо, Акс! Вроде понятне стало. Буду продолжать мучать.
Да, кстати, ты там говорил о двух способах подклучения драйвера... и сказал, что интересует первый... так вот, меня скорее интересует как раз второй... Улыбаюсь В идеале хочу сделать что-то типа трафик-шейпера. Разделять канал хотя бы по клиентам (IP). Ведь насколько я понял из NDIS_PACKET определить IP проще, чем службу прикладного уровня, для которой этот пакет предназначен?
Записан
aks68
Модератор

il
Offline Offline
Пол: Мужской

« Ответ #130 : 27-04-2006 14:11 » 

а не могли бы вы объяснить(я думаю смый интересный вопрос) как распотрошить пакет?

Именно это.

Добрый день!

Извлечение данных из обработанного Ethernet фрейма и из структуры NDIS_PACKET

На данном этапе я, увы, нераспалагаю достаточным к-вом времени, что-бы опробовать нижепреведенный метод на практике. Метод подсмотрен у ребят из ndis.com.  У себя на работе я делаю в общем то-же самое, но немного подругому, однако рабочий код не могу привести по понятным соображениям Жаль. Я надеюсь, что все нижеприведенное поможет Вам, и буду очень рад если Вы сообщите о полученных результатах.


Как уже было сказано ранее данные могут поступать в IM двумя путями - через колбэк зарегистрированный как ProtocolReceive, либо через колбэк зарегистрированный как ProtocolReceivePacket.

В 1-м случае в ф-ю передаются указатели на части обработанного MP-ом Ethernet фрейма, а именно указатель на блок заголовка пакета и его длинна (HeaderBuffer и HeaderBufferSize) и указатель на кусок данных пакета - т.н. LookAhead Buffer - который можно использовать для экспресс-тестов (LookAheadBuffer и LookaheadBufferSize). Из HeaderBuffer легко извлекается тип пакета:

Код:
PktType = HeaderBuffer[12] * 0x100U + HeaderBuffer[13];

Возможные варианты значения:
Код:
1. PktType < 0x05dc (IEEE 802.2/802.3 Encapsulation - RFC 1042)
2. PktType == 0x0800 IP (Ethernet Incapsulation - RFC 894)
3. PktType == 0x0806 ARP (Ethernet Incapsulation - RFC 894)
4. PktType == 0x8035 RARP (Ethernet Incapsulation - RFC 894)
5. PktType == 0x8137 IPX(Ethernet Incapsulation - RFC 894)

Манипуляции по определению IP и портов могут производится над LookAheadBuffer-ом. Его длинна задается с помощю запроса к MP (NdisRequest) с указанием OID_GEN_CURRENT_LOOKAHEAD перед тем, как начинается прием пакетов. 

Предлагаемая техника  :
1.Определяем структуры описывающие тот или иной заголовок (IP/TCP/UDP).
2. затем смещая указатель относительно начала блока (с учетом размера предыдущего заголовка) производим приведение типа данных
3. Получаем доступ к необходимым полям.

Пример:
Код:
/* Определяем структуру заголовка IP */
typedef struct  _IP_HDR {
   UCHAR  iph_verlen;
   UCHAR  iph_tos;
   USHORT  iph_length;
   USHORT  iph_id;
   USHORT  iph_offset;
   UCHAR  iph_ttl;
   UCHAR  iph_protocol;
   USHORT  iph_xsum;
   ULONG  iph_src;
   ULONG  iph_dest;
} IP_HDR, *PIP_HDR;


/* Вставка в ф-ю passthru зарегистрированную как  ProtocolReceive */

NDIS_STATUS PtReceive(    IN  NDIS_HANDLE ProtocolBindingContext,
                                      IN  NDIS_HANDLE MacReceiveContext,
                                      IN  PVOID HeaderBuffer,
                                      IN  UINT HeaderBufferSize,
                                      IN  PVOID LookAheadBuffer,
                                      IN  UINT LookAheadBufferSize,
                                      IN  UINT PacketSize  )
{
...

PIP_HDR pIpHdr; /* (1) */

...

pIpHdr = (PIP_HDR)LookAheadBuffer; /* (2) */

...

/* (3) */
pIpHdr->iph_src; /* Source IP */
pIpHdr->iph_dest; /* Destination IP */

...

}

Вторую часть по поводу извлечения данных из NDIS_PACKET я приведу позже.

С уважением,
Акс.
Записан
sss
Специалист

ru
Offline Offline

« Ответ #131 : 28-04-2006 07:52 » 

Вопрос. Как положить статью?
Записан

while (8==8)
new_s
Постоялец

by
Offline Offline
Пол: Мужской

« Ответ #132 : 01-05-2006 19:13 » 

Возник вопрос:
А каких функции и какие возможности должен предоставлять firewall?
Понятно что фильтровать трафик:)
Я хотел бы услышать про коммерческую сторону.
аск пример выше вроде не работает.
компилятор ругается.
(PktType имеет тип USHORT?)
« Последнее редактирование: 01-05-2006 20:48 от new_s » Записан
Uhri
Гость
« Ответ #133 : 02-05-2006 09:30 » 

Есть 2 вопроса:
1. Как определить тип контента в NDIS_PACKET? Т.е. ftp или http и т.п.?
2. Как создавать потоки в passthru?
в общем, хочу сделать так, чтобы драйвер определял тип данных и в зависимости от типа давал приоритет при передаче. Например, у http будет выше, чем, скажем у ftp.
Алгоритм примерно такой в голове:
1) ловим пакет,
2) определяем тип контента,
3) вызываем функцию в отдельном патоке, которая будет с определенным интервалом времени отправлять пакеты (в зависимости от приоритета)
Вот, кстати, тут еще один вопрос. Как насчет таймера в NDIS? Может кто рассказать что да как (желательно с примером).
Что скажете по поводу задумки, товарищи программисты? Нормально или как всегда через ж? Улыбаюсь
Записан
aks68
Модератор

il
Offline Offline
Пол: Мужской

« Ответ #134 : 04-05-2006 11:59 » 

Возник вопрос:
А каких функции и какие возможности должен предоставлять firewall?
Понятно что фильтровать трафик:)
Я хотел бы услышать про коммерческую сторону.
аск пример выше вроде не работает.
компилятор ругается.
(PktType имеет тип USHORT?)
Добрый день!

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

Насчет возможностей firewall-а:
1. NAT
2. Анти спуффинг
3. Блокирование IP/портов/сервисов вообще
4. Блокирование всего из п3. для к-либо процесса (если fw бежит на end-point)
5. Опционально: взаимодействие с антивирусом (коли уж пакет получили)
6. Опционально: VPN
7. Опционально: потрошить данные на предмет всяких нехороших паттернов

На просторах и-нета существует книга Building Internet Firewalls (O'Reilly), старенькая, но зато 100% есть в электронном виде.

С уважением,
Акс.
« Последнее редактирование: 14-12-2007 23:24 от Алексей1153++ » Записан
heptohedron2004
Гость
« Ответ #135 : 05-05-2006 12:04 » 

Kife очень тебя прошу расскажи как сделать то, о чем ты говорил ранее (делаешь lib, компилишь в режиме ядра, прилинковываешь к драйверу), или хотя бы подскажи где енто можно прочитать а то извиняюсь вермя поджимает. Очень прошу откликнись хотя бы просто скажи что жив здоров и подскажи что нить.
Записан
Uhri
Гость
« Ответ #136 : 07-05-2006 11:20 » 

Ребятя! Нашел я заголовок TCP. Не пойму только на что именно указывает LookAheadBuffer. На начало всего пакета или же на пакет, начиная с IP заголовка (исключая Ethernet Header)?
Вот сижу я щас тут гадаю... Есть хороший способ проверить, но не знаю как поользоваться... Скажите, как можно посмотреть содержимое той или иной переменной в процессе работы драйвера? Увидел такую функцию DBGPRINT(). Я так полагаю она должна выводить на экран. Вот только куда именно и как?
Записан
new_s
Постоялец

by
Offline Offline
Пол: Мужской

« Ответ #137 : 07-05-2006 13:06 » 

Ребятя! Нашел я заголовок TCP. Не пойму только на что именно указывает LookAheadBuffer. На начало всего пакета или же на пакет, начиная с IP заголовка (исключая Ethernet Header)?
Вот сижу я щас тут гадаю... Есть хороший способ проверить, но не знаю как поользоваться... Скажите, как можно посмотреть содержимое той или иной переменной в процессе работы драйвера? Увидел такую функцию DBGPRINT(). Я так полагаю она должна выводить на экран. Вот только куда именно и как?
Искренни поздравляю!!!!
DBGPRINT - не функция а макрос, функция DbgPrint если про passthru то этот макрос делает так чтобы сначала выводилось сообщение о том что выведенное сообщение относится к passthru.
Просмотреть выведенное можно специальными утилитами.
Например можно взять с www.sysinternals.com утилитку----DebugView.
Открываешь её и смотришь.
Синтаксис DbgPrint взят от printf(это написано в ddk).
DbgPrint даёт возможность "контролировать" драйвер.
А что ты нашёл можно подробнее?
« Последнее редактирование: 07-05-2006 13:10 от new_s » Записан
Uhri
Гость
« Ответ #138 : 07-05-2006 15:18 » 

Вот определение заголовка TCP. Он идет сразу за заголовком IP.
Код:
// Structure of a TCP packet header.

typedef struct _TCP_Header {
    USHORT    tcp_src;                // Source port.
    USHORT    tcp_dest;               // Destination port.
    int       tcp_seq;                // Sequence number.
    int       tcp_ack;                // Ack number.
    USHORT    tcp_flags;              // Flags and data offset.
    USHORT    tcp_window;             // Window offered.
    USHORT    tcp_xsum;               // Checksum.
    USHORT    tcp_urgent;             // Urgent pointer.
} TCP_Header, * TCP_Header;

Исходя из этого я определил структуру пакета, включая Ethernet заголовок, IP и TCP:

Код:
typedef struct _IP_Packet { 
    char        DestMAC[6];
    char        SrcMAC[6];
    USHORT      Type;                                  // 0x0800 => IP.
    UCHAR     iph_verlen;             // Version and length.
    UCHAR     iph_tos;                // Type of service.
    USHORT    iph_length;             // Total length of datagram.
    USHORT    iph_id;                 // Identification.
    USHORT    iph_offset;             // Flags and fragment offset.
    UCHAR     iph_ttl;                // Time to live.
    UCHAR     iph_protocol;           // Protocol.
    USHORT    iph_xsum;               // Header checksum.
    UINT      iph_src;                // Source address.
    UINT      iph_dest;               // Destination address.
    USHORT    tcp_port;                // Source port.
    USHORT    tcp_dest;               // Destination port.
    int       tcp_seq;                // Sequence number.
    int       tcp_ack;                // Ack number.
    USHORT    tcp_flags;              // Flags and data offset.
    USHORT    tcp_window;             // Window offered.
    USHORT    tcp_xsum;               // Checksum.
    USHORT    tcp_urgent;             // Urgent pointer.
} IP_Packet, * pIP_Packet;
правда, вот, не получается пока использовать... не знаю где взять указатель на весь пакет... поэтому и хочу знать какие значения принимают переменные в процессе работы.
Записан
heptohedron2004
Гость
« Ответ #139 : 10-05-2006 08:33 » 

Люди мот кто нает ответьте пожалуйста внятно на следующий вопрос.
Пусть у нас есть IP пакет. Мы перехватываем его в IMDriver-e, в функции к примеру MPSend(), добавляем NDIS буфер(например 8 байт) к NDISструктуре пакета(вконец, то бишь в хвост). В этот буфер пусть мы записываем всякую лабуду(это неважно). Пусть еще в поле ДАННЫЕ апи-пакета мы емеем тисипи. Теперь вопрос. Надо ли расчитывать црц(хоть какое) и еси надо то как и куда его пихнуть. И еще вопрос, нормально ли пойдет пакет дальше в сетку, то есть пойдет ли он весь с добавленными 8-ю байтами ? В том смысле что необходимо ли где нить изменять длину пакета или все-таки NDIS все сделает за нас?
Записан
heptohedron2004
Гость
« Ответ #140 : 10-05-2006 08:38 » 

Блин.... забыл еще сказать. На принимающей стороне, когда мы принимаем пакет например в функции PtReceivePacket, мы обрубаем эти 8 байт, то есть удаляем последний сначала буфер в NDIS структуре пакета. Вопросы те же что и выше )
Записан
aks68
Модератор

il
Offline Offline
Пол: Мужской

« Ответ #141 : 11-05-2006 12:55 » 

Добрый день!

Что-то не получается у меня нормально поработать с Пастру - нет времени Жаль.
Однако вот этот код у меня побежал. Вставляется в protocol.c:PtReceive. Демонстрирует доступ к структурам пакета (см. мой пост выше)...


Код:
//-------Это вставляется сверху -----------------
// IP Header

typedef struct  _IP_HDR {
UCHAR iph_verlen;
UCHAR iph_tos;
USHORT iph_length;
USHORT iph_id;
USHORT iph_offset;
UCHAR iph_ttl;
UCHAR iph_protocol;
USHORT iph_xsum;
ULONG iph_src;
ULONG iph_dest;
} IP_HDR, *PIP_HDR;

// TCP Header
typedef struct  _TCP_HDR {
USHORT tcp_src;
USHORT tcp_dest;
int    tcp_seq;
int    tcp_ack;
USHORT tcp_flags;
USHORT tcp_window;
USHORT tcp_xsum;
USHORT tcp_urgent;
}TCP_HDR, *PTCP_HDR;



//-------Это вставляется в PtReceive -----------------
USHORT PktType;
PCHAR Buf = HeaderBuffer;
PIP_HDR pIpHdr;
PUCHAR pOctSrc, pOctDst;
PTCP_HDR pTcpHdr;

DBGPRINT(("==> PtReceive.\n"));

// Check the packet //

PktType = ((USHORT) Buf[12]) * 0x100U + (USHORT) Buf[13];

switch(PktType)
{
case 0x0800:
DBGPRINT(("Packet type IP 0x%x\n", PktType));

// Trying to check IP adderss...
pIpHdr = (PIP_HDR)LookAheadBuffer;
pOctSrc = (PUCHAR) &(pIpHdr->iph_src);
pOctDst = (PUCHAR) &(pIpHdr->iph_dest);

DBGPRINT(("Packet from %d.%d.%d.%d to %d.%d.%d.%d\n",\
*pOctSrc, *(pOctSrc+1), *(pOctSrc+2), *(pOctSrc+3),\
*pOctDst, *(pOctDst+1), *(pOctDst+2), *(pOctDst+3) ));

switch(pIpHdr->iph_protocol)
{
case 0x01:
DBGPRINT(("ICMP: ...\n"));
break;

case 0x06:
// Trying to check TCP related parameters
pTcpHdr = (PTCP_HDR)((PUCHAR)LookAheadBuffer + sizeof(IP_HDR));
DBGPRINT(("TCP: from port %d to port %d\n", pTcpHdr->tcp_src, pTcpHdr->tcp_dest));
break;

case 0x11:
DBGPRINT(("UDP: ...\n"));
break;

}

break;

case 0x0806:
DBGPRINT(("Packet type ARP 0x%x\n", PktType));
break;
}


 С уважением,
Акс.
Записан
new_s
Постоялец

by
Offline Offline
Пол: Мужской

« Ответ #142 : 11-05-2006 14:53 » 

Не могу поверить.
Это что на каждый пакет нужна своя структура(IP,ARP,...)?
Дайте тогда ссылку на книжку в которой это  будет описано.
Записан
aks68
Модератор

il
Offline Offline
Пол: Мужской

« Ответ #143 : 13-05-2006 21:27 » 

Не могу поверить.
Это что на каждый пакет нужна своя структура(IP,ARP,...)?
Дайте тогда ссылку на книжку в которой это  будет описано.

Не на пакет, а на заголовок. И кроме того никто Вас не заставляет обрабаывать данные с помощю структур. Хотите пользуйтеь смещениями отноительно базы или еще чем другим... Но главное, это понимть каково представление данных, с которым Вы собираетесь работать. Ведь это очевидно, что не стоит и пытаться искать TCP-шные поля в ARP пакете.
К слову сказать эта самая вложенность пакета в пакет значительно упрощает дело: если программа видит, что пакет RARP например, то его обработка завершена, а вот если попался IP с инкапсуляцией - пройдемте на экзекуцию, пожалуйста... Улыбаюсь
А из существующего многообразия Вас на первом этапе будут интересовать лишь ARP и RARP для уровня соединений, IP и инкапсулированные в него ICMP/IGMP (ну и может залететь SPX от Новелл, хотя это вряд-ли) для сетевого уровня, а на транспортном TCP/UDP. Прикладной уровень пока трогать ненадо,-если хотите его обсудить давайте заведем отдельный тред...

Ну а "книжка" у нас одна, RFC (790, 791) называется, как-бы пошло это не звучало. Еще могу отрекомендовать Tcp/Ip Illustrsted (vol 1) Ричарда Стивенса. На русском языке она есть да и в осле наверное тоже. Описание IP пакета приведено например здесь http://www.networksorcery.com/enp/protocol/ip.htm
Ну и вокруг там посмотрите...

Конкретные описания структур приведу завтра, как до работы только доберусь.

С уважением,
Акс.
Записан
Uhri
Гость
« Ответ #144 : 14-05-2006 08:26 » 

что-то со структурами у меня не то... тип протокола в IP заголовке определяет нормально, а вот в заголовке TCP порты почему-то левые какие-то показывает. И все не меньше 1000 !!!
Записан
aks68
Модератор

il
Offline Offline
Пол: Мужской

« Ответ #145 : 14-05-2006 10:32 » 

что-то со структурами у меня не то... тип протокола в IP заголовке определяет нормально, а вот в заголовке TCP порты почему-то левые какие-то показывает. И все не меньше 1000 !!!
Да, разумеется...
Я там напорол, когда вычислял смещение до TCP-заголовка, т.к. длинна IP-заголовка определяется не сайзоффом, а полем HeaderLength (4-7 биты в pIpHdr->iph_verlen). Как с ним работать разберитесь самостоятельно.

С уважением,
Акс.

PS: Помните про остро и тупоконечников, когда работаете с байтами!
« Последнее редактирование: 14-05-2006 10:46 от aks68 » Записан
aks68
Модератор

il
Offline Offline
Пол: Мужской

« Ответ #146 : 14-05-2006 10:40 » 

В продолжении ответа new_s...

Вот 2 структуры которые я когда-то нарыл на ndis.com. Они похоже это тоже где-то нарыли, так что копирайт непонятно чей Улыбаюсь

Код:
      struct
      {
          ushort Source;
          ushort Dest;
          ushort Length;
          ushort Checksum;
      }UDPHeader;
     
      struct {
          uchar ich_type;
          uchar ich_code;
          ushort ich_xsum;
          ulong ich_param;
      }ICMPHeader;


С уважением,
Акс.
Записан
Uhri
Гость
« Ответ #147 : 15-05-2006 06:57 » 

Да, разумеется...
Я там напорол, когда вычислял смещение до TCP-заголовка, т.к. длинна IP-заголовка определяется не сайзоффом, а полем HeaderLength (4-7 биты в pIpHdr->iph_verlen). Как с ним работать разберитесь самостоятельно.
PS: Помните про остро и тупоконечников, когда работаете с байтами!
Так дело в том, что у меня ни так, ни так не выходит. Т.е. пробовал я как отдельно 2 структуры создавать, так и 1 на весь заголовок:
Код:
typedef struct _IP_Packet { 
    UCHAR     iph_verlen;             // Version and length.
    UCHAR     iph_tos;                // Type of service.
    USHORT    iph_length;             // Total length of datagram.
    USHORT    iph_id;                 // Identification.
    USHORT    iph_offset;             // Flags and fragment offset.
    UCHAR     iph_ttl;                // Time to live.
    UCHAR     iph_protocol;           // Protocol.
    USHORT    iph_xsum;               // Header checksum.
    UINT      iph_src;                // Source address.
    UINT      iph_dest;               // Destination address.
    USHORT    tcp_src;                // Source port.
    USHORT    tcp_dest;               // Destination port.
    int       tcp_seq;                // Sequence number.
    int       tcp_ack;                // Ack number.
    USHORT    tcp_flags;              // Flags and data offset.
    USHORT    tcp_window;             // Window offered.
    USHORT    tcp_xsum;               // Checksum.
    USHORT    tcp_urgent;             // Urgent pointer.
} IP_Packet, * pIP_Packet;
Проверяю, разумеется, что за протокол, если TCP, то использую эту структуру. Попробую конечно с полем длины заголовка, но я думал, что размер IP-заголовка постоянный, ведь во многих источниках читал о нем и везде одинаковые поля одинаковых размеров.

з.ы.а, да, еще такой интересный момент. В заголовке TCP есть 2 поля - порт отправителья и порт получателя. Что-то я не до конца врублюсь, а разве можно послыть с одного порта,чтоб получили на другом(ну,если тока вручную пакеты не собирать)?
« Последнее редактирование: 15-05-2006 07:01 от Uhri » Записан
aks68
Модератор

il
Offline Offline
Пол: Мужской

« Ответ #148 : 15-05-2006 08:41 » 

 Улыбаюсь Улыбаюсь Улыбаюсь ОЧИПЯТКА  Улыбаюсь Улыбаюсь Улыбаюсь
« Последнее редактирование: 15-05-2006 08:51 от aks68 » Записан
aks68
Модератор

il
Offline Offline
Пол: Мужской

« Ответ #149 : 15-05-2006 08:50 » 

Добрый день Ури (я правильно странскрибировал?),

В своем предположении относительно IP заголовка Вы неправы. Длинна его может изменяться от 20 до 60 байт, и определяется 4-мя старшим битам поля iph_verlen.
Взять их можно так:
1. Определить union для поля iph_verlen
2. Доступиться через битовое поле

Код:
typedef struct  _IP_HDR {
union
{
UCHAR verlen;
struct
{
UCHAR len:4;
UCHAR ver:4;
}ip;
}iph_verlen;

... ... ...

pTcpHdr = (PTCP_HDR)((PUCHAR)LookAheadBuffer + 4 * pIpHdr->iph_verlen.ip.len);

... ... ...

При этом pTcpHdr должен сдвинуться на 20 байт относительно начала LookAheadBuffer.

Попробуйте это. Я его не запускал, но работать (IMHO) должно.

С уважением,
Акс.
Записан
Страниц: 1 2 3 4 [5] 6 7 8   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines