Модераторы: feodorv
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Разбор TCP header, Представление портов. 
V
    Опции темы
Kappac
Дата 17.2.2008, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 203
Регистрация: 30.9.2006
Где: Украина, Киев

Репутация: нет
Всего: нет



Доброго времени суток! 
Получаю пакет с помощью pcap, разбор ethernet и ip заголовков проходит нормально, но при попытке определить порты источника\приемника в tcp\udp возвращаются абсолютно не раельные числа. Как правильно представить номера портов?
P.S. Мои исходники прилагаются.

Присоединённый файл ( Кол-во скачиваний: 23 )
Присоединённый файл  testpcap.rar 1,92 Kb
--------------------
                                                                                     
PM MAIL ICQ Skype   Вверх
jonie
Дата 18.2.2008, 23:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 5
Всего: 118



несмотря исходники используете internet формат чисел, конечно же ?


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Kappac
Дата 19.2.2008, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 203
Регистрация: 30.9.2006
Где: Украина, Киев

Репутация: нет
Всего: нет



И с преобразованием и без, результаты в любом случае не правильные.   smile 
--------------------
                                                                                     
PM MAIL ICQ Skype   Вверх
jonie
Дата 19.2.2008, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 5
Всего: 118



значит не оттуда брешешь ...
несилен в никсах: а как там насчет выравнивания полей в структурах ?


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Kappac
Дата 20.2.2008, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 203
Регистрация: 30.9.2006
Где: Украина, Киев

Репутация: нет
Всего: нет



Дело не в никсах, RFC-то везде RFC, вот потому и код положил... 
--------------------
                                                                                     
PM MAIL ICQ Skype   Вверх
jonie
Дата 21.2.2008, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 5
Всего: 118



rfc пишется с расчетом align=1byte, а у тя в структурах как ?...


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Kappac
Дата 25.2.2008, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 203
Регистрация: 30.9.2006
Где: Украина, Киев

Репутация: нет
Всего: нет



У меня в структурах с учетом BigEndian и LittleEndian памяти, но к портам это значение не имеет, так как их номера хранятся в 2 байтах(short).
--------------------
                                                                                     
PM MAIL ICQ Skype   Вверх
jonie
Дата 25.2.2008, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 5
Всего: 118



а я грю про выравнивание, а не про формат слов.
Код


//
// c этим должно дать 14      21      20
//а вот без такого трюка даст (у меня например) такое : 14      24      20
#pragma pack(1)    

#include "protocols.h"

int main(int argc, _TCHAR* argv[]){
    cout<<sizeof(protocol_ether_h)<<"\t"<<sizeof(protocol_ipv4_h)<<"\t"<<sizeof(protocol_tcp_h);
    return 0;
}



--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
turist
Дата 25.2.2008, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 13.8.2007
Где: Киев

Репутация: нет
Всего: нет



Код

if(strcmp(prType->p_name, "tcp") == 0)
        getTcp((u8 *)packet, ip->ihl);
if(strcmp(prType->p_name, "udp") == 0)
        getUdp((u8 *)packet, ip->ihl);


Вот в этом месте вы передаёте не IP пакет, а Ethernet. Надо было:
getTcp((u8 *)packet+ETH_HLEN, ip->ihl)

из linux/if_ether.h:
#define ETH_HLEN 14
PM MAIL WWW ICQ Skype GTalk Jabber MSN   Вверх
Kappac
Дата 26.2.2008, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 203
Регистрация: 30.9.2006
Где: Украина, Киев

Репутация: нет
Всего: нет



jonieturist, спасибо, вечером проверю и отпишусь! 
--------------------
                                                                                     
PM MAIL ICQ Skype   Вверх
fish9370
Дата 26.2.2008, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: нет
Всего: 1



http://www.tcpdump.org/pcap.htm

Код

/* ethernet headers are always exactly 14 bytes */
#define SIZE_ETHERNET 14

    const struct sniff_ethernet *ethernet; /* The ethernet header */
    const struct sniff_ip *ip; /* The IP header */
    const struct sniff_tcp *tcp; /* The TCP header */
    const char *payload; /* Packet payload */

    u_int size_ip;
    u_int size_tcp;

ethernet = (struct sniff_ethernet*)(packet);
    ip = (struct sniff_ip*)(packet + SIZE_ETHERNET);
    size_ip = IP_HL(ip)*4;
    if (size_ip < 20) {
        printf("   * Invalid IP header length: %u bytes\n", size_ip);
        return;
    }
    tcp = (struct sniff_tcp*)(packet + SIZE_ETHERNET + size_ip);
    size_tcp = TH_OFF(tcp)*4;
    if (size_tcp < 20) {
        printf("   * Invalid TCP header length: %u bytes\n", size_tcp);
        return;
    }
    payload = (u_char *)(packet + SIZE_ETHERNET + size_ip + size_tcp);


Это сообщение отредактировал(а) fish9370 - 26.2.2008, 17:37


--------------------
undefined
PM MAIL WWW ICQ   Вверх
Kappac
Дата 26.2.2008, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 203
Регистрация: 30.9.2006
Где: Украина, Киев

Репутация: нет
Всего: нет



fish9370, отдельное спасибо, за хороший пример! 
--------------------
                                                                                     
PM MAIL ICQ Skype   Вверх
Kappac
Дата 27.2.2008, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 203
Регистрация: 30.9.2006
Где: Украина, Киев

Репутация: нет
Всего: нет



turistfish9370, спасибо за наводку! Действительно не правильно переходил по указателю! 
Тема закрыта! 
--------------------
                                                                                     
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0807 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.