ssaomiao.txt
上传用户:sdbfgg
上传日期:2021-06-01
资源大小:4k
文件大小:12k
源码类别:

扫描程序

开发平台:

Visual C++

  1. #include <stdio.h> 
  2. #include <winsock2.h> 
  3. #include <time.h> 
  4. #define iPort 80//目标Web Server端口 
  5. .#define szSign "500 13rnServer: Microsoft-IIS/5.0"//根据此标志来检查目标是否有漏洞 
  6. #pragma comment(lib,"ws2_32.lib") 
  7. /////////////////////////////////////////////////////////////////////////// 
  8. // 
  9. //定义&初始化全局变量 
  10. char *SendBuff="GET /NULL.printern",//发送的请求buff 
  11. CurrentTarget[52]={0},//存放最后一个线程将扫描的目标 
  12. turn[4][2]={"-","\","|","/"};//显示进度时的字符 
  13. int SendBuffLen=strlen(SendBuff),//发送的buff长度 
  14. iConnTimeout,//TCP Connect TimeOut 
  15. ii=0,//扫描进度 
  16.     iTotal;//服务器总数 
  17. HANDLE hSemaphore=NULL,//信标内核对象句柄,用来控制线程数量 
  18.        hStdout;//console标准输出句柄,做进度显示的时候用的 
  19. struct timeval timeout;//连接、发送和接收的超时值 
  20. DWORD SleepTime;//每个一个线程后等待的时间 
  21.     /* 
  22. SleepTime值根据用户输入的线程数量[ThreadNum]和TCP ConnectTimeOut[ConNTIMEO]来计算。确保在ConNTIMEO时间左右开ThreadNum个线程。这样在ConNTIMEO时间后,所开的线程开始陆续超时退出,可以继续稳定的开线程,可以有效的保证同时有ThreadNum个线程在运行。
  23. */ 
  24. /////////////////////////////////////////////////////////////////////////// 
  25. void ShowError(char *);//显示出错信息函数
  26. BOOL ResetCursor(void);//重置光标位置,线程输出的时候调用的 
  27. DWORD WINAPI ShowProInfo(LPVOID);//显示进度信息 
  28. DWORD WINAPI scan(LPVOID);//扫描函数 
  29. void usage(char *);//帮助函数 
  30. /////////////////////////////////////////////////////////////////////////// 
  31. int main(int argc,char **argv) 
  32.     HANDLE hThread=NULL;//线程句柄 
  33.     DWORD dwThreadID;//线程ID 
  34.     struct sockaddr_in sa; 
  35.     int i, 
  36.        MaxThread;//最大线程数量 
  37.     WSADATA    wsd; 
  38.     long PreviousCount; 
  39.     clock_t start,end;//程序运行的起始和结束时间 
  40.     double duration; 
  41.     //检查用户输入参数 
  42.     if(argc!=5) 
  43.     { 
  44.        usage(argv[0]); 
  45.        return 1; 
  46.     } 
  47.     //get target range 
  48.     int StartNet=inet_addr(argv[1]); 
  49.     int StopNet=inet_addr(argv[2]); 
  50.     int StartHost=ntohl(StartNet); 
  51.     int StopHost=ntohl(StopNet); 
  52.     //取得线程数量 
  53.     MaxThread=atoi(argv[3]); 
  54.     //取得conn超时时间 
  55.     iConnTimeout=atoi(argv[4]); 
  56.     //检查参数合法性 
  57.     if((iConnTimeout>6) || (iConnTimeout<2) || (MaxThread<1) || (MaxThread>500) || (StopHost<StartHost)) 
  58.     { 
  59.        usage(argv[0]); 
  60.        return 1; 
  61.     } 
  62.     //计算时间 
  63.     SleepTime=1000*iConnTimeout/MaxThread; 
  64.     //设置连接超时值 
  65.     timeout.tv_sec = iConnTimeout; 
  66.     timeout.tv_usec =0; 
  67.     __try 
  68.     { 
  69.        //开始计时 
  70.        start=clock(); 
  71.        //加载winsock库 
  72.        if (WSAStartup(MAKEWORD(1,1), &wsd) != 0) 
  73.        { 
  74.            ShowError("WSAStartup"); 
  75.            __leave; 
  76.        } 
  77.        //创建信标内核对象句柄 
  78.        hSemaphore=CreateSemaphore(NULL,MaxThread,MaxThread,NULL); 
  79.        if(hSemaphore==NULL) 
  80.        { 
  81.            ShowError("CreateSemaphore"); 
  82.            __leave; 
  83.        } 
  84.        //取得console标准输出句柄 
  85.        hStdout=GetStdHandle(STD_OUTPUT_HANDLE); 
  86.        if(hStdout==INVALID_HANDLE_VALUE) 
  87.        { 
  88.            ShowError("GetStdHandle"); 
  89.            __leave; 
  90.        } 
  91.        //设置目标总数 
  92.        iTotal=StopHost-StartHost; 
  93.        //创建进度显示线程 
  94.        hThread=CreateThread(NULL,0,ShowProInfo,NULL,0,&dwThreadID); 
  95.        if(hThread==NULL) 
  96.        { 
  97.            ShowError("1 CreateThread"); 
  98.            __leave; 
  99.        } 
  100. //关闭句柄 
  101.        CloseHandle(hThread); 
  102.        //循环创建扫描线程 
  103.        for(i=StartHost;i<=StopHost;i++) 
  104.        { 
  105.            //等待信标内核对象通知 
  106.            WaitForSingleObject(hSemaphore,INFINITE); 
  107.            //create thread to scan 
  108.            hThread=CreateThread(NULL,0,scan,(LPVOID)i,0,&dwThreadID); 
  109.            if(hThread==NULL) 
  110.            { 
  111.               ShowError("2 CreateThread"); 
  112.               break; 
  113.            } 
  114.            //进度自加1 
  115.            ii++; 
  116.            //重设最后一个线程扫描的目标 
  117.            sa.sin_addr.s_addr=htonl(i); 
  118.            strncpy(CurrentTarget,inet_ntoa(sa.sin_addr),sizeof(CurrentTarget)); 
  119.           //休息一会儿 ) 
  120.            Sleep(SleepTime); 
  121.            //关闭线程句柄 
  122.            CloseHandle(hThread); 
  123.        } 
  124.        //等待所有线程结束 
  125.        while(1) 
  126.        { 
  127.            WaitForSingleObject(hSemaphore,INFINITE); 
  128.            if(!ReleaseSemaphore(hSemaphore,1,&PreviousCount)) 
  129.            { 
  130.               ShowError("main() ReleaseSemaphore"); 
  131.               Sleep(5000); 
  132.               break; 
  133.            } 
  134.            if(PreviousCount==(MaxThread-1)) 
  135.            { 
  136.               printf("nAll done."); 
  137.               break; 
  138.            } 
  139.            Sleep(500); 
  140.        } 
  141.     }//end of try 
  142.     //搞定,清场,收工 
  143.     __finally 
  144.     { 
  145.        //计时结束 
  146.        end=clock(); 
  147.        //转换时间格式 
  148.        duration = (double)(end - start) / CLOCKS_PER_SEC; 
  149.        //显示所用时间 
  150.        printf("nnComplete.Scan %d targets use %2.1f seconds.Speed %0.3g/sn",iTotal,duration,iTotal/duration); 
  151.        //关闭句柄 
  152.        CloseHandle(hStdout); 
  153.        CloseHandle(hSemaphore); 
  154.        WSACleanup(); 
  155.     } 
  156.     return 0; 
  157. /////////////////////////////////////////////////////////////////////////// 
  158. // 
  159. //回显错误信息函数 
  160. // 
  161. void ShowError(char *msg) 
  162.     MessageBox(NULL,msg,"ERROR",0); 
  163.     //printf("n%s failed:%d",GetLastError()); 
  164. ////////////////////////////////////////////////////////////////////////// 
  165. // 
  166. //重置光标位置函数,以便扫描线程输出结果 
  167. // 
  168. BOOL ResetCursor() 
  169.     ConSOLE_SCREEN_BUFFER_INFO ConsoleScreenBufferInfo; 
  170.     //取得当前光标位置 
  171.     if(!GetConsoleScreenBufferInfo(hStdout,&ConsoleScreenBufferInfo)) 
  172.     { 
  173.        ShowError("GetConsoleScreenBufferInfo"); 
  174.        return FALSE; 
  175.     } 
  176.     //设置光标X坐标为0 
  177.     ConsoleScreenBufferInfo.dwCursorPosition.X=0; 
  178.     //设置当前光标位置 
  179.     SetConsoleCursorPosition(hStdout,ConsoleScreenBufferInfo.dwCursorPosition); 
  180.     return TRUE; 
  181. /////////////////////////////////////////////////////////////////////////// 
  182. // 
  183. //显示进度信息函数 
  184. // 
  185. DWORD WINAPI ShowProInfo(LPVOID lp) 
  186. {   
  187.     int j,k; 
  188.     ConSOLE_SCREEN_BUFFER_INFO ConsoleScreenBufferInfo; 
  189.     float m; 
  190.     for(j=0;ii<iTotal;j++) 
  191.     { 
  192.        //休息一会儿 )) 
  193.        Sleep(SleepTime); 
  194.        //取得当前光标位置 
  195.        if(!GetConsoleScreenBufferInfo(hStdout,&ConsoleScreenBufferInfo)) 
  196.        { 
  197.            ShowError("GetConsoleScreenBufferInfo"); 
  198.            return 1; 
  199.        } 
  200.        //设置百分比进度显示的X坐标 
  201.        ConsoleScreenBufferInfo.dwCursorPosition.X=0; 
  202.        //设置当前光标位置 
  203.        SetConsoleCursorPosition(hStdout,ConsoleScreenBufferInfo.dwCursorPosition); 
  204.        //已经完成的百分比 
  205.        m=(ii+1)*100.00/iTotal; 
  206.        //显示进度 
  207.        if(ii==iTotal) 
  208.        { 
  209.            printf("******** 100%% Wait %d seconds to exit ********       n",iConnTimeout); 
  210.            break; 
  211.        } 
  212.        else 
  213.        { 
  214.            k=j%4; 
  215.            printf("%-15s %s [%d/%d] %s %%%0.3g",CurrentTarget,turn[k],ii,iTotal,turn[k],m); 
  216.        } 
  217.     }//end of for 
  218.     return 0; 
  219. /////////////////////////////////////////////////////////////////////////// 
  220. // 
  221. //扫描函数 
  222. // 
  223. DWORD WINAPI scan(LPVOID lp) 
  224.     int i=(int)lp,iErr; 
  225.     struct sockaddr_in server; 
  226.     SOCKET s=INVALID_SOCKET; 
  227.     char RecvBuff[1024]={0},*ptr; 
  228.     int RecvBuffLen=sizeof(RecvBuff); 
  229.     u_long ul=1;//初始化为为非0值 
  230.   fd_set r,w; 
  231.     //create socket 
  232.     s=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 
  233.     if(s==INVALID_SOCKET) 
  234.     { 
  235.        printf("nCreate socket failed:%d",GetLastError()); 
  236.        ExitProcess(1); 
  237.     } 
  238.     //fill the addr struct 
  239.     server.sin_family=AF_INET; 
  240.     server.sin_port=htons(iPort); 
  241.     server.sin_addr.S_un.S_addr=htonl(i); 
  242.     __try 
  243.     { 
  244.        //设置socket为非锁定模式,ul为0值的话,那么soocket将被设置为锁定模式 
  245.        iErr=ioctlsocket(s,FIonBIO,(unsigned long*)&ul); 
  246.        if(iErr==SOCKET_ERROR ) 
  247.        { 
  248.            ResetCursor(); 
  249.            ShowError("ioctlsocket"); 
  250.            ExitProcess(1); 
  251.        } 
  252.        //printf("n%X ioctl ok.strat conn",i); 
  253.        //connect to target 
  254.        connect(s,(struct sockaddr *)&server,sizeof(server)); 
  255.        //printf("n%X conn return,start select w",i); 
  256.        //设置select参数 
  257.        FD_ZERO(&w); 
  258.        FD_SET(s, &w); 
  259.        //等待connect成功&socket可写 
  260.        iErr=select(0, 0, &w, 0, &timeout); 
  261.        //printf("n%X select w return %d",i,iErr); 
  262.        //等待返回后,socket仍不可写则退出 
  263.        if((iErr==SOCKET_ERROR) || (iErr==0)) 
  264.        { 
  265.            //printf("n%X select return w err,exit",i); 
  266.            __leave; 
  267.        } 
  268.        //socket可写则继续 
  269.        else 
  270.        { 
  271.            //send buff to target 
  272.            //printf("n%X send",i); 
  273.            iErr=send(s,SendBuff,SendBuffLen,0); 
  274.            //printf("n%X send return",i); 
  275.            if(iErr==SOCKET_ERROR) 
  276.               __leave; 
  277.        } 
  278.        //等待socket可读 
  279.        FD_ZERO(&r); 
  280.        FD_SET(s, &r); 
  281.        //printf("n%X start select r",i); 
  282.        iErr=select(0, &r, 0, 0, &timeout); 
  283.        //printf("n%X select r return %d",i,iErr); 
  284.        if((iErr==SOCKET_ERROR) || (iErr==0)) 
  285.        { 
  286.            //printf("n%X select r err,exit",i); 
  287.            __leave; 
  288.        } 
  289.        else 
  290.        { 
  291.            //recv buff from target 
  292.            //printf("n%X start recv",i); 
  293.            iErr=recv(s,RecvBuff,RecvBuffLen,0); 
  294.            //printf("n%X recv ret",i); 
  295.            if(iErr==SOCKET_ERROR) 
  296.               __leave; 
  297.        } 
  298.        //verify buff 
  299.        ptr=strstr(RecvBuff,szSign); 
  300.        if(ptr!=NULL) 
  301.        { 
  302.            //线程输出前要先调用ResetCursor函数 
  303.            ResetCursor(); 
  304.            //输出信息后务必加一个以上换行符号,输出前请别加换行符号,以免显示混乱 
  305.            printf("[%-15s] has .printer mapped.        n",inet_ntoa(server.sin_addr)); 
  306.        } 
  307.     } 
  308.     __finally 
  309.     { 
  310.        if(!ReleaseSemaphore(hSemaphore,1,NULL)) 
  311.            ShowError("thread ReleaseSemaphore failed"); 
  312.        closesocket(s); 
  313.     } 
  314.     return 0; 
  315. /////////////////////////////////////////////////////////////////////////// 
  316. void usage(char *proname) 
  317.     printf("n%s v0.1 only can find IIS5 .Printer mapped" 
  318.        "nPower by ey4s<ey4s@21cn.com> 2001.5.20" 
  319.        "nhttp://www.patching.net" 
  320.        "nnUsage:%s <StartIP> <EndIP> <ThreadNum> <ConNTIMEO>" 
  321.        "nnNotice" 
  322.        "n    StartIP StopIP ==>Don‘t forgot StopIP must large than StartIP " 
  323.        "n    ThreadNum ==>Thread number,please input between 1-500" 
  324.        "n    ConNTIMEO ==>TCP connect timeout,please input between 2-6" 
  325.        "nnExample" 
  326.        "n    %s 192.168.0.0 192.168.255.255 200 2",proname,proname,proname); 
  327. 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/shat_a_t/archive/2008/06/09/2527743.aspx