扫描器scanner的源代码,应该说是比较粗糙的

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

其实就是个取Banner。我那他改造了一下。有空检查一下效果如何:)
 

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