一个简单的端口扫描程序题

来源:互联网 发布:网络禁书目录 编辑:程序博客网 时间:2024/06/05 04:36

一、TCP扫描技术

  常用的端口扫描技术有很多种,如 TCP connect() 扫描 、TCP SYN 扫描、TCP FIN 扫描 等,网络上也有很多文章专门介绍,比如 :http://www.antai-genecon.com/suml/zhishiyy/jingong/duankougj.htm 上就介绍了很多我的程序 所使用的最基本的扫描技术:TCP 扫描。
  操作系统提供的 connect() 系统调用,用来与每一个感兴趣的目标计算机的端口进行连接。如果端口处于侦听状态,那么connect()就能成功。否则,这个端口是不能用的,即没有提供服务。这个技术的一个最大的优点是,你不需要任何权限。系统中的任何用户都有权利使用这个调用。另一个好处就是速度。如果对每个目标端口以线性的方式,使用单独的connect()调用,那么将会花费相当长的时间,你可以通过同时打开多个套接字,从而加速扫描。使用非阻塞 I/O 允许你设置一个低的时间用尽周期,同时观察多个套接字。但这种方法的缺点是很容易被发觉,并且被过滤掉。目标计算机的logs文件会显示一连串的连接和连接是出错的服务消息,并且能很快的使它关闭。
  作者提示:未经许可扫描他人的计算机端口属非法行为。本程序只是展示一种端口扫描技术,请不得将其用于非法目的,否则后果自负。

二、程序简介

  为了提高扫描速度,本程序采用了多线程技术和非阻塞I/O的技术。程序的主界面是一个对话框,下面是程序框架示意图:



1、全局变量:

  以下是所有全局变量的定义:

HWND g_hWnd = NULL; //处理消息的窗口句柄unsigned long g_ulAddr = INADDR_NONE; //扫描的主机地址DWORD g_dwTimeOut = 1000; //连接超时时间,以ms计bool g_bTerminate = false; //是否用户发出结束扫描的标志short g_nMaxThread = 200; //最大允许的扫描线程数,经试验不宜大于200short g_nThreadCount = 0; //当前正在扫描的进程数

2、StartScan 线程:

  这个线程完成的任务是启动具体的扫描DoScanPort线程,对某一个端口进行扫描。该进程启动的DoScanPort线程的最大数量在设定的值范围内,如果线程数已达最大,则会等待某些线程结束后再启动新的线程。如果用户发出结束扫描信息,则不再启动新的线程,而等待已启动的线程结束后返回。下面是这线程的执行体代码:

