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

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.013 c
1-27445
solo
2003-09-27 17:36
2003.10.09
Что за баг?


14-27727
Maximator Vetera
2003-09-20 19:39
2003.10.09
Архитектор программных систем - профессионал


11-27423
Bartov
2003-01-25 19:18
2003.10.09
Вышел KOl 1.63


3-27401
Filat
2003-09-14 13:49
2003.10.09
Бибилиотека EhLib и компонент TDBLookupComboboxEh.


3-27367
satron
2003-09-18 14:02
2003.10.09
Как сделать запись в таблице Paradox на французском языке





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский