端口扫描器原理相对简单,采用的是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. 20172325 2018-2019-2 《Java程序设计》第六周学习总结

    20172325 2018-2019-2 <Java程序设计>第六周学习总结 教材学习内容总结 本周学习第十章--树 1.什么是树 (1)树是一种数据结构,与之前学过的栈.队列和列表这些线 ...

  2. 模板学习实践二 pointer

    c++ template学习记录 使用模板将实际类型的指针进行封装 当变量退出作用域 自动delete // 1111.cpp : 定义控制台应用程序的入口点. // #include "s ...

  3. docker安装radis

    sudo docker search redis sudo docker pull redis sudo docker run --name redis6379 -p 6379:6379 -v /op ...

  4. 深入浅出WPF文摘

    第一部分 深入浅出XMAL 第一章 XMAL概览 第二章 从零起步认识XMAL 第三章 系统学习XMAL语法 第四章 X名称空间详解 第五章 控件与布局 GUI:图形化用户界面 逻辑树: 可视树: : ...

  5. 第41章:MongoDB-集群--Sharding(分片)

    ①Sharding分片概念 分片(sharding)是指将数据库拆分,将其分散在不同的机器上的过程.将数据分散到不同的机器上,不需要功能强大的服务器就可以存储更多的数据和处理更大的负载. 分片是每个分 ...

  6. Reading | 《Python基础教程》第1次阅读

    目录 一.基础知识 1.数和表达式 浮点除法和整数除法 负数整除和取余 圆整 乘方运算 2.变量名 3.获取用户输入 4.模块 5.让脚本像普通程序一样 6.字符串 单.双引号 引号的转义 字符串拼接 ...

  7. SSM_CRUD新手练习(9)显示分页数据

    我们已经做好了用来显示数据的分页模板,现在只需要将我们从后台取出的数据填充好,显示出来. 我们使用<c:forEach>标签循环取出数据,所以需要先导入JSTL标签库 <%@ tag ...

  8. hive 命令行传入参数

    azkban实现任务重跑 我们执行sql的方式是将hql文件上传到服务器本地.然后执行shell命令 hive " -f ./test_scheduler.hql 注:hive -e 是执行 ...

  9. RxSwift学习笔记10:startWith/merge/zip/combineLatest/withLatestFrom/switchLatest

    //startWith //该方法会在 Observable 序列开始之前插入一些事件元素.即发出事件消息之前,会先发出这些预先插入的事件消息 Observable.of(1,2,3) .startW ...

  10. shell脚本基础教程

    一.什么是shell: shell解释:引用别人的话说:“Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言.” 简而言之, ...