Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2004.06.27;
Скачать: [xml.tar.bz2];

Вниз

Распаковка пакетов.   Найти похожие ветки 

 
-=Demon=-   (2004-04-29 14:20) [0]

Ранее в приводимом здесь коде снифера бы ло рассмотрен тоько перехват. Но не подскажите мастера как распаковывать пришедшие данные я их распаковываю следующим образом

procedure WWW.FIcmp;
var
Tip,cod:integer;
Icmpheader:Picmp;
begin
Icmpheader:= PICMP(integer(@Buffer[IPHdrLen*4]));
sCod:=inttostr(Icmpheader.icmp_type);
sTip:=inttostr(Icmpheader.icmp_code);
SICMPID:=inttostr(Icmpheader.icmp_id);
snomer:=inttostr(Icmpheader.icmp_seq);
end;

procedure WWW.FTCP;
Var
SrcPortt,DstPortt:integer;
begin
SrcPortt:=TCPHeader((@Buffer[IPHdrLen*4])^).SrcPort;
SSrcPort :=Inttostr((SrcPortt AND $00FF shl 8) OR (SrcPortt AND $FF00 shr 8));

DstPortt:=TCPHeader((@Buffer[IPHdrLen*4])^).DstPort;
SDstPort :=Inttostr((DstPortt AND $00FF shl 8) OR (DstPortt AND $FF00 shr 8));
end;

procedure WWW.FUDP;
Var
SrcPortt,DstPortt:integer;
begin
SrcPortt:=TCPHeader((@Buffer[IPHdrLen*4])^).SrcPort;
SSrcPort :=Inttostr((SrcPortt AND $00FF shl 8) OR (SrcPortt AND $FF00 shr 8));

DstPortt:=TCPHeader((@Buffer[IPHdrLen*4])^).DstPort;
SDstPort :=Inttostr((DstPortt AND $00FF shl 8) OR (DstPortt AND $FF00 shr 8));
end;
.............
res:=recv(Sock, Buffer, SizeOf(Buffer), 0);
if res >= SizeOf(IPHeader) then
begin
Version:=inttostr((IPHeader((@Buffer)^).VerLen AND $F0) shr 4);
IPHdrLen :=IPHeader((@Buffer)^).VerLen AND $0F;
StTl:=Inttostr(IPHeader((@Buffer)^).TTL);
SIPHdrLen:=Inttostr(Res);
//Synchronize(Message7);
//Synchronize(Message9);
if IPHdrLen >= 5 then
begin
{----------------------------}
SrcIP :=IPHeader((@Buffer)^).IPSrc;
SIpSrt:=inet_ntoa(TInAddr(SrcIP));
//Synchronize(Message5);

DstIP :=IPHeader((@Buffer)^).IPDst;
SIpDst:=inet_ntoa(TInAddr(DstIP));
//Synchronize(Message6);
{Ïðîòîêîëû}
case IPHeader((@Buffer)^).Proto of
IPPROTO_ICMP: begin Protokol:="ICMP"; ICMP; end;
IPPROTO_TCP: begin Protokol:="TCP"; FTCP;  end;
IPPROTO_UDP: begin Protokol:="UDP"; FUDP;  end;
end;


Но а как дальше вытащить информацию. К примеру HTML код.
Заранее благодарен.


 
Piter ©   (2004-04-29 18:53) [1]

Читай описания форматов, HTTP, FTP ну и т.д.
Очень хороший снифер Ethereal - знает туеву хучу форматов


 
-=Demon=-   (2004-04-30 01:06) [2]

Мне не нужны форматы HTTP, FTP. Меня интересует как мне дальше достать информацию?


 
Digitman ©   (2004-04-30 08:11) [3]


> -=Demon=-  



> как дальше вытащить информацию. К примеру HTML код.


> Мне не нужны форматы HTTP


для тех кто на бронепоезде - для передачи HTML-данных (гипертекст) используется HTTP-протокол (протокол передачи гипертекста)

в свою очередь, HTTP-протокол (протоко прикладного уровеня) использует TCP/IP-протокол (протокол транспортного уровеня)

данные в формате IPPROTO_TCP ты уже научился "нюхать", дело за малым - сходить на http://book.itep.ru и проштудировать все касаемое упомянутых протоколов, прежде чем делать дальнейшие телодвижения


 
-=Demon=-   (2004-04-30 10:48) [4]

Не ну блин умников развелось. Я прошу объяснить мне как из переменной Buffer вытащить информацию (данные), которые идут после tcp заголовка.


 
Digitman ©   (2004-04-30 11:31) [5]

http://book.itep.ru/4/44/tcp_443.htm - здесь описание данных в формате TCP в принятом тобой буфере


 
-=Demon=-   (2004-04-30 15:38) [6]

Если не сложно. Можно в показать прогаммно.
На сколько я знаю один из способов получения информации это добавления поля Data в структуру TCPHEADER

