Windows多线程端口扫描

还不是很了解多线程,先简单运用下。

  1 /*
  2 2015.5    HT
  3 多线程端口扫描
  4
  5 netstat -an
  6
  7 */
  8
  9 #include <iostream>
 10 #include <process.h>
 11 #include <winsock2.h>
 12 #pragma comment(lib,"ws2_32.lib")
 13 using namespace std;
 14
 15 // 线程传递的端口参数
 16 typedef struct
 17 {
 18     unsigned int min_port;
 19     unsigned int max_port;
 20 }Port;
 21 Port *lpPort = new Port;
 22 // 线程数
 23 int Thread_NUM;
 24 // 互斥量
 25 HANDLE hMutex;
 26
 27 DWORD WINAPI scan(LPVOID lpParameter)
 28 {
 29     // 获得参数
 30     Port* port = (Port*)lpParameter;
 31     SOCKET sockfd = NULL;
 32     SOCKADDR_IN sin;
 33     sin.sin_family = AF_INET;
 34     sin.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
 35
 36     for (unsigned int i = port->min_port; i <= port->max_port; ++i)
 37     {
 38         if (sockfd == NULL)
 39         {
 40             // 创建套接字
 41             sockfd = socket(AF_INET, SOCK_STREAM, 0);
 42             if (sockfd == INVALID_SOCKET)
 43             {
 44                 cout << "创建socket失败!" << endl;
 45                 return 0;
 46             }
 47         }
 48         sin.sin_port = htons(i);
 49         // 连接服务器
 50         int ret = connect(sockfd, (sockaddr *)&sin, sizeof(sockaddr));
 51         // 请求一个互斥量的访问权
 52         WaitForSingleObject(hMutex, INFINITE);
 53         if (ret == SOCKET_ERROR)
 54         {
 55             cout << "Port: " << i << "    not open !" << endl;
 56         }
 57         else
 58         {
 59             cout << "Port: " << i << "    open !" << endl;
 60             closesocket(sockfd);
 61             sockfd = NULL;
 62         }
 63         // 释放一个互斥量的访问权
 64         ReleaseMutex(hMutex);
 65     }
 66
 67     return 0;
 68 }
 69
 70 int main()
 71 {
 72     WSADATA wsaData;
 73     if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
 74     {
 75         cout << "找不到 WinSock dll!" << endl;
 76         return 0;
 77     }
 78
 79     hMutex = CreateMutex(NULL, FALSE, NULL);
 80
 81     cout << "输入起始端口,结束端口号: " ;
 82     cin >> lpPort->min_port >> lpPort->max_port;
 83     cout << "输入线程数(小于200): ";
 84     cin >> Thread_NUM;
 85     HANDLE handle[200];
 86     int Scan_Len = (lpPort->max_port - lpPort->min_port) / Thread_NUM;
 87
 88     for (int i = 0; i < Thread_NUM; ++i)
 89     {
 90         Port *NewPort = new Port;
 91         NewPort->min_port = lpPort->min_port + Scan_Len * i;
 92         if (i < (Thread_NUM - 1))
 93             NewPort->max_port = NewPort->min_port + Scan_Len - 1;
 94         else
 95         {
 96             NewPort->max_port = lpPort->max_port;
 97             handle[i] = (HANDLE)CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)scan, NewPort, 0, NULL);
 98             break;
 99         }
100         handle[i] = (HANDLE)CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)scan, NewPort, 0, NULL);
101     }
102     WaitForMultipleObjects(Thread_NUM, handle, TRUE, INFINITE);
103
104     CloseHandle(hMutex);
105     return 0;
106 }
时间: 2024-08-09 07:46:46

Windows多线程端口扫描的相关文章

使用Java开发多线程端口扫描工具(二)

