TCP/UDP隐藏IP
//真郁闷,UDP的可以发送,TCP的发送失败
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, winsock2, StdCtrls;
type
// 一些 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;
//IP头 长度20
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;
//TCP 头
T_TCP_HEADER = record //长度20
Sport : WORD; //* source port */
Dport : WORD; //* destination port */
Seq : DWORD; //* sequence number */
Ack : DWORD; //* acknowledgement number */
Off_X2: BYTE; //* data offset */ ___ //* (unused) */
Flags : BYTE;
Win : WORD; //* window */
Sum : WORD; //* checksum */
Urp : WORD; //* urgent pointer */
end;
T_TCP_TSEUDO_HEADER = record
Saddr : LongWord;
Daddr : LongWord;
Zero : BYTE;
Protocol : BYTE;
Length : WORD;
end;
T_ICMP_HEADER = record
IcmpType : BYTE;
IcmpCode : BYTE; // Type sub code
IcmpChecksum : WORD;
IcmpId : WORD;
IcmpSeq : WORD;
IcmpTimestamp : DWORD; // Not standard field in header, but reserved nonetheless
end;
// UDP 头
Type
T_UDP_Header = record
src_portno : Word;
dst_portno : Word;
udp_length : Word;
udp_checksum : Word;
end;
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Button2: TButton;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function CheckSum(addr: PWord; len:Integer):Word;//计算校验和
var
nleft,sum:Integer;
w:PWord;
begin
nleft:=len; //完全可以不用中间变量nleft而直接使用len
sum:=0;
w:=addr;
Result:=0; //answer=0
while nleft>1 do
begin
Inc(sum,w^); //求和
Inc(w); //指针后移
Dec(nleft,2); //长度减少( Word = 2 Byte )
end;
if nleft=1 then //长度为奇数
begin
PByte(@Result)^:=PByte(w)^;
Inc(sum,Result); //这两句可以合并为 Inc(sum,PByte(w)^);
end;
sum:=sum shr 16+sum and $FFFF;
Inc(sum,sum shr 16);
Result:=not sum;
end;
procedure TForm1.Button1Click(Sender: TObject); //UDP
Var
sh : TSocket;
bOpt : Integer;
ret : Integer;
Remote : TSockAddr;
//Local : TSockAddr;
iTotalSize : Word;
wsdata : TWSAdata;
buff:array[0..255]of byte;
ipHdr:T_IP_Header;
udpHdr:T_UDP_Header;
seudo:T_TCP_TSEUDO_HEADER;
begin
// Startup Winsock 2
ret := WSAStartup(MAKEWORD(2,2), wsdata);
if ret=0 then
begin
try
sh :=WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,NIL,0,WSA_FLAG_OVERLAPPED);
//sh := Socket(AF_INET, SOCK_RAW, IPPROTO_UDP); // Create socket
if (sh <> INVALID_SOCKET) then
begin
bOpt := 1;
ret := SetSockOpt(sh, IPPROTO_IP, IP_HDRINCL, @bOpt, SizeOf(bOpt)); // Option: Header Include
if ret <> SOCKET_ERROR then
begin
Randomize;
// IP
ipHdr.ip_verlen:= 69;
ipHdr.ip_tos:= 0; // IP服务类型
ipHdr.ip_totallength:=htons(28) ; // 总包大小
ipHdr.ip_id:= 0; // 唯一标识,一般设置为0
ipHdr.ip_offset:= 0; // 偏移字段
ipHdr.ip_ttl:= 128; // 超时时间
ipHdr.ip_protocol:= $11; // 定义协议
ipHdr.ip_checksum:= 0 ; // 检验总数
ipHdr.ip_srcaddr:= inet_Addr(PChar(format('%d.%d.%d.%d',[Random(255),Random(255),Random(255),Random(255)]))) ; // 源地址
ipHdr.ip_destaddr:=inet_Addr('192.168.1.4') ; // 目标地址
//UDP
udpHdr.src_portno:= htons(Random(60000)+1000);
udpHdr.dst_portno := htons(6002) ;
udpHdr.udp_length := htons(8) ;
udpHdr.udp_checksum := 0 ;
//填充缓冲区
fillchar(buff,sizeof(buff),0);
move(ipHdr,buff[0],sizeof(ipHdr));
move(udpHdr,buff[sizeof(ipHdr)],sizeof(udpHdr));
iTotalSize:=sizeof(ipHdr)+sizeof(udpHdr);
remote.sin_family := AF_INET;
remote.sin_port :=udpHdr.dst_portno; //远程端口
remote.sin_addr.S_addr :=ipHdr.ip_destaddr; //远程地址
// Send the packet
ret := SendTo(sh, buff, iTotalSize, 0, Remote, SizeOf(Remote));
edit1.Text :=inttostr(ret);
end;
CloseSocket(sh); // Close socket
end;
finally
WSACleanup; // Close Winsock 2
end;
end;
end;