📄 数据包发送程序.txt
字号:
//////////////////////////////////////////////////////////////////////////
// //
// 数据包发送程序1.0 //
// //
// 日期: [2004.4.25] //
// 作者: [Zvrop][[email]zvrop@163.com[/email]] //
// 环境: [WINXP + Visual C++ 6.0] //
// 主页: [[url]http://www.gedao.com[/url]][[url]http://www.ringz.org[/url]] //
// 声名: [如果你修改了什么,请发给我一份拷贝,谢谢] //
// //
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////
//若干的头文件
//////////////////////////////////////////////////////////////
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <winsock2.h>
#include <windows.h>
#include <Ws2tcpip.h>
//////////////////////////////////////////////////////////////
//若干的宏定义
//////////////////////////////////////////////////////////////
#define IPVER 4 //ip协议预定
#define MAX_TIMEOUT 2000 //最大超时时间
#define MAX_HOSTNAME_LAN 1024 //主机名最长
#define MAX_BUFF_LEN 65500 //发送缓冲区最大
#define MAX_PORT 65500 //端口最大
#define MAX_CHAR 255 //uchar类型最大
#define MAX_SHORT 65535 //ushort类型最大
#define MAX_LONG 4294967294 //ulong类型最大
#define DEF_PORT_DA 1025 //默认的端口
#define DEF_FORGE_IP 0xffffffff //默认的伪造IP
#define DEF_FORGE_PORT 0xffff //默认的伪造端口
//////////////////////////////////////////////////////////////
//若干的报文头部首部结构定义
//////////////////////////////////////////////////////////////
//定义IP首部
typedef struct _iphdr{
UCHAR h_verlen; //4位首部长度,4位IP版本号
UCHAR tos; //8位服务类型TOS
USHORT total_len; //16位总长度(字节)
USHORT ident; //16位标识
USHORT frag_and_flags; //3位标志位
UCHAR ttl; //8位生存时间 TTL
UCHAR proto; //8位协议 (TCP, UDP 或其他)
USHORT checksum; //16位IP首部校验和
ULONG sourceIP; //32位源IP地址
ULONG destIP; //32位目的IP地址
}IP_HEADER;
//定义TCP伪首部
typedef struct _psdhdr{
ULONG saddr; //源地址
ULONG daddr; //目的地址
UCHAR mbz; //没用
UCHAR ptcl; //协议类型
USHORT tcpl; //TCP长度
}PSD_HEADER;
//定义TCP首部
typedef struct _tcphdr{
USHORT th_sport; //16位源端口
USHORT th_dport; //16位目的端口
ULONG th_seq; //32位序列号
ULONG th_ack; //32位确认号
UCHAR th_lenres; //4位首部长度/6位保留字
UCHAR th_flag; //6位标志位
USHORT th_win; //16位窗口大小
USHORT th_sum; //16位校验和
USHORT th_urp; //16位紧急数据偏移量
}TCP_HEADER;
//定义UDP首部
typedef struct _udphdr{
USHORT uh_sport; //16位源端口
USHORT uh_dport; //16位目的端口
USHORT uh_len; //16位长度
USHORT uh_sum; //16位校验和
} UDP_HEADER;
//定义ICMP首部
typedef struct _icmphdr{
UCHAR i_type; //8位类型
UCHAR i_code; //8位代码
USHORT i_cksum; //16位校验和
USHORT i_id; //识别号(一般用进程号作为识别号)
USHORT i_seq; //报文序列号
ULONG timestamp; //时间戳
}ICMP_HEADER;
//定义IGMP首部
typedef struct _igmphdr{
UCHAR i_code; //8位代码
UCHAR i_type; //8位类型
USHORT i_nv; //没用
USHORT i_cksum; //16位校验和
ULONG i_addr; //32位组地址
}IGMP_HEADER;
//////////////////////////////////////////////////////////////
//若干的报文首部结构变量
//////////////////////////////////////////////////////////////
IP_HEADER ip_header = {0}; //ip首部结构
PSD_HEADER psd_header = {0}; //伪首部结构
TCP_HEADER tcp_header = {0}; //tcp首部结构
UDP_HEADER udp_header = {0}; //udp首部结构
ICMP_HEADER icmp_header = {0}; //icmp首部结构
IGMP_HEADER igmp_header = {0}; //igmp首部结构
//////////////////////////////////////////////////////////////
//若干的全局变量
//////////////////////////////////////////////////////////////
//有关临时堆变量的指针
ULONG *Ip_Buff = NULL; //IP缓冲区
USHORT *Port_Buff = NULL; //端口缓冲区
USHORT *Ip_Chk_Buff = NULL; //IP首部效验和缓冲区
USHORT *Other_Chk_Buff = NULL; //其他首部效验和缓冲区
//发送有关的参数
char Dest_Ip[MAX_HOSTNAME_LAN] = {0}; //目的ip
short Send_Data_Type = 2; //发送类型
ULONG Send_Degree = 10; //发送次数
ULONG Send_Sdeg = 1; //同一报文发送次数
USHORT Delay_Time = 0; //延时时间
SOCKET SockRaw = 0; //socket句柄
struct sockaddr_in DestAddr = {0}; //socket地址结构
char Send_Dest_Data[MAX_BUFF_LEN] = {0}; //发送的报文信息
char Send_Data_File[MAX_PATH] = {0}; //数据文件路径
int Send_Data_Size = 0; //发送信息大小
//各个报文的可变参数变量
UCHAR IP_TOSE = 0; //IP服务类型
USHORT IP_IDENT = 0; //IP16位标识
USHORT IP_FLAG = 0; //IP标志
UCHAR IP_TTLE = 128; //IP ttl值
USHORT TCP_WINS = 16384; //TCP窗口值
UCHAR TCP_FLAG = 2; //TCP标志
ULONG TCP_SEQ = 1; //32位序列号
ULONG TCP_ACK = 0; //32位确认号
USHORT TCP_URP = 0; //TCP紧急数据偏移
USHORT ICMP_TYPE = 8; //ICMP类型值
USHORT ICMP_CODE = 0; //ICMP代码值
USHORT ICMP_ID = 2; //ICMP识别号值
USHORT ICMP_SEQ = 1; //ICMP序号值
ULONG ICMP_TIME = 1; //ICMP时间戳值
USHORT IGMP_CODE = 1; //IGMP版本值
USHORT IGMP_TYPE = 1; //IGMP类型值
ULONG IGMP_ADDR = 100; //IGMP32位组地址
//伪造有关的变量
ULONG Ip_Forge_Deg = 100; //伪造个数
short Forge_Type = 1; //伪造模式
char Forge_Ip_File[MAX_PATH] = {0}; //伪造ip文件路径
char Forge_Ip[MAX_HOSTNAME_LAN] = {0}; //伪造IP
USHORT Forge_Port = DEF_PORT_DA; //伪造的端口
//和程序有关的临时变量
USHORT PORTT = 0; //临时变量,记录目的IP的端口
ULONG IPTL = 0; //临时变量,记录目的ip
int ErrorCode = 0; //错误返回寄存变量
//////////////////////////////////////////////////////////////
//若干函数的声名
//////////////////////////////////////////////////////////////
void Usage();
USHORT checksum(USHORT *buffer, int size);
int SetInitializeValue(int argc, char *argv[]);
int SetInitializeSock();
int GetIpAndPortByLine(char *IPL);
int MakeForgeData();
int AccCheckSum();
//重载函数
int AssMemory(ULONG **a, ULONG sa, USHORT **b, ULONG sb);
int AssMemory(USHORT **a, ULONG sa, USHORT **b, ULONG sb);
//////////////////////////////////////////////////////////////
//主函数
//////////////////////////////////////////////////////////////
int main(int argc, char *argv[]){
//参数少于2个,退出
if (argc < 2){
Usage();
return 0;
}
fprintf(stderr, "1.开始分析命令行,获得参数,稍等...\n");
//分析命令行,赋初始化值.
if(!SetInitializeValue(argc, argv))
return 0;
fprintf(stderr, "2.正在初始化网络,稍等...\n");
//初始化连接函数
if(!SetInitializeSock())
return 0;
fprintf(stderr, "3.正在构造伪造数据包,稍等...\n");
//构造伪造数据
if(!MakeForgeData())
return 0;
fprintf(stderr, "4.正在计算效验和,稍等...\n");
//计算效验和
if(!AccCheckSum())
return 0;
//下面开始发送信息
//填充地址结构
memset(&DestAddr, 0, sizeof(DestAddr));
DestAddr.sin_family = AF_INET; //internet网络
DestAddr.sin_port = htons(PORTT);
DestAddr.sin_addr.s_addr = htonl(IPTL); //目的IP
//开始循环发送消息,因为效验和已经计算好,这里就是一些指针和内存的操作
char Sendto_Buff[MAX_BUFF_LEN];
ULONG i = 0, j, HL = 0, SZE = sizeof(DestAddr);
for(j = 0; j < Send_Degree; j++, i++){
//循环使用ip段
if(i >= Ip_Forge_Deg)
i = 0;
//发送缓冲区清空,可要可不要
memset(Sendto_Buff, 0, MAX_BUFF_LEN);
//填充可变参数
ip_header.sourceIP = htonl(Ip_Buff[i]);
ip_header.ident = htons((USHORT)((i + IP_IDENT) % MAX_SHORT) + 1);
ip_header.checksum = Ip_Chk_Buff[i];
//填充发送缓冲区
memcpy(Sendto_Buff, &ip_header, sizeof(IP_HEADER));
//判断是什么类型报文,发送
switch(Send_Data_Type){
case 1:
//填充tcp伪首部和tcp首部
psd_header.saddr = ip_header.sourceIP;
tcp_header.th_seq = htonl((TCP_SEQ + i) % MAX_SHORT);;
tcp_header.th_sport = htons(Port_Buff[i]);
//填充效验和,已经计算的
tcp_header.th_sum = Other_Chk_Buff[i];
//填充缓冲区
memcpy(Sendto_Buff + sizeof(IP_HEADER), &tcp_header, sizeof(TCP_HEADER));
memcpy(Sendto_Buff + sizeof(IP_HEADER) + sizeof(TCP_HEADER),
Send_Dest_Data, Send_Data_Size);
//计算报文长度
HL = sizeof(IP_HEADER) + sizeof(TCP_HEADER) + Send_Data_Size;
break;
case 2:
psd_header.saddr = ip_header.sourceIP;
udp_header.uh_sport = htons(Port_Buff[i]);
udp_header.uh_sum = Other_Chk_Buff[i];
memcpy(Sendto_Buff + sizeof(IP_HEADER), &udp_header, sizeof(UDP_HEADER));
memcpy(Sendto_Buff + sizeof(IP_HEADER) + sizeof(UDP_HEADER),
Send_Dest_Data, Send_Data_Size);
HL = sizeof(IP_HEADER) + sizeof(UDP_HEADER) + Send_Data_Size;
break;
case 3:
icmp_header.i_seq = htons((USHORT)((ICMP_SEQ + i) % MAX_SHORT));
icmp_header.timestamp = htonl((ICMP_TIME + i) % MAX_SHORT);
icmp_header.i_cksum = Other_Chk_Buff[i];
memcpy(Sendto_Buff + sizeof(IP_HEADER), &icmp_header, sizeof(ICMP_HEADER));
memcpy(Sendto_Buff + sizeof(IP_HEADER) + sizeof(ICMP_HEADER),
Send_Dest_Data, Send_Data_Size);
HL = sizeof(IP_HEADER) + sizeof(ICMP_HEADER) + Send_Data_Size;
break;
case 4:
igmp_header.i_cksum = Other_Chk_Buff[i];
memcpy(Sendto_Buff + sizeof(IP_HEADER), &icmp_header, sizeof(IGMP_HEADER));
memcpy(Sendto_Buff + sizeof(IP_HEADER) + sizeof(IGMP_HEADER),
Send_Dest_Data, Send_Data_Size);
HL = sizeof(IP_HEADER) + sizeof(IGMP_HEADER) + Send_Data_Size;
break;
}//End of switch
//发送
for(ULONG SN = 0; SN < Send_Sdeg; SN++){
ErrorCode = sendto(SockRaw,
Sendto_Buff,
HL,
0,
(struct sockaddr*) &DestAddr,
SZE);
}//End of for
//打印提示符
fprintf(stderr, ".");
//如果出错,打印出错信息,并暂停
if (ErrorCode == SOCKET_ERROR){
fprintf(stderr, "\n数据发送错误,错误代码:%d\n"
"Ctrl+C退出,任意键继续发送...\n",GetLastError());
system("PAUSE");
}
//延迟一定时间
Sleep(Delay_Time);
}//End of for
//释放一些内存
if(Ip_Buff) free(Ip_Buff);
if(Port_Buff) free(Port_Buff);
if(Ip_Chk_Buff) free(Ip_Chk_Buff);
if(Other_Chk_Buff) free(Other_Chk_Buff);
//关闭句柄
closesocket(SockRaw);
WSACleanup();
return 1;
}
//////////////////////////////////////////////////////////////
//计算效验和
//填充报文必须注意网络字节和主机字节的切换
//////////////////////////////////////////////////////////////
int AccCheckSum(){
//计算缓冲区
char MakeSumBuff[MAX_BUFF_LEN];
//分析目的IP流
if(!GetIpAndPortByLine(Dest_Ip))
return 0;
//开始设置IP首部的变量
ip_header.h_verlen = (IPVER << 4 | sizeof(ip_header) / sizeof(unsigned long)); //版本号
ip_header.tos = (UCHAR)IP_TOSE; //服务类型
//这里还差加一个具体的报文字段的长度
ip_header.total_len = sizeof(IP_HEADER) + Send_Data_Size; //16位总长度(字节)
//下面这个表示每发送一次加1,需要更改
ip_header.ident = 0; //16位标识
ip_header.frag_and_flags = IP_FLAG; //3位标志位
ip_header.ttl = (UCHAR)IP_TTLE; //8位生存时间TTL
//协议类型需要更改
ip_header.proto = 0; //协议类型
//效验和需要更改
ip_header.checksum = 0; //效验和
//源地址需要更改
ip_header.sourceIP = 0; //32位源IP地址
//这里改变了字节顺序
ip_header.destIP = htonl(IPTL); //32位目的IP地址
if(!AssMemory(&Ip_Chk_Buff, Ip_Forge_Deg, &Other_Chk_Buff, Ip_Forge_Deg))
return 0;
ULONG i;
switch(Send_Data_Type){
case 1://tcp包
//协议设置为TCP
ip_header.proto = IPPROTO_TCP;
//加上TCP结构,赋值给IP头部
ip_header.total_len = htons(ip_header.total_len + sizeof(TCP_HEADER));
//源地址需要更改
psd_header.saddr = 0; //源地址
psd_header.daddr = ip_header.destIP; //目的地址
psd_header.mbz = 0;
psd_header.ptcl = ip_header.proto; //直接取上面的协议
psd_header.tcpl = htons(sizeof(TCP_HEADER) + Send_Data_Size);
//填充TCP首部
//源端口号需要更改
tcp_header.th_sport = 0; //源端口号
tcp_header.th_dport = htons(PORTT); //目的端口号
//syn序列号要改的
tcp_header.th_seq = 0; //SYN序列号
tcp_header.th_ack = htonl(TCP_ACK); //ACK序列号置为0
tcp_header.th_lenres = (sizeof(TCP_HEADER) /sizeof(unsigned long) << 4 | 0); //TCP长度和保留位
tcp_header.th_flag = (UCHAR)TCP_FLAG; //SYN 标志
tcp_header.th_win = htons(TCP_WINS); //窗口大小
tcp_header.th_urp = htons(TCP_URP); //偏移
//效验和需要更改
tcp_header.th_sum = 0; //校验和
//循环计算Ip_Forge_Deg个效验和出来
for(i = 0; i < Ip_Forge_Deg; i++){
//填充一些每次都改变的变量,比如源IP,源端口,seq等等.
ip_header.sourceIP = htonl(Ip_Buff[i]);
ip_header.ident = htons((USHORT)((i + IP_IDENT) % MAX_SHORT) + 1);
psd_header.saddr = ip_header.sourceIP;
tcp_header.th_sport = htons(Port_Buff[i]);
tcp_header.th_seq = htonl((TCP_SEQ + i) % MAX_SHORT);
//吧tcp伪首部和tcp首部先送入计算出tcp首部效验和
memset(MakeSumBuff, 0, MAX_BUFF_LEN);
memcpy(MakeSumBuff, &psd_header, sizeof(PSD_HEADER));
memcpy(MakeSumBuff + sizeof(PSD_HEADER), &tcp_header, sizeof(TCP_HEADER));
memcpy(MakeSumBuff + sizeof(PSD_HEADER) + sizeof(TCP_HEADER),
Send_Dest_Data, Send_Data_Size);
Other_Chk_Buff[i] = checksum((USHORT *)MakeSumBuff,
sizeof(PSD_HEADER) + sizeof(TCP_HEADER) + Send_Data_Size);
//然后结合IP首部,计算出IP首部效验和
memset(MakeSumBuff, 0, MAX_BUFF_LEN);
memcpy(MakeSumBuff, &ip_header, sizeof(IP_HEADER));
memcpy(MakeSumBuff + sizeof(IP_HEADER), &tcp_header, sizeof(TCP_HEADER));
memcpy(MakeSumBuff + sizeof(IP_HEADER) + sizeof(TCP_HEADER),
Send_Dest_Data, Send_Data_Size);
Ip_Chk_Buff[i] = checksum((USHORT *)MakeSumBuff,
sizeof(IP_HEADER) + sizeof(TCP_HEADER) + Send_Data_Size);
}//End of for
break;
case 2://udp包
ip_header.proto = IPPROTO_UDP;
ip_header.total_len = htons(ip_header.total_len + sizeof(UDP_HEADER));
psd_header.saddr = 0;
psd_header.daddr = ip_header.destIP;
psd_header.mbz = 0;
psd_header.ptcl = ip_header.proto;
psd_header.tcpl = htons(sizeof(UDP_HEADER) + Send_Data_Size);
udp_header.uh_sport = 0;
udp_header.uh_dport = htons(PORTT);
udp_header.uh_len = htons(sizeof(UDP_HEADER) + Send_Data_Size);
udp_header.uh_sum = 0;
for(i = 0; i < Ip_Forge_Deg; i++){
ip_header.sourceIP = htonl(Ip_Buff[i]);
ip_header.ident = htons((USHORT)((i + IP_IDENT) % MAX_SHORT) + 1);
psd_header.saddr = ip_header.sourceIP;
udp_header.uh_sport = htons(Port_Buff[i]);
memset(MakeSumBuff, 0, MAX_BUFF_LEN);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -