Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.10.09;
Скачать: CL | DM;

Вниз

raw socket programming with Delphi, part II   Найти похожие ветки 

 
nobody ©   (2003-08-11 19:03) [0]

Вот есть кусок кода который хорошо работает на си
int main(){
int s, bytes_recieved, fromlen;
char buffer[65535];
struct sockaddr_in from;
struct ip *ip;
struct tcp *tcp;
s=socket(AF_INET, SOCK_RAW, IPPROTO_TCP);
while(1){
fromlen=sizeof(from);
bytes_recieved=recvfrom(s, buffer, sizeof buffer, 0, (struct sockaddr *)&from, &fromlen);
printf("Bytes received: %5d\n",bytes_recieved);
printf("Source ip: %s\n",inet_ntoa(from.sin_addr));
ip=(struct ip *)buffer;
printf("IP header length: %d\n",ip->ip_length);
printf("Protocol: %d\n",ip->ip_protocol);
tcp=(struct tcp *)(buffer + (4*ip->ip_length));
printf("Source port: %d\n",ntohs(tcp->tcp_source_port));
printf("Dest port: %d\n",ntohs(tcp->tcp_dest_port));
}
}

но, у меня ни как не получается конвертнуть его в дельфи синтаксис, с использованием winsock,
точнее говоря recvfrom возвращает -1, но даже ели и вернет 0,
то как "ip=(struct ip *)buffer" реализовть на дельфи?


 
Digitman ©   (2003-08-12 08:12) [1]

type
Pip = ^Tip;
Tip = packed record
...
end;

var
ip: Pip;
buffer: array[0..65534] of byte;

...
ip := @buffer;
...


 
dvp ©   (2003-08-12 10:35) [2]

struct ip *ip;
struct tcp *tcp;
где найти описания?


 
Verg ©   (2003-08-12 11:31) [3]

struct ip {
u_int8_t ip_v:4, /* version взаимное расположение этих двух битовых полей зависит от C компилера, например для BC++ их надо поменять местами*/
ip_hl:4; /* header length */
u_int8_t ip_tos; /* type of service */
u_int16_t ip_len; /* total length */
u_int16_t ip_id; /* identification */
u_int16_t ip_off; /* fragment offset field */
#define IP_RF 0x8000 /* reserved fragment flag */
#define IP_DF 0x4000 /* dont fragment flag */
#define IP_MF 0x2000 /* more fragments flag */
#define IP_OFFMASK 0x1fff /* mask for fragmenting bits */
u_int8_t ip_ttl; /* time to live */
u_int8_t ip_p; /* protocol */
u_int16_t ip_sum; /* checksum */
struct in_addr ip_src, ip_dst; /* source and dest address */
};


 
Verg ©   (2003-08-12 11:33) [4]

typedef ulong tcp_seq;

/*
* TCP header.
* Per RFC 793, September, 1981.
*/
struct tcp {
ushort sport; /* source port */
ushort dport; /* destination port */
tcp_seq seq; /* sequence number */
tcp_seq ack; /* acknowledgement number */
uchar x2_off; /* data offset */
uchar th_flags;
#define TH_FIN 0x01
#define TH_SYN 0x02
#define TH_RST 0x04
#define TH_PUSH 0x08
#define TH_ACK 0x10
#define TH_URG 0x20
ushort th_win; /* window */
ushort th_sum; /* checksum */
ushort th_urp; /* urgent pointer */
};


 
Verg ©   (2003-08-12 11:38) [5]

На всякий случай :)

typedef struct
{
uchar icmp_type;
uchar icmp_code;
ushort icmp_sum;
ushort icmp_id;
ushort icmp_seq;
}
icmp_packet;


 
nobody ©   (2003-08-12 14:27) [6]

а никто не конвертнет весь код?


 
Digitman ©   (2003-08-12 15:45) [7]

а что тебе здесь еще непонятно ? конкретно ?


 
Verg ©   (2003-08-12 17:24) [8]


> Digitman ©


"Непонятно" - читай "лень"


 
nobody ©   (2003-08-12 22:38) [9]

нужно чтобы работало, а у меня не работает
дайте пример работы с рав-сокетами, только полный и работающий


 
Digitman ©   (2003-08-13 08:11) [10]


> nobody


ЧТО не работает ? приводи свой неработающий код !


 
Verg ©   (2003-08-13 09:15) [11]

const
WINSOCK_VERSION = $0202;
MAX_PACKET_SIZE = $10000; // Например

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;

var
Ia : TInAddr;
Buffer : array[0..MAX_PACKET_SIZE-1] of byte;

