论坛: 编程破解 标题: VC程序问题,请教286, 复制本贴地址    
作者: zlj982 [zlj982]    论坛用户   登录
  这是一个针对CGI的扫描程序,程序如下:
 
#include <stdio.h>

#include <winsock2.h>

#include <time.h>

#define iPort 5000 //目标Web Server端口

#define szSign "500 13\r\nServer: Microsoft-IIS/5.0"//根据此标志来检查目标是否有漏洞

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

///////////////////////////////////////////////////////////////////////////

//

//file://定义&初始化全局变量


//


char *SendBuff="GET /NULL.printer\n",//发送的请求buff



CurrentTarget[52]={0},//存放最后一个线程将扫描的目标



turn[4][2]={"-","\\","|","/"};//显示进度时的字符



int SendBuffLen=strlen(SendBuff),//发送的buff长度



iConnTimeout,//TCP Connect TimeOut



ii=0,//扫描进度



iTotal;//服务器总数



HANDLE hSemaphore=NULL,//信标内核对象句柄,用来控制线程数量



hStdout;//console标准输出句柄,做进度显示的时候用的



struct timeval timeout;//连接、发送和接收的超时值



DWORD SleepTime;//每个一个线程后等待的时间



/*



SleepTime值根据用户输入的线程数量[ThreadNum]和TCP ConnectTimeOut[CONNTIMEO]来计算。确保在CONNTIMEO时间左右开 ThreadNum个线程。这样在CONNTIMEO时间后,所开的线程开始陆续超时退出,可以继续稳定的开线程,可以有效的保证同时有 ThreadNum个线程在运行。



*/



///////////////////////////////////////////////////////////////////////////



void ShowError(char *);//显示出错信息函数,可以写完善一些,偶偷懒了:)



BOOL ResetCursor(void);//重置光标位置,线程输出的时候调用的



DWORD WINAPI ShowProInfo(LPVOID);//显示进度信息



DWORD WINAPI scan(LPVOID);//扫描函数



void usage(char *);//帮助函数



///////////////////////////////////////////////////////////////////////////



int main(int argc,char **argv)



{



HANDLE hThread=NULL;//线程句柄



DWORD dwThreadID;//线程ID



struct sockaddr_in sa;



int i,



MaxThread;//最大线程数量



WSADATA wsd;



long PreviousCount;



clock_t start,end;//程序运行的起始和结束时间



double duration;






// file://检查用户输入参数



if(argc!=5)



{



usage(argv[0]);



return 1;



}



// file://get target range



int StartNet=inet_addr(argv[1]);



int StopNet=inet_addr(argv[2]);



int StartHost=ntohl(StartNet);



int StopHost=ntohl(StopNet);



// file://取得线程数量



MaxThread=atoi(argv[3]);



// file://取得conn超时时间



iConnTimeout=atoi(argv[4]);



// file://检查参数合法性



if(((iConnTimeout>6)||
(iConnTimeout<2))||
((MaxThread<1)||
(MaxThread>500))||
(StopHost<StartHost))



{



usage(argv[0]);



return 1;



}



// file://计算时间



SleepTime=1000*iConnTimeout/MaxThread;



// file://设置连接超时值



timeout.tv_sec = iConnTimeout;



timeout.tv_usec =0;



__try



{



// file://开始计时



start=clock();



// file://加载winsock库



if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)



{



  ShowError("WSAStartup");



  __leave;



}



// file://创建信标内核对象句柄



hSemaphore=CreateSemaphore(NULL,MaxThread,MaxThread,NULL);



if(hSemaphore==NULL)



{



  ShowError("CreateSemaphore");



  __leave;



}



// file://取得console标准输出句柄



hStdout=GetStdHandle(STD_OUTPUT_HANDLE);



if(hStdout==INVALID_HANDLE_VALUE)



{



  ShowError("GetStdHandle");



  __leave;



}



// file://设置目标总数



iTotal=StopHost-StartHost;



// file://创建进度显示线程



hThread=CreateThread(NULL,0,ShowProInfo,NULL,0,&dwThreadID);



if(hThread==NULL)



{



  ShowError("1 CreateThread");



  __leave;



}



//file://关闭句柄



CloseHandle(hThread);



// file://循环创建扫描线程



for(i=StartHost;i<=StopHost;i++)



{



// file://等待信标内核对象通知



  WaitForSingleObject(hSemaphore,INFINITE);



//  file://create thread to scan



  hThread=CreateThread(NULL,0,scan,(LPVOID)i,0,&dwThreadID);



  if(hThread==NULL)



{



  ShowError("2 CreateThread");



break;



}



// file://进度自加1



  ii++;



// file://重设最后一个线程扫描的目标



  sa.sin_addr.s_addr=htonl(i);



  strncpy(CurrentTarget,inet_ntoa(sa.sin_addr),sizeof(CurrentTarget));



// file://休息一会儿:))



  Sleep(SleepTime);



// file://关闭线程句柄



  CloseHandle(hThread);



}



// file://等待所有线程结束



while(1)



{



  WaitForSingleObject(hSemaphore,INFINITE);



  if(!ReleaseSemaphore(hSemaphore,1,&PreviousCount))



{



ShowError("main() ReleaseSemaphore");



Sleep(5000);



break;



}



  if(PreviousCount==(MaxThread-1))



  {



printf("\nAll done.");



break;



}



  Sleep(500);



}



}//end of try



