⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 数据包发送程序.txt

📁 一个基于发送tcp/ip协议的数据包发送程序
💻 TXT
📖 第 1 页 / 共 3 页
字号:
////////////////////////////////////////////////////////////////////////// 

// // 

// 数据包发送程序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 + -