python 端口扫描器

# -*- coding = utf-8 -*-
# @Time : 2021/8/30 21:42
# @Author : 刘卓文
# @File : 端口扫描器.py
# @Software : PyCharm


#用户通过你设定的变量来传入相应所需要的值
import optparse
from socket import *
from threading import *
#开发第二步,生成connScan和portScan函数

#connScan 原理非常简单,就是利用connect,未连接则关闭
def connScan(tgtHost,tgtPort):
    try:
        conn = socket(AF_INET,SOCK_STREAM) #实例化一个socket对象
        conn.connect((tgtHost,tgtHost))
        #发送垃圾信息等待响应,跟进得到的信息就可以知道端口上运行的应用
        conn.send('ViolentPython\r\n')
        results = conn.recv(100)
        print('[+]%d/tcp closed'% tgtPort)
        print('[+] ' + str(results))
        conn.close()
    except:
        print('[-]%d/tcp close'% tgtPort)
#portScan函数解构不同的域名,起到每次扫描标识符的意义
def portScan(tgtHost,tgtPorts):
    try: #先通过host得到ip是多少
        tgtIp = gethostbyname(tgtHost)
    except: #找不到就说不知道这是啥就好了
        print("[-] Cannot resolve '%s':Unknown host"%tgtHost)
        return
    try:  #能找到主机名是最好的
        tgtName = gethostbyaddr(tgtIp)
        print('\n[+] Scan Results for: ' + tgtName[0])
    except: #找不到就用第一步得到的ip也可以
        print('\n[+] Scan Results for: ' + tgtIp)
    setdefaulttimeout(1)
    for tgtPort in tgtPorts:
        print('scanning port ' + tgtPort)
        connScan(tgtHost,int(tgtPort))
#第一步传入使用指南
def main():
    usage = "-H <target host> -p <target port>"
    parser = optparse.OptionParser(usage)
    #第二步传入实际参数代表的意义,dest=key
    parser.add_option('-H',dest='tgtHost',type='string',help='target host')
    parser.add_option('-P',dest='tgtPort',type='string',help='target port')
    #第三步,parse_args用来接收你的参数,options保存的是接受的变量,agrs保存的是未接收的变量
    (options,agrs) = parser.parse_args()
    tgtHost = options.tgtHost
    tgtPorts = str(options.tgtPort).split(',')
    if(tgtHost==None) | (tgtPorts[0]==None):
        print(parser.usage)
        exit(0)
    portScan(tgtHost,tgtPorts)
if __name__=='__main__':
    main()

python_threading模块的加入,重点在于screenLock的设置

# -*- coding = utf-8 -*-
# @Time : 2021/8/30 21:42
# @Author : 刘卓文
# @File : 端口扫描器.py
# @Software : PyCharm


#用户通过你设定的变量来传入相应所需要的值
import optparse
from socket import *
from threading import *
screenLock = Semaphore(value=1)
#开发第二步,生成connScan和portScan函数

#connScan 原理非常简单,就是利用connect,未连接则关闭
def connScan(tgtHost,tgtPort):
    try:
        conn = socket(AF_INET,SOCK_STREAM) #实例化一个socket对象
        conn.connect((tgtHost,tgtPort))
        #发送垃圾信息等待响应,跟进得到的信息就可以知道端口上运行的应用
        conn.send('ViolentPython\r\n')
        results = conn.recv(100)
        screenLock.acquire()
        print('[+]%d/tcp closed'% tgtPort)
        print('[+] ' + str(results))
    except:
        screenLock.acquire()
        print('[-]%d/tcp close'% tgtPort)
    finally:
        screenLock.release()
        conn.close()
#portScan函数解构不同的域名,起到每次扫描标识符的意义
def portScan(tgtHost,tgtPorts):
    try: #先通过host得到ip是多少
        tgtIp = gethostbyname(tgtHost)
    except: #找不到就说不知道这是啥就好了
        print("[-] Cannot resolve '%s':Unknown host"%tgtHost)
        return
    try:  #能找到主机名是最好的
        tgtName = gethostbyaddr(tgtIp)
        print('\n[+] Scan Results for: ' + tgtName[0])
    except: #找不到就用第一步得到的ip也可以
        print('\n[+] Scan Results for: ' + tgtIp)
    setdefaulttimeout(1)
    for tgtPort in tgtPorts:
        t = Thread(target=connScan,args=(tgtHost,int(tgtPort)))
        t.start()
#第一步传入使用指南
def main():
    parser = optparse.OptionParser("[*] Usage : ./portscanner.py -H <target host> -p <target port>")
    #第二步传入实际参数代表的意义,dest=key
    parser.add_option('-H',dest='tgtHost',type='string',help='target host')
    parser.add_option('-P',dest='tgtPort',type='string',help='target port')
    #第三步,parse_args用来接收你的参数,options保存的是接受的变量,agrs保存的是未接收的变量
    (options,agrs) = parser.parse_args()
    tgtHost = options.tgtHost
    tgtPorts = str(options.tgtPort).split(',')
    if(tgtHost==None) | (tgtPorts[0]==None):
        print(parser.usage)
        exit(0)
    portScan(tgtHost,tgtPorts)
if __name__=='__main__':
    main()

 

posted @ 2021-08-31 17:04  Lzwhehe  阅读(83)  评论(0)    收藏  举报