DWORD WINAPI StartScan(LPVOID lpParam){tag_PORTS* pScanParam = (tag_PORTS*)lpParam;DWORD dwThreadId;unsigned short i;if (pScanParam->bSepecifiedPort){for(i=0; i<=pScanParam->nCount; i++){if (g_bTerminate){break;//用户已发出结束扫描命令}while(g_nThreadCount >= g_nMaxThread){Sleep(10);}if (CreateThread(NULL,                  0,                 DoScanPort,                 (LPVOID)new short(pScanParam->nArrOfPorts[i]),                 0,                 &dwThreadId) != NULL){g_nThreadCount ++;}}}else{for(i=pScanParam->iStartPort; i<=pScanParam->iEndPort; i++){if (g_bTerminate){break;//用户已发出结束扫描命令}while(g_nThreadCount >= g_nMaxThread){Sleep(10);}if (CreateThread(NULL, 0, DoScanPort, (LPVOID)new short(i), 0, &dwThreadId) != NULL){g_nThreadCount ++;}}}//等待各端口扫描线程结束while (g_nThreadCount > 0){Sleep(50);}::SendMessage(g_hWnd, SCAN_THREAD, STARTSCAN_COMPLETE, 0);delete pScanParam;return ERROR_SUCCESS;}      

3、DoScanPort 线程:

  这个线程负责具体扫描指定的端口,并将结果SendMessage给主对话框。下面是其代码:

DWORD WINAPI DoScanPort(LPVOID lpParam){DWORD dwRet;short nPort = *(short*)lpParam;delete lpParam;SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);if(sock == INVALID_SOCKET){AfxMessageBox("创建套接字失败!");dwRet = ERROR_CREATE_SOCKET;}else{unsigned long flag = 1; if ((ioctlsocket(sock, FIONBIO, &flag) != 0)){AfxMessageBox("未能改为非阻塞模式!");dwRet = ERROR_MODIFY_FIONBIO;}else{sockaddr_in severAddr;severAddr.sin_family = AF_INET;severAddr.sin_port = htons(nPort); severAddr.sin_addr.S_un.S_addr = g_ulAddr;connect(sock, (sockaddr*)&severAddr, sizeof(severAddr));struct fd_set mask;FD_ZERO(&mask);FD_SET(sock, &mask);struct timeval timeout;timeout.tv_sec = g_dwTimeOut / 1000;timeout.tv_usec = g_dwTimeOut % 1000;switch(select(0, NULL, &mask, NULL, &timeout)){case -1:dwRet = ERROR_SELECT;break;case 0:dwRet = ERROR_SELECT_TIMEOUT;break;default:dwRet = ERROR_SUCCESS;};}closesocket(sock);}g_nThreadCount --;if (dwRet == ERROR_SUCCESS){::SendMessage(g_hWnd, SCAN_THREAD, DOSCAN_FIND_PORT, nPort);}else{::SendMessage(g_hWnd, SCAN_THREAD, DOSCAN_END_PORT, nPort);}return dwRet;}      

三、运行结果

  本程序在VC6+WinXp下编写调试运行正确,在Win98下运行正确。
在我的计算机扫描本机1-5000号端口,超时设置1000ms,200个最大线程数,约需要45秒。当超时设置再短一些时速度可达每秒150个端口的速度。

四、结束语

  事实上,速度要想再提高,可能需要其它方法了。如果线程数开得过多,则由于线程的调度开销过大,速度反而会降低。如果超时设置过短,可能引起扫描的结果不正确(这须视网络情况决定),并且由于是多线程,超时等待的时间也可能小于因线程调度而等待的时间,则也不能提高速度。
  另外我还发现了一个问题,就是扫描本机时,如果以IP地址127.0.0.1时,则139#端口没有开放;如果设置为本机的实际IP时则139#端口是开放的,这不知是何原因,还望高手指点。
  本程序还有一个需要改进的地方,就是不象大多数端口扫描器可扫描指定的IP段,而只设计成扫描指定的某一台主机。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 荣耀9i手机总是滑手怎么办? 春兰空调没发票不给修怎么办 洗衣机顶盖的安全开关坏了怎么办 苹果手机的开关健坏了怎么办 淘宝买的东西快递弄破损了怎么办 京东购买邮来手机里面没有怎么办 孕期建卡病历本丢了怎么办 四维检查胎儿心脏有缺陷怎么办 七个月的宝宝俩个蛋蛋都疝气怎么办 电脑有些网站看视频不能全屏怎么办 小米滑板车坏了售后不保修怎么办 红米4a电池不耐用怎么办 华为手机买个别人退货的怎么办 京东购物怎么查订单查询不到怎么办 退款了又收到货怎么办快递打电话 快递未收到货能退款商家拒绝怎么办 黑色牛仔裤有一块洗白了怎么办 黑色牛仔裤被洗衣液烧了怎么办 在蘑菇街退鞋子商家非说脏了怎么办 牛皮屑怎么办ke靠成都银康 微信订阅号取消关注之后还在怎么办 腾讯新闻红包领取说帐号异常怎么办 计算机职弥报名没选模块怎么办 有人用我手机注册有赞了怎么办 一件代发别人的货被投诉了怎么办 淘宝极速退款后商家拒收快递怎么办 运费险退到天猫垫付账户了怎么办 淘宝卖家食品有问题该怎么办 美团外卖不要辣椒给放了怎么办 旺旺卖家拒收我的消息怎么办 淘宝清空购物车大奖到上限了怎么办 游戏无响应除了退出还能怎么办 淘宝给差评了卖家一直打电话怎么办 电脑说带宽问题无法观看视频怎么办 手机淘宝上的购买信息删除了怎么办 为什么支付宝有钱淘宝付不了怎么办 苹果平板电脑上的淘宝点不开怎么办 淘宝付了两次款只有一个订单怎么办 淘宝付款显示支付宝账号异常怎么办 手机老卡换新卡淘宝付不了款怎么办 淘宝买东西退款卖家拒绝退款怎么办