»áÔ±£º ÃÜÂ룺 ¡¡Ãâ·Ñ×¢²á | Íü¼ÇÃÜÂë | »áÔ±µÇ¼ ÍøÒ³¹¦ÄÜ£º ¼ÓÈëÊÕ²Ø ÉèΪÊ×Ò³ ÍøÕ¾ËÑË÷  
¼¼ÊõÎĵµ > Delphi
IPµØÖ·µÄÒþ²Ø
·¢±íÈÕÆÚ£º2004-02-16 00:00:00×÷Õߣº× ³ö´¦£º  

Ò»¡¢Ç°ÑÔ

¡¡ ±¾ÎÄÖ÷Òª½éÉÜÈçºÎÔÚ³ÌÐòÖÐʵÏÖIPµØÖ·µÄÒþ²Ø¡£ÆäʵÕâƪ¶«Î÷²»ËãÎÒдµÄ¡£ÆäÖС¶IPÍ·½á¹¹¡·²¿·ÖÎÒÀÁµÃ´ò×Ö£¬¹Ê¸´ÖÆ¡¢Õ³ÌùÁ˹¶À½£¿ÍµÄÎÄÕ£¬ÏÈ˵Éùлл£¡´úÂ벿·Ö²Î¿¼ÁËÍâ¹ú³ÌÐòxesдµÄÒ»¸ö³ÌÐò¡£ËùÒÔÕâÖ»ÊÇѧϰ¹ý³ÌÖеÄÒ»¸ö¸±²úÆ·¡£¼ÈÈ»³ÌÐòÒѾ­×öºÃÁË£¬¾Í˳±ã·ÅÉÏÀ´¸ú´ó¼ÒÒ»Æð½»Á÷£¬¹²Í¬Ìá¸ß°É¡£±¾ÎÄÖ»²»¹ýÏë˵Ã÷Ò»ÏÂIPÊý¾ÝµÄ½á¹¹ºÍ·¢ËÍ»úÖÆ¡£Èç¹ûÓÐÈË°ÑËü¸ÄΪ¶ñÒâIP¹¥»÷¹¤¾ß£¬ºó¹û×Ô¸º¡£

¶þ¡¢IPÍ·½á¹¹

   ÎÒÃÇÖªµÀ£¬TCP/IPÍøÂçÊý¾ÝÈ«²¿ÊÇͨ¹ý·â×°ÔÚIPÊý¾Ý°üÖÐÔÚInternetÍøÉÏ´«Ë͵ģ¬Ò²¾ÍÊÇ·â×°½¨Á¢ÆðÒ»¸ö°üº¬IPÍ·ºÍÊý¾ÝµÄIPÊý¾Ý±¨¡£Ò»°ãÀ´Ëµ£¬ÍøÂçÈí¼þ×ÜÊÇÒÔ¶à¸ö32λ×Ö²úÉúIPÍ·£¬¼´Ê¹±ØÐëÓø½¼ÓµÄ0Ìî³äIPÍ·¡£IPÍ·°üº¬ÁË´«ÊäIPÊý¾Ý°üÖзâ×°Êý¾ÝµÄËùÓбØÒªÐÅÏ¢¡£IPÍ·µÄÊý¾Ý½á¹¹ºÍÃèÊöÈçÏ£º

³ÉÔ± ³¤¶È(Bit) ÃèÊö

Version 4 IPÍ·µÄ°æ±¾ºÅ£¬Ä¿Ç°ÊÇIPv4£¬×îÐÂÊÇIPv6

Header Length 4 IPÍ·µÄ³¤¶È£¬ÈôûÓÐÌØÊâÑ¡Ôñ£¬IPÍ·×ÜÊÇ20×Ö½Ú³¤

Type of Service 8 ·þÎñÀàÐÍ£¬¶¨ÒåÁËÊý¾Ý´«ÊäµÄÓÅÏȼ¶¡¢ÑÓ³Ù¡¢ÍÌÍÂÁ¿ºÍ¿É¿¿ÐÔµÈÌØÐÔ

Total Packet Length 16 IP°üµÄ³¤¶È£¬ÈôûÓÐÌØÊâÑ¡Ïһ°ãΪ20×Ö½Ú³¤

