Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум на Исходниках.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 |
Очень интересный и глубокомысленный вопрос Будьте любезны - уточните оный |
Автор: Oleg2004 20.01.08, 18:49 |
M sAshA20 В чем суть вашего вопроса? Ответьте пожалуйста, иначе ваш топик будет удален |
Автор: sAshA20 20.01.08, 21:29 |
Изменил вопрос. Очень удивлен... Пол дня пытался создать тему! Выбрасывало ошибки разные (в т.ч. 404 Not found), очень долго грузились страницы, вис браузер... (вроди не новичок в этом деле, И-нетом пользуюсь не один год). Может у меня И-нет глючить, а может форум... теперь уже не важно. Извините господа, первый раз мой вопрос загрузился не полностью. Теперь вроди все нормально. |
Автор: medved_68 21.01.08, 05:35 |
Цитата sAshA20 @ Мне советовали, что прочитав пакет, как то можна определить какой файл в нем (или его часть). Так ли это? sAshA20 тебя нагло обманули. Определить ты можешь только размер данных в пакете, а вот что это - файл или его часть (а тем более имя или путь файла) - это увы..... Если передающая сторона не отправляет имени файла или какую - нибудь метку, что это передается именно файл, а не какой - нибудь набор данных, то, сидя на приемнике, остается только абстрагировать, что же принялось на этот раз. Приведенный тобою пример сниффера довольно успешно может читать HTTP запрос браузера, который отправляется с этого же компа, на котором запущен сей сниффер. |
Автор: Rouse_ 21.01.08, 06:30 |
Да, конечно может, нужно только добавить анализатор пакетов, который ловил бы начало запроса и все последующие пакеты... |
Автор: Катенька 21.01.08, 07:01 |
Цитата 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 |
Как всегда вопрос - означает ли это, что ваш сниффер на рав-сокетах ловит исходящие IP-пакеты? Цитата medved_68 @ Приведенный тобою пример сниффера довольно успешно может читать HTTP запрос браузера, который отправляется с этого же компа, на котором запущен сей сниффер. потому как вот наш коллега пишет о такой возможности - а я, просматривая код, этой возможности не нашел PS Вечная тема - ловит ли равсокет сниффер исходящие IP-пакеты Надо один раз поставить точки над i |
Автор: Rouse_ 21.01.08, 07:56 |
Это как раз он и есть Только что запустил, чтоб ручками белиберду не вбивать |
Автор: Катенька 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] а это разве не запрос ? |
Автор: medved_68 21.01.08, 08:10 |
Цитата Oleg2004 @ потому как вот наш коллега пишет о такой возможности - а я, просматривая код, этой возможности не нашел Oleg2004 ловит. А вот пакеты с других компов (гуляющие в сетке до шлюза, но адресованные не ему) нет. А канальный ловит все. Он самый. |
Автор: sAshA20 21.01.08, 09:50 |
Цитата Rouse_ @ нужно только добавить анализатор пакетов, который ловил бы начало запроса и все последующие пакеты... Обьясните, пожалуйста, очень подробно и доступно как это сделать (алгоритм, исходники или зарисовки исходников). Можно на примере. Еще вопросы: Если, браузер грузит страницу (на странице есть, например, картинки), то браузер сам создает запроси в процессе загрузки на эти самие картинки или их вместе со страницей присылает сервер? А как дело обстоит с контентом который уже закеширован (например HandyCache) и с запросами на них? Вопрос ко всем: поясните мне, ученику, весь процес (ну очень подробно) от нажатия кнопки "Перейти" до надписи внизу экрана "Готово" процес загрузки браузером страниц и связанного с ней контента. Или дайте ссылку, пожалуйста, где это все п-о-д-р-о-б-н-о и д-о-с-т-у-п-н-о описано. Очень мало такого материала я встречал в И-нете. Может Вы знаете? |
Автор: Oleg2004 21.01.08, 10:18 |
Ну мы так вообще дойдем до неизвестно чего......... Читаем - groops.google.com Цитата Barry Margolin Просмотреть профиль Дополнительные параметры 15 апр 2006, 17:59 Группы новостей: comp.unix.programmer Автор: Barry Margolin <bar...@alum.mit.edu> Дата: Sat, 15 Apr 2006 11:59:06 -0400 Местное время: Сб. 15 апр 2006 17:59 Тема: Re: My simple tcp sniffer sniffs only incoming packts and not outgoing packets. Why ??? > Hi everybody. > I'm trying to write a simple as possible tcp sniffer in C. It seems to > work, it goes in promiscuous mode and sniffs packets but it sniffs ONLY > incoming packets. I can't really figure out why it won't show me > outgoing packets. Probably i'm missing something, but I don't know > what. Because read() is used to read things that you receive, and you don't receive your own outgoing packets. В программе Rouse_ есть только один recv() - и он в точности подпадает под цитату. Все остальные мои поиски в Гуглях говорят о том (впрочем как Стивенс и все остальные статьи) - что Windows-сниффер на равсокетах не ловит уходящие пакеты - найдите мне хоть одно место в сети или в статье или в учебнике - это противоречит всем сетевым правилам. Да, можно ловить с канального уровня - но пользовательскому уровню это доступно только в Linux, где есть такой сокет sd=socket(AF_INET,SOCK_PACKET, htons(ETH_P_ALL)); Цитата medved_68 @ А вот пакеты с других компов (гуляющие в сетке до шлюза, но адресованные не ему) нет. А канальный ловит все. А эту фразу я вообще отказываюсь понимать Если равсокет в неразборчивом режиме не ловит проходящие мимо карточки все тогда что означает эта фраза в коде: Цитата - и кому тогда равсокет в сниффере нужен то? // Переключаем интерфейс на прием всех пакетов проходящих через интерфейс - promiscuous mode |
Автор: Rouse_ 21.01.08, 10:32 |
Ну чтож... Вот лог того что ловит данный сниффер на моей машине при запросе данной страницы, т.е. при открытии следующего URL: Сниффер В логе наглядно видны как входящие, так и исходящие пакеты Кому верить? Своим глазам или Barry Margolin-у? Добавлено Времени сейчас на обьяснения нет, посомтрите на 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_ Блииииииииин!!! Ловит. У меня крышу сносит - ей ей И где же тут собака порылась то - с точки зрения науки и техники??? Все, на пенсию, на пенсию........ |
Автор: Rouse_ 21.01.08, 11:24 |
Если с 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_ секрет всетаки в коде....... |
Автор: sAshA20 21.01.08, 11:44 |
Цитата Rouse_ @ Вот лог того что ловит данный сниффер на моей машине при запросе данной страницы, т.е. при открытии следующего URL: Сниффер Ну все же, как увидеть в этом имя, тип, размер файла? |
Автор: Rouse_ 21.01.08, 11:47 |
Да это тестовый, я для себя для отладки делал, в стандартном примере фильтрации по порту нет. Забыл выравнивание указать Только анализируя входящий контент... Добавлено никакого секрета - чистая практика |
Автор: medved_68 21.01.08, 11:49 |
Но это на самом деле так, по крайней мере у меня.Oleg2004 просмотрите мою тему об этом годовалой давности - там я "парился" практически идентичным с точностью наоборот вопросом. Да и программки как сетевого, так и канального уровня я вам сбрасывал, для проверки так сказать. Цитата Rouse_ @ В логе наглядно видны как входящие, так и исходящие пакеты Кому верить? Своим глазам или Barry Margolin-у? Честно говоря - "что вижу, о том пою". |
Автор: sAshA20 21.01.08, 11:56 |
Извините, что так туго мне доходит, но не можете ли по подробнее, пожалуйста. Вы можете обьяснить, используя лог, какие файли он загрузил, их тип, размер? Как дело обстоит с контентом, который закеширован? |
Автор: 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 |
Ну ладно, как я сам на практике убедился, ловит. А теперь уже серьезно: Где можно об этом прочитать - точно? Или же мне не верить Стивенсу? Но он гуру в *nix'ах а тут виндовоз Или не верить всем поисковикам? Всем группам новостей? Или же у Билла как всегда с сетевой проблематикой нелады Я в шоке Цитата 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 |
Я все-таки сторонник совпадения теории и практики - тем более что практика в программировании есть прямое отражение теории. И поэтому отсебятину производителей софта - недокументированную - я не приветствую. Добавлено Нет, такого действия в протоколе http нет, можно лишь оборвать передачу. Если только не писать собственный веб-броузер, который будет селективно выбирать нужные кому-то файлы, а остальные игнорировать. Впрочем, некоторые подобные настройки в броузерах есть - типа - не грузить изображения... Но чтобы прерывать на середине.... |
Автор: sAshA20 21.01.08, 14:41 |
Точно нельзя??? Очень жаль! А как тогда это реализовано в программе Naviscope официальный сайт сама прога? Только из-за того что она прокси? Только прокси может отменять загрузку отдельного файла? |
Автор: Oleg2004 21.01.08, 14:48 |
Сие мне неизвестно - да и в описании программы об этом я не нашел |
Автор: sAshA20 22.01.08, 10:47 |
А можна ли, используя код сниффера (см. сообщ # 1), буферизировать пакеты с запросами на отдельные файлы и посылать их адресату в том случае, если ми указуем этот файл как нужный (разрешаем его загрузку)? ИЛИ Перенаправлять пакеты с запросами на отдельный порт (каждый файл на свой порт). В том случае, если ми хотим отменить загрузку отдельного файла - просто закрываем порт или что-то в таком роде чтобы он не загружался. А? |
Автор: Rouse_ 22.01.08, 10:53 |
Нет, для этого он не предназначен... |
Автор: sAshA20 22.01.08, 10:57 |
Я имею ввиду дописать код этого сниффера. А как на счет идей??? Подскажите, пожалуйста! |
Автор: Rouse_ 22.01.08, 11:10 |
На том уровне на котором работает данный сниффер пакеты заблокировать уже нельзя... Поэтому даже дописыванием кода тут не решить. Тут должен работать NDIS драйвер... |
Автор: Oleg2004 22.01.08, 11:14 |
Открытый порт на клиенте - это одно приложение (те одна программа) - этот порт выделяется при выполнении коннекта - и более не меняется. Порт выделяется броузером также для новой закладки (многопоточный клиент). |
Автор: sAshA20 22.01.08, 12:16 |
Можна поподробней, пожалуйста? Больше ни у кого никаких идей? |
Автор: Rouse_ 22.01.08, 12:30 |
Попробуй вот это помотреть: http://www.tisbi.ru/resource/lib/Eltext/BookPrSistSecurity/Glava%203/GL3.htm Это теория. Самостоятельно ты врятли будешь писать драйвер, так-что после прочтения теории ищи статьи по WinPCap |
Автор: Катенька 22.01.08, 18:02 |
Эмм... У Вас же в коде это и делается, только пакеты до конца доходят, точнее Вы продолжаете его принимать до конца. <{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 |
Изучаю родную документацию WinPCap... Есть непонятки... Вопрос: Можна ли, использую WinPCap, перехватывать исходящие пакеты, в которых содержится запрос браузера. Как это реализовать? Под перехватом здесь понимается буферизация тех пакетов, которые содержат нужные запросы браузера. В сеть они не идут! Они идут в сеть лиш после того, как юзер подтвердит надобность в запрашиваемом ресурсе (файле, странице и т.д.). Всем остальным пакетам - свобода действий. Перед прочтением документации был уверен, что это возможно. Теперь есть сомнения: возможно ли? |
Автор: medved_68 04.02.08, 05:40 |
Цитата sAshA20 @ Перед прочтением документации был уверен, что это возможно. Теперь есть сомнения: возможно ли? Нет. Обычно такого рода "глушилки" делаются либо на прокси, либо на шлюзе. |
Автор: sAshA20 05.02.08, 09:25 |
А што если поставить хуки на функции, которые формируют и отправляют запрос браузера? Таким образом можна перехватить и по надобности прервать запрос? Я в хуках не силен и слабо представляю себе их. Может кто хорошо разобрался с ними подскажет мне? Если понадобится можна подогнать прогу под конкретный браузер (если они используют разные функции для формирования запросов). |
Автор: sAshA20 06.02.08, 23:34 |
Цитата sAshA20 @ што если поставить хуки на функции, которые формируют и отправляют запрос браузера? Таким образом можна перехватить и по надобности прервать запрос А не функцию recv ли нада перехватывать для моих целей? Только вот эту одну? |
Автор: medved_68 07.02.08, 05:27 |
Цитата sAshA20 @ А што если поставить хуки на функции, которые формируют и отправляют запрос браузера? sAshA20 сам себе противоречишь. Если ты не хочешь, чтобы пакет ушел в сеть - то зачем перехват приема? |
Автор: sAshA20 10.02.08, 11:30 |
Извините, грубейшая механическая ошибка! Вместо send написал recv! В тот момент читал статейку о recv и перепутал. Так вот повторяю вопрос, но теперь уже правильно: Мне нужно перехватывать send для моих целей? И только эту одну функцию? Может у кого то есть пример перехвата send и тому подобных? Цитата sAshA20 @ Я в хуках не силен и слабо представляю себе их. Может кто хорошо разобрался с ними подскажет мне? Если понадобится можна подогнать прогу под конкретный браузер (если они используют разные функции для формирования запросов). |
Автор: Oleg2004 10.02.08, 11:43 |
Скорее всего это будет WSASend() Вот тут подробное описание методов - правда для С++ Но идея одна и та же Еще смотрите здесь - там на паскале есть примерчики Еще здесь |
Автор: sAshA20 10.02.08, 11:51 |
А примеры есть? Ибо я не имею представления как это сделать |
Автор: Катенька 10.02.08, 12:33 |
На вот понаблюдай. Запусти сниффер Rouse_'а, потом запусти эту прогу, введи свой айпи, когда ты в инете, и попробуй грузануть Форум на исходниках. |
Автор: sAshA20 11.02.08, 08:36 |
А есть ли у кого то пример реализации перехвата функций WSASend и тому подобных? Гуглил... не нашол... Плиз помогите! |
Автор: Rouse_ 11.02.08, 10:45 |
Вот сдесь перехват WSARecv, WSARecvEx... переделай по аналогии на свою функцию: Перехват recv |
Автор: sAshA20 11.02.08, 15:00 |
А в чем разница между функциями WSASend, WSASendTo, Send, SendTo? Их надо все перехватывать или только одну WSASend хватит? Можно перехватить все. Но нужно ли? Просто интересно... |
Автор: Oleg2004 11.02.08, 15:06 |
Эти функции используются при передаче по протоколу UDP - а веб использует TCP броузер может использовать и send - потому в примере отлавливаются все возможные функции (в примере это несколько функций приема) |
Автор: Virtuals 12.02.08, 06:44 |
а если так хочется перехватывать все и вся не лучше ли сразу NtDeviceIoControlFile поправте меня если ошибаюсь кстати WSASendTo вроде оболочка для WSASend |
Автор: Rouse_ 12.02.08, 07:24 |
Нет. sendto и WSASendTo выходят на вызов провайдера WSPSendTo. Которая производит вызов QueueOverlappedSendTo() в случае оверлапа, и вот только тут производится проверка на тип сокета. Если он не IS_DGRAM_SOCK - производится вызов WSPSend, в противном случае стандартный WSPBind и NtDeviceIoControlFile() |
Автор: sAshA20 12.02.08, 10:19 |
Цитата Rouse_ @ Вот сдесь перехват WSARecv, WSARecvEx... переделай по аналогии на свою функцию: Перехват recv Проверил Вашу прогу (не меняючи ничего) на браузерах IE, Opera, Mozilla Firefox. И ничего не перехватывает!!!! Только FlashGet! Библиотека внедряется во все приложения но перехватывает recv только во FlashGet! |
Автор: Rouse_ 12.02.08, 10:20 |
Она перехватывает только функции обьявленные в таблице импорта. Браузеры-же используют wininet, причем подгрузка происходит динамически. Против динамики нужно использовать сплайсинг... |
Автор: sAshA20 12.02.08, 10:23 |
Цитата Rouse_ @ Она перехватывает только функции обьявленные в таблице импорта. Браузеры-же используют wininet... А как сделать для браузера? Помогите, пожалуйста, поясните!! Вся надежда на Вас! Начинаю седеть |
Автор: 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. Компилировал примерчики... В статейке написано, шо гарантировано работает, но у меня почемуто нет... Библиотечка внедряется, но запросы не блокируются?! Вот один из примеров |
Автор: 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_ 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 и не только, которые позволяют это сделать. Или только надо писать прокси (если да, то есть ли подобные исходники). Люди которые в этом хорошо разбираются отзовитесь!!! Поясните пожалуйста мне как реализовать отмену загрузки отдельного взятого файла в любой момент. |
Автор: Oleg2004 11.03.08, 19:51 |
Фактически это означает прерывание работы recv() в произвольный момент. Механизма API такого останова работы я пока не знаю. Мое первое решение, которое пришло в голову - такое: Прием файла(загрузка) идет в отдельном потоке. Второй поток просто висит как дамоклов меч - как только получает команду, убивает поток приема - вместе с recv() Может кто и другое получше предложит |
Автор: Rouse_ 12.03.08, 07:44 |
Ну механизм можно сделать на основе того-же Recv, только принимать маленькими порциями. Т.е. при перехвате начинаем закачку самостоятельно и по поступлении команды о отмене, прекращаем закачку и возвращаем к примеру WSA_OPERATION_ABORTED... |
Автор: sAshA20 12.03.08, 13:49 |
А как из функции 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 |
Если будет время, поясните поподробней! Очень жду вашего ответа! Очень... Я думаю это заинтересует многих! |
Автор: 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 и надо распаковать будет для анализа. Что-то наверняка уже написано, что ответ принимает и собирает в одно целое. Можете подсказать куда смотреть? |