// file://搞定,清场,收工



__finally



{



// file://计时结束



end=clock();



// file://转换时间格式



duration = (double)(end - start) / CLOCKS_PER_SEC;



// file://显示所用时间



printf("\n\nComplete.Scan %d targets use %2.1f seconds.Speed %0.3g/s\n",iTotal,duration,iTotal/duration);



// file://关闭句柄



CloseHandle(hStdout);



CloseHandle(hSemaphore);



WSACleanup();



}



return 0;



}



///////////////////////////////////////////////////////////////////////////



//



//file://回显错误信息函数



//



void ShowError(char *msg)



{



MessageBox(NULL,msg,"ERROR",0);



printf("\n%s failed:%d",GetLastError());



}



//////////////////////////////////////////////////////////////////////////



//



//file://重置光标位置函数,以便扫描线程输出结果



//



BOOL ResetCursor()



{



CONSOLE_SCREEN_BUFFER_INFO ConsoleScreenBufferInfo;



// file://取得当前光标位置



if(!GetConsoleScreenBufferInfo(hStdout,&ConsoleScreenBufferInfo))



{



ShowError("GetConsoleScreenBufferInfo");



return FALSE;



}



// file://设置光标X坐标为0



ConsoleScreenBufferInfo.dwCursorPosition.X=0;



// file://设置当前光标位置



SetConsoleCursorPosition(hStdout,ConsoleScreenBufferInfo.dwCursorPosition);



return TRUE;



}



///////////////////////////////////////////////////////////////////////////



//



//file://显示进度信息函数



//



DWORD WINAPI ShowProInfo(LPVOID lp)



{



int j,k;



CONSOLE_SCREEN_BUFFER_INFO ConsoleScreenBufferInfo;



float m;



for(j=0;ii<iTotal;j++)



{



// file://休息一会儿:)))



Sleep(SleepTime);



// file://取得当前光标位置



if(!GetConsoleScreenBufferInfo(hStdout,&ConsoleScreenBufferInfo))



{



  ShowError("GetConsoleScreenBufferInfo");



  return 1;



}



// file://设置百分比进度显示的X坐标



ConsoleScreenBufferInfo.dwCursorPosition.X=0;



// file://设置当前光标位置



SetConsoleCursorPosition(hStdout,ConsoleScreenBufferInfo.dwCursorPosition);



// file://已经完成的百分比



m=(ii+1)*100.00/iTotal;



// file://显示进度



if(ii==iTotal)



{



  printf("******** 100%% Wait %d seconds to exit ********  \n",iConnTimeout);



  break;



}



else



{



  k=j%4;



  printf("%-15s %s [%d/%d] %s %%%0.3g",CurrentTarget,turn[k],ii,iTotal,turn[k],m);



}



}//end of for



return 0;



}



///////////////////////////////////////////////////////////////////////////



//



//file://扫描函数



//



DWORD WINAPI scan(LPVOID lp)



{



int i=(int)lp,iErr;



struct sockaddr_in server;



SOCKET s=INVALID_SOCKET;



char RecvBuff[1024]={0},*ptr;



int RecvBuffLen=sizeof(RecvBuff);



u_long ul=1;//初始化为为非0值



fd_set  r,w;






// file://create socket



s=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);



if(s==INVALID_SOCKET)



{



printf("\nCreate socket failed:%d",GetLastError());



ExitProcess(1);



}



// file://fill the addr struct



server.sin_family=AF_INET;



server.sin_port=htons(iPort);



server.sin_addr.S_un.S_addr=htonl(i);



