Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Delphi: Сетевое программирование > Сниффер


Автор: sAshA20 20.01.08, 18:19
Есть код пакетного сниффера сетевого уровня модели OSI
(автор Александр (Rouse_) Багель !!!огромное ему спасибо за науку!!!).

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    ////////////////////////////////////////////////////////////////////////////////
    //
    //  ****************************************************************************
    //  * 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). Опыта в плагинописании вообще нет :-(
Что делать? Научите, пожалуйста ...

Автор: Gonarh 20.01.08, 18:38
Очень интересный и глубокомысленный вопрос :D
Будьте любезны - уточните оный

Автор: Oleg2004 20.01.08, 18:49
M
sAshA20
В чем суть вашего вопроса?
Ответьте пожалуйста, иначе ваш топик будет удален

Автор: sAshA20 20.01.08, 21:29
Изменил вопрос.
Очень удивлен... :huh: Пол дня пытался создать тему! Выбрасывало ошибки разные (в т.ч. 404 Not found), очень долго грузились страницы, вис браузер... (вроди не новичок в этом деле, И-нетом пользуюсь не один год). Может у меня И-нет глючить, а может форум... теперь уже не важно.
Извините господа, первый раз мой вопрос загрузился не полностью. Теперь вроди все нормально.

Автор: medved_68 21.01.08, 05:35
Цитата sAshA20 @
Мне советовали, что прочитав пакет, как то можна определить какой файл в нем (или его часть). Так ли это?

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

Автор: Rouse_ 21.01.08, 06:30
Да, конечно может, нужно только добавить анализатор пакетов, который ловил бы начало запроса и все последующие пакеты...

Автор: Катенька 21.01.08, 07:01
Цитата Rouse_ @
Да, конечно может, нужно только добавить анализатор пакетов, который ловил бы начало запроса и все последующие пакеты...

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

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


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

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

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

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

Если честно не представляю как это :)

Автор: Rouse_ 21.01.08, 07:23
Эмм... Ну я могу только в общих чертах описать. Скажем берем запрос на получаение некоего контента:

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    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 - там были примеры таких снифферов с анализаторами...

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

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

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

Автор: Rouse_ 21.01.08, 07:56
Цитата Oleg2004 @
означает ли это, что ваш сниффер на рав-сокетах ловит исходящие IP-пакеты?

Это как раз он и есть :) Только что запустил, чтоб ручками белиберду не вбивать :)

Автор: Катенька 21.01.08, 08:02
[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:

Автор: medved_68 21.01.08, 08:10
Цитата Oleg2004 @
потому как вот наш коллега пишет о такой возможности - а я, просматривая код, этой возможности не нашел

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

Он самый. :)

Автор: sAshA20 21.01.08, 09:50
Цитата Rouse_ @
нужно только добавить анализатор пакетов, который ловил бы начало запроса и все последующие пакеты...

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

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

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


Вопрос ко всем: поясните мне, ученику, весь процес (ну очень подробно) от нажатия кнопки "Перейти" до надписи внизу экрана "Готово" процес загрузки браузером страниц и связанного с ней контента. Или дайте ссылку, пожалуйста, где это все п-о-д-р-о-б-н-о и д-о-с-т-у-п-н-о описано. Очень мало такого материала я встречал в И-нете. Может Вы знаете?

Автор: Oleg2004 21.01.08, 10:18
Цитата 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:

Автор: Rouse_ 21.01.08, 10:32
Цитата Oleg2004 @
Ну мы так вообще дойдем до неизвестно чего.........

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

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

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

Времени сейчас на обьяснения нет, посомтрите на sourceforge.net примеры снифферов

Автор: Rouse_ 21.01.08, 10:40
Экзешник...

Автор: Oleg2004 21.01.08, 10:41
Rouse_
И еще один вопрос - сколько сетевых карточек у вас на компе - потому что в коде вы биндите интерфейс для равсокета - что обычно не делается :)

Автор: Rouse_ 21.01.08, 10:43
Одна :)

Автор: Oleg2004 21.01.08, 11:21
Rouse_
Блииииииииин!!!
Ловит.
У меня крышу сносит - ей ей :D
И где же тут собака порылась то - с точки зрения науки и техники???
Все, на пенсию, на пенсию........ :'(

Автор: Rouse_ 21.01.08, 11:24
Цитата Oleg2004 @
Ловит.

Если с NAT-ом похимичить ловить не будет :) Дома у меня к примеру не ловит, но там хитрый конфиг :) Но в остальных 90 процентов случаев ловит :)