............
............
WSAStartup(WINSOCK_VERSION, wdata);
s := socket( AF_INET, SOCK_RAW, IPPROTO_IP );
ZeroMemory(@sa, sizeof(sa) );
sa.sin_family := AF_INET;
sa.sin_addr.s_addr := inet_addr(pchar(нужный адрес));
if bind(s, @sa, sizeof(sa))=SOCKET_ERROR then exit;

// Приём IP-пакетов.
count := recv( s, Buffer[0], sizeof(Buffer), 0 );
// обработка IP-пакета
if( count >= sizeof(TIPHeader) ) then
begin
.....


 
nobody ©   (2003-08-13 09:16) [12]


unit sniff;

interface

uses
ipheader, Controls, Grids, ComCtrls, Classes, StdCtrls ,
winsock,Windows, Messages, SysUtils, Graphics, Forms, Dialogs ;

const WM_ASYNCSELECT = WM_USER + 0;

type
TSessionClosed = procedure (Sender: TObject; Socket: TSocket) of object;
TSessionAvailable = procedure (Sender: TObject; Socket: TSocket) of object;
TSessionConnected = procedure (Sender: TObject; Socket: TSocket) of object;
TErrorOccurred = procedure (Sender: TObject; Error: integer; Msg: string) of object;
TDataAvailable = procedure (Sender: TObject; Socket: TSocket) of object;

TForm1 = class(TForm)
Button1: TButton;
ListView1: TListView;
Button2: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);

private
FDataAvailable: TDataAvailable;
FSessionClosed: TSessionClosed;
FSessionAvailable: TSessionAvailable;
FSessionConnected: TSessionConnected;
RawSocket: TSocket;
Procedure AnalysisDataPacket;
protected
procedure WMASyncSelect(var msg: TMessage); message WM_user+0;

public
end;

var
Form1: TForm1;

Const
MAX_CHAR = 1024 * 5;
IP_HDRINCL = 2;
SIO_RCVALL = $98000001;

Function WSAIoctl(s: Tsocket; dwIoControlCode: dword; lpvInBuffer: pointer; cbInBuffer: DWORD; lpvOUTBuffer: pointer; cbOUTBuffer: dword; lpcbBytesReturned: LPDWORD; lpOverlapped: pointer; lpCompletionROUTINE: pointer): integer; stdcall; external "ws2_32.dll";

const
SIO_GET_INTERFACE_LIST = $4004747F;
IFF_UP = $00000001;
IFF_BROADCAST = $00000002;
IFF_LOOPBACK = $00000004;
IFF_POINTTOPOINT = $00000008;
IFF_MULTICAST = $00000010;

type
sockaddr_gen = packed record
AddressIn: sockaddr_in;
filler: packed array[0..7] of char;
end;

type
INTERFACE_INFO = packed record
iiFlags: u_long;
iiAddress: sockaddr_gen;
iiBroadcastAddress: sockaddr_gen;
iiNetmask: sockaddr_gen;
end;

implementation

{$R *.DFM}

procedure Tform1.WMASyncSelect(var msg: TMessage);
var
l,ws_rcv:integer;
str:string;
Buffer : Array[0..32768] of Char;
begin
case LoWord(msg.lParam) of
FD_READ:
begin
if Assigned(FDataAvailable) then
FDataAvailable(Self,msg.wParam);
AnalysisDataPacket;
end;
FD_CLOSE:
begin
if Assigned(FSessionClosed) then
FSessionClosed(Self,msg.wParam);
end;
FD_ACCEPT:
begin
if Assigned(FSessionAvailable) then
FSessionAvailable(Self,msg.wParam);
end;
FD_CONNECT:
begin
if Assigned(FSessionConnected) then
FSessionConnected(Self,msg.wParam);
end;
end;
end;

Procedure TForm1.AnalysisDataPacket;
Var
count, iRet, filterip: Integer;
buf: Array[0..MAX_CHAR] Of char;
pipheader: PIP_Header;
ptcpheader:PTCP_Header;
pudpheader:PUDP_Header;
buf2: pchar;
listdata: Tlistitem;
i,j: Integer;
str: String;
s: String;
src_port,dest_port:word;
Begin
filterip := 0;
Application.ProcessMessages ;
iRet := recv(RawSocket, buf, sizeof(buf), 0);
pipheader := PIP_Header(@buf);
getmem(buf2, iRet);
copymemory(buf2, @buf, iRet);

listdata := ListView1.Items.Add;
listdata.Caption := FormatDateTime("hh:nn:ss:zzz", now);
listdata.Data := buf2;

listdata.SubItems.Add(strpas(Inet_Ntoa(TInAddr(pipheader.ip_srcaddr))) );
listdata.SubItems.Add(strpas(Inet_Ntoa(TInAddr(pipheader.ip_destaddr)) ));