__try



{



// file://设置socket为非锁定模式,ul为0值的话,那么soocket将被设置为锁定模式



iErr=ioctlsocket(s,FIONBIO,(unsigned long*)&ul);



if(iErr==SOCKET_ERROR )



{



  ResetCursor();



  ShowError("ioctlsocket");



  ExitProcess(1);



}



printf("\n%X ioctl ok.strat conn",i);



// file://connect to target



connect(s,(struct sockaddr *)&server,sizeof(server));



printf("\n%X conn return,start select w",i);



// file://设置select参数



FD_ZERO(&w);



FD_SET(s, &w);



// file://等待connect成功&socket可写



iErr=select(0, 0, &w, 0, &timeout);



printf("\n%X select w return %d",i,iErr);



// file://等待返回后,socket仍不可写则退出



if((iErr==SOCKET_ERROR)||
(iErr==0))



{



    printf("\n%X select return w err,exit",i);



  __leave;



}



// file://socket可写则继续



else



{



//  file://send buff to target



  printf("\n%X send",i);



  iErr=send(s,SendBuff,SendBuffLen,0);



  printf("\n%X send return",i);



  if(iErr==SOCKET_ERROR)



__leave;



}



// file://等待socket可读



FD_ZERO(&r);



FD_SET(s, &r);



printf("\n%X start select r",i);



iErr=select(0, &r, 0, 0, &timeout);



  printf("\n%X select r return %d",i,iErr);



if((iErr==SOCKET_ERROR)||
(iErr==0))



{



    printf("\n%X select r err,exit",i);



  __leave;



}



else



{



//  file://recv buff from target



//  file://printf("\n%X start recv",i);



  iErr=recv(s,RecvBuff,RecvBuffLen,0);



  printf("\n%X recv ret",i);



  if(iErr==SOCKET_ERROR)



__leave;



}



// file://verify buff



ptr=strstr(RecvBuff,szSign);



if(ptr!=NULL)



{



// file://线程输出前要先调用ResetCursor函数



  ResetCursor();



// file://输出信息后务必加一个以上换行符号,输出前请别加换行符号,以免显示混乱



  printf("[%-15s] has .printer mapped. \n",inet_ntoa(server.sin_addr));



}



}



__finally



{



if(!ReleaseSemaphore(hSemaphore,1,NULL))



  ShowError("thread ReleaseSemaphore failed");



closesocket(s);



}



return 0;


                           
}



///////////////////////////////////////////////////////////////////////////



void usage(char *proname)



{



printf("\n%s v0.1 only can find IIS5 .Printer mapped"



"\nPower by ey4s<ey4s@21cn.com> 2001.5.20"



"\nhttp://www.patching.net"



"\n\nUsage:%s <StartIP> <EndIP> <ThreadNum> <CONNTIMEO>"



"\n\nNotice"



"\nStartIP StopIP ==>Don‘t forgot StopIP must large than StartIP "



"\nThreadNum ==>Thread number,please input between 1-500"



"\nCONNTIMEO ==>TCP connect timeout,please input between 2-6"



"\n\nExample"



"\n%s 192.168.0.0 192.168.255.255 200 2",proname,proname,proname);



}

请问是不是缺少了取得用户输入参数的函数,应该怎么加?我自己试过添加了,可惜我太菜了,还望赐教!!!


地主 发表时间: 05-05-15 17:11

回复: 286 [unique]   版主   登录
程序名 v0.1 only can find IIS5 .Printer
Power by ey4s<ey4s@21cn.com> 2001.5.20 http://www.patching.net

Usage:程序名 <StartIP> <EndIP> <ThreadNu

Notice
StartIP StopIP ==>Don‘t forgot StopIP m
ThreadNum ==>Thread number,please input
CONNTIMEO ==>TCP connect timeout,please

Example
程序名 192.168.0.0 192.168.255.255 200 2

B1层 发表时间: 05-05-16 09:19

回复: echo [qiezic]      登录
这么长也看的下去,286牛!
你们这些问问题的也不替别人考虑一下,把不必要的代码砍去,帖出简短的关键部分代码!

B2层 发表时间: 05-05-16 10:48

回复: zlj982 [zlj982]   论坛用户   登录
  谢谢286,结果我也运行出来了,但马上就PRESS ANY KEY TO CONTINUE,什么愿意?还希望解答!
  谢谢提醒,我以后会注意的。

B3层 发表时间: 05-05-16 19:48

论坛: 编程破解

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号