Автор: Oleg2004 21.01.08, 11:30
Кстати, когда делаешь фуллскрин вашему снифферу - почемуто текстбокс с опциями фильтрования остается там где он был в неполном окне :)
Нда, ну а дальше - пишу заявление об отставке :(
Ибо теория говорит совсем не то - да и поисковики тоже............ :'(
Ну вот например еще одно с гуглегруп:
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:

Автор: sAshA20 21.01.08, 11:44
Цитата Rouse_ @
Вот лог того что ловит данный сниффер на моей машине при запросе данной страницы, т.е. при открытии следующего URL: Сниффер


Ну все же, как увидеть в этом имя, тип, размер файла?

Автор: Rouse_ 21.01.08, 11:47
Цитата Oleg2004 @
почемуто текстбокс с опциями фильтрования остается там где он был в неполном окне

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

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

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

никакого секрета - чистая практика :)

Автор: medved_68 21.01.08, 11:49
Цитата Oleg2004 @
А эту фразу я вообще отказываюсь понимать

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

Честно говоря - "что вижу, о том пою". :D

Автор: sAshA20 21.01.08, 11:56
Цитата Rouse_ @
Только анализируя входящий контент...


Извините, что так туго мне доходит, но не можете ли по подробнее, пожалуйста.
Вы можете обьяснить, используя лог, какие файли он загрузил, их тип, размер?
Как дело обстоит с контентом, который закеширован?

Автор: Rouse_ 21.01.08, 12:01
Ищи примеры тут: 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/

Автор: sAshA20 21.01.08, 12:07
Цитата Rouse_ @
щи примеры тут: http://sourceforge.net/search/?words=Sniff...newfilter=Apply

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



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

Автор: Oleg2004 21.01.08, 12:13
Цитата medved_68 @
Но это на самом деле так, по крайней мере у меня.

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

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

Автор: Rouse_ 21.01.08, 12:13
Просто обьяснять сам принцип очень долго, а готового примера чтоб на пальцах показать у меня нет, как и времени его писать :) Так что только там, ну или тут кто что мошт расскажет :)

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

Верить или не верить - мы же программисты а не бабки гадалки. Достаточно один раз самому проверить :) Я много раз так натыкался, когда встает задача - пробегаю поиском, везде написано что это невозможно. Сажусь сам делать - почему-то работает :) Так что вопрос спорный, теория всегда должна быть обильно разбавленна практикой, иначе она так и останется голой теорией :)

Автор: sAshA20 21.01.08, 12:23
Припустим, я знаю имена файлов, которые грузит браузер в данный момент. Могу я отменить загрузку любого из них (тех которые еще грузятся или будут грузится)зная это? Или что для этого нада и как это сделать?

Автор: Astrafox 21.01.08, 12:25
sAshA20 Возможно поможет Проект Skynet

Автор: Oleg2004 21.01.08, 13:08
Цитата Rouse_ @
иначе она так и останется голой теорией

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

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

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

Автор: sAshA20 21.01.08, 14:41
Цитата Oleg2004 @
Нет, такого действия в протоколе http нет, можно лишь оборвать передачу.


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

Автор: Oleg2004 21.01.08, 14:48
Цитата sAshA20 @
А как тогда это реализовано в программе Naviscope

Сие мне неизвестно - да и в описании программы об этом я не нашел

Автор: sAshA20 22.01.08, 10:47
Цитата Oleg2004 @
который будет селективно выбирать нужные кому-то файлы, а остальные игнорировать



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

ИЛИ

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

Автор: Rouse_ 22.01.08, 10:53
Нет, для этого он не предназначен...

Автор: sAshA20 22.01.08, 10:57
Цитата Rouse_ @
Нет, для этого он не предназначен...


Я имею ввиду дописать код этого сниффера.
А как на счет идей??? Подскажите, пожалуйста!

Автор: Rouse_ 22.01.08, 11:10
На том уровне на котором работает данный сниффер пакеты заблокировать уже нельзя... Поэтому даже дописыванием кода тут не решить. Тут должен работать NDIS драйвер...

Автор: Oleg2004 22.01.08, 11:14
Цитата sAshA20 @
Перенаправлять пакеты с запросами на отдельный порт (каждый файл на свой порт).

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

Автор: sAshA20 22.01.08, 12:16
Цитата Rouse_ @
Тут должен работать NDIS драйвер...


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

Больше ни у кого никаких идей? :(

Автор: Rouse_ 22.01.08, 12:30
Цитата sAshA20 @
Можна поподробней, пожалуйста?

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

Автор: Катенька 22.01.08, 18:02
Цитата Rouse_ @
Поэтому даже дописыванием кода тут не решить. Тут должен работать NDIS драйвер...


Эмм... У Вас же в коде это и делается, только пакеты до конца доходят, точнее Вы продолжаете его принимать до конца.
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    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 принял данные такого размера а дальше в коде не было реализовано продолжение принятия и страница в браузере дальше не грузилась. Так что драйвер и не нужен. Ведь мы привязываемся к интерфейсу и принимаем данные, если мы не будем продолжать принимать то данные стоят в очереди.

По-пробуйте сами ;)

