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

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

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

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

转载于:https://blog.51cto.com/linkboy/300409

扫描器scanner的源代码相关推荐

  1. Java基础知识之扫描器(Scanner)

    一.定义: 一个可以使用正则表达式来解析基本类型和字符串的简单文本扫描器 Scanner 使用分隔符模式将其输入分解为标记,默认情况下该分隔符模式与空白匹配.然后可以使用不同的 next 方法将得到的 ...

  2. 扫描器Scanner

    文章目录 一.扫描器的使用 二,扫描器的注意事项 一.扫描器的使用 接收用户输入的数据,就可以使用键盘输入语句来获取. 使用扫描器: import java.util.Scanner;//导包 - S ...

  3. Java基础之 Scanner 扫描器

    学习Demo:Demo1 Scanner类:Java的输入类 Scanner类既可以读字符,也可以读字符串和整数 码上行动:Demo1 import java.util.Scanner;/*** Ja ...

  4. 使用Scanner扫描器时NoSuchElementException异常

    当我们在使用控制台输入操作时,最常用到的是扫描器Scanner工具类,但一般使用该类都忘记了关闭资源,最近写代码时特意每次使用都执行了关闭操作,结果出现了异常NoSuchElementExceptio ...

  5. ApI、toString方法、equals方法、Scanner方法基本知识

    1.APi 定义:应用程序接口[application programming interface] 接口:用于规定方法名称的集合.定义方法的修饰符.返回值类型.方法的名称.方法的参数列表.方法的功能 ...

  6. Scanner 中next()和nexline()方法的区别

    在java实现字符窗口的输入时,很多人更喜欢选择使用扫描器scanner,它操作起来比较简单.在编程的过程中,我发现用scanner实现字符串的输入有两种方法,一种是next(),另一种是nextli ...

  7. 无线安全入门、芯片选型、扫描器使用

    相关学习资料 http://www.cnblogs.com/LittleHann/p/3700357.html http://www.anywlan.com/ http://radiowar.dian ...

  8. 强哥说Java--Java Scanner 类

    Java Scanner类 Java Scanner 类 前言 1. 定义 2. Scanner 对象创建 3. 常用方法 3.1 next()及其同伴方法 3.1.1 next() 方法 3.1.2 ...

  9. java scanner 教程,Java Scanner 类 - Java 入门教程

    一直以来,我们都使用 System.out.println() 方法向屏幕打印内容,那么如何接收输入的内容呢?本小节所学习的 Scanner 类就可以实现对输入内容的接收.在本小节,我们将学习 Sca ...

最新文章

  1. 最新android webview,Android 关于WebView全方面的使用(项目应用篇)
  2. gulp项目配置指南
  3. ubuntu 18.04 64bit下如何安装安卓虚拟机anbox?
  4. RTL 和 综合 等一些基本概念的摘记
  5. jboss5.1安全性配置_使用Java EE安全性和JBoss AS 7.x保护JSF应用程序的安全
  6. 前端学习(1990)vue之电商管理系统电商系统之自定义时间过滤器
  7. Spark的ShuffleManager
  8. python seaborn_Python数据分析之Seaborn(样式风格)
  9. CentOS6.9+Hadoop2.7.3+Hive1.2.1+Hbase1.3.1+Spark2.1.1
  10. opengl (1) 基本API的熟悉
  11. ubuntu16.04中将python3设置为默认
  12. python pip 安装 win10 解决anacoda代理错误 ProxyError: Conda cannot proxy configuration
  13. 【数学基础】线性方程组解情况整理
  14. 硬禾课堂 - 一分钟焊接小技巧
  15. 从单体式架构迁移到微服务架构
  16. OPPO R17在哪里打开usb调试模式的完美流程
  17. 【综述笔记】一些弱监督语义分割论文
  18. 中国超级计算机之最,中国超级计算机神威太湖之光世界最快,且总量排名榜单第一...
  19. 同一个局域网我可以访问同事的电脑同事的访问不了我的本地项目
  20. Python标准库time

热门文章

  1. oracle-group by -having
  2. 将markdown编译为HTML和PDF
  3. linux命令详解——iostat
  4. 电脑中病毒后被隐藏的文件的显示
  5. 巧用apply让javascript函数仅执行一次
  6. Oracle数据库 查看表是否是 索引组织表的方法
  7. Kylin工作原理、体系架构
  8. SSH整合中,使用父action重构子类action类.(在父类中获取子类中的泛型对象)
  9. javaScript获取url中的参数
  10. surfaceView中的线程问题