На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Соблюдайте общие правила форума
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Указывайте точные версии Delphi и используемых сетевых библиотек.

Не приветствуется поднятие старых тем. Если ваш вопрос перекликается со старой темой, то для вопроса лучше создать новую тему, а старую указать в первом сообщении с описанием взаимосвязи.

Внимание:
попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...

Полезные ссылки:
user posted image MSDN Library user posted image FAQ раздела user posted image Поиск по разделу user posted image Как правильно задавать вопросы


Выразить свое отношение к модераторам раздела можно здесь: user posted image Krid, user posted image Rouse_

Модераторы: Krid, Rouse_
Страницы: (6) [1] 2 3 ...  5 6 все  ( Перейти к последнему сообщению )  
> Сниффер , Может ли сниффер...
    Есть код пакетного сниффера сетевого уровня модели OSI
    (автор Александр (Rouse_) Багель !!!огромное ему спасибо за науку!!!).

    ExpandedWrap disabled
      ////////////////////////////////////////////////////////////////////////////////
      //
      //  ****************************************************************************
      //  * 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). Опыта в плагинописании вообще нет :-(
    Что делать? Научите, пожалуйста ...
    Сообщение отредактировано: sAshA20 -
      Очень интересный и глубокомысленный вопрос :D
      Будьте любезны - уточните оный
        M
        sAshA20
        В чем суть вашего вопроса?
        Ответьте пожалуйста, иначе ваш топик будет удален
          Изменил вопрос.
          Очень удивлен... :huh: Пол дня пытался создать тему! Выбрасывало ошибки разные (в т.ч. 404 Not found), очень долго грузились страницы, вис браузер... (вроди не новичок в этом деле, И-нетом пользуюсь не один год). Может у меня И-нет глючить, а может форум... теперь уже не важно.
          Извините господа, первый раз мой вопрос загрузился не полностью. Теперь вроди все нормально.
            Цитата sAshA20 @
            Мне советовали, что прочитав пакет, как то можна определить какой файл в нем (или его часть). Так ли это?

            sAshA20 тебя нагло обманули. Определить ты можешь только размер данных в пакете, а вот что это - файл или его часть (а тем более имя или путь файла) - это увы..... :( Если передающая сторона не отправляет имени файла или какую - нибудь метку, что это передается именно файл, а не какой - нибудь набор данных, то, сидя на приемнике, остается только абстрагировать, что же принялось на этот раз. :D
            Цитата sAshA20 @
            Можно ли в Delрhi написать прогу, которая анализирует http-запросы браузера
            Приведенный тобою пример сниффера довольно успешно может читать HTTP запрос браузера, который отправляется с этого же компа, на котором запущен сей сниффер. :)
              Да, конечно может, нужно только добавить анализатор пакетов, который ловил бы начало запроса и все последующие пакеты...
                Цитата Rouse_ @
                Да, конечно может, нужно только добавить анализатор пакетов, который ловил бы начало запроса и все последующие пакеты...

                как-то мутно сказано :)

                Цитата Rouse_ @
                анализатор пакетов, который ловил бы начало запроса и все последующие пакеты...


                То есть анализатор - по идее он уже обрабатывает полученные данные, а в данном случае(высказывании) он как-то ловит начало запроса ;)

                Нельзя по-подробнее, мне тоже интересно...

                Rouse_, я по вашему исходнику написала Сниффер на ассемблере, и хотела бы добавить данную фичу, может привести пример хотябы направить так как в инете нет ничего подобного...

                С внешней стороны мне не интересно, а если вот у меня что-то качают уже интересно - узнать через сниффер : что именно... ;)

                Если честно не представляю как это :)
                  Эмм... Ну я могу только в общих чертах описать. Скажем берем запрос на получаение некоего контента:

                  ExpandedWrap disabled
                    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 - там были примеры таких снифферов с анализаторами...
                    Цитата Rouse_ @
                    который ловил бы начало запроса и все последующие пакеты...

                    Как всегда вопрос - означает ли это, что ваш сниффер на рав-сокетах ловит исходящие IP-пакеты?
                    Цитата medved_68 @
                    Приведенный тобою пример сниффера довольно успешно может читать HTTP запрос браузера, который отправляется с этого же компа, на котором запущен сей сниффер.

                    потому как вот наш коллега пишет о такой возможности - а я, просматривая код, этой возможности не нашел :(
                    PS
                    Вечная :D тема - ловит ли равсокет сниффер исходящие IP-пакеты :)
                    Надо один раз поставить точки над i :yes:
                      Цитата Oleg2004 @
                      означает ли это, что ваш сниффер на рав-сокетах ловит исходящие IP-пакеты?

                      Это как раз он и есть :) Только что запустил, чтоб ручками белиберду не вбивать :)
                        [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] а это разве не запрос ? :unsure:
                        Сообщение отредактировано: Катенька -
                          Цитата Oleg2004 @
                          потому как вот наш коллега пишет о такой возможности - а я, просматривая код, этой возможности не нашел

                          Oleg2004 ловит. :D А вот пакеты с других компов (гуляющие в сетке до шлюза, но адресованные не ему) нет. А канальный ловит все. :D
                          Цитата Катенька @
                          а это разве не запрос ?

                          Он самый. :)
                            Цитата Rouse_ @
                            нужно только добавить анализатор пакетов, который ловил бы начало запроса и все последующие пакеты...

                            Обьясните, пожалуйста, очень подробно и доступно как это сделать (алгоритм, исходники или зарисовки исходников). Можно на примере.

                            Еще вопросы:
                            Если, браузер грузит страницу (на странице есть, например, картинки), то браузер сам создает запроси в процессе загрузки на эти самие картинки или их вместе со страницей присылает сервер? :huh:

                            А как дело обстоит с контентом который уже закеширован (например HandyCache) и с запросами на них?


                            Вопрос ко всем: поясните мне, ученику, весь процес (ну очень подробно) от нажатия кнопки "Перейти" до надписи внизу экрана "Готово" процес загрузки браузером страниц и связанного с ней контента. Или дайте ссылку, пожалуйста, где это все п-о-д-р-о-б-н-о и д-о-с-т-у-п-н-о описано. Очень мало такого материала я встречал в И-нете. Может Вы знаете?
                              Цитата 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 @
                              А вот пакеты с других компов (гуляющие в сетке до шлюза, но адресованные не ему) нет. А канальный ловит все.

                              А эту фразу я вообще отказываюсь понимать :wacko:
                              Если равсокет в неразборчивом режиме не ловит проходящие мимо карточки все тогда что означает эта фраза в коде:
                              Цитата
                              // Переключаем интерфейс на прием всех пакетов проходящих через интерфейс - promiscuous mode
                              - и кому тогда равсокет в сниффере нужен то? :blink:
                                Цитата Oleg2004 @
                                Ну мы так вообще дойдем до неизвестно чего.........

                                Ну чтож... Вот лог того что ловит данный сниффер на моей машине при запросе данной страницы, т.е. при открытии следующего URL: Сниффер

                                В логе наглядно видны как входящие, так и исходящие пакеты :) Кому верить? Своим глазам или Barry Margolin-у? :)

                                Добавлено
                                Цитата sAshA20 @
                                Обьясните, пожалуйста, очень подробно и доступно как это сделать

                                Времени сейчас на обьяснения нет, посомтрите на sourceforge.net примеры снифферов
                                Прикреплённый файлПрикреплённый файлtest.zip (49.97 Кбайт, скачиваний: 673)
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (6) [1] 2 3 ...  5 6 все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0549 ]   [ 17 queries used ]   [ Generated: 19.03.24, 09:28 GMT ]