Identification 16 IP°ü±êʶ£¬Ö÷»úʹÓÃËüΨһȷ¶¨Ã¿¸ö·¢Ë͵ÄÊý¾Ý±¨

Flag 3 IPÊý¾Ý·Ö¸î±êÖ¾

Fragment Offset 13 IPÊý¾Ý·Ö¸îÆ«ÒÆ

Time to Live 8 Êý¾Ý±¨ÔÚÍøÂçÉϵĴæ»îʱ¼ä£¬Ã¿Í¨¹ýÒ»¸ö·ÓÉÆ÷£¬¸ÃÊýÖµ¼õÒ»

Protocol 8 TCP/IPЭÒéÀàÐÍ£¬±ÈÈ磺ICMPΪ1£¬IGMPΪ2£¬TCPΪ6£¬UDPΪ17µÈ

Header Checksum 16 Í·²¿¼ìÑéºÍ

Source IP Address 32 Ô´IPµØÖ·

Destination IP Address 32 Ä¿µÄIPµØÖ·

Other ? ÆäËûÑ¡Ïî

Data ? Êý¾Ý

   ÊµÏÖ×Ô¼º¶¨ÒåµÄIPÍ·ÊÇÒ»¼þ·Ç³£ÓÐÒâÒåµÄÊÂÇ飬±ÈÈ磬ͨ¹ý¸Ä±äIPÍ·ÀïµÄTOSµÄÓÅÏȼ¶ºÍTTL£¬Äã¿ÉÒÔʹ×Ô¼ºµÄÊý¾Ý°üÓиüÇ¿µÄ´«ÊäÄÜÁ¦ºÍÊÙÃü£¬Í¨¹ýÐÞ¸ÄIPÍ·ÀïµÄÔ´IPµØÖ·¾Í¿ÉÒÔÒþ²Ø×Ô¼º»úÆ÷µÄIPµØÖ·µÈµÈ¡£ÏóÖøÃû¹¥»÷³ÌÐò¡°ÀáµÎTearDrop¡±¾ÍÊÇͨ¹ý¹ÊÒâÖÆÔìϵͳ²»ÄÜ´¦ÀíµÄ·ÖƬIP°ü¶øʵÏֵģ¬»¹ÓÐSYN FlooderºÍUDP Flooder¾ÍÊÇͨ¹ý²úÉúËæ»úÔ´IPʵÏÖÆÛÆ­µÄ¡£

Èý¡¢ÊµÏÖÔ­Àí

   Ò»°ãÀ´Ëµ£¬×Ô¶¨ÒåIPÍ·ÊÇͨ¹ýʹÓÃsocketµÄ¿âº¯Êýsetsockopt()µÄÑ¡ÏîIP_HDRINCLÀ´ÊµÏֵģ¬¾¡¹ÜÕâÔÚunixºÍlinuxƽ̨ÉϺÜÈÝÒ×ʵÏÖ£¬µ«Òź¶µÄÊÇÔÚWindowsƽ̨µÄWinsock1.1ºÍWinsock2.0º¯Êý¿âÀïsetsockopt()²»Ö§³ÖIP_HDRINCLÑ¡ÏËùÒÔÔÚWindows 9x/NTÀïÊÇÎÞ·¨Í¨¹ýWinsockº¯Êý¿âÀ´ÊµÏÖIPÍ·×Ô¶¨ÒåµÄ£¬µ±È»¿ÉÒÔͨ¹ý±àдÐéÄâÉ豸Çý¶¯³ÌÐòÀ´ÊµÏÖ£¬²»¹ý±È½Ï¸´ÔÓ£¬µ«Windows 2000µÄ³öÏÖ´òÆÆÁËÕâÖÖ¾ÖÃ棬Windows2000µÄWinsock2.2º¯Êý¿âÀïÈ«ÃæÖ§³Ösetsockopt()µÄÑ¡ÏîIP_HDRINCL£¬Ê¹µÃÎÒÃÇÇáËɾͿÉÒÔʵÏÖ×Ô¶¨ÒåµÄIPÍ·¡£ÊµÏÖ·½·¨ÈçÏ£º

ËÄ¡¢´úÂ벿·Ö

