Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.06.27;
Скачать: CL | DM;

Вниз

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

 
-=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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.022 c
4-1084794195
Temucin
2004-05-17 15:43
2004.06.27
Мониторинг принтера


3-1085941851
Viktor
2004-05-30 22:30
2004.06.27
Перекодировка таблиц


4-1084893032
Sanek_metaller
2004-05-18 19:10
2004.06.27
GetNextWindow()


1-1087194807
Unicode
2004-06-14 10:33
2004.06.27
ADSI


1-1086845576
sergt
2004-06-10 09:32
2004.06.27
DateTimePicker