For i := 0 To 8 Do
If pipheader.ip_protocol = IPPROTO[i].itype Then
str := IPPROTO[i].name;

listdata.SubItems.Add(str);
listdata.SubItems.Add(inttostr(ntohs(pipheader.ip_totallength)));

If pipheader.ip_protocol=6 then
begin
ptcpheader := PTCP_Header(@pipheader.data );
src_port:= ntohs(ptcpheader.src_portno ) ;
dest_port:= ntohs(ptcpheader.dst_portno ) ;
listdata.SubItems.Add(inttostr(src_port));
listdata.SubItems.Add(inttostr(dest_port));
end;

If pipheader.ip_protocol=17 then
begin
pudpheader := PUDP_Header(@pipheader.data );
src_port:= ntohs(pudpheader.src_portno ) ;
dest_port:= ntohs(pudpheader.dst_portno ) ;
listdata.SubItems.Add(inttostr(src_port));
listdata.SubItems.Add(inttostr(dest_port));
end;

End;

procedure TForm1.Button1Click(Sender: TObject);
Var
WSAData: TWSAData;
rcvtimeo, result: Integer;
host: Array[0..50] Of char;
sHost:string;
hostent: Phostent;
ip: ^integer;
sa: TSockAddr;
dwBufferInLen, dwBytesReturned, dwBufferOutLen: DWORD;
Begin
WSAStartup(MakeWord(2, 2), WSAData);

Try
RawSocket := socket(AF_INET, SOCK_RAW, IPPROTO_IP);

rcvtimeo := 5000;
setsockopt(RawSocket, SOL_SOCKET, SO_RCVTIMEO, pchar(@rcvtimeo), sizeof(rcvtimeo));

sa.sin_family := AF_INET;
sa.sin_port := htons(7000);
sa.sin_addr.s_addr := inet_addr(pchar("192.168.10.30"));

bind(RawSocket, sa, sizeof(sa));

dwBufferInLen:=1;
dwBufferOutLen:=0;

WSAASyncSelect(RawSocket,handle, WM_ASYNCSELECT, FD_READ);

button1.Enabled :=false;
button2.Enabled :=true;
Except
closesocket(RawSocket);
WSACleanup;
End;
End;

procedure TForm1.Button2Click(Sender: TObject);
var
bytes,i:integer;
begin
WSAASyncSelect(RawSocket ,Handle,WM_ASYNCSELECT,0);
WSACleanUp;
button1.Enabled :=true;
button2.Enabled :=false;
end;

end.


вот этот кусок кода снифает только ICMP? почему,
и как сделать чтобы снифал tcp


 
nobody ©   (2003-08-13 09:21) [13]

-> Verg
а ты не можешь мне написать
как отослать и получить рав пакет на примере получения флага Syn


 
Verg ©   (2003-08-13 09:42) [14]


> If pipheader.ip_protocol=6 then
Вот прием TCP

> begin
> ptcpheader := PTCP_Header(@pipheader.data );
> src_port:= ntohs(ptcpheader.src_portno ) ;
> dest_port:= ntohs(ptcpheader.dst_portno ) ;
> listdata.SubItems.Add(inttostr(src_port));
> listdata.SubItems.Add(inttostr(dest_port));
> end;
>
> If pipheader.ip_protocol=17 then
> begin
Вот прием UDP

> pudpheader := PUDP_Header(@pipheader.data );
> src_port:= ntohs(pudpheader.src_portno ) ;
> dest_port:= ntohs(pudpheader.dst_portno ) ;
> listdata.SubItems.Add(inttostr(src_port));
> listdata.SubItems.Add(inttostr(dest_port));
> end;


Как раз ICPM-то я и не увидел.
И вообще снифает-то он IP.


 
Verg ©   (2003-08-13 09:46) [15]


> sa.sin_port := htons(7000);


Я бы заменил на sa.sin_port :=0;


 
nobody ©   (2003-08-13 10:31) [16]

-> Verg от порта ничего не зависит
так как насчет примера, работающего?
"If pipheader.ip_protocol=6 then" - дело в том что никогда 6 или любому другому он не бывает равет, кроме icmp



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

Текущий архив: 2003.10.09;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.024 c
4-27789
likeanangel
2003-08-05 13:36
2003.10.09
Вывод текста поверх изображения


3-27371
_Novice_
2003-09-17 15:13
2003.10.09
Sorting


9-27298
Дмитрий К.К.
2003-04-03 09:29
2003.10.09
GLScene


1-27472
pum5a
2003-09-26 22:07
2003.10.09
Как создать окно для контрола


1-27489
Max_
2003-09-26 17:43
2003.10.09
Освобождение памяти VarArray!!!