{

1. ±¾³ÌÐòÖ»ÄÜÔËÐÐÓÚ Window 2000.

2. Äã±ØÐëÓÐ Administrator ȨÏÞ.

3. ³ÌÐòÐèÒªÓõ½Ò»¸ö button ºÍÒ»¸ö memo.

----------------------------------------------------------------------

ÔËÐгÌÐòÇ°£¬Çë¸ù¾Ý×Ô¼ºµÄÐèÒª¸Ä±ä SrcIP¡¢SrcPort¡¢DestIPºÍDestPortµÄÖµ

----------------------------------------------------------------------

Èç¹ûÄã¿´²»¶®ÒÔÏ´úÂ룬×îºÃ²»ÒªÈ¥ÔËÐÐËü¡£

----------------------------------------------------------------------

}

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

StdCtrls, OleCtrls, Registry;

Const

SrcIP = '123.123.123.1';//·¢ËÍ·½IPµØÖ·

SrcPort = 1234;     //·¢ËÍ·½¶Ë¿Ú

DestIP = '127.0.0.2';  //Ä¿µÄIPµØÖ·

DestPort = 4321;    //Ä¿µÄ¶Ë¿Ú

Max_Message = 4068;

Max_Packet = 4096;

type

TPacketBuffer = Array[0..Max_Packet-1] of byte;

TForm1 = class(TForm)

Button1: TButton;

Memo1: TMemo;

procedure Button1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

procedure SendIt;

end;

// IP Í·

type

T_IP_Header = record

ip_verlen : Byte;

ip_tos : Byte;

ip_totallength : Word;

ip_id : Word;

ip_offset : Word;

ip_ttl : Byte;

ip_protocol : Byte;

ip_checksum : Word;

ip_srcaddr : LongWord;

ip_destaddr : LongWord;

end;

// UDP Í·

Type

T_UDP_Header = record

src_portno : Word;

dst_portno : Word;

udp_length : Word;

udp_checksum : Word;

end;

// һЩ Winsock 2 µÄÀàÐÍÉùÃ÷

u_char = Char;

u_short = Word;

u_int = Integer;

u_long = Longint;

SunB = packed record

s_b1, s_b2, s_b3, s_b4: u_char;

end;

SunW = packed record

s_w1, s_w2: u_short;

end;

in_addr = record

case integer of

0: (S_un_b: SunB);

1: (S_un_w: SunW);

2: (S_addr: u_long);

end;

TInAddr = in_addr;

Sockaddr_in = record

case Integer of

0: (sin_family: u_short;

sin_port: u_short;

sin_addr: TInAddr;

sin_zero: array[0..7] of Char);

1: (sa_family: u_short;

sa_data: array[0..13] of Char)

end;

TSockAddr = Sockaddr_in;

TSocket = u_int;

const

WSADESCRIPTION_LEN = 256;

WSASYS_STATUS_LEN = 128;

type

PWSAData = ^TWSAData;

WSAData = record // WSDATA

wVersion: Word;

wHighVersion: Word;

szDescription: array[0..WSADESCRIPTION_LEN] of Char;

szSystemStatus: array[0..WSASYS_STATUS_LEN] of Char;

iMaxSockets: Word;

iMaxUdpDg: Word;

lpVendorInfo: PChar;

end;

TWSAData = WSAData;

//¶¨ÒåһЩ winsock 2 º¯Êý

function closesocket(s: TSocket): Integer; stdcall;

function socket(af, Struct, protocol: Integer): TSocket; stdcall;

function sendto(s: TSocket; var Buf; len, flags: Integer; var addrto: TSockAddr;

tolen: Integer): Integer; stdcall;{}

function setsockopt(s: TSocket; level, optname: Integer; optval: PChar;

optlen: Integer): Integer; stdcall;

function inet_addr(cp: PChar): u_long; stdcall; {PInAddr;} { TInAddr }

function htons(hostshort: u_short): u_short; stdcall;

function WSAGetLastError: Integer; stdcall;

function WSAStartup(wVersionRequired: word; var WSData: TWSAData): Integer; stdcall;

function WSACleanup: Integer; stdcall;

const

AF_INET = 2; // internetwork: UDP, TCP, etc.

IP_HDRINCL = 2; // IP Header Include

SOCK_RAW = 3; // raw-protocol interface

IPPROTO_IP = 0; // dummy for IP

IPPROTO_TCP = 6; // tcp