一 介绍 这一篇文章是紧接着上一篇文章(http://www.zifangsky.cn/2015/12/使用java开发多线程端口扫描工具/)写的,端口扫描的原理不用多少,我在上一篇文章中已经说过了,至于目的大家都懂得.在这一篇文章里,我主要是对端口扫描工具的继续完善,以及写出一个比较直观的图形界面出来,以方便我们测试使用.界面如下: 这个工具主要是实现了以下几点功能:(1)两种扫描方式,一种是只扫描常见端口,另一种是设置一个起始和结束端口,依次探测.当然,原理很简单,用for循环就可以了:(2

使用Java开发多线程端口扫描工具

前言:这里只给出命令行版的扫描工具,后续可能是写一个独立的界面,或者是集成到其他工具上去. 一 扫描原理 其实原理非常简单,就是使用Socket去连接目标IP或者域名的指定端口,如果能够连上则说明该端口是打开的.反之,要是在连接超时之前都没有连上,则将该端口判断为关闭状态.下面我将分别说明两种基本的扫描方式:(1)扫描一个连续的端口段:(2)仅扫描一个指定的端口集合 二 使用多线程扫描目标主机一个段的端口开放情况 /**  * 多线程扫描目标主机一个段的端口开放情况  *   * @param 

AndroidStudio多线程端口扫描

Android Studio 3.1.4 Build #AI-173.4907809, built on July 24, 2018JRE: 1.8.0_152-release-1024-b02 amd64JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.oWindows 10 10.0 Lucky~ 1.XML布局界面文件 1 <?xml version="1.0" encoding="utf-8"?> 2

端口扫描工具

简单的多线程端口扫描工具 可以接收IP地址作为参数,如果不接参数,则默认扫描本机的端口 1 #!/usr/bin/python 2 3 import socket 4 import time 5 import argparse 6 import threading 7 8 def arg_process(): 9 argparser=argparse.ArgumentParser(description="Port Scaner") 10 argparser.add_argument(

多线程实现端口扫描

1 import java.net.*; 2 import java.io.*; 3 import java.awt.*; 4 import java.awt.event.*; 5 import javax.swing.*; 6 7 public class TcpThread extends Thread{ 8 9 //定义变量 10 public static InetAddress hostAddress;//主机IP地址 11 public static int MIN_port; //

告别脚本小子【编写端口扫描工具】

前言Windows系统默认开放了很多端口,通常这些端口意味着该主机运行着大家都知道的服务,比如TCP端口21-FTP服务,TCP端口80-HTTP服务,有些服务就有可能存在公开的漏洞,因此可以说主机上每一个开放的端口都可能成为一条入侵的捷径.当然,网上存在很多端口扫描工具,但是我们总不能只知道使用别人的工具,一是这些工具别人编写的时候有没有加入后门,二是如果只会用别人的工具,最终也只能是一个脚本小子,所以我们自己来编写一款实用的端口扫描工具. 一.基础知识 1.1.线程 线程,有时被称为轻量级进

Windows完成端口 IOCP模型(一)

1 Windows完成端口基本介绍 2他是只能在Windows下的基于SOCKET事件管理的模型 3与select不同,select需要多次重置管理句柄,IOCP只要一次 4有事件后select需要操作获取数据,而IOCP通知你的时候说明数据操作好了 5select管理句柄的数目有限,IOCP没有限制 6IOCP支持多线程同时等待. 我的设计思路一个线程用来侦听accept事件, 一个线程来侦听SOCKET的IO事件, 大部分框架都是这样, 其实可以只使用一个线程做异步SOCKET就完全足够了,

用Python实现一个端口扫描,只需简单几步就好

一.常见端口扫描的原理 0.秘密扫描 秘密扫描是一种不被审计工具所检测的扫描技术. 它通常用于在通过普通的防火墙或路由器的筛选(filtering)时隐藏自己. 秘密扫描能躲避IDS.防火墙.包过滤器和日志审计,从而获取目标端口的开放或关闭的信息.由于没有包含TCP 3次握手协议的任何部分,所以无法被记录下来,比半连接扫描更为隐蔽. 但是这种扫描的缺点是扫描结果的不可靠性会增加,而且扫描主机也需要自己构造IP包.现有的秘密扫描有TCP FIN扫描.TCP ACK扫描.NULL扫描.XMAS扫描和

Python实现端口扫描,只需做这几步走战略

一.常见端口扫描的原理 0.秘密扫描 秘密扫描是一种不被审计工具所检测的扫描技术. 它通常用于在通过普通的防火墙或路由器的筛选(filtering)时隐藏自己. 秘密扫描能躲避IDS.防火墙.包过滤器和日志审计,从而获取目标端口的开放或关闭的信息.由于没有包含TCP 3次握手协议的任何部分,所以无法被记录下来,比半连接扫描更为隐蔽. 但是这种扫描的缺点是扫描结果的不可靠性会增加,而且扫描主机也需要自己构造IP包.现有的秘密扫描有TCP FIN扫描.TCP ACK扫描.NULL扫描.XMAS扫描和