Python实现的多线程端口扫描工具分享_python

昨晚今晚写了两晚,总算把Py Port Scanner 写完了,姑且称之为0.1版本,算是一个Python多线程端口扫描工具。

水平有限,实话中间有一些困惑和不解的地方,代码可能也写的比较乱。有些问题并未找到很好的解决方法,还望大家谅解。速度大家自己试验,我感觉还行。

送上效果图两份,分别是扫单IP和扫IP段:

源码:

复制代码 代码如下:

# -*- coding: utf-8 -*-
__author__ = 'Phtih0n'
import threading, socket, sys, cmd, os, Queue

#扫描常用端口
PortList = [21, 22, 23, 25, 80, 135, 137, 139, 445, 1433, 1502, 3306, 3389, 8080, 9015]
#得到一个队列
def GetQueue(list):
    PortQueue = Queue.Queue(65535)
    for p in list:
        PortQueue.put(p)
    return PortQueue

#单IP扫描线程个数
nThread = 20
#线程锁
lock = threading.Lock()
#超时时间
Timeout = 3.0
#打开的端口列表
OpenPort = []

class ScanThread(threading.Thread):
    def __init__(self, scanIP):
        threading.Thread.__init__(self)
        self.IP = scanIP

    def Ping(self, Port):
        global OpenPort, lock, Timeout
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.settimeout(Timeout)
        address = (self.IP, Port)
        try:
            sock.connect(address)
        except:
            sock.close()
            return False
        sock.close()
        OpenPort.append(Port)
        if lock.acquire():
            print "IP:%s  Port:%d" % (self.IP, Port)
            lock.release()
        return True

class ScanThreadSingle(ScanThread):
    def __init__(self, scanIP, SingleQueue):
        ScanThread.__init__(self, scanIP)
        self.SingleQueue = SingleQueue

    def run(self):
        while not self.SingleQueue.empty():
            p = self.SingleQueue.get()
            self.Ping(p)

class ScanThreadMulti(ScanThread):
    def __init__(self, scanIP, PortList):
        ScanThread.__init__(self, scanIP)
        self.List = PortList[:]

    def run(self):
        for p in self.List:
            self.Ping(p)

class Shell(cmd.Cmd):
    u'''Py Port Scanner 0.1 使用说明:
    port [port..] 设置扫描的端口,用逗号分隔。
        默认:21, 22, 23, 25, 80, 135, 137, 139, 445, 1433, 1502, 3306, 3389, 8080, 9015
        example:port 21,23,25
        example: port 1000..2000
        example: port 80,443,1000..1500
    scan [IP] 扫描某一IP地址
        example: scan 192.168.1.5
    search [IP begin]-[IP end] 扫描某一IP段
        example: search 192.168.1.1-192.168.1.100
    time [timeout] 设置超时时间,默认为3秒
        example: time 5
    cls 清楚屏幕内容
    listport 打印端口列表
    help 打开本帮助
        '''
    def __init__(self):
        cmd.Cmd.__init__(self)
        reload(sys)
        sys.setdefaultencoding('utf-8')
        self.prompt = "Port Scan >>"
        self.intro = "Py Port Scanner 0.1"

    def do_EOF(self, line):
        return True

    def do_help(self, line):
        print self.__doc__

    #设置端口
    def do_port(self, line):
        global PortList
        PortList = []
        ListTmp = line.split(',')
        for port in ListTmp:
            if port.find("..") < 0:
                if not port.isdigit():
                    print "输入错误"
                    return False
                PortList.append(int(port))
            else:
                RangeLst = port.split("..")
                if not (RangeLst[0].isdigit() and RangeLst[1].isdigit()):
                    raise ValueError
                    exit()
                for i in range(int(RangeLst[0]), int(RangeLst[1])):
                    PortList.append(i)

    def do_scan(self, line):
        global nThread, PortList
        ThreadList = []
        strIP = line
        SingleQueue = GetQueue(PortList)
        for i in range(0, nThread):
            t = ScanThreadSingle(strIP, SingleQueue)
            ThreadList.append(t)
        for t in ThreadList:
            t.start()
        for t in ThreadList:
            t.join()

    def do_search(self, line):
        global nThread, PortList
        ThreadList = []
        (BeginIP, EndIP) = line.split("-")
        try:
            socket.inet_aton(BeginIP)
            socket.inet_aton(EndIP)
        except:
            print "输入错误"
            return
        IPRange = BeginIP[0:BeginIP.rfind('.')]
        begin = BeginIP[BeginIP.rfind('.') + 1:]
        end = EndIP[EndIP.rfind('.') + 1:]
        for i in range(int(begin), int(end)):
            strIP = "%s.%s" % (IPRange, i)
            t = ScanThreadMulti(strIP, PortList)
            ThreadList.append(t)
        for t in ThreadList:
            t.start()
        for t in ThreadList:
            t.join()

    def do_listport(self, line):
        global PortList
        for p in PortList:
            print p,
        print '\n'

    def do_time(self, line):
        global Timeout
        try:
            Timeout = float(line)
        except:
            print u"参数错误"

    def do_cls(self, line):
        os.system("cls")