Автор: dot 25.01.08, 06:06
Цитата Катенька @
дальше в коде не было реализовано продолжение принятия и страница в браузере дальше не грузилась

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

Вообще по идее равсокет работает параллельно с приложениями и если он не принимает пакеты то они всё равно продолжают идти, ведь это всего лишь сниффер !
Я в своей программе делал блокировку портов через 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. В ней читаем информацию о пакете:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    SnifferThread:
        strPacket: string; // пакет
     
        strSrcIP: string; // откуда пришёл (IP)
        strDstIP: string; // куда пришёл (IP)
     
        intSrcPort: Word; // с какого порта пришёл
        intDstPort: Word; // на какой порт пришёл

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

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

Автор: sAshA20 03.02.08, 12:10
Цитата Rouse_ @
ищи статьи по WinPCap


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

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

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

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

Автор: sAshA20 05.02.08, 09:25
Цитата medved_68 @
такого рода "глушилки" делаются либо на прокси, либо на шлюзе.



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

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


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

Только вот эту одну?

Автор: medved_68 07.02.08, 05:27
Цитата sAshA20 @
А што если поставить хуки на функции, которые формируют и отправляют запрос браузера?

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

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

Автор: sAshA20 10.02.08, 11:30
Цитата medved_68 @
то зачем перехват приема


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

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

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

Автор: Oleg2004 10.02.08, 11:43
Цитата sAshA20 @
И только эту одну функцию?

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

Автор: sAshA20 10.02.08, 11:51
Цитата Oleg2004 @
Скорее всего это будет WSASend()


А примеры есть?
Ибо я не имею представления как это сделать

Автор: Катенька 10.02.08, 12:33
Цитата dot @
Интересно, но у меня такого эффекта не наблюдалось !

На вот понаблюдай. Запусти сниффер Rouse_'а, потом запусти эту прогу, введи свой айпи, когда ты в инете, и попробуй грузануть Форум на исходниках. ;)

Автор: sAshA20 11.02.08, 08:36
А есть ли у кого то пример реализации перехвата функций WSASend и тому подобных? Гуглил... не нашол... Плиз помогите! :wall:

Автор: Rouse_ 11.02.08, 10:45
Цитата sAshA20 @
А есть ли у кого то пример реализации перехвата функций WSASend и тому подобных?

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

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


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

Автор: Oleg2004 11.02.08, 15:06
Цитата sAshA20 @
WSASendTo, SendTo?

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

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

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

Автор: Virtuals 12.02.08, 06:44
а если так хочется перехватывать все и вся не лучше ли сразу
NtDeviceIoControlFile
:D
поправте меня если ошибаюсь

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

Автор: Rouse_ 12.02.08, 07:24
Цитата Virtuals @
кстати
WSASendTo вроде оболочка для WSASend

Нет. sendto и WSASendTo выходят на вызов провайдера WSPSendTo. Которая производит вызов QueueOverlappedSendTo() в случае оверлапа, и вот только тут производится проверка на тип сокета. Если он не IS_DGRAM_SOCK - производится вызов WSPSend, в противном случае стандартный WSPBind и NtDeviceIoControlFile()

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


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

Библиотека внедряется во все приложения но перехватывает recv только во FlashGet!

Автор: Rouse_ 12.02.08, 10:20
Она перехватывает только функции обьявленные в таблице импорта. Браузеры-же используют wininet, причем подгрузка происходит динамически. Против динамики нужно использовать сплайсинг...

Автор: sAshA20 12.02.08, 10:23
Цитата Rouse_ @
Она перехватывает только функции обьявленные в таблице импорта. Браузеры-же используют wininet...


А как сделать для браузера? Помогите, пожалуйста, поясните!! Вся надежда на Вас! Начинаю седеть :wall:

Автор: Rouse_ 12.02.08, 11:10
Вот читай про сплайсинг:
http://www.wasm.ru/article.php?article=apihook_1
http://www.wasm.ru/article.php?article=sasapi

Перехватывать нужно InternetOpenUrl, HttpSendRequest, InternetReadFile, InternetReadFileEx

Автор: sAshA20 19.02.08, 14:16
Нашол статейки о перехвате функций send, WSASend, recv, WSAResv с библиотеки ws2_32.dll.
Компилировал примерчики... В статейке написано, шо гарантировано работает, но у меня почемуто нет... Библиотечка внедряется, но запросы не блокируются?! :wall:
Вот один из примеров

Автор: Rouse_ 19.02.08, 14:46
Скорее всего вот это не отрабатывает:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    hws2_32 := GetModuleHandle('ws2_32.dll');

Автор: sAshA20 20.02.08, 11:20
Цитата Rouse_ @
hws2_32 := GetModuleHandle('ws2_32.dll');


