怎么隐藏IP地址。

来源:百度文库 编辑:神马文学网 时间:2024/07/04 18:12:41
一、前言
本文主要介绍如何在程序中实现 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: PCha