端口扫描器原理相对简单,采用的是TCP connect状态判断。具体来说:TCP connect方式使用系统网络API connect向目标主机的端口发起连接,如果无法连接,说明该端口关闭。该方式扫描速度比较慢,而且由于建立完整的TCP连接会在目标机上留下记录信息,不够隐蔽。所以,TCP connect是TCP SYN无法使用才考虑选择的方式。

在编写过程中,采用多线程时遇到共享变量访问的同步问题,经过试验,这里仅仅简单采用Sleep()函数进行等待就能拥有不错的效果。

代码及部分说明如下:

#include <stdio.h>

#include <WinSock2.h>

#include <time.h>

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

int gNumThread = 0;

void usage()

{

printf("Usage: <TCPScanner> [IP]
[StartPort]-[EndPort]\n");

printf("Example: TCPScanner 192.168.1.1 80-100\n");

ExitProcess(1);

}

DWORD WINAPI ThreadProc(LPVOID pPara);

int main(int argc, char *argv[])

{

WSADATA wsad;

SOCKADDR_IN target;

char *IP,*p;

USHORT
PortEnd,PortStart,i;

clock_t TimeStart,TimeEnd;

HANDLE    hThread;

DWORD    dwThreadId;

//参数处理

if(argc!=3) usage();

IP = argv[1];  //第一个参数是IP

PortStart = atoi(argv[2]);  //第二个参数是端口范围,分别得到首尾端口

for(p = argv[2];*(p++)!='-';);  //指向结束端口的起始位置

PortEnd =
atoi(p);

printf("Scanner will work on %s %d-%d now..\n",IP,PortStart,PortEnd);

TimeStart =
clock();

//加载,创建套接字,填写目标主机地址,按端口扫描

WSAStartup(MAKEWORD(2,2),&wsad);

target.sin_family
= AF_INET;

target.sin_addr.s_addr = inet_addr(IP);

for(i=PortStart;i<=PortEnd;++i){

target.sin_port
= htons(i);

//创建进程接收数据

hThread =
CreateThread(NULL,0,ThreadProc,(LPVOID)&target,0,&dwThreadId);

Sleep(10);  //主进程先等待一段时间,使得子进程能够有时间来读取端口信息,不致跳过、错开某些端口

if (hThread == NULL){

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

break;

}

CloseHandle(hThread);
//不再需要这个句柄,关掉它,但并非是关掉对应线程

}

Sleep(50);  //等待上一段时间,等待所有子进程结束任务

TimeEnd =
clock();

printf("Time cost:%.3fs\n",(float)(TimeEnd-TimeStart)/CLOCKS_PER_SEC);

WSACleanup();

return 0;

}

DWORD WINAPI ThreadProc(LPVOID pParam)

{

SOCKADDR_IN target = *(SOCKADDR_IN*) pParam;

SOCKET sConn;

printf("%s %d\n",inet_ntoa(target.sin_addr),ntohs(target.sin_port));

sConn = socket(AF_INET,SOCK_STREAM,IPPROTO_IP);

if(connect(sConn,(const SOCKADDR*) &target,sizeof(target)) == SOCKET_ERROR) return 0;

printf("Port %d is open\n",ntohs(target.sin_port));

closesocket(sConn);

return 0;

}

 

简单的端口扫描器(TCP connect)的更多相关文章

  1. 使用Python编写简单的端口扫描器的实例分享【转】

    转自 使用Python编写简单的端口扫描器的实例分享_python_脚本之家 http://www.jb51.net/article/76630.htm -*- coding:utf8 -*- #!/ ...

  2. Python与Hack之window下运行带参数的Python脚本,实现一个简单的端口扫描器

    1.前提是:windows已经配置好Python的环境变量: 2.进入cmd命令行模式: **输入python命令,检测是否环境配置好:显示这样说明配置环境变量没问题 **用cd命令进入Python脚 ...

  3. Java 端口扫描器 TCP的实现方法

    想必很多朋友都实现过一个简易的聊天室这个功能,其中涉及到Socket套接字这个类,我们通过一个特定的IP以及特定的端口创建一个服务端的套接字(ServerSocket),以此我们聊天个体的套接字(So ...

  4. Python3实现TCP端口扫描器

    本文来自 高海峰对 玄魂工作室 的投稿 作者:高海峰 QQ:543589796 在渗透测试的初步阶段通常我们都需要对攻击目标进行信息搜集,而端口扫描就是信息搜集中至关重要的一个步骤.通过端口扫描我们可 ...

  5. Python写安全小工具-TCP全连接端口扫描器

    通过端口扫描我们可以知道目标主机都开放了哪些服务,下面通过TCP connect来实现一个TCP全连接端口扫描器. 一个简单的端口扫描器 #!/usr/bin/python3 # -*- coding ...

  6. Python脚本写端口扫描器(socket,python-nmap)

    目录 Socket模块编写 扫描给定主机是否开放了指定的端口 python-nmap模块编写 扫描给定ip或给定网段内指定端口是否开放 一个用python写的简单的端口扫描器,python环境为 3. ...

  7. python实现FTP弱口令扫描器与简单端口扫描器

    python实现FTP弱口令扫描器与简单端口扫描器 目录 FTP弱口令扫描器 简单端口扫描器 参考: https://blog.csdn.net/rebelqsp/article/details/22 ...

  8. perl多线程tcp端口扫描器(原创)

    perl多线程tcp端口扫描器(原创) http://bbs.chinaunix.net/thread-1457744-1-1.html perl socket 客户端发送消息 http://blog ...

  9. python实现端口扫描器/DoS/DDoS

    整理github,梳理下Python小工具.以下是python实现的DoS/DDoS/端口扫描器(github). 一.DoS SYN Flood是当前最流行的DoS(拒绝服务攻击)与DdoS(分布式 ...

随机推荐

  1. RN与webview通讯

     一.RN给webview发送信息 this.webview.postMessage(message) 二.监听从React Native发过来的消息: window.document.addEven ...

  2. jquery 表单校验

    <link type="text/css" href="<%=basepath%>css/form/validate.css" rel=&qu ...

  3. error while loading shared libraries的解決方法

    我是在启动nginx的时候报这个错误,搜索这个错误时发现这篇文章,非本人(小渡博客)原创. 原文地址:http://blog.csdn.net/dumeifang/article/details/29 ...

  4. 深入C#的String类

  5. VM下载安装

    VM下载 VM是一款收费软件,要找有密钥的下载. 我的网盘 > 软件 > 常用电脑工具 > VM VM安装 参考链接中的安装步骤 http://blog.java1234.com/b ...

  6. 程序中使用now()函数对性能的影响

    这两天从某平台的慢查询日志中发现了一些很简单的,原本执行时间在0.01-0.03s的SQL,慢查询日志中记录的执行时间在2s左右. 排查后发现,表设计及索引建设均没有什么问题.但是SQL语句中使用了n ...

  7. 启动 mysql 时报错

    通过mysql -u用户名 -p密码 的命令连接 Mysql数据库时 报错 "can't connect to local mysql serverthrough  socket'/var/ ...

  8. 数组-Array

    1.数组的概念 /* 数组的格式 数组: 同一种数据类型的若干个值的容器 元素:数组中的值称为元素 索引:元素的标号,从0开始 长度:数组中元素的个数 */ public class ArrayDem ...

  9. .Wait()与.GetAwaiter()之间有什么区别

    两者都是同步等待操作的结果差异主要在于处理异常.使用Wait,异常堆栈跟踪不会改变并表示异常时的实际堆栈,因此如果您有一段代码在线程池线程上运行,那么您将拥有类似的堆栈 ThreadPoolThrea ...

  10. InstallShield 创建 visual studio 工程的时候 指向 任意 visual studio 版本 方法 (修改 计算机 默认 visual studio shell 版本)

    这需要 修改 计算机 默认 visual studio shell 版本 注册表 HKEY_CLASSES_ROOT VisualStudio.DTE 配置节点 描述的是 默认的 visual stu ...