А как на Ваш взгляд лучше сделать?

Автор: Rouse_ 20.02.08, 11:43
Ну хотябы так:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    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;

Автор: sAshA20 25.02.08, 13:20
Создал свою dll для внедрения в адресное пространство приложения (а конкретно браузера) и простенькое приложение для внедрение библиотеки в браузер. Использую библиотечку advApiHook coded By Ms-Rem. Функция перехвата возвращает код успешного перехвата. Осуществляется переход на мою функцию send. Но при чтении буфера Buf браузера, в котором находиться его запрос, вилетает браузер. Почему!!! Много експериментировал, но ничего не помогает. Все равно вилетает браузер. Вот проект

Автор: vljak 28.02.08, 05:59
немного пофлужу, но по моему обсуждение поменяло термин "сниффер" на "фаервол". Чтобы решить предложенные здесь задачи я думаю проще поискать исходные тексты фаерволов: ведь самые простые из них с самого начала могли как полностью блокировать сетевые подключения, так и "вырезать" ненужный контент, такой как реклама.
Как я споминаю, фаервол может не работать через драйвер: виндовс с самого начала предусмотрела такие функции - т.е. перед отправкой/приемом любого пакета вызывается callback функция (название сейчас хоть убейте не вспомню, но искал я в страндартом msdn), возвращающая в результате действие, с которым надлежит поступить с этим пакетом.

Автор: Rouse_ 28.02.08, 06:43
Цитата vljak @
с самого начала предусмотрела такие функции - т.е. перед отправкой/приемом любого пакета вызывается callback функция

Эмм... параметр LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine в функции WSASend()?

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

Автор: Oleg2004 11.03.08, 19:51
Цитата sAshA20 @
как реализовать отмену загрузки отдельного взятого файла в любой момент

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

Автор: Rouse_ 12.03.08, 07:44
Ну механизм можно сделать на основе того-же Recv, только принимать маленькими порциями. Т.е. при перехвате начинаем закачку самостоятельно и по поступлении команды о отмене, прекращаем закачку и возвращаем к примеру WSA_OPERATION_ABORTED...

Автор: sAshA20 12.03.08, 13:49
Цитата Rouse_ @
на основе того-же Recv


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

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

Автор: Rouse_ 12.03.08, 18:02
Цитата sAshA20 @
А как из функции recv мы узнаем какой файл пришел или на какой запрос пришел ответ!

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

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


Пожалуйста, поясните как можно поподробней и попорядку. Это мне очень важно. Не хочу что нибудь упустить.
Пожалуйста!

Автор: Rouse_ 14.03.08, 06:07
На подробней у меня нет времени. Если в кратке ты должен перехватить как send так и recv и анализировать запросы, отправленные через send

Автор: sAshA20 14.03.08, 09:15
Цитата Rouse_ @
На подробней у меня нет времени.


Если будет время, поясните поподробней! Очень жду вашего ответа! Очень...
Я думаю это заинтересует многих!

Автор: Jetus 22.06.08, 21:30
2 Rouse_
Раньше ловились, а теперь не ловятся ICMP-пакеты.
Почему?

З.Ы. ОС: WinXP SP2 (брандмауер отключён, файерволов нет)

Автор: i3laze 04.06.09, 21:38
Интересно.. исходящие пакеты ловятся на WinXP и не ловятся на Vista.

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

Есть комментарии? Какую ещё информацию для дебага предоставить?)

Автор: Rouse_ 05.06.09, 09:57
Тут все зависит от настроек сети, например на моей рабочей машине ловится все и на всех системах, на домашней исходящие не ловятся, поэтому дома для таких целей я использую сниффер канального уровня

Автор: i3laze 05.06.09, 10:03
Спасибо за ответ.
В соседней ветке предлагалось для исходящий пакетов добавить второй сокет.. <_< Есть ли в подобном предложении какой-то смысл?

Автор: EDIsaev 16.02.17, 13:26
Rouse_
Мне нужно "слушать" общение клиент/сервер и при нужной информации в запросе поймать ответ.
сервер чужой, клиент - online flash игра. Для этого, как я понял нужно WinPcap использовать.
c WinPcap никогда дела не имел, пытаюсь разобраться
Поставил magsys.co.uk/delphi/magmonsock.asp ловлю я нужные пакеты через WinPcap, через то самое единственное событие в TMonitorPCap - OnPacketEvent но нигде не могу найти SequenceNr пакета и их количество, принадлежащее одному ответу, чтобы собрать из нескольких пакетов 1 файл. А собрать его нужно, т.к. он в gzip и надо распаковать будет для анализа.
Что-то наверняка уже написано, что ответ принимает и собирает в одно целое.
Можете подсказать куда смотреть?

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)