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

📄 数据包发送程序.txt

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

memcpy(MakeSumBuff, &psd_header, sizeof(PSD_HEADER)); 

memcpy(MakeSumBuff + sizeof(PSD_HEADER), &udp_header, sizeof(UDP_HEADER)); 

memcpy(MakeSumBuff + sizeof(PSD_HEADER) + sizeof(UDP_HEADER), 

Send_Dest_Data, Send_Data_Size); 

Other_Chk_Buff[i] = checksum((USHORT *)MakeSumBuff, 

sizeof(PSD_HEADER) + sizeof(UDP_HEADER) + Send_Data_Size); 

memset(MakeSumBuff, 0, MAX_BUFF_LEN); 

memcpy(MakeSumBuff, &ip_header, sizeof(IP_HEADER)); 

memcpy(MakeSumBuff + sizeof(IP_HEADER), &udp_header, sizeof(UDP_HEADER)); 


memcpy(MakeSumBuff + sizeof(IP_HEADER) + sizeof(UDP_HEADER), 

Send_Dest_Data, Send_Data_Size); 

Ip_Chk_Buff[i] = checksum((USHORT *)MakeSumBuff, 

sizeof(IP_HEADER) + sizeof(UDP_HEADER) + Send_Data_Size); 

}//End of for 

break; 

case 3://icmp包 

ip_header.proto = IPPROTO_ICMP; 

ip_header.total_len = htons(ip_header.total_len + sizeof(ICMP_HEADER)); 

icmp_header.i_type = (UCHAR)ICMP_TYPE; 


icmp_header.i_code = (UCHAR)ICMP_CODE; 

icmp_header.i_cksum = 0; 

icmp_header.i_id = htons(ICMP_ID); 

icmp_header.i_seq = 0; 

icmp_header.timestamp = 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); 



icmp_header.i_seq = htons((USHORT)((ICMP_SEQ + i) % MAX_SHORT)); 


icmp_header.timestamp = htonl((ICMP_TIME + i) % MAX_SHORT); 

memcpy(MakeSumBuff, &icmp_header, sizeof(ICMP_HEADER)); 

memcpy(MakeSumBuff + sizeof(icmp_header), 

Send_Dest_Data, Send_Data_Size); 

Other_Chk_Buff[i] = checksum((USHORT *)MakeSumBuff, 

sizeof(ICMP_HEADER) + Send_Data_Size); 

memcpy(MakeSumBuff, &ip_header, sizeof(IP_HEADER)); 

memcpy(MakeSumBuff + sizeof(IP_HEADER), &icmp_header, sizeof(ICMP_HEADER)); 

memcpy(MakeSumBuff + sizeof(IP_HEADER) + sizeof(ICMP_HEADER), 

Send_Dest_Data, Send_Data_Size); 


Ip_Chk_Buff[i] = checksum((USHORT *)MakeSumBuff, 

sizeof(IP_HEADER) + sizeof(ICMP_HEADER) + Send_Data_Size); 

} 

break; 

case 4://igmp包 

ip_header.proto = IPPROTO_IGMP; 

ip_header.total_len = htons(ip_header.total_len + sizeof(IGMP_HEADER)); 

igmp_header.i_code = (UCHAR)IGMP_CODE; 

igmp_header.i_type = (UCHAR)IGMP_TYPE; 

igmp_header.i_addr = htonl(IGMP_ADDR); 


igmp_header.i_nv = 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); 



memcpy(MakeSumBuff, &igmp_header, sizeof(IGMP_HEADER)); 

memcpy(MakeSumBuff + sizeof(igmp_header), 

Send_Dest_Data, Send_Data_Size); 

Other_Chk_Buff[i] = checksum((USHORT *)MakeSumBuff, 

sizeof(IGMP_HEADER) + Send_Data_Size); 


memcpy(MakeSumBuff, &ip_header, sizeof(IP_HEADER)); 

memcpy(MakeSumBuff + sizeof(IP_HEADER), &igmp_header, sizeof(IGMP_HEADER)); 

memcpy(MakeSumBuff + sizeof(IP_HEADER) + sizeof(IGMP_HEADER), 

Send_Dest_Data, Send_Data_Size); 

Ip_Chk_Buff[i] = checksum((USHORT *)MakeSumBuff, 

sizeof(IP_HEADER) + sizeof(IGMP_HEADER) + Send_Data_Size); 

} 

break; 

default: 

fprintf(stderr, "Unknow Data Type\n"); 


return 0; 

}//End of switch 