IPPROTO_UDP = 17; // user datagram protocol

IPPROTO_RAW = 255; // raw IP packet

INVALID_SOCKET = TSocket(NOT(0));

SOCKET_ERROR = -1;

var

Form1: TForm1;

implementation

// Import Winsock 2 functions

const WinSocket = 'WS2_32.DLL';

function closesocket; external winsocket name 'closesocket';

function socket; external winsocket name 'socket';

function sendto; external winsocket name 'sendto';

function setsockopt; external winsocket name 'setsockopt';

function inet_addr; external winsocket name 'inet_addr';

function htons; external winsocket name 'htons';

function WSAGetLastError; external winsocket name 'WSAGetLastError';

function WSAStartup; external winsocket name 'WSAStartup';

function WSACleanup; external winsocket name 'WSACleanup';

{$R *.DFM}

function CheckSum(Var Buffer; Size : integer) : Word;

type

TWordArray = Array[0..1] of Word;

var

ChkSum : LongWord;

i : Integer;

begin

ChkSum := 0;

i := 0;

While Size > 1 do begin

ChkSum := ChkSum + TWordArray(Buffer)[i];

inc(i);

Size := Size - SizeOf(Word);

end;

if Size=1 then ChkSum := ChkSum + Byte(TWordArray(Buffer)[i]);

ChkSum := (ChkSum shr 16) + (ChkSum and $FFFF);

ChkSum := ChkSum + (Chksum shr 16);

Result := Word(ChkSum);

end;

procedure BuildHeaders(

FromIP : String;

iFromPort : Word;

ToIP : String;

iToPort : Word;

StrMessage : String;

Var Buf : TPacketBuffer;

Var remote : TSockAddr;

Var iTotalSize : Word

);

Var

dwFromIP : LongWord;

dwToIP : LongWord;

iIPVersion : Word;

iIPSize : Word;

ipHdr : T_IP_Header;

udpHdr : T_UDP_Header;

iUdpSize : Word;

iUdpChecksumSize : Word;

cksum : Word;

Ptr : ^Byte;

procedure IncPtr(Value : Integer);

begin

ptr := pointer(integer(ptr) + Value);

end;

begin

// Convert ip address'ss

dwFromIP := inet_Addr(PChar(FromIP));

dwToIP := inet_Addr(PChar(ToIP));

// ³õʼ»¯ IP Í·

//

iTotalSize := sizeof(ipHdr) + sizeof(udpHdr) + length(strMessage);

iIPVersion := 4;

iIPSize := sizeof(ipHdr) div sizeof(LongWord);

ipHdr.ip_verlen := (iIPVersion shl 4) or iIPSize;

ipHdr.ip_tos := 0; // IP type of service

ipHdr.ip_totallength := htons(iTotalSize); // Total packet len

ipHdr.ip_id := 0; // Unique identifier: set to 0

ipHdr.ip_offset := 0; // Fragment offset field

ipHdr.ip_ttl := 128; // Time to live

ipHdr.ip_protocol := $11; // Protocol(UDP)

ipHdr.ip_checksum := 0 ; // IP checksum

ipHdr.ip_srcaddr := dwFromIP; // Source address

ipHdr.ip_destaddr := dwToIP; // Destination address

//

// ³õʼ»¯ UDP Í·

//

iUdpSize := sizeof(udpHdr) + length(strMessage);

udpHdr.src_portno := htons(iFromPort) ;

udpHdr.dst_portno := htons(iToPort) ;

udpHdr.udp_length := htons(iUdpSize) ;

udpHdr.udp_checksum := 0 ;

iUdpChecksumSize := 0;

ptr := @buf[0];

FillChar(Buf, SizeOf(Buf), 0);

Move(ipHdr.ip_srcaddr, ptr^, SizeOf(ipHdr.ip_srcaddr));

IncPtr(SizeOf(ipHdr.ip_srcaddr));

iUdpChecksumSize := iUdpChecksumSize + sizeof(ipHdr.ip_srcaddr);

Move(ipHdr.ip_destaddr, ptr^, SizeOf(ipHdr.ip_destaddr));

IncPtr(SizeOf(ipHdr.ip_destaddr));

iUdpChecksumSize := iUdpChecksumSize + sizeof(ipHdr.ip_destaddr);