if '__main__' == __name__:
    try:
        os.system("cls")
        shell = Shell()
        shell.cmdloop()
    except:
        exit()

时间: 2024-10-27 06:22:30

Python实现的多线程端口扫描工具分享_python的相关文章

Python端口扫描简单程序_python

本文实例为大家分享了Python端口扫描的实现代码,供大家参考,具体内容如下 获取本机的IP和端口号: import socket def get_my_ip(): try: csock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) csock.connect(('8.8.8.8', 80)) (addr, port) = csock.getsockname() csock.close() return addr,port except s

虚拟机-求对nmap和端口扫描工具较熟悉的朋友进来看看

问题描述 求对nmap和端口扫描工具较熟悉的朋友进来看看 我在虚拟机中,使用nmap -sn 192.168.1.0/24,同时用wireshark抓包,-sn应该是ping吧,然而wireshark里是arp广播. 然后使用了nmap -PS 192.168.1.0/24,我看资料这里应该是用tcp syn进行扫描,但在wireshark里,先进行了arp广播,然后再进行了tcp扫描(这里的扫描并非广播,而是目的地址是arp广播的结果) 于是,我有如下的问题: 1.扫描存活主机,为什么都会先使

Python脚本实现Web漏洞扫描工具_python

这是去年毕设做的一个Web漏洞扫描小工具,主要针对简单的SQL注入漏洞.SQL盲注和XSS漏洞,代码是看过github外国大神(听说是SMAP的编写者之一)的两个小工具源码,根据里面的思路自己写的.以下是使用说明和源代码. 一.使用说明: 1.运行环境: Linux命令行界面+Python2.7 2.程序源码: Vim scanner//建立一个名为scanner的文件 Chmod a+xscanner//修改文件权限为可执行的 3.运行程序: Python scanner//运行文件 若没有携

Multi Threaded TCP Port Scanner 2.0发布 多线程TCP端口扫描工具

Multi http://www.aliyun.com/zixun/aggregation/29914.html">Threaded TCP Port Scanner是一个用于扫描某个IP地址的多线程TCP端口的工具.你可以设置运行多少个线程和时间,它会告诉你目标的MAC地址和正在运行的服务.你可以扫描网络上的IP地址,并找出你有哪些开放的端口. Multi Threaded TCP Port Scanner 2.0版本增加了Syn扫描的-s选项,使得扫描速度更快.增加更多的默认端口,提高

C#编写的多线程端口扫描程序

程序|端口扫描|多线程 作者: 萧寒雪 有幸购买到Visual studio .net 的光盘,急忙安装一套,一用感觉非常好,所学写端口扫描程序一只,献给本版的朋友们:) using System;: using System.Drawing;: using System.Collections;: using System.ComponentModel;: using System.Windows.Forms;: //增加的如下.. using System.Data;: using Syst

python实现超简单端口转发的方法_python

本文实例讲述了python实现超简单端口转发的方法.分享给大家供大家参考.具体如下: 代码非常简单,实现了简单的端口数据转发功能,用于真实环境还需要再修改一下. 复制代码 代码如下: #tcp server import socket host = '127.0.0.1'          #Local Server IP host2 = '127.0.0.1'   #Real Server IP port = 6001 #Local Server Port port2 = 7001 #Real

python局域网ip扫描示例分享_python

复制代码 代码如下: #!/usr/bin/python# -*- coding: utf-8 -*- from scapy.all import *from time import ctime,sleepimport threadingTIMEOUT = 4conf.verb=0 def pro(cc,handle): dst = "192.168.1." + str(cc) packet = IP(dst=dst, ttl=20)/ICMP() reply = sr1(packet

Python写的PHPMyAdmin暴力破解工具代码_python

PHPMyAdmin暴力破解,加上CVE-2012-2122 MySQL Authentication Bypass Vulnerability漏洞利用. #!/usr/bin/env python import urllib import urllib2 import cookielib import sys import subprocess def Crack(url,username,password): opener = urllib2.build_opener(urllib2.HTT

手动实现把python项目发布为exe可执行程序过程分享_python

1. 手动制作python的exe可执行程序Python没有内建一个编译为exe的功能.给python程序的部署带来不少的麻烦.所以就会出现一些py2exe之类的很不错的工具,用于自动把.py文件编译为.exe文件. 最近抽空研究了一下手动实现类似py2exe的功能,希望加强对python的了解.结果还相当不错.把结果记录下来,与大家共享. 1.1. 原理文中所描述的方法,基于python的以下几个功能    1) python程序运行时,会在sys.path指定的路径中查找库文件.    2)