简单的端口扫描器(TCP connect)
端口扫描器原理相对简单,采用的是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)的更多相关文章
- 使用Python编写简单的端口扫描器的实例分享【转】
转自 使用Python编写简单的端口扫描器的实例分享_python_脚本之家 http://www.jb51.net/article/76630.htm -*- coding:utf8 -*- #!/ ...
- Python与Hack之window下运行带参数的Python脚本,实现一个简单的端口扫描器
1.前提是:windows已经配置好Python的环境变量: 2.进入cmd命令行模式: **输入python命令,检测是否环境配置好:显示这样说明配置环境变量没问题 **用cd命令进入Python脚 ...
- Java 端口扫描器 TCP的实现方法
想必很多朋友都实现过一个简易的聊天室这个功能,其中涉及到Socket套接字这个类,我们通过一个特定的IP以及特定的端口创建一个服务端的套接字(ServerSocket),以此我们聊天个体的套接字(So ...
- Python3实现TCP端口扫描器
本文来自 高海峰对 玄魂工作室 的投稿 作者:高海峰 QQ:543589796 在渗透测试的初步阶段通常我们都需要对攻击目标进行信息搜集,而端口扫描就是信息搜集中至关重要的一个步骤.通过端口扫描我们可 ...
- Python写安全小工具-TCP全连接端口扫描器
通过端口扫描我们可以知道目标主机都开放了哪些服务,下面通过TCP connect来实现一个TCP全连接端口扫描器. 一个简单的端口扫描器 #!/usr/bin/python3 # -*- coding ...
- Python脚本写端口扫描器(socket,python-nmap)
目录 Socket模块编写 扫描给定主机是否开放了指定的端口 python-nmap模块编写 扫描给定ip或给定网段内指定端口是否开放 一个用python写的简单的端口扫描器,python环境为 3. ...
- python实现FTP弱口令扫描器与简单端口扫描器
python实现FTP弱口令扫描器与简单端口扫描器 目录 FTP弱口令扫描器 简单端口扫描器 参考: https://blog.csdn.net/rebelqsp/article/details/22 ...
- perl多线程tcp端口扫描器(原创)
perl多线程tcp端口扫描器(原创) http://bbs.chinaunix.net/thread-1457744-1-1.html perl socket 客户端发送消息 http://blog ...
- python实现端口扫描器/DoS/DDoS
整理github,梳理下Python小工具.以下是python实现的DoS/DDoS/端口扫描器(github). 一.DoS SYN Flood是当前最流行的DoS(拒绝服务攻击)与DdoS(分布式 ...
随机推荐
- JavaScript RegExp.$1
我们不生产代码 我们只是代码的搬运工 JavaScript RegExp.$1 RegExp 是javascript中的一个内置对象.为正则表达式. RegExp.$1是RegExp的一个属性,指的是 ...
- 2018php最新面试题之PHP核心技术
一.PHP核心技术 1.写出一个能创建多级目录的PHP函数(新浪网技术部) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 <?php ...
- js使用锚点回到顶部
使用锚点链接是一种简单的返回顶部的功能实现.该实现主要在页面顶部放置一个指定名称的锚点链接,然后在页面下方放置一个返回到该锚点的链接,用户点击该链接即可返回到该锚点所在的顶部位置 <body s ...
- Maven学习 三 Maven与Eclipse结合使用
一检查是否已经集成了Maven 现在的Eclipse一般都是集成了Maven,如果确定集成开发工具是否集成了Maven, Windows->preferences->Maven,查看是否已 ...
- java内存模型和垃圾回收(收藏)
java内存模型: https://www.cnblogs.com/handsomeye/p/5442879.html java垃圾回收 http://www.cnblogs.com/handsome ...
- Note of Python Turtle
Note of Python Turtle Turtle 库函数是 Python语言中一个流行的绘图函数库.Turtle 意思是海龟,在Python中显示为一个小箭头,通过它的移动而留 ...
- HDU 1171 01背包
http://acm.hdu.edu.cn/showproblem.php?pid=1171 基础的01背包,求出总值sum,背包体积即为sum/2 #include<stdio.h> # ...
- 跨域ajax问题
1. Intro 在用ajax请求时,请求的域名和所在域名不同,会出现跨域问题导致请求失败. 复杂请求: 条件: .请求方式:HEAD.GET.POST .请求头信息: Accept Accept-L ...
- Python之旅Day2 元组 字符串 字典 集合
元组(tuple) 元组其实跟列表差不多,也是存一组数,与列表相比,元组一旦创建,便不能再修改,所以又叫只读列表. 语法: names = ("Wuchunwei","Y ...
- Android开发 - 掌握ConstraintLayout(四)创建基本约束
上一篇我们介绍了编辑器的基本使用,本文我们介绍创建基本的约束. "约束"表示View之间的位置关系.当我们在ConstraintLayout布局中创建View时,如果我们没有添加任 ...