Форум: "Сети";
Текущий архив: 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