TTCPHeader = packed record
    SrcPort:        word;  //Source Port
    DstPort:        word;  //Destination Port
    Seq:           Dword; // порядковый номер передаваемого октета
    Ack:           Dword; // порядковый номер принятого октета
    Rsvd0_Off:     byte;  //Смещение до начала данных
    Flags_Rsvd:   byte;  //флаги
    Window:        word;  // Размер окна
    Checksum:      word;
    UrgPoint:      word;
    Hren:          Dword;
    Data:          Array [1..1024] of byte;

Но правельно ли это сделано и если правельно то как преобразовать эти данные в текст.
Заранее благодарен.


 
Digitman ©   (2004-04-30 16:26) [7]


> как преобразовать эти данные в текст


никак.
TCP-данные не обязаны иметь отображаемый текстовый формат

ЛИБО ЯВНО заостряй внимание на том, чтио речь ты ведешь искл-но о HTML


 
Verg ©   (2004-04-30 17:25) [8]


>
> TTCPHeader = packed record
>     SrcPort:        word;  //Source Port
>     DstPort:        word;  //Destination Port
>     Seq:           Dword; // порядковый номер передаваемого
> октета
>     Ack:           Dword; // порядковый номер принятого
> октета
>     Rsvd0_Off:     byte;  //Смещение до начала данных
>     Flags_Rsvd:   byte;  //флаги
>     Window:        word;  // Размер окна
>     Checksum:      word;
>     UrgPoint:      word;
>    Hren:          Dword;
>     Data:          Array [1..1024] of byte;


Откуда ты взял это ?!
Какой "Hren", какая "Data"?

"//Смещение до начала данных" - А вот это вот написано по-русски!

Ты смещения не умеешь добавлять? Или что? Т.е. числа не можешь сложить? К указателью на начало TCP заголовка надо добавить "Смещение до начала данных" и получится адрес начала данных в пакете. Все! И все остальное до конца пакета - это данные этого пакета.
Куда еще проще?!


 
Verg ©   (2004-04-30 17:28) [9]

Data Offset (смещение данных)  4 бита
  Количество 32-битных слов в TCP заголовке. Указывает на начало по-
  ля данных.


(C) RFC 793


 
-=Demon=-   (2004-04-30 18:45) [10]

А если можно для тех кто в танке. Кусок кода. Я что то не догнал?


 
-=Demon=-   (2004-05-01 10:54) [11]

Попробую перефразировать свой вопрос.
Необходимо все что приходит в данных ТСР пакета представлять в текстовом формате


> Какой "Hren", какая "Data"?

По поводу "Какой Hren" это да, это зря, но "какая Data" мне кажется это вы зря. Потому как я попробовал следующий способ:


Var
Sdata:String;
TCP:PTCPHeader;

.......

for i:=1 to 10000 do Sdata:=sData+Chr(Tcp.Data[i]);


И у меня не много получилось. Но иногда приходит такой бред что просто .....
В чем проблема понять не могу.
Если есть другой способ с радостью рассмотрю..


 
Verg ©   (2004-05-01 13:54) [12]

Ну хорошо, давай так: возмем процедуру из того исходника, который я недавно тут приводил:

function TCPInput(Iph: PIPHeader; TCPPacket : PTCPHeader; Size : word): boolean;
var TCPData : pchar;
   TCPHeaderLen,
   TCPDataSize  : DWORD;

begin
 Result := false;
 if Size < sizeof(TTCPHeader) then exit;
 if DstPort<>0 then
   if TCPPacket^.Source <> DstPort then exit;      //Только нужный порт
 //SOCK_RAW гарантирует, что IP заголовок имеет правильную КС,
 // но на все остальные уровни он плевал, поэтому придется расчитать
 // КС TCP пакета самим
{$IFDEF CHECKSUMM}
 if net_chksum_add(PHCheckSumm(Iph^.src, Iph^.dst, IPPROTO_TCP, Size),
                   net_checksum(TCPPacket^, Size)
                  ) <> $FFFF then
   exit;
{$ENDIF}
// Начало "распаковки" пакета :)))))
 TCPHeaderLen := (TCPPacket^.Rsvd0_Off and $F0) shr 2;
 TCPData      := pchar(TCPPacket) + TCPHeaderLen;
 TCPDataSize  := ntohs(Iph^.length) - ( pchar(TCPData) - pchar(Iph) );
// Конец "распаковки" пакета
 // Ну и все TCPData Указывает на начало данных пакета
 // TCPDataSize содержит их размер
 Inc(Trafic0, ntohs(Iph^.length));
 Result := true;
end;


:= - это знак присваивания
+  - знак сложения двух величин
-  - знак вычитания

Да, дальше не забудь отслеживать соединения, руководствуясь TCP флагами, портами и адресами,  делать сборку нескольких TCP пакетов в единый поток, руководствуясь Seq и длиной данных, показаниями UrgentPointer и т.д.
Все, дальше ты уж как-нибудь сама, ок?


 
-=Demon=-   (2004-05-02 13:41) [13]

Все, надеюсь последний вопрос.
Я прописал все как ты сказал, но когда идет HTML-код все нормаль выводиться (хотя есть кое каке глюки, но об этом позже). Но когда я к примеру запускаю WinComander и начинаю лазить по сети он мне ничего не выдает хотя должен...
Я сделал все следуующим образом:

type
TTCPHeader = packed record
    SrcPort:        word;  
    DstPort:        word;  
    Seq:           Dword;  
    Ack:           Dword;
    Rsvd0_Off:     byte;  
    Flags_Rsvd:   byte;  
    Window:        word;  
    Checksum:      word;
    UrgPoint:      word;
   end;
  PTCPHeader = ^TTCPHeader;

VAr
TCP:PTCPHeader;
TCPHeaderLen,TCPDataSize:DWord;
TCPData : pchar;
Sdata:String;

TCPHeaderLen := (TCP^.Rsvd0_Off and $F0) shr 2;
TCPData      := pchar(TCP) +TCPHeaderLen;
Sdata:=TCPData;

А когда идет HTML-код то иногда выводиться не полностьютехт, начало съедается.
Что делать и как с этим бороться?


 
-=Demon=-   (2004-05-02 13:46) [14]

Да и ещё. А зачем нужно и что она делат эта строчка

TCPHeaderLen := (TCP^.Rsvd0_Off and $F0) shr 2;


 
Verg ©   (2004-05-02 13:54) [15]


> Sdata:=TCPData;


Пардон, фигня, опять же :)
У тебя есть указатель "на" и длина этого, на чего "на", так что единственным уместным тут будет применение только SetString, а не присваивания, т.к. никто по сути совей не может гарантировать, что тот блок данных окончится нулем (#0).


>  когда идет HTML-код то иногда выводиться не полностьютехт,
> начало съедается


Куда "не выводится", то вооще об чем, о каком таком "выводе"?
Выводе чего и куда? Я ж тебе три недели назад сказал - читай RFC!
Ты как сборку пакетов в поток-то собираешься осуществлять? Как ты привязываешь поток данных к конкретному соединению?
это же целая "кухня", это не пять строк кода.

Я не понимаю, человек начинает по-сути первые шаги в программировании вообще, но почему-то сразу лезет в "крутые катокомбы низкоуровневого сетевого программинга".

Зачем тебе это?!


 
-=Demon=-   (2004-05-02 14:37) [16]

Ладно признаюсь.
Demon=Rezya
И как я уже давно сказал с основами всего сетевого программирования я разобрался уже давно.
Просто сейчас начальник мой поставил перд мной 3 задачи
1: Дампить на винт все что приходит и выходит с копьютера.
2: Сделать полную сборку Всех TCP цепочек и сохранить их на винт.
3: Сделать одноконнектовый прокси с возможностью проксирования всех протоколов Прикладного уровня. И с возможностью Заменой IP адреса отправителя. (Грубо говоря с возможностью спуфинга).
Да и Verg ну что я надеюсь мы оставим наши междуусобтци в прошлом и будем сотрудничать :-))))


> Куда "не выводится", то вооще об чем, о каком таком "выводе"?

Забыл виноват, В Мемо посредствам Form1.Memo1.Lines.Add(Sdata);


 
-=Rezya=-   (2004-05-02 15:19) [17]

И по средстовам SetString такая же беда как и в [13] только теперь  HTML- код отображается корректоно.


 
Verg ©   (2004-05-02 16:17) [18]

Удалено модератором
Примечание: Выясняйте отношения в чате или по почте...


 
Verg ©   (2004-05-02 16:18) [19]

Удалено модератором
Примечание: Выясняйте отношения в чате или по почте...


 
Verg ©   (2004-05-02 16:35) [20]

Удалено модератором
Примечание: Выясняйте отношения в чате или по почте...


 
-=Rezya=-   (2004-05-02 23:29) [21]

Удалено модератором
Примечание: Выясняйте отношения в чате или по почте...


 
-=Rezya=-   (2004-05-02 23:47) [22]

Удалено модератором
Примечание: Со стороны модератора извининия приняты, Андрею твой пост отправлен, но пропустить его в форум я не могу...



Страницы: 1 вся ветка

Форум: "Сети";
Текущий архив: 2004.06.27;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.03 c
3-1085826331
lemon
2004-05-29 14:25
2004.06.27
Проверка на выделение записи в таблице (компонент DBgrid)


1-1086937382
Mim1
2004-06-11 11:03
2004.06.27
пересобрать visualclx после применения UnofficialVisualCLX Pathch


3-1086029463
Bohdan
2004-05-31 22:51
2004.06.27
Ошибка "Cannot edit LANGDRIVER" dBASE RUS cp866!!!


6-1082355963
Piter
2004-04-19 10:26
2004.06.27
Статья про сокеты


10-1013693872
GenBr
2002-02-14 16:37
2004.06.27
Как узнать имя компьютера?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский