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