На главную Наши проекты:
Журнал   ·   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_
  
> Сниффер , Может ли сниффер...
    Есть код пакетного сниффера сетевого уровня модели 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)
                                  Экзешник...
                                  Прикреплённый файлПрикреплённый файлSnifferDemo.zip (242.21 Кбайт, скачиваний: 561)
                                    Rouse_
                                    И еще один вопрос - сколько сетевых карточек у вас на компе - потому что в коде вы биндите интерфейс для равсокета - что обычно не делается :)
                                      Одна :)
                                        Rouse_
                                        Блииииииииин!!!
                                        Ловит.
                                        У меня крышу сносит - ей ей :D
                                        И где же тут собака порылась то - с точки зрения науки и техники???
                                        Все, на пенсию, на пенсию........ :'(
                                          Цитата Oleg2004 @
                                          Ловит.

                                          Если с NAT-ом похимичить ловить не будет :) Дома у меня к примеру не ловит, но там хитрый конфиг :) Но в остальных 90 процентов случаев ловит :)
                                            Кстати, когда делаешь фуллскрин вашему снифферу - почемуто текстбокс с опциями фильтрования остается там где он был в неполном окне :)
                                            Нда, ну а дальше - пишу заявление об отставке :(
                                            Ибо теория говорит совсем не то - да и поисковики тоже............ :'(
                                            Ну вот например еще одно с гуглегруп:
                                            Fragment of our code:

                                            Цитата
                                            socket( AF_INET, SOCK_RAW , IPPROTO_IP ) ;
                                            setsockopt( rawsocket , SOL_SOCKET , SO_RCVTIMEO, (const char *)&rcvtimeo ,
                                            sizeof(rcvtimeo) );
                                            bind(rawsocket,(PSOCKADDR)&sa, sizeof(sa));
                                            ioctlsocket( rawsocket, SIO_RCVALL, &flag));
                                            recv(rawsocket, (char*)(buffer) , sizeof(buffer), 0 );

                                            There is the problem to capture outgoing traffic from own computer. We see
                                            only incoming IP packets.

                                            И это пишется сплошь и рядом везде.......
                                            Какой то у Rouse_ секрет всетаки в коде....... :wall: :wall: :wall:
                                              Цитата Rouse_ @
                                              Вот лог того что ловит данный сниффер на моей машине при запросе данной страницы, т.е. при открытии следующего URL: Сниффер


                                              Ну все же, как увидеть в этом имя, тип, размер файла?
                                                Цитата Oleg2004 @
                                                почемуто текстбокс с опциями фильтрования остается там где он был в неполном окне

                                                Да это тестовый, я для себя для отладки делал, в стандартном примере фильтрации по порту нет. Забыл выравнивание указать :)
                                                Цитата sAshA20 @
                                                Ну все же, как увидеть в этом имя, тип, размер файла?

                                                Только анализируя входящий контент...

                                                Добавлено
                                                Цитата sAshA20 @
                                                Какой то у Rouse_ секрет всетаки в коде

                                                никакого секрета - чистая практика :)
                                                  Цитата Oleg2004 @
                                                  А эту фразу я вообще отказываюсь понимать

                                                  :D Но это на самом деле так, по крайней мере у меня.Oleg2004 просмотрите мою тему об этом годовалой давности - там я "парился" практически идентичным с точностью наоборот вопросом. Да и программки как сетевого, так и канального уровня я вам сбрасывал, для проверки так сказать. :D
                                                  Цитата Rouse_ @
                                                  В логе наглядно видны как входящие, так и исходящие пакеты Кому верить? Своим глазам или Barry Margolin-у?

                                                  Честно говоря - "что вижу, о том пою". :D
                                                    Цитата Rouse_ @
                                                    Только анализируя входящий контент...


                                                    Извините, что так туго мне доходит, но не можете ли по подробнее, пожалуйста.
                                                    Вы можете обьяснить, используя лог, какие файли он загрузил, их тип, размер?
                                                    Как дело обстоит с контентом, который закеширован?
                                                      Ищи примеры тут: http://sourceforge.net/search/?words=Sniffer&type_of_search=soft&pmode=0&inex=1&sortselect=trove__160®istration_date__0=&trove__225=456&trove__274=369&trove__160=265&trove__199=426&trove__13=14&trove__1=534&trove__6=7&trove__496=499&newfilter=Apply

                                                      Вот это остенно посмотри: http://sourceforge.net/projects/packetyzer/
                                                        Цитата Rouse_ @
                                                        щи примеры тут: http://sourceforge.net/search/?words=Sniff...newfilter=Apply

                                                        Вот это остенно посмотри: http://sourceforge.net/projects/packetyzer/



                                                        :-))) Огромное спасибо!!! Сейчас посмотрю!
                                                        P.S. И-нет у меня ну очень медленный, проблемно что-то искать (а в sourceforge.net вообще штиль)
                                                          Цитата medved_68 @
                                                          Но это на самом деле так, по крайней мере у меня.

                                                          Ну ладно, как я сам на практике убедился, ловит.
                                                          А теперь уже серьезно: :wub:
                                                          Где можно об этом прочитать - точно?
                                                          Или же мне не верить Стивенсу? Но он гуру в *nix'ах а тут виндовоз <_<
                                                          Или не верить всем поисковикам?
                                                          Всем группам новостей?
                                                          Или же у Билла как всегда с сетевой проблематикой нелады :wacko:
                                                          Я в шоке :wall:
                                                          Цитата sAshA20 @
                                                          какие файли он загрузил, их тип, размер?
                                                          Как дело обстоит с контентом, который закеширован?

                                                          Для того, чтобы парсить http-responce - те ответ сервера - вам надо в первую очередь хорошо знать основы HTTP-протокола - поля заголовков, как пересылаются данные, и тд и тп - и это к сетевому программированию напрямую не относится - это WEB-программирование - тогда вы увидите, какие файлы загружены, тип (что просите - то и получаете) и все остальное. Без этих знаний вы ничего не сможете правильно разобрать.
                                                            Просто обьяснять сам принцип очень долго, а готового примера чтоб на пальцах показать у меня нет, как и времени его писать :) Так что только там, ну или тут кто что мошт расскажет :)

                                                            Добавлено
                                                            Цитата Oleg2004 @
                                                            Или же мне не верить Стивенсу? Но он гуру в *nix'ах а тут виндовоз
                                                            Или не верить всем поисковикам?
                                                            Всем группам новостей?

                                                            Верить или не верить - мы же программисты а не бабки гадалки. Достаточно один раз самому проверить :) Я много раз так натыкался, когда встает задача - пробегаю поиском, везде написано что это невозможно. Сажусь сам делать - почему-то работает :) Так что вопрос спорный, теория всегда должна быть обильно разбавленна практикой, иначе она так и останется голой теорией :)
                                                              Припустим, я знаю имена файлов, которые грузит браузер в данный момент. Могу я отменить загрузку любого из них (тех которые еще грузятся или будут грузится)зная это? Или что для этого нада и как это сделать?
                                                                sAshA20 Возможно поможет Проект Skynet
                                                                Сообщение отредактировано: Astrafox -
                                                                  Цитата Rouse_ @
                                                                  иначе она так и останется голой теорией

                                                                  Я все-таки сторонник совпадения теории и практики - тем более что практика в программировании есть прямое отражение теории.
                                                                  И поэтому отсебятину производителей софта - недокументированную - я не приветствую.

                                                                  Добавлено
                                                                  Цитата sAshA20 @
                                                                  Могу я отменить загрузку любого из них

                                                                  Нет, такого действия в протоколе http нет, можно лишь оборвать передачу.
                                                                  Если только не писать собственный веб-броузер, который будет селективно выбирать нужные кому-то файлы, а остальные игнорировать.
                                                                  Впрочем, некоторые подобные настройки в броузерах есть - типа - не грузить изображения...
                                                                  Но чтобы прерывать на середине.... :blink:
                                                                    Цитата Oleg2004 @
                                                                    Нет, такого действия в протоколе http нет, можно лишь оборвать передачу.


                                                                    Точно нельзя??? Очень жаль! :(
                                                                    А как тогда это реализовано в программе Naviscope официальный сайт сама прога?
                                                                    Только из-за того что она прокси? Только прокси может отменять загрузку отдельного файла?
                                                                      Цитата sAshA20 @
                                                                      А как тогда это реализовано в программе Naviscope

                                                                      Сие мне неизвестно - да и в описании программы об этом я не нашел
                                                                        Цитата Oleg2004 @
                                                                        который будет селективно выбирать нужные кому-то файлы, а остальные игнорировать



                                                                        А можна ли, используя код сниффера (см. сообщ # 1), буферизировать пакеты с запросами на отдельные файлы и посылать их адресату в том случае, если ми указуем этот файл как нужный (разрешаем его загрузку)?

                                                                        ИЛИ

                                                                        Перенаправлять пакеты с запросами на отдельный порт (каждый файл на свой порт). В том случае, если ми хотим отменить загрузку отдельного файла - просто закрываем порт или что-то в таком роде чтобы он не загружался. А?
                                                                          Нет, для этого он не предназначен...
                                                                            Цитата Rouse_ @
                                                                            Нет, для этого он не предназначен...


                                                                            Я имею ввиду дописать код этого сниффера.
                                                                            А как на счет идей??? Подскажите, пожалуйста!
                                                                              На том уровне на котором работает данный сниффер пакеты заблокировать уже нельзя... Поэтому даже дописыванием кода тут не решить. Тут должен работать NDIS драйвер...
                                                                                Цитата sAshA20 @
                                                                                Перенаправлять пакеты с запросами на отдельный порт (каждый файл на свой порт).

                                                                                Открытый порт на клиенте - это одно приложение (те одна программа) - этот порт выделяется при выполнении коннекта - и более не меняется. Порт выделяется броузером также для новой закладки (многопоточный клиент).
                                                                                  Цитата Rouse_ @
                                                                                  Тут должен работать NDIS драйвер...


                                                                                  Можна поподробней, пожалуйста? :huh:

                                                                                  Больше ни у кого никаких идей? :(
                                                                                    Цитата sAshA20 @
                                                                                    Можна поподробней, пожалуйста?

                                                                                    Попробуй вот это помотреть: http://www.tisbi.ru/resource/lib/Eltext/BookPrSistSecurity/Glava%203/GL3.htm
                                                                                    Это теория. Самостоятельно ты врятли будешь писать драйвер, так-что после прочтения теории ищи статьи по WinPCap
                                                                                      Цитата Rouse_ @
                                                                                      Поэтому даже дописыванием кода тут не решить. Тут должен работать NDIS драйвер...


                                                                                      Эмм... У Вас же в коде это и делается, только пакеты до конца доходят, точнее Вы продолжаете его принимать до конца.
                                                                                      ExpandedWrap disabled
                                                                                        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;


                                                                                      А если сделать буффер поменьше для приёма и не продолжать принимать то ожидание как раз и будет остановкой. По крайней мере я когда писала и проверяла, у меня было именно так, я грузила страницу в браузере и мой сниффер в котором был размер буффера 1024 принял данные такого размера а дальше в коде не было реализовано продолжение принятия и страница в браузере дальше не грузилась. Так что драйвер и не нужен. Ведь мы привязываемся к интерфейсу и принимаем данные, если мы не будем продолжать принимать то данные стоят в очереди.

                                                                                      По-пробуйте сами ;)
                                                                                        Цитата Катенька @
                                                                                        дальше в коде не было реализовано продолжение принятия и страница в браузере дальше не грузилась

                                                                                        Интересно, но у меня такого эффекта не наблюдалось !

                                                                                        Вообще по идее равсокет работает параллельно с приложениями и если он не принимает пакеты то они всё равно продолжают идти, ведь это всего лишь сниффер !
                                                                                        Я в своей программе делал блокировку портов через Packet Filtering... Я прикрепил пару модулей.

                                                                                        FLTDEFS.pas - это файл в котором описываются функции и типы данных Pf
                                                                                        UProtection.pas - модуль со сниффером и упрощёнными функциями Pf.

                                                                                        Сниффер конечно же Rouse_ :)

                                                                                        Сначала вызываем StartProtection(Host - адрес к которому привязываемся, Mask - по идее маска но у меня почему-то работает только '255.255.255.255'...)

                                                                                        Затем PfDenyIP2Port / PfAllowIP2Port ... , при закрытии приложения StopProtection.
                                                                                        Код ещё в разработке так что если там где-то нету try..except, try..finally то не бить ! :)

                                                                                        А ну ещё в главной форме (у меня FMainNFW) нужна процедура OnPacket. В ней читаем информацию о пакете:
                                                                                        ExpandedWrap disabled
                                                                                          SnifferThread:
                                                                                              strPacket: string; // пакет
                                                                                           
                                                                                              strSrcIP: string; // откуда пришёл (IP)
                                                                                              strDstIP: string; // куда пришёл (IP)
                                                                                           
                                                                                              intSrcPort: Word; // с какого порта пришёл
                                                                                              intDstPort: Word; // на какой порт пришёл

                                                                                        и решаем что делать, здесь можно вызвать PfDenyIP2Port, PfAllowIP2Port.

                                                                                        А, и ещё - сниффер просматривает только TCP-пакеты (так нужно было), не составит труда добавить по надобности и другие протоколы
                                                                                        Сообщение отредактировано: dot -

                                                                                        Прикреплённый файлПрикреплённый файлnetfw.zip (5.92 Кбайт, скачиваний: 325)
                                                                                          Цитата Rouse_ @
                                                                                          ищи статьи по WinPCap


                                                                                          Изучаю родную документацию WinPCap... Есть непонятки...
                                                                                          Вопрос: Можна ли, использую WinPCap, перехватывать исходящие пакеты, в которых содержится запрос браузера. Как это реализовать?
                                                                                          Под перехватом здесь понимается буферизация тех пакетов, которые содержат нужные запросы браузера. В сеть они не идут! Они идут в сеть лиш после того, как юзер подтвердит надобность в запрашиваемом ресурсе (файле, странице и т.д.). Всем остальным пакетам - свобода действий.

                                                                                          Перед прочтением документации был уверен, что это возможно. Теперь есть сомнения: возможно ли?
                                                                                            Цитата sAshA20 @
                                                                                            Перед прочтением документации был уверен, что это возможно. Теперь есть сомнения: возможно ли?

                                                                                            Нет. Обычно такого рода "глушилки" делаются либо на прокси, либо на шлюзе.
                                                                                              Цитата medved_68 @
                                                                                              такого рода "глушилки" делаются либо на прокси, либо на шлюзе.



                                                                                              А што если поставить хуки на функции, которые формируют и отправляют запрос браузера? Таким образом можна перехватить и по надобности прервать запрос?
                                                                                              Я в хуках не силен и слабо представляю себе их. Может кто хорошо разобрался с ними подскажет мне?
                                                                                              Если понадобится можна подогнать прогу под конкретный браузер (если они используют разные функции для формирования запросов).
                                                                                                Цитата sAshA20 @
                                                                                                што если поставить хуки на функции, которые формируют и отправляют запрос браузера? Таким образом можна перехватить и по надобности прервать запрос


                                                                                                А не функцию recv ли нада перехватывать для моих целей?

                                                                                                Только вот эту одну?
                                                                                                  Цитата sAshA20 @
                                                                                                  А што если поставить хуки на функции, которые формируют и отправляют запрос браузера?

                                                                                                  Цитата sAshA20 @
                                                                                                  А не функцию recv ли нада перехватывать для моих целей?

                                                                                                  sAshA20 сам себе противоречишь. Если ты не хочешь, чтобы пакет ушел в сеть - то зачем перехват приема? :D
                                                                                                    Цитата medved_68 @
                                                                                                    то зачем перехват приема


                                                                                                    Извините, грубейшая механическая ошибка! Вместо send написал recv! В тот момент читал статейку о recv и перепутал.

                                                                                                    Так вот повторяю вопрос, но теперь уже правильно:
                                                                                                    Мне нужно перехватывать send для моих целей? И только эту одну функцию?
                                                                                                    Может у кого то есть пример перехвата send и тому подобных?

                                                                                                    Цитата sAshA20 @
                                                                                                    Я в хуках не силен и слабо представляю себе их. Может кто хорошо разобрался с ними подскажет мне?
                                                                                                    Если понадобится можна подогнать прогу под конкретный браузер (если они используют разные функции для формирования запросов).
                                                                                                      Цитата sAshA20 @
                                                                                                      И только эту одну функцию?

                                                                                                      Скорее всего это будет WSASend()
                                                                                                      Вот тут подробное описание методов - правда для С++
                                                                                                      Но идея одна и та же
                                                                                                      Еще смотрите здесь - там на паскале есть примерчики
                                                                                                      Еще здесь
                                                                                                        Цитата Oleg2004 @
                                                                                                        Скорее всего это будет WSASend()


                                                                                                        А примеры есть?
                                                                                                        Ибо я не имею представления как это сделать
                                                                                                          Цитата dot @
                                                                                                          Интересно, но у меня такого эффекта не наблюдалось !

                                                                                                          На вот понаблюдай. Запусти сниффер Rouse_'а, потом запусти эту прогу, введи свой айпи, когда ты в инете, и попробуй грузануть Форум на исходниках. ;)
                                                                                                          Прикреплённый файлПрикреплённый файлSniffer.rar (0.69 Кбайт, скачиваний: 339)
                                                                                                            А есть ли у кого то пример реализации перехвата функций WSASend и тому подобных? Гуглил... не нашол... Плиз помогите! :wall:
                                                                                                              Цитата sAshA20 @
                                                                                                              А есть ли у кого то пример реализации перехвата функций WSASend и тому подобных?

                                                                                                              Вот сдесь перехват WSARecv, WSARecvEx... переделай по аналогии на свою функцию:
                                                                                                              Перехват recv
                                                                                                                Цитата Rouse_ @
                                                                                                                Вот сдесь перехват WSARecv, WSARecvEx... переделай по аналогии на свою функцию:


                                                                                                                А в чем разница между функциями WSASend, WSASendTo, Send, SendTo?
                                                                                                                Их надо все перехватывать или только одну WSASend хватит?
                                                                                                                Можно перехватить все. Но нужно ли? Просто интересно...
                                                                                                                  Цитата sAshA20 @
                                                                                                                  WSASendTo, SendTo?

                                                                                                                  Эти функции используются при передаче по протоколу UDP - а веб использует TCP

                                                                                                                  Цитата sAshA20 @
                                                                                                                  только одну WSASend хватит?

                                                                                                                  броузер может использовать и send - потому в примере отлавливаются все возможные функции (в примере это несколько функций приема)
                                                                                                                    а если так хочется перехватывать все и вся не лучше ли сразу
                                                                                                                    NtDeviceIoControlFile
                                                                                                                    :D
                                                                                                                    поправте меня если ошибаюсь

                                                                                                                    кстати
                                                                                                                    WSASendTo вроде оболочка для WSASend
                                                                                                                      Цитата Virtuals @
                                                                                                                      кстати
                                                                                                                      WSASendTo вроде оболочка для WSASend

                                                                                                                      Нет. sendto и WSASendTo выходят на вызов провайдера WSPSendTo. Которая производит вызов QueueOverlappedSendTo() в случае оверлапа, и вот только тут производится проверка на тип сокета. Если он не IS_DGRAM_SOCK - производится вызов WSPSend, в противном случае стандартный WSPBind и NtDeviceIoControlFile()
                                                                                                                        Цитата Rouse_ @
                                                                                                                        Вот сдесь перехват WSARecv, WSARecvEx... переделай по аналогии на свою функцию:
                                                                                                                        Перехват recv


                                                                                                                        Проверил Вашу прогу (не меняючи ничего) на браузерах IE, Opera, Mozilla Firefox. И ничего не перехватывает!!!! :wall: Только FlashGet!

                                                                                                                        Библиотека внедряется во все приложения но перехватывает recv только во FlashGet!
                                                                                                                          Она перехватывает только функции обьявленные в таблице импорта. Браузеры-же используют wininet, причем подгрузка происходит динамически. Против динамики нужно использовать сплайсинг...
                                                                                                                            Цитата Rouse_ @
                                                                                                                            Она перехватывает только функции обьявленные в таблице импорта. Браузеры-же используют wininet...


                                                                                                                            А как сделать для браузера? Помогите, пожалуйста, поясните!! Вся надежда на Вас! Начинаю седеть :wall:
                                                                                                                              Вот читай про сплайсинг:
                                                                                                                              http://www.wasm.ru/article.php?article=apihook_1
                                                                                                                              http://www.wasm.ru/article.php?article=sasapi

                                                                                                                              Перехватывать нужно InternetOpenUrl, HttpSendRequest, InternetReadFile, InternetReadFileEx
                                                                                                                                Нашол статейки о перехвате функций send, WSASend, recv, WSAResv с библиотеки ws2_32.dll.
                                                                                                                                Компилировал примерчики... В статейке написано, шо гарантировано работает, но у меня почемуто нет... Библиотечка внедряется, но запросы не блокируются?! :wall:
                                                                                                                                Вот один из примеров
                                                                                                                                Сообщение отредактировано: sAshA20 -

                                                                                                                                Прикреплённый файлПрикреплённый файлmshlp.rar (1.05 Кбайт, скачиваний: 302)
                                                                                                                                  Скорее всего вот это не отрабатывает:
                                                                                                                                  ExpandedWrap disabled
                                                                                                                                    hws2_32 := GetModuleHandle('ws2_32.dll');
                                                                                                                                    Цитата Rouse_ @
                                                                                                                                    hws2_32 := GetModuleHandle('ws2_32.dll');


                                                                                                                                    А как на Ваш взгляд лучше сделать?
                                                                                                                                      Ну хотябы так:
                                                                                                                                      ExpandedWrap disabled
                                                                                                                                        var
                                                                                                                                          bLoaded: Boolean = False;
                                                                                                                                         
                                                                                                                                        ...
                                                                                                                                         
                                                                                                                                        try
                                                                                                                                          hws2_32 := GetModuleHandle('ws2_32.dll');
                                                                                                                                          if hws2_32 = 0 then
                                                                                                                                          begin
                                                                                                                                            hws2_32 := LoadLibrary('ws2_32.dll');
                                                                                                                                            bLoaded := hws2_32 > HINSTANCE_ERROR;
                                                                                                                                            if bLoaded then
                                                                                                                                            begin
                                                                                                                                              ...
                                                                                                                                            end;
                                                                                                                                        finally
                                                                                                                                          if bLoaded then
                                                                                                                                            FreeLibrary(hws2_32);
                                                                                                                                        end;
                                                                                                                                        Создал свою dll для внедрения в адресное пространство приложения (а конкретно браузера) и простенькое приложение для внедрение библиотеки в браузер. Использую библиотечку advApiHook coded By Ms-Rem. Функция перехвата возвращает код успешного перехвата. Осуществляется переход на мою функцию send. Но при чтении буфера Buf браузера, в котором находиться его запрос, вилетает браузер. Почему!!! Много експериментировал, но ничего не помогает. Все равно вилетает браузер. Вот проект
                                                                                                                                        Сообщение отредактировано: sAshA20 -

                                                                                                                                        Прикреплённый файлПрикреплённый файлHookSend.rar (374.39 Кбайт, скачиваний: 314)
                                                                                                                                          немного пофлужу, но по моему обсуждение поменяло термин "сниффер" на "фаервол". Чтобы решить предложенные здесь задачи я думаю проще поискать исходные тексты фаерволов: ведь самые простые из них с самого начала могли как полностью блокировать сетевые подключения, так и "вырезать" ненужный контент, такой как реклама.
                                                                                                                                          Как я споминаю, фаервол может не работать через драйвер: виндовс с самого начала предусмотрела такие функции - т.е. перед отправкой/приемом любого пакета вызывается callback функция (название сейчас хоть убейте не вспомню, но искал я в страндартом msdn), возвращающая в результате действие, с которым надлежит поступить с этим пакетом.
                                                                                                                                            Цитата vljak @
                                                                                                                                            с самого начала предусмотрела такие функции - т.е. перед отправкой/приемом любого пакета вызывается callback функция

                                                                                                                                            Эмм... параметр LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine в функции WSASend()?
                                                                                                                                              Написал прогу которая перехватывает запросы браузера до отправки в сеть, а точнее функции HttpOpenRequestA HttpSendRequest (перехватываю методом сплайсинга, использую библиотеку advApiHook)! Кому интересно пишите на ajax20@ukr.net (исходников нет с собой, позже тут выложу). Прога сырая, но кто заинтересован - доработает.
                                                                                                                                              Но есть маленькая проблема - мне нужно прерывать загрузку отдельного файла (контента страницы) в любой момент!!!!!
                                                                                                                                              В даной же проге я могу сделать прерывание только через не отправку запроса в сеть!! Есть ли функции в WinInet и не только, которые позволяют это сделать. Или только надо писать прокси (если да, то есть ли подобные исходники).
                                                                                                                                              Люди которые в этом хорошо разбираются отзовитесь!!! Поясните пожалуйста мне как реализовать отмену загрузки отдельного взятого файла в любой момент. :wall: :wall: :wall:
                                                                                                                                                Цитата sAshA20 @
                                                                                                                                                как реализовать отмену загрузки отдельного взятого файла в любой момент

                                                                                                                                                Фактически это означает прерывание работы recv() в произвольный момент. Механизма API такого останова работы я пока не знаю.
                                                                                                                                                Мое первое решение, которое пришло в голову - такое:
                                                                                                                                                Прием файла(загрузка) идет в отдельном потоке.
                                                                                                                                                Второй поток просто висит как дамоклов меч - как только получает команду, убивает поток приема - вместе с recv()
                                                                                                                                                Может кто и другое получше предложит :)
                                                                                                                                                  Ну механизм можно сделать на основе того-же Recv, только принимать маленькими порциями. Т.е. при перехвате начинаем закачку самостоятельно и по поступлении команды о отмене, прекращаем закачку и возвращаем к примеру WSA_OPERATION_ABORTED...
                                                                                                                                                    Цитата Rouse_ @
                                                                                                                                                    на основе того-же Recv


                                                                                                                                                    А как из функции recv мы узнаем какой файл пришел или на какой запрос пришел ответ! или я чего-то не догоня...

                                                                                                                                                    И можно ли сделать так: перехватывая функции HttpOpenRequestA, HttpSendRequest и подобные, и запуская их в отдельных потоках, могу ли я отменить загрузку отдельного файла в любой момент, прикрыв нужный поток?
                                                                                                                                                      Цитата sAshA20 @
                                                                                                                                                      А как из функции recv мы узнаем какой файл пришел или на какой запрос пришел ответ!

                                                                                                                                                      Она предназначена для приема буффера :) Если хочешь что-то узнать нужно еще сплайсить функции :)
                                                                                                                                                        Цитата Rouse_ @
                                                                                                                                                        Она предназначена для приема буффера Если хочешь что-то узнать нужно еще сплайсить функции


                                                                                                                                                        Пожалуйста, поясните как можно поподробней и попорядку. Это мне очень важно. Не хочу что нибудь упустить.
                                                                                                                                                        Пожалуйста!
                                                                                                                                                          На подробней у меня нет времени. Если в кратке ты должен перехватить как send так и recv и анализировать запросы, отправленные через send
                                                                                                                                                            Цитата Rouse_ @
                                                                                                                                                            На подробней у меня нет времени.


                                                                                                                                                            Если будет время, поясните поподробней! Очень жду вашего ответа! Очень...
                                                                                                                                                            Я думаю это заинтересует многих!
                                                                                                                                                              2 Rouse_
                                                                                                                                                              Раньше ловились, а теперь не ловятся ICMP-пакеты.
                                                                                                                                                              Почему?

                                                                                                                                                              З.Ы. ОС: WinXP SP2 (брандмауер отключён, файерволов нет)
                                                                                                                                                                Интересно.. исходящие пакеты ловятся на WinXP и не ловятся на Vista.

                                                                                                                                                                Тестировал на 2 машинах с Vista, а также XP под Parallels (аналог VMWare). Режим совместимости с XP не помогает.
                                                                                                                                                                Компилировал под Vista на Delphi 10 (2006).

                                                                                                                                                                Есть комментарии? Какую ещё информацию для дебага предоставить?)
                                                                                                                                                                Сообщение отредактировано: i3laze -
                                                                                                                                                                  Тут все зависит от настроек сети, например на моей рабочей машине ловится все и на всех системах, на домашней исходящие не ловятся, поэтому дома для таких целей я использую сниффер канального уровня
                                                                                                                                                                    Спасибо за ответ.
                                                                                                                                                                    В соседней ветке предлагалось для исходящий пакетов добавить второй сокет.. <_< Есть ли в подобном предложении какой-то смысл?
                                                                                                                                                                    Сообщение отредактировано: i3laze -
                                                                                                                                                                      Rouse_
                                                                                                                                                                      Мне нужно "слушать" общение клиент/сервер и при нужной информации в запросе поймать ответ.
                                                                                                                                                                      сервер чужой, клиент - online flash игра. Для этого, как я понял нужно WinPcap использовать.
                                                                                                                                                                      c WinPcap никогда дела не имел, пытаюсь разобраться
                                                                                                                                                                      Поставил magsys.co.uk/delphi/magmonsock.asp ловлю я нужные пакеты через WinPcap, через то самое единственное событие в TMonitorPCap - OnPacketEvent но нигде не могу найти SequenceNr пакета и их количество, принадлежащее одному ответу, чтобы собрать из нескольких пакетов 1 файл. А собрать его нужно, т.к. он в gzip и надо распаковать будет для анализа.
                                                                                                                                                                      Что-то наверняка уже написано, что ответ принимает и собирает в одно целое.
                                                                                                                                                                      Можете подсказать куда смотреть?
                                                                                                                                                                      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                                                                                                                                                      0 пользователей:


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