IncPtr(1);

Inc(iUdpChecksumSize);

Move(ipHdr.ip_protocol, ptr^, sizeof(ipHdr.ip_protocol));

IncPtr(sizeof(ipHdr.ip_protocol));

iUdpChecksumSize := iUdpChecksumSize + sizeof(ipHdr.ip_protocol);

Move(udpHdr.udp_length, ptr^, sizeof(udpHdr.udp_length));

IncPtr(sizeof(udpHdr.udp_length));

iUdpChecksumSize := iUdpChecksumSize + sizeof(udpHdr.udp_length);

move(udpHdr, ptr^, sizeof(udpHdr));

IncPtr(sizeof(udpHdr));

iUdpChecksumSize := iUdpCheckSumSize + sizeof(udpHdr);

Move(StrMessage[1], ptr^, Length(strMessage));

IncPtr(Length(StrMessage));

iUdpChecksumSize := iUdpChecksumSize + length(strMessage);

cksum := checksum(buf, iUdpChecksumSize);

udpHdr.udp_checksum := cksum;

//

// ÏÖÔÚ IP ºÍ UDP Í·OKÁË£¬ÎÒÃÇ¿ÉÒÔ°ÑËü·¢ËͳöÈ¥¡£

//

FillChar(Buf, SizeOf(Buf), 0);

Ptr := @Buf[0];

Move(ipHdr, ptr^, SizeOf(ipHdr)); IncPtr(SizeOf(ipHdr));

Move(udpHdr, ptr^, SizeOf(udpHdr)); IncPtr(SizeOf(udpHdr));

Move(StrMessage[1], ptr^, length(StrMessage));

remote.sin_family := AF_INET;

remote.sin_port := htons(iToPort);

remote.sin_addr.s_addr := dwToIP;

end;

procedure TForm1.SendIt;

Var

sh : TSocket;

bOpt : Integer;

ret : Integer;

Buf : TPacketBuffer;

Remote : TSockAddr;

Local : TSockAddr;

iTotalSize : Word;

wsdata : TWSAdata;

begin

// Startup Winsock 2

ret := WSAStartup($0002, wsdata);

if ret<>0 then begin

memo1.lines.add('WSA Startup failed.');

exit;

end;

with memo1.lines do begin

add('WSA Startup:');

add('Desc.: '+wsData.szDescription);

add('Status: '+wsData.szSystemStatus);

end;

try

// Create socket

sh := Socket(AF_INET, SOCK_RAW, IPPROTO_UDP);

if (sh = INVALID_SOCKET) then begin

memo1.lines.add('Socket() failed: '+IntToStr(WSAGetLastError));

exit;

end;

Memo1.lines.add('Socket Handle = '+IntToStr(sh));

// Option: Header Include

bOpt := 1;

ret := SetSockOpt(sh, IPPROTO_IP, IP_HDRINCL, @bOpt, SizeOf(bOpt));

if ret = SOCKET_ERROR then begin

Memo1.lines.add('setsockopt(IP_HDRINCL) failed: '+IntToStr(WSAGetLastError));

exit;

end;

// Build the packet

BuildHeaders( SrcIP, SrcPort,

DestIP, DestPort,

'THIS IS A TEST PACKET',

Buf, Remote, iTotalSize );

// Send the packet

ret := SendTo(sh, buf, iTotalSize, 0, Remote, SizeOf(Remote));

if ret = SOCKET_ERROR then

Memo1.Lines.Add('sendto() failed: '+IntToStr(WSAGetLastError))

else

Memo1.Lines.Add('send '+IntToStr(ret)+' bytes.');

// Close socket

CloseSocket(sh);

finally

// Close Winsock 2

WSACleanup;

end;

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

SendIt;

end;

end.

¡¾·µ»Ø¶¥²¿¡¿ ¡¾´òÓ¡±¾Ò³¡¿ ¡¾¹Ø±Õ´°¿Ú¡¿

¹ØÓÚÎÒÃÇ / ¸øÎÒÁôÑÔ / °æȨ¾Ù±¨ / Òâ¼û½¨Òé / ÍøÕ¾±à³ÌQQȺ   
Copyright ©2003- 2024 Lihuasoft.net webmaster(at)lihuasoft.net ¼ÓÔØʱ¼ä 0.00386