Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.16.137.108] |
|
Страницы: (6) [1] 2 3 ... 5 6 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Есть код пакетного сниффера сетевого уровня модели OSI
(автор Александр (Rouse_) Багель !!!огромное ему спасибо за науку!!!). //////////////////////////////////////////////////////////////////////////////// // // **************************************************************************** // * Project : SnifferDemo // * Unit Name : uMain // * Purpose : Демонстрационный пример сниффера. // * Author : Александр (Rouse_) Багель // * Version : 1.02 // * Home Page : http://rouse.drkb.ru // **************************************************************************** // // Особая благодарность TrefptYc и группе Машина Времени, // за оказанную моральную поддержку, в процессе написания данного примера :) // // **************************************************************************** // От автора: // Я не ставил перед собой целью написать что-то революционное, // просто было желание показать сам принцип написания простейшего сниффера, // что я и осуществил :) // // Да, ну и работает все это бесчинство, только начиная с Windows 2000 :) // unit uMain; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, WinSock; const MAX_PACKET_SIZE = $10000; // 2^16 SIO_RCVALL = $98000001; WSA_VER = $202; MAX_ADAPTER_NAME_LENGTH = 256; MAX_ADAPTER_DESCRIPTION_LENGTH = 128; MAX_ADAPTER_ADDRESS_LENGTH = 8; IPHelper = 'iphlpapi.dll'; // Тип ICMP пакета ICMP_ECHO = 8; // Запрос ICMP_ECHOREPLY = 0; // Ответ resourcestring LOG_STR_0 = '==============================================================================' + sLineBreak; LOG_STR_1 = 'Packet ID: %-5d TTL: %d' + sLineBreak; LOG_STR_2 = 'Packet size: %-5d bytes type: %s' + sLineBreak; LOG_STR_3 = 'Source IP : %15s: %d' + sLineBreak; LOG_STR_4 = 'Destination IP : %15s: %d' + sLineBreak; LOG_STR_5 = 'ARP Type: %s, operation: %s' + sLineBreak; LOG_STR_6 = 'ICMP Type: %s' + sLineBreak; LOG_STR_7 = '------------------------------ Packet dump -----------------------------------' + sLineBreak; type USHORT = WORD; ULONG = DWORD; time_t = Longint; // ip заголовок // Более подробно в RFC 791 // http://rtfm.vn.ua/inet/prot/rfc791r.html TIPHeader = packed record iph_verlen: UCHAR; // версия и длина заголовка iph_tos: UCHAR; // тип сервиса iph_length: USHORT; // длина всего пакета iph_id: USHORT; // Идентификация iph_offset: USHORT; // флаги и смещения iph_ttl: UCHAR; // время жизни пакета iph_protocol: UCHAR; // протокол iph_xsum: USHORT; // контрольная сумма iph_src: ULONG; // IP-адрес отправителя iph_dest: ULONG; // IP-адрес назначения end; PIPHeader = ^TIPHeader; // tcp заголовок // Более подробно в RFC 793 // http://rtfm.vn.ua/inet/prot/rfc793r.html TTCPHeader = packed record sourcePort: USHORT; // порт отправителя destinationPort: USHORT; // порт назначения sequenceNumber: ULONG; // номер последовательности acknowledgeNumber: ULONG; // номер подтверждения dataoffset: UCHAR; // смещение на область данных flags: UCHAR; // флаги windows: USHORT; // размер окна checksum: USHORT; // контрольная сумма urgentPointer: USHORT; // срочность end; PTCPHeader = ^TTCPHeader; // udp заголовок // Более подробно в RFC 768 // http://rtfm.vn.ua/inet/prot/rfc768r.html TUDPHeader = packed record sourcePort: USHORT; // порт отправителя destinationPort: USHORT; // порт назначения len: USHORT; // длина пакета checksum: USHORT; // контрольная сумма end; PUDPHeader = ^TUDPHeader; // ICMP заголовок // Более подробно в RFC 792 // http://rtfm.vn.ua/inet/prot/rfc792r.html TICMPHeader = packed record IcmpType : BYTE; // Тип пакета IcmpCode : BYTE; // Код пакета IcmpChecksum : WORD; IcmpId : WORD; IcmpSeq : WORD; IcmpTimestamp : DWORD; end; PICMPHeader = ^TICMPHeader; // Структуры для выполнения GetAdaptersInfo IP_ADDRESS_STRING = record S: array [0..15] of Char; end; IP_MASK_STRING = IP_ADDRESS_STRING; PIP_MASK_STRING = ^IP_MASK_STRING; PIP_ADDR_STRING = ^IP_ADDR_STRING; IP_ADDR_STRING = record Next: PIP_ADDR_STRING; IpAddress: IP_ADDRESS_STRING; IpMask: IP_MASK_STRING; Context: DWORD; end; PIP_ADAPTER_INFO = ^IP_ADAPTER_INFO; IP_ADAPTER_INFO = record Next: PIP_ADAPTER_INFO; ComboIndex: DWORD; AdapterName: array [0..MAX_ADAPTER_NAME_LENGTH + 3] of Char; Description: array [0..MAX_ADAPTER_DESCRIPTION_LENGTH + 3] of Char; AddressLength: UINT; Address: array [0..MAX_ADAPTER_ADDRESS_LENGTH - 1] of BYTE; Index: DWORD; Type_: UINT; DhcpEnabled: UINT; CurrentIpAddress: PIP_ADDR_STRING; IpAddressList: IP_ADDR_STRING; GatewayList: IP_ADDR_STRING; DhcpServer: IP_ADDR_STRING; HaveWins: BOOL; PrimaryWinsServer: IP_ADDR_STRING; SecondaryWinsServer: IP_ADDR_STRING; LeaseObtained: time_t; LeaseExpires: time_t; end; // Поток сниффера TSnifferThread = class(TThread) private WSA: TWSAData; hSocket: TSocket; Addr_in: sockaddr_in; Packet: array[0..MAX_PACKET_SIZE - 1] of Byte; LogData: String; procedure ShowPacket; protected function InitSocket: Boolean; virtual; procedure DeInitSocket(const ExitCode: Integer); virtual; procedure Execute; override; procedure ParcePacket(const PacketSize: Word); virtual; public Host: String; end; TfrmMain = class(TForm) btnStartStop: TButton; memReport: TMemo; cbInterfaces: TComboBox; Label1: TLabel; procedure FormCreate(Sender: TObject); procedure btnStartStopClick(Sender: TObject); private TotalPacketCount: Integer; FSnifferThread: TSnifferThread; procedure ReadLanInterfaces; end; // При помощи данной функции мы определим наличие сетевых интерфейсов // на локальном компьютере и информацию о них function GetAdaptersInfo(pAdapterInfo: PIP_ADAPTER_INFO; var pOutBufLen: ULONG): DWORD; stdcall; external IPHelper; const // Размеры используемых структур IPHeaderSize = SizeOf(TIPHeader); ICMPHeaderSize = SizeOf(TICMPHeader); TCPHeaderSize = SizeOf(TTCPHeader); UDPHeaderSize = SizeOf(TUDPHeader); var frmMain: TfrmMain; implementation {$R *.dfm} { TSnifferThread } // Инициализация слушающего сокета function TSnifferThread.InitSocket: Boolean; var PromiscuousMode: Integer; begin // инициализируем WinSock Result := WSAStartup(WSA_VER, WSA) = NOERROR; if not Result then begin LogData := 'Ошибка: ' + SysErrorMessage(WSAGetLastError); Synchronize(ShowPacket); Exit; end; // создаем сокет hSocket := socket(AF_INET, SOCK_RAW, IPPROTO_IP); if hSocket = INVALID_SOCKET then begin DeInitSocket(WSAGetLastError); Exit; end; FillChar(Addr_in, SizeOf(sockaddr_in), 0); Addr_in.sin_family:= AF_INET; // указываем за каким интерфейсом будем следить Addr_in.sin_addr.s_addr := inet_addr(PChar(Host)); // связываем сокет с локальным адресом if bind(hSocket, Addr_in, SizeOf(sockaddr_in)) <> 0 then begin DeInitSocket(WSAGetLastError); Exit; end; // Переключаем интерфейс на прием всех пакетов проходящих через интерфейс - promiscuous mode. PromiscuousMode := 1; if ioctlsocket(hSocket, SIO_RCVALL, PromiscuousMode) <> 0 then begin DeInitSocket(WSAGetLastError); Exit; end; Result := True; end; // Завершение работы сокета procedure TSnifferThread.DeInitSocket(const ExitCode: Integer); begin // Если была ошибка - выводим ее if ExitCode <> 0 then begin LogData := 'Ошибка: ' + SysErrorMessage(ExitCode); Synchronize(ShowPacket); end; // Закрываем сокет if hSocket <> INVALID_SOCKET then closesocket(hSocket); // Деинициализируем WinSock WSACleanup; end; // Рабочая процедура потока сниффера procedure TSnifferThread.Execute; var PacketSize: Integer; begin // Производим инициализацию if InitSocket then try // Крутим поток до упора while not Terminated do begin // Ждем получения пакета (блокирующий режим) PacketSize := recv(hSocket, Packet, MAX_PACKET_SIZE, 0); // Если есть данные - производим их разбор if PacketSize > SizeOf(TIPHeader) then ParcePacket(PacketSize); end; finally // В конце освобождаем занятые ресурсы DeInitSocket(NO_ERROR); end; end; // Процедура разборки пакета procedure TSnifferThread.ParcePacket(const PacketSize: Word); var IPHeader: TIPHeader; ICMPHeader: TICMPHeader; TCPHeader: TTCPHeader; UDPHeader: TUDPHeader; SrcPort, DestPort: Word; I, Octets, PartOctets: Integer; PacketType, DumpData, ExtendedInfo: String; Addr, A, B: TInAddr; begin Inc(frmMain.TotalPacketCount); // Читаем из буфера IP заголовок Move(Packet[0], IPHeader, IPHeaderSize); // Пишем время жизни пакета LogData := LOG_STR_0 + Format(LOG_STR_1, [frmMain.TotalPacketCount, IPHeader.iph_ttl]); SrcPort := 0; DestPort := 0; ExtendedInfo := ''; // определяем тип протокола case IPHeader.iph_protocol of IPPROTO_ICMP: // ICMP begin PacketType := 'ICMP'; // Читаем ICMP заголовок Move(Packet[IPHeaderSize], ICMPHeader, ICMPHeaderSize); // Смотрим тип пакета case ICMPHeader.IcmpCode of ICMP_ECHO: ExtendedInfo := Format(LOG_STR_6, ['Echo']); ICMP_ECHOREPLY: ExtendedInfo := Format(LOG_STR_6, ['Echo reply']); else ExtendedInfo := Format(LOG_STR_6, ['Unknown']); end; end; IPPROTO_TCP: // TCP begin PacketType := 'TCP'; // Читаем ТСР заголовок Move(Packet[IPHeaderSize], TCPHeader, TCPHeaderSize); // Смотрим порт отправителя и получателя SrcPort := TCPHeader.sourcePort; DestPort := TCPHeader.destinationPort; end; IPPROTO_UDP: // UDP begin PacketType := 'UDP'; // Читаем UDP заголовок Move(Packet[IPHeaderSize], UDPHeader, UDPHeaderSize); // Смотрим порт отправителя и получателя SrcPort := UDPHeader.sourcePort; DestPort := UDPHeader.destinationPort; end; else PacketType := 'Unsupported (0x' + IntToHex(IPHeader.iph_protocol, 2) + ')'; end; // Пишем размер пакета LogData := LogData + Format(LOG_STR_2, [PacketSize, PacketType]); if ExtendedInfo <> '' then LogData := LogData + ExtendedInfo; // Пишем IP адрес отправителя с портом Addr.S_addr := IPHeader.iph_src; LogData := LogData + Format(LOG_STR_3, [inet_ntoa(Addr), htons(SrcPort)]); // Пишем IP адрес получателя с портом Addr.S_addr := IPHeader.iph_dest; LogData := LogData + Format(LOG_STR_4, [inet_ntoa(Addr), htons(DestPort)]) + LOG_STR_7; // Выводим содержимое пакета на экран (парсинг комментировать не буду, там все просто) // получается что-то вроде этого: // // ------------------------------ Packet dump ----------------------------------- // 000000 45 00 00 4E D8 91 00 00 | 80 11 DB 3B C0 A8 02 82 E..N.......;.... // 000010 C0 A8 02 FF 00 89 00 89 | 00 3A AC 6A 83 BD 01 10 .........:.j.... // 000020 00 01 00 00 00 00 00 00 | 20 45 43 46 46 45 49 44 ........ ECFFEID // 000030 44 43 41 43 41 43 41 43 | 41 43 41 43 41 43 41 43 DCACACACACACACAC // 000040 41 43 41 43 41 43 41 43 | 41 00 00 20 00 01 ACACACACA.. .. I := 0; Octets := 0; PartOctets := 0; while I < PacketSize do begin case PartOctets of 0: LogData := LogData + Format('%.6d ', [Octets]); 9: LogData := LogData + '| '; 18: begin Inc(Octets, 10); PartOctets := -1; LogData := LogData + ' ' + DumpData + sLineBreak; DumpData := ''; end; else begin LogData := LogData + Format('%s ', [IntToHex(Packet[I], 2)]); if Packet[I] in [$19..$7F] then DumpData := DumpData + Chr(Packet[I]) else DumpData := DumpData + '.'; Inc(I); end; end; Inc(PartOctets); end; if PartOctets <> 0 then begin PartOctets := (16 - Length(DumpData)) * 3; if PartOctets >= 24 then Inc(PartOctets, 2); Inc(PartOctets, 4); LogData := LogData + StringOfChar(' ', PartOctets) + DumpData + sLineBreak + sLineBreak end else LogData := LogData + sLineBreak + sLineBreak; // Выводим все что напарсерили в Memo Synchronize(ShowPacket); end; procedure TSnifferThread.ShowPacket; begin frmMain.memReport.Lines.BeginUpdate; frmMain.memReport.Text := frmMain.memReport.Text + sLineBreak + LogData; SendMessage(frmMain.memReport.Handle, WM_VSCROLL, SB_BOTTOM, 0); frmMain.memReport.Lines.EndUpdate; end; { TfrmMain } procedure TfrmMain.FormCreate(Sender: TObject); begin TotalPacketCount := 0; ReadLanInterfaces; end; // Читаем все IP адреса со всех присутствующих // в системе сетевых интерфейсов procedure TfrmMain.ReadLanInterfaces; var InterfaceInfo, TmpPointer: PIP_ADAPTER_INFO; IP: PIP_ADDR_STRING; Len: ULONG; begin // Смотрим сколько памяти нам требуется? if GetAdaptersInfo(nil, Len) = ERROR_BUFFER_OVERFLOW then begin // Берем нужное кол-во GetMem(InterfaceInfo, Len); try // выполнение функции if GetAdaptersInfo(InterfaceInfo, Len) = ERROR_SUCCESS then begin // Перечисляем все сетевые интерфейсы TmpPointer := InterfaceInfo; repeat // перечисляем все IP адреса каждого интерфейса IP := @TmpPointer.IpAddressList; repeat cbInterfaces.Items.Add(Format('%s - [%s]', [IP^.IpAddress.S, TmpPointer.Description])); IP := IP.Next; until IP = nil; TmpPointer := TmpPointer.Next; until TmpPointer = nil; end; finally // Освобождаем занятую память FreeMem(InterfaceInfo); end; end; // Смотрим - можем ли мы продолжать работу программы? if cbInterfaces.Items.Count = 0 then begin memReport.Text := 'Сетевые интерфейсы не обнаружены.' + sLineBreak + 'Продолжение работы программы не возможно.'; btnStartStop.Enabled := False; Exit; end else cbInterfaces.ItemIndex := 0; end; // Запуск остановка потока procedure TfrmMain.btnStartStopClick(Sender: TObject); begin if FSnifferThread <> nil then begin FSnifferThread.Terminate; FSnifferThread := nil; btnStartStop.Caption := 'Start'; end else begin FSnifferThread := TSnifferThread.Create(True); FSnifferThread.Host := Copy(cbInterfaces.Text, 1, Pos(' ', cbInterfaces.Text)); FSnifferThread.FreeOnTerminate := True; FSnifferThread.Resume; btnStartStop.Caption := 'Stop'; end; end; end. Можна ли дописать этот сниффер так, чтобы он мониторил файли (имя, тип, размер и т.д.), которые грузит браузер в данный момент, к тому же чтобы можна было отменить загрузку отдельного файла, указав его. Если да, то подскажите как? Если нет, то, пожалуйста, обьясните как это можна сделать по другому. Я потратил много времени на поиск учебного материала, учебников, статтей, но очень мало чего полезного (а то и совсем нет ничего), конкретного, по сути. У меня мало опыта в программировании подобного и я хочу научиться, жду любой подсказки, литературы, статьи, исходника. Мне советовали, что прочитав пакет, как то можна определить какой файл в нем (или его часть). Так ли это? Можно ли в Delрhi написать прогу, которая анализирует http-запросы браузера и мониторит какие файлы з web-страницей он грузит? Также рекомендовали написать плагин к браузеру (точнее к IE). Опыта в плагинописании вообще нет :-( Что делать? Научите, пожалуйста ... |
Сообщ.
#2
,
|
|
|
Очень интересный и глубокомысленный вопрос
Будьте любезны - уточните оный |
Сообщ.
#3
,
|
|
|
M sAshA20 В чем суть вашего вопроса? Ответьте пожалуйста, иначе ваш топик будет удален |
Сообщ.
#4
,
|
|
|
Изменил вопрос.
Очень удивлен... Пол дня пытался создать тему! Выбрасывало ошибки разные (в т.ч. 404 Not found), очень долго грузились страницы, вис браузер... (вроди не новичок в этом деле, И-нетом пользуюсь не один год). Может у меня И-нет глючить, а может форум... теперь уже не важно. Извините господа, первый раз мой вопрос загрузился не полностью. Теперь вроди все нормально. |
Сообщ.
#5
,
|
|
|
Цитата sAshA20 @ Мне советовали, что прочитав пакет, как то можна определить какой файл в нем (или его часть). Так ли это? sAshA20 тебя нагло обманули. Определить ты можешь только размер данных в пакете, а вот что это - файл или его часть (а тем более имя или путь файла) - это увы..... Если передающая сторона не отправляет имени файла или какую - нибудь метку, что это передается именно файл, а не какой - нибудь набор данных, то, сидя на приемнике, остается только абстрагировать, что же принялось на этот раз. Цитата sAshA20 @ Приведенный тобою пример сниффера довольно успешно может читать HTTP запрос браузера, который отправляется с этого же компа, на котором запущен сей сниффер. Можно ли в Delрhi написать прогу, которая анализирует http-запросы браузера |
Сообщ.
#6
,
|
|
|
Да, конечно может, нужно только добавить анализатор пакетов, который ловил бы начало запроса и все последующие пакеты...
|
Сообщ.
#7
,
|
|
|
Цитата Rouse_ @ Да, конечно может, нужно только добавить анализатор пакетов, который ловил бы начало запроса и все последующие пакеты... как-то мутно сказано Цитата Rouse_ @ анализатор пакетов, который ловил бы начало запроса и все последующие пакеты... То есть анализатор - по идее он уже обрабатывает полученные данные, а в данном случае(высказывании) он как-то ловит начало запроса Нельзя по-подробнее, мне тоже интересно... Rouse_, я по вашему исходнику написала Сниффер на ассемблере, и хотела бы добавить данную фичу, может привести пример хотябы направить так как в инете нет ничего подобного... С внешней стороны мне не интересно, а если вот у меня что-то качают уже интересно - узнать через сниффер : что именно... Если честно не представляю как это |
Сообщ.
#8
,
|
|
|
Эмм... Ну я могу только в общих чертах описать. Скажем берем запрос на получаение некоего контента:
000000 45 00 01 FD 97 63 40 00 | 80 06 DF BD C0 A8 00 24 E....c@........$ 000010 C0 A8 00 65 06 2C 1F 90 | C2 91 D0 C8 29 18 76 22 ...e.,.....).v" 000020 50 18 FF 02 7C 0F 00 00 | 47 45 54 20 68 74 74 70 P...|...GET http 000030 3A 2F 2F 77 77 77 2E 66 | 6C 63 2E 72 75 2F 69 6E ://www.flc.ru/in 000040 64 65 78 2E 70 68 70 3F | 69 64 3D 33 34 26 61 3D dex.php?id=34&a= 000050 6E 61 6D 65 73 65 61 72 | 68 26 6E 61 6D 65 3D 25 namesearh&name=% 000060 43 43 25 44 36 25 44 36 | 25 44 31 20 48 54 54 50 CC%D6%D6%D1 HTTP 000070 2F 31 2E 30 0D 0A 41 63 | 63 65 70 74 3A 20 69 6D /1.0..Accept: im 000080 61 67 65 2F 67 69 66 2C | 20 69 6D 61 67 65 2F 78 age/gif, image/x 000090 2D 78 62 69 74 6D 61 70 | 2C 20 69 6D 61 67 65 2F -xbitmap, image/ 000100 6A 70 65 67 2C 20 69 6D | 61 67 65 2F 70 6A 70 65 jpeg, image/pjpe 000110 67 2C 20 61 70 70 6C 69 | 63 61 74 69 6F 6E 2F 78 g, application/x 000120 2D 73 68 6F 63 6B 77 61 | 76 65 2D 66 6C 61 73 68 -shockwave-flash 000130 2C 20 61 70 70 6C 69 63 | 61 74 69 6F 6E 2F 76 6E , application/vn 000140 64 2E 6D 73 2D 65 78 63 | 65 6C 2C 20 61 70 70 6C d.ms-excel, appl 000150 69 63 61 74 69 6F 6E 2F | 76 6E 64 2E 6D 73 2D 70 ication/vnd.ms-p 000160 6F 77 65 72 70 6F 69 6E | 74 2C 20 61 70 70 6C 69 owerpoint, appli 000170 63 61 74 69 6F 6E 2F 6D | 73 77 6F 72 64 2C 20 2A cation/msword, * 000180 2F 2A 0D 0A 52 65 66 65 | 72 65 72 3A 20 68 74 74 /*..Referer: htt 000190 70 3A 2F 2F 77 77 77 2E | 66 6C 63 2E 72 75 2F 3F p://www.flc.ru/? 000200 69 64 3D 33 34 0D 0A 41 | 63 63 65 70 74 2D 4C 61 id=34..Accept-La 000210 6E 67 75 61 67 65 3A 20 | 72 75 0D 0A 50 72 6F 78 nguage: ru..Prox 000220 79 2D 43 6F 6E 6E 65 63 | 74 69 6F 6E 3A 20 4B 65 y-Connection: Ke 000230 65 70 2D 41 6C 69 76 65 | 0D 0A 55 73 65 72 2D 41 ep-Alive..User-A 000240 67 65 6E 74 3A 20 4D 6F | 7A 69 6C 6C 61 2F 34 2E gent: Mozilla/4. 000250 30 20 28 63 6F 6D 70 61 | 74 69 62 6C 65 3B 20 4D 0 (compatible; M 000260 53 49 45 20 36 2E 30 3B | 20 57 69 6E 64 6F 77 73 SIE 6.0; Windows 000270 20 4E 54 20 35 2E 31 3B | 20 53 56 31 3B 20 2E 4E NT 5.1; SV1; .N 000280 45 54 20 43 4C 52 20 32 | 2E 30 2E 35 30 37 32 37 ET CLR 2.0.50727 000290 29 0D 0A 48 6F 73 74 3A | 20 77 77 77 2E 66 6C 63 )..Host: www.flc 000300 2E 72 75 0D 0A 43 6F 6F | 6B 69 65 3A 20 74 65 73 .ru..Cookie: tes 000310 74 43 6F 6F 6B 69 65 3D | 31 0D 0A 0D 0A tCookie=1.... Запоминаем параметры соединения т.е. IP и порт и смотрим что придет оттуда до следующего запроса на Destination Addr... Это и будет сам контент. К примеру фильтр включается как только будет пойман исходящий GET http:// Вообще у меня в разработке сейчас идет снифер с анализатором на базе PSSDK, но когда я его завершу и отдам на всеобщее обозрение - не знаю... Времени мало на его полноценную разработку. Вообще посмотри на sourceforge.net - там были примеры таких снифферов с анализаторами... |
Сообщ.
#9
,
|
|
|
Цитата Rouse_ @ который ловил бы начало запроса и все последующие пакеты... Как всегда вопрос - означает ли это, что ваш сниффер на рав-сокетах ловит исходящие IP-пакеты? Цитата medved_68 @ Приведенный тобою пример сниффера довольно успешно может читать HTTP запрос браузера, который отправляется с этого же компа, на котором запущен сей сниффер. потому как вот наш коллега пишет о такой возможности - а я, просматривая код, этой возможности не нашел PS Вечная тема - ловит ли равсокет сниффер исходящие IP-пакеты Надо один раз поставить точки над i |
Сообщ.
#10
,
|
|
|
Цитата Oleg2004 @ означает ли это, что ваш сниффер на рав-сокетах ловит исходящие IP-пакеты? Это как раз он и есть Только что запустил, чтоб ручками белиберду не вбивать |
Сообщ.
#11
,
|
|
|
[quote=Oleg2004,1200901112,1842255]Как всегда вопрос - означает ли это, что ваш сниффер на рав-сокетах ловит исходящие IP-пакеты?[/quote] он то ловит - так как программа привязана...
Только пакеты не обрабатывает, в отличае от входящих. [quote=Oleg2004,1200901112,1842255]потому как вот наш коллега пишет о такой возможности - а я, просматривая код, этой возможности не нашел PS Вечная тема - ловит ли равсокет сниффер исходящие IP-пакеты Надо один раз поставить точки над i [quote]GET http 000030 3A 2F 2F 77 77 77 2E 66 | 6C 63 2E 72 75 2F 69 6E ://www.flc.ru/in 000040 64 65 78 2E 70 68 70 3F | 69 64 3D 33 34 26 61 3D dex.php?id=34&a= 000050 6E 61 6D 65 73 65 61 72 | 68 26 6E 61 6D 65 3D 25 namesearh&name=% 000060 43 43 25 44 36 25 44 36 | 25 44 31 20 48 54 54 50 CC%D6%D6%D1[/quote] а это разве не запрос ? |
Сообщ.
#12
,
|
|
|
Цитата Oleg2004 @ потому как вот наш коллега пишет о такой возможности - а я, просматривая код, этой возможности не нашел Oleg2004 ловит. А вот пакеты с других компов (гуляющие в сетке до шлюза, но адресованные не ему) нет. А канальный ловит все. Цитата Катенька @ а это разве не запрос ? Он самый. |
Сообщ.
#13
,
|
|
|
Цитата Rouse_ @ нужно только добавить анализатор пакетов, который ловил бы начало запроса и все последующие пакеты... Обьясните, пожалуйста, очень подробно и доступно как это сделать (алгоритм, исходники или зарисовки исходников). Можно на примере. Еще вопросы: Если, браузер грузит страницу (на странице есть, например, картинки), то браузер сам создает запроси в процессе загрузки на эти самие картинки или их вместе со страницей присылает сервер? А как дело обстоит с контентом который уже закеширован (например HandyCache) и с запросами на них? Вопрос ко всем: поясните мне, ученику, весь процес (ну очень подробно) от нажатия кнопки "Перейти" до надписи внизу экрана "Готово" процес загрузки браузером страниц и связанного с ней контента. Или дайте ссылку, пожалуйста, где это все п-о-д-р-о-б-н-о и д-о-с-т-у-п-н-о описано. Очень мало такого материала я встречал в И-нете. Может Вы знаете? |
Сообщ.
#14
,
|
|
|
Цитата Rouse_ @ Это как раз он и есть Только что запустил, чтоб ручками белиберду не вбивать Ну мы так вообще дойдем до неизвестно чего......... Читаем - groops.google.com Цитата Barry Margolin Просмотреть профиль Дополнительные параметры 15 апр 2006, 17:59 Группы новостей: comp.unix.programmer Автор: Barry Margolin <bar...@alum.mit.edu> Дата: Sat, 15 Apr 2006 11:59:06 -0400 Местное время: Сб. 15 апр 2006 17:59 Тема: Re: My simple tcp sniffer sniffs only incoming packts and not outgoing packets. Why ??? > Hi everybody. > I'm trying to write a simple as possible tcp sniffer in C. It seems to > work, it goes in promiscuous mode and sniffs packets but it sniffs ONLY > incoming packets. I can't really figure out why it won't show me > outgoing packets. Probably i'm missing something, but I don't know > what. Because read() is used to read things that you receive, and you don't receive your own outgoing packets. В программе Rouse_ есть только один recv() - и он в точности подпадает под цитату. Все остальные мои поиски в Гуглях говорят о том (впрочем как Стивенс и все остальные статьи) - что Windows-сниффер на равсокетах не ловит уходящие пакеты - найдите мне хоть одно место в сети или в статье или в учебнике - это противоречит всем сетевым правилам. Да, можно ловить с канального уровня - но пользовательскому уровню это доступно только в Linux, где есть такой сокет sd=socket(AF_INET,SOCK_PACKET, htons(ETH_P_ALL)); Цитата medved_68 @ А вот пакеты с других компов (гуляющие в сетке до шлюза, но адресованные не ему) нет. А канальный ловит все. А эту фразу я вообще отказываюсь понимать Если равсокет в неразборчивом режиме не ловит проходящие мимо карточки все тогда что означает эта фраза в коде: Цитата - и кому тогда равсокет в сниффере нужен то? // Переключаем интерфейс на прием всех пакетов проходящих через интерфейс - promiscuous mode |
Сообщ.
#15
,
|
|
|
Цитата Oleg2004 @ Ну мы так вообще дойдем до неизвестно чего......... Ну чтож... Вот лог того что ловит данный сниффер на моей машине при запросе данной страницы, т.е. при открытии следующего URL: Сниффер В логе наглядно видны как входящие, так и исходящие пакеты Кому верить? Своим глазам или Barry Margolin-у? Добавлено Цитата sAshA20 @ Обьясните, пожалуйста, очень подробно и доступно как это сделать Времени сейчас на обьяснения нет, посомтрите на sourceforge.net примеры снифферов Прикреплённый файлtest.zip (49.97 Кбайт, скачиваний: 677) |