return 1; 

} 



////////////////////////////////////////////////////////////// 

//构造伪造数据 

////////////////////////////////////////////////////////////// 

int MakeForgeData(){ 

//填充伪造IP 


switch(Forge_Type){ 

case 1://本机型 

//获得主机名 

char name[MAX_HOSTNAME_LAN]; 

memset(name, 0, MAX_HOSTNAME_LAN); 

if(SOCKET_ERROR == gethostname(name, MAX_HOSTNAME_LAN)){ 

fprintf(stderr, "gethostname 函数失败,错误代码: %d\n",WSAGetLastError()); 

return 0; 

} 

//通过主机名获得IP 


struct hostent * pHostent; 

pHostent = NULL; 

pHostent = gethostbyname(name); 

if(pHostent == NULL){ 

fprintf(stderr, "gethostbyname 函数失败,错误代码: %d\n",WSAGetLastError()); 

return 0; 

} 

//获得本机IP,注意,这里是主机字节顺序,pHost指向的是网络字节顺序 

//要累加必须先转化为主机字节,然后进行+1等操作,最后再转到网络字节 

//当然这里可以不需要,不过为了兼容后面的操作,还是转换了. 


IPTL = ntohl((ULONG)(*(struct in_addr*)pHostent->h_addr).s_addr); 



//伪造个数设置为1 

//同样,为了代码看起来比较清楚 

Ip_Forge_Deg = 1; 

//申请缓冲区,这里只有1个 

//后面不要忘记释放了 

//另外,这两个的值是不同类型的,注意 

if(!AssMemory(&Ip_Buff, Ip_Forge_Deg, &Port_Buff, Ip_Forge_Deg)) 

return 0; 




//填充缓冲区 

PORTT = Forge_Port; 

Port_Buff[0] = PORTT; 

Ip_Buff[0] = IPTL; 

break; 

case 2://指定ip型 

//拆分参数里面的命令行 

//值得注意的是,这里返回的IPTL的值就是主机字节了,不需要再做转换 

if(!GetIpAndPortByLine(Forge_Ip)) 


return 0; 

Ip_Forge_Deg = 1; 

if(!AssMemory(&Ip_Buff, Ip_Forge_Deg, &Port_Buff, Ip_Forge_Deg)) 

return 0; 



Port_Buff[0] = PORTT; 

Ip_Buff[0] = IPTL; 

break; 

case 3://指定ip递增型 

if(!GetIpAndPortByLine(Forge_Ip)) 


return 0; 



//申请缓冲区,这里只有N个,从初始IP开始递增 

//具体的数量根据伪造个数那里设置到 

if(!AssMemory(&Ip_Buff, Ip_Forge_Deg, &Port_Buff, Ip_Forge_Deg)) 

return 0; 

//全部赋值 

//这里赋值也全部都是主机字节,到后面统一转换 

ULONG i; 

for(i = 0; i < Ip_Forge_Deg; i++){ 


Ip_Buff[i] = IPTL; 

Port_Buff[i] = PORTT; 

IPTL ++; 

PORTT ++; 

if(PORTT >= MAX_PORT) 

PORTT = 1; 

}//End of for 

break; 

case 4://指定文件型 

//打开该ip文件 


FILE *IpFp; 

IpFp = NULL; 

IpFp = fopen(Forge_Ip_File, "r"); 

if(IpFp == NULL){ 

fprintf(stderr, "打开文件\"%s\"出错,出错代码:%d\n", Forge_Ip_File, GetLastError()); 

return 0; 

} 

ULONG numread; 

Ip_Forge_Deg = 0; 

//获取文件中IP的个数 


while(1){ 

memset(Send_Dest_Data, 0, MAX_BUFF_LEN); 

numread = fread(Send_Dest_Data, sizeof(char), MAX_BUFF_LEN, IpFp); 

if(numread <= 0) 

break; 

ULONG i; 

for(i = 0; i < numread; i++) 

if(Send_Dest_Data[i] == ’\n’) 

Ip_Forge_Deg ++; 

}//End of while 


//出错关闭句柄,返回 

//注意关闭句柄 

if(Ip_Forge_Deg <= 0){ 

fprintf(stderr, "获取文件中IP个数出错.\n"); 

fclose(IpFp); 

return 0; 

} 

//根据个数申请变量 

if(!AssMemory(&Ip_Buff, Ip_Forge_Deg, &Port_Buff, Ip_Forge_Deg)){ 

fclose(IpFp); 


return 0; 

} 



//定位到文件开头 

fseek(IpFp, 0, SEEK_SET); 

char IPtemp[MAX_HOSTNAME_LAN]; 

//开始取每一个IP 

for(i = 0; i < Ip_Forge_Deg; i++){ 

//清空缓冲区 

memset(IPtemp, 0, MAX_HOSTNAME_LAN); 


//获得IP,就是获取一行的信息 

fgets(IPtemp, MAX_HOSTNAME_LAN, IpFp); 

//fgets会取得末尾的\n,去掉最后的\n 

IPtemp[strlen(IPtemp) - 1] = 0; 

//分析IP,出错赋默认值 

if(!GetIpAndPortByLine(IPtemp)){ 

//如果出错,就赋值默认的值 

Ip_Buff[i] = DEF_FORGE_IP; 

Port_Buff[i] = DEF_FORGE_PORT; 

}else{//End of if 


//赋值给每一个缓冲区 

Ip_Buff[i] = IPTL; 

Port_Buff[i] = PORTT; 

}//End of else 

}//End of for 



//关闭文件句柄 

fclose(IpFp); 



break; 


case 5://随机型 

//申请缓冲区,这里有N个 

if(!AssMemory(&Ip_Buff, Ip_Forge_Deg, &Port_Buff, Ip_Forge_Deg)) 

return 0; 

//设置随机种子 

srand((unsigned)time(NULL)); 

char IP[20]; 

//填充随机IP和端口 

for(i = 0; i < Ip_Forge_Deg; i++){ 

memset(IP, 0, 20); 


sprintf(IP, "%d.%d.%d.%d", ((rand() % 255) + 1), 

(rand() % 256), (rand() % 256), (rand() % 256)); 

//转换后存入缓冲区 

Ip_Buff[i] = inet_addr(IP); 

Port_Buff[i] = ((rand() % MAX_PORT) + 1); 

}//End of For 

break; 

default: 

fprintf(stderr, "未知的伪造类型\n"); 

return 0; 


}//End of switch 

//定义一个宏 

#define MAX_READ_FILE_BUFF 1024 

//如果指定了一个信息的文件,则开始取信息 

if(Send_Data_File == ""){ 

FILE *SdFp = NULL; 

//打开文件 

SdFp = fopen(Send_Data_File, "r"); 

if(SdFp == NULL){ 

fprintf(stderr, "打开文件\":%s\"出错,出错代码:%d\n", Send_Data_File, GetLastError()); 


return 0; 

} 

memset(Send_Dest_Data, 0, MAX_BUFF_LEN); 

char tempbuff[MAX_READ_FILE_BUFF]; 

int tempread; 

int ReadSendDataNum = 0; 

while(1){ 

//读取文件,如果文件结束,则退出 

//如果文件内容超过最大缓冲区,则退出 

memset(tempbuff, 0, MAX_READ_FILE_BUFF); 


tempread = fread(tempbuff, sizeof(char), MAX_READ_FILE_BUFF, SdFp); 

if(tempread <= 0 || ReadSendDataNum == MAX_BUFF_LEN) 

break; 

if(ReadSendDataNum + tempread > MAX_BUFF_LEN) 

tempread = MAX_BUFF_LEN - ReadSendDataNum; 

memcpy(Send_Dest_Data + ReadSendDataNum, tempbuff, tempread); 

ReadSendDataNum += tempread; 

}//End of while 

fclose(SdFp); 

//如果尚未指定发送信息的大小,则采用实际读取的数据大小 


if(Send_Data_Size == 0) 

Send_Data_Size = ReadSendDataNum; 

//需要对齐数据 

if(Send_Data_Size % 32 != 0) 

Send_Data_Size += (32 - (Send_Data_Size % 32)); 

}//End of if 

return 1; 

} 



////////////////////////////////////////////////////////////// 


//赋初始化值函数 

////////////////////////////////////////////////////////////// 

int SetInitializeValue(int argc, char *argv[]){ 

int temp; 

//分析命令行,赋初值. 

for (int i = 1; i < argc; i++) { 

if (argv[i][0] == ’/’ || argv[i][0] == ’-’ || argv[i][0] == ’\\’) { 

//开始分析每个参数 

switch (argv[i][1]) { 

case ’?’: 


case ’H’: 

case ’h’: 

Usage(); 

break; 



case ’t’://tcp数据包 

//send_data_type的值1为tcp,2为udp,3为icmp,4为igmp 

Send_Data_Type = 1; 

//预取参数长度 

temp = strlen(&argv[i][3]); 


//检查ip参数长度 

if(temp <= 0 || temp > MAX_HOSTNAME_LAN) { 

fprintf(stderr, "目的长度出错:%s\n", argv[i]); 

return 0; 

} 

//接受ip参数 

strcpy(Dest_Ip, &argv[i][3]); 

break; 

case ’u’://udp数据包 

Send_Data_Type = 2; 


//预取参数长度 

temp = strlen(&argv[i][3]); 

if(temp <= 0 || temp > MAX_HOSTNAME_LAN) { 

fprintf(stderr, "目的长度出错:%s\n", argv[i]); 

return 0; 

} 

strcpy(Dest_Ip, &argv[i][3]); 

break; 

case ’c’://icmp数据包 

Send_Data_Type = 3; 


//预取参数长度 

temp = strlen(&argv[i][3]); 

if(temp <= 0 || temp > MAX_HOSTNAME_LAN) { 

fprintf(stderr, "目的长度出错:%s\n", argv[i]); 

return 0; 

} 

strcpy(Dest_Ip, &argv[i][3]); 

break; 

case ’g’://igmp数据包 

Send_Data_Type = 4; 


//预取参数长度 

temp = strlen(&argv[i][3]); 

if(temp <= 0 || temp > MAX_HOSTNAME_LAN) { 

fprintf(stderr, "目的长度出错:%s\n", argv[i]); 

return 0; 

} 

strcpy(Dest_Ip, &argv[i][3]); 

break; 

case ’n’://发送次数 

Send_Degree = atol(&argv[i][3]); 


if(Send_Degree <= 0){ 

fprintf(stderr, "发送次数参数出错:%s\n", argv[i]); 

return 0; 

} 

break; 

case ’x’://每个报文发送次数 

Send_Sdeg = atol(&argv[i][3]); 

if(Send_Sdeg <= 0){ 

fprintf(stderr, "每个报文发送次数参数出错:%s\n", argv[i]); 

return 0; 


} 

break; 



case ’m’://延迟时间 

Delay_Time = atoi(&argv[i][3]); 

if(Delay_Time <= 0 || Delay_Time >= MAX_PORT) { 

fprintf(stderr, "延迟参数出错:%s\n", argv[i]); 

return 0; 

} 

break; 




case ’d’://发送的信息 

//预取参数长度 

temp = strlen(&argv[i][3]); 

if(temp <= 0 || temp > MAX_BUFF_LEN) { 

fprintf(stderr, "目的长度出错:%s\n", argv[i]); 

return 0; 

} 

memset(Send_Dest_Data, 0, MAX_BUFF_LEN); 

strcpy(Send_Dest_Data, &argv[i][3]); 


//获得附加数据的大小 

Send_Data_Size = temp; 

break; 

case ’F’://发送信息由文件指定 

//预取参数长度 

temp = strlen(&argv[i][3]); 

if(temp <= 0 || temp > MAX_PATH) { 

fprintf(stderr, "文件长度超出:%s\n", argv[i]); 

return 0; 

} 


memset(Send_Data_File, 0, MAX_PATH); 

strcpy(Send_Data_File, &argv[i][3]); 

break; 

case ’S’://发送信息最大长度 

Send_Data_Size = atoi(&argv[i][3]); 

if(Send_Data_Size <= 0 || Send_Data_Size >= MAX_BUFF_LEN) { 

fprintf(stderr, "信息最大长度:%s\n", argv[i]); 

return 0; 

} 

break; 


//IP报文参数设置 

case ’I’: 

switch(argv[i][2]) { 

case ’S’: 

IP_TOSE = (UCHAR)atoi(&argv[i][4]); 

if(IP_TOSE <= 0 || IP_TOSE >= MAX_CHAR) { 

fprintf(stderr, "IP TOS参数出错:%s\n", argv[i]); 

return 0; 

} 

break; 


case ’I’: 

IP_IDENT = atoi(&argv[i][4]); 

if(IP_IDENT <= 0 || IP_IDENT >= MAX_SHORT) { 

fprintf(stderr, "IP IDENT参数出错:%s\n", argv[i]); 

return 0; 

} 

break; 

case ’F’: 

IP_FLAG = atoi(&argv[i][4]); 

if(IP_FLAG <= 0 || IP_FLAG >= MAX_SHORT) { 


fprintf(stderr, "IP FLAG参数出错:%s\n", argv[i]); 

return 0; 

} 

break; 

case ’T’: 

IP_TTLE = (UCHAR)atoi(&argv[i][4]); 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -