📄 数据包发送程序.txt
字号:
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 + -