Socket API隐藏自己的真实IP

      

        下面是利用RAW Socket自己管理IP头和UDP头的例子~~~~~UDP隐藏自己的IP很容易,但是TCP就难了,因为必须和远程主机建立连接~~~~~~~~`假的IP地址怎么建立连接呢???

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Winsock2, YRecords;

type
  TForm1 = class(TForm)
    Button1: TButton;
    edtDestIP: TEdit;
    edtFromIP: TEdit;
    edtDestPort: TEdit;
    edtFromPort: TEdit;
    ListBox1: TListBox;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function CheckSum( p: PU16; size: U16 ):U16;
var
  chksum : U32;
  pbuf : PU16;
begin
  pbuf := p;
  chksum := 0;

  while size > 1 do
  begin
    chksum := chksum + pbuf^;
    Inc( pBuf );
    Dec( size, sizeof(U16) );
  end;

  if Size=1 then
    ChkSum := ChkSum + PByte(pBuf)^;

  chksum := (chksum shr 16 )+(chksum and $ffff);
  chksum := chksum + (chksum shr 16);
  chksum := not chksum;
  result := U16(chksum);
end;

//填充IP Header
procedure FillIPHeader( pip: PIPHeader; ttl:u8; datalen: u32; proto: U8;
          destip, fromip: U32 );
var
  b : u8;
  w : u16;
begin
  b := 4;
  pip^.u8verlen := ( b shl 4 ) or (sizeof(YIPHeader) div sizeof(u32));
  pip^.u8tos := 0;

  w := u16( sizeof(YIPHeader) + sizeof(YUDPHeader) + datalen );
  pip^.u16totallen := htons( w );
  pip^.u16id := u16(GetCurrentProcessID);
  pip^.u16offset := htons(1 shl 14);//do not fragment
  pip^.u8ttl := ttl;
  pip^.u8protol := proto;
  pip^.u16checksum := 0;
  pip^.u32srcaddr := fromip;
  pip^.u32destaddr := destip;
  pip^.u16checksum := CheckSum( PU16(pip), sizeof(YIPHeader) );
end;

//填充UDP头
procedure FillUDPHeader( pudp: PUDPHeader; datalen: u32; destport, fromport: U32 );
var
  b : u8;
  w : u16;
begin
  pudp^.u16srcport := fromport;
  pudp^.u16destport := destport;
  pudp^.u16len := htons( sizeof(YUDPHeader) + datalen );
  pudp^.u16chksum := 0;
end;

procedure ErrMsg( msg: string );
begin
  MessageBox( 0, PChar(msg), 'Ping Program Error', MB_ICONERROR );
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  wsa : TWSAData;
begin
  if WSAStartup( $0202, wsa ) <> 0 then
     ErrMsg( 'Windows socket is not responed.' );
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if WSACleanup <> 0 then
     ErrMsg( 'Windows socket can not be closed.' );
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  udpsock  : TSocket;
  opt      : s32;
  DestAdr,
  FromAdr  : TSockAddr;
  pIPHdr   : PIPHeader;
  pUDPHdr  : PUDPHeader;
  pDataBuf : PChar;
begin
  //创建一个UDPSOCK发送探测包
  udpsock := socket( AF_INET, SOCK_RAW, IPPROTO_UDP );

  //设置SOCKET选项--我们自己操作IP头
  opt := 1;
  setsockopt( udpsock, IPPROTO_IP, IP_HDRINCL, @opt, SizeOf(opt));

  //为IP Header / UDP header /Data buf 分配内存
  pIPHdr := AllocMem( sizeof(YIPHeader) + sizeof(YUDPHeader) + PACKET_SIZE );
  pUDPHdr := PUDPHeader( PChar(pIPHdr) + sizeof(YIPHeader) );
  pDataBuf := PChar(pUDPHdr) + sizeof(YUDPHeader);

  //本地Addr
  FillChar( FromAdr, sizeof(FromAdr), 0 );
  FromAdr.sin_family := AF_INET;
  FromAdr.sin_port := htons( StrToInt(edtFromPort.text) );
  FromAdr.sin_addr.S_addr := inet_addr( PChar(edtFromIP.Text) );

  //远程Addr
  FillChar( DestAdr, sizeof(DestAdr), 0 );
  DestAdr.sin_family := AF_INET;
  DestAdr.sin_port := htons( StrToInt(edtDestPort.text) );
  DestAdr.sin_addr.S_addr := inet_addr( PChar(edtDestIP.Text) );

  //填充IP头和UDP头
  FillIPHeader( pIPHdr, 55, PACKET_SIZE, IPPROTO_UDP, DestAdr.sin_addr.S_addr,
       FromAdr.sin_addr.S_addr );
  FillUDPHeader( pUDPHdr, PACKET_SIZE, DestAdr.sin_port, FromAdr.sin_port );
  FillChar( pDataBuf^, PACKET_SIZE, 'Y' );

  //发送UDP包到HOST
  sendto( udpsock, pIPHdr^, sizeof(YIPHeader) + sizeof(YUDPHeader) + PACKET_SIZE,
      0, DestAdr, sizeof(DestAdr) );

  ListBox1.Items.Add( '发送了' +IntToStr(ret)+ '字节到:' + edtDestIP.Text );
  closesocket(udpsock);
  FreeMem( pIPHdr );
end;

end.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值