Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];

Вниз

мониторинг порта   Найти похожие ветки 

 
hirlik   (2004-02-01 11:58) [0]

Здравствуйте уважаемые мастера!
Необходимио мониторить порт на локальной машине (с ведением полного лога трафика через этот порт). На этом порту висит работающий сервис (очень хочеться глянуть что же этот сервис кидает в сеть и что принимает)
В связи с чем ряд вопросов:
1. Как это реализовать в принципе?
2. С чего начать? (какой материальчик почитать?, очень помогут ссылки, потому как в имеющейся у меня литературе по работе с сетями из Delphi инфы практически нет :()
3. Буду благодарен за любую информацию.


 
Verg ©   (2004-02-02 05:14) [1]

В принципе?
В принципе проще сделать снифер на базе символьного сокета в режиме SIO_RCVALL. Будешь ловить весь трафик, а там уже фильтруй по заголовкам IP пакетов - кому, чего, кто шлет...
Для начала вот тебе модулек, попробуй его "оживить":

unit SNIFFSock;

interface

uses
 Classes, Windows, Winsock2;
const
 MAX_PACKET_SIZE = 65536;

type

 PDatagram = ^TDatagram;
 TDatagram = record
    DLen : DWORD;
    Dg   : pointer;
 end;

 TSNIFFSocket = class(TThread)
 private
   { Private declarations }
   Host : HWND;
   HMsg : DWORD;
   SocketEvent : THandle;
   S      : TSOCKET;         // Cлущающий сокет.
   RecSize : integer;
   Buffer : array[0..MAX_PACKET_SIZE-1] of byte;
   function ProcessSocketEvent:boolean;
 protected
   procedure Execute; override;
   destructor Destroy; override;
 public
   ExitEvent : THandle;
   ExitCode  : integer;
   constructor Create(const IF_Address : TInAddr; OnTerm :TNotifyEvent;
                      AHost  : HWND;
                      AHMsg  : DWORD);
 end;

implementation

uses IP_H;
const
 WAIT_MESSAGE =WAIT_TIMEOUT+1;

function WaitForObjects(Objects:array of THandle; wTimeOut : DWORD; wMsg:boolean):DWORD;
begin
 if wMsg then
 begin
   Result:=MsgWaitForMultipleObjects(High(Objects)+1, Objects, false, wTimeOut, QS_ALLINPUT);
   if Result=High(Objects)+1 then Result:=WAIT_MESSAGE;
 end else Result:= WaitForMultipleObjects(High(Objects)+1, @Objects ,false, wTimeOut);
end;
{ TSNIFFSocket }

destructor TSNIFFSocket.Destroy;
begin
 closehandle(ExitEvent);
 if SocketEvent<>WSA_INVALID_EVENT then WSACloseEvent(SocketEvent);
 if S<> INVALID_SOCKET then closesocket(S);
 inherited;
end;

constructor TSNIFFSocket.Create(const IF_Address : TInAddr; OnTerm :TNotifyEvent;
                                     AHost  : HWND;
                                     AHMsg  : DWORD);

var
   sa     : SOCKADDR_IN;        // Адрес хоста
   Rs     : TSocket;
   Flag   : DWORD;

   mreq   : ip_mreq;

begin
 try
 flag:=1;
 S:=INVALID_SOCKET;
 OnTerminate:=OnTerm;
 Host := AHost;
 HMsg := AHMsg;
 ExitEvent :=  CreateEvent(nil, true, false, nil);
 SocketEvent:=WSACreateEvent;
 if SocketEvent=WSA_INVALID_EVENT then exit;
 Rs := socket( AF_INET, SOCK_RAW, IPPROTO_IP);
 if Rs <> INVALID_SOCKET then
 begin
   if WSAEventSelect(Rs, SocketEvent, FD_READ)<>SOCKET_ERROR then
   begin
     ZeroMemory(@sa, sizeof(sa) );
     if  setsockopt (Rs, IPPROTO_IP, IP_HDRINCL, @flag, sizeof(flag))<>SOCKET_ERROR then
     begin

       sa.sin_family := AF_INET;
       sa.sin_addr :=IF_Address;
       if bind(Rs, @sa, sizeof(sa))<>SOCKET_ERROR then
       begin
         if ioctlsocket(Rs, SIO_RCVALL , flag)<>SOCKET_ERROR then
           s :=Rs
         else closesocket(Rs);
       end else  closesocket(Rs);
     end else closesocket(Rs);
   end else closesocket(Rs);
 end;
 finally
 FreeOnterminate:= true;
 inherited Create(true);
 end;
end;

procedure TSNIFFSocket.Execute;
begin
 { Place thread code here }
 ExitCode:=1;
 if (SocketEvent=WSA_INVALID_EVENT) or (S = INVALID_SOCKET) then exit;
 while not Terminated do
 case WaitForObjects([ExitEvent, SocketEvent], INFINITE, false) of
    WAIT_OBJECT_0   : exit;
    WAIT_OBJECT_0+1 : if not ProcessSocketEvent then
                          exit;
 end;
end;

function TSNIFFSocket.ProcessSocketEvent:boolean;
var
  Evs : TWSANetworkEvents;
  I :  integer;
  Dg : PDatagram;
begin
 result:=WSAEnumNetworkEvents(S, SocketEvent, @Evs)=0;
 if result then
 begin
   for I:=0 to high(Evs.iErrorCode) do
   begin
     if Evs.lNetworkEvents and (1 shl i)<>0 then
     begin
       if Evs.iErrorCode[I]<>0 then begin Result:=false; exit; end;
       case (1 shl I) of
         FD_READ : begin
                     RecSize:=Recv(S, Buffer, sizeof(buffer),0);
                     Result:=RecSize>=0;
                     if not Result then ExitCode:=3 else
                     begin
                       if (RecSize<>0) and (Host<>0) then
                       begin
                         new( Dg);
                         Dg.DLen:=RecSize;
                         GetMem(Dg.Dg, Dg.DLen);
                         Move(Buffer, Dg.Dg^, Dg.DLen);
                         postmessage(Host, HMsg, 0, LPARAM(Dg));
                       end;
                     end;
                   end;
       end;
     end;
   end;
 end else ExitCode:=2;
end;

end.


 
Verg ©   (2004-02-02 05:33) [2]

Да, кстати, тебе понадобится модуль Winsock2.pas. Я думаю, что Alex Konshin не будет возражать, если я укажу ссылку на его ресурс
http://home.earthlink.net/~akonshin/index.htm
Оттуда скачаешь Winsock2

И еще, на всякий случай:

unit IP_H;

interface
uses Windows, Winsock2;

const
  IPPROTO_OSPFIGP = 89;

type
   PIPHeader = ^TIPHeader;
   TIPHeader = packed record
     verlen : byte;      // версия и длина заголовка
     tos    : byte;      // тип сервиса
     length : word;      // длина всего пакета
     id     : word;      // Id
     offset : word;      // флаги и смещения
     ttl    : byte;      // время жизни
     protocol : byte;    // протокол
     xsum   : word;      // контрольная сумма
     src    : TInAddr;   // IP-адрес отправителя
     dest   : TInAddr;   // IP-адрес назначения
   end;

function ProtoString(Proto:byte):string;

implementation

function ProtoString(Proto:byte):string;
begin
 result:="";
 case proto of
   IPPROTO_ICMP   : result:="ICMP";
   IPPROTO_TCP    : result:="TCP";
   IPPROTO_UDP    : result:="UDP";
   IPPROTO_OSPFIGP: result:="OSPF";
 end;
end;

end.


 
hirlik   (2004-02-02 09:36) [3]

Спасибо! Жаль только, что в теории я слабоват (сокеты для меня - новое, еще не приходилось с ними общаться), но это дело наживное. Теперь есть направление в котором копать.


 
Verg ©   (2004-02-02 13:10) [4]

По теории сокетов есть масса книг. Кстати, здесь, на сколько я понял рекламируется "Питер", так вот, пошерсти у них - они издают массу хороших книг из серии "Мастер класс". Один только Стивенс чего стоит...


 
griffff ©   (2004-02-02 15:26) [5]

Можно  воспользоваться Snmp. если на Установлен сервер SNMp, то можно обращаясь к нужному мибу вытаскивать трафик с конкретного интерфейса. ДЛя это го нужно воспользоваться клиентом, в Delphi есть IdSNMP, но к сожелению как с ним работать я так и не разобрался и обратился с вопросом на данный форум пока ответа не получил. Если разбирусь и такой вариант интересен, поделюсь.


 
hirlik   (2004-02-03 11:18) [6]

<to griffff
Спасибо, обязательно отпишись сюда.



Страницы: 1 вся ветка

Форум: "Сети";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.043 c
6-1078666286
Gym
2004-03-07 16:31
2004.04.11
TIdTCPServer + несколько клиентов.


6-1079672319
boa
2004-03-19 07:58
2004.04.11
Помогите разобраться с функцией NetServerGetInfo!!


3-1081514428
Strela
2004-04-09 16:40
2004.04.11
timeout expired


11-1058953592
ironwit
2003-07-23 13:46
2004.04.11
вопрос по form.font.name


1-1080267085
Alek Aaz
2004-03-26 05:11
2004.04.11
Размер исполняемого кода





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский