利用Python实现简易端口扫描器方法介绍

高洛峰
发布: 2017-03-15 13:37:42
原创
1676人浏览过

在网上的一些资料的基础上自己又添了些新内容,算是python socket编程练手吧。

#coding=utf-8
import socket
import time
import sys
import struct
import threading
from threading import Thread,activeCount

results=[]
def portScanner(ip,port):
    server = (ip,port)
    sockfd = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    sockfd.settimeout(0.1)          #设置阻塞模式下socket的超时时间
    ret = sockfd.connect_ex(server)  #成功返回0,失败返回error的值。
    if not ret:
        sockfd.close()
        results.append([ip,port])
        #print '%s:%s is opened...' % (ip,port)
    else:
        sockfd.close()
        pass
    return ''
    

def ip2num(ip):         #将ip地址转换成数字
    lp = [int(x) for x in ip.split('.')]
    return lp[0] << 24 | lp[1] << 16 | lp[2] << 8 |lp[3]

def num2ip(num):
    ip = ['','','','']
    ip[3] = (num & 0xff)
    ip[2] = (num & 0xff00) >> 8
    ip[1] = (num & 0xff0000) >> 16
    ip[0] = (num & 0xff000000) >> 24
    return '%s.%s.%s.%s' % (ip[0],ip[1],ip[2],ip[3])

def iprange(ip1,ip2):
    num1 =socket.ntohl(struct.unpack("I",socket.inet_aton(str(ip1)))[0])
    num2 =socket.ntohl(struct.unpack("I",socket.inet_aton(str(ip2)))[0])
    tmp = num2 - num1
    if tmp < 0:
        return None
    else:
        return num1,num2,tmp


if name == 'main':

    if((len(sys.argv)!= 4)&(len(sys.argv)!= 2)):   #用法说明
        print 'Usage:\n\tscanner.py startip endip port'
        print '\tscanner.py ip'
        sys.exit()

    if len(sys.argv)==4:            #对某一IP段的扫描
        time_start=time.time()        #起始时间
        startip = sys.argv[1]        #起始IP
        endip = sys.argv[2]            #结束IP
        port = int(sys.argv[3])        #端口号

        res = iprange(startip,endip)
        if not res:
            print 'endip must be bigger than startone'
            sys.exit()
        elif res[2] == 0:
            portScanner(startip,port)
        else:
            for x in xrange(int(res[2])+1):        #IP地址依次递增
                startipnum = ip2num(startip)
                startipnum = startipnum + x
                if activeCount() <=1000:                      
                    Thread(target=portScanner,args=(num2ip(startipnum),port)).start()
                
        print "There are %d hosts." %len(results)
        results.sort()
        for ip,port in results:
            print "%s:%d is opened..." %(ip,port)
        times=time.time()-time_start            #用时
        print 'use time : %s' % times
                
    if len(sys.argv)==2:
        time_start=time.time()
        port=0
        ip=sys.argv[1]
        while(port<2000):
            if activeCount() <= 40:     #设置40线程扫描
                Thread(target = portScanner, args = (ip, port)).start()
                port=port+1
        results.sort()
        for ip,port in results:
            print "%s:%d is opened..." %(ip,port)
        times=time.time()-time_start
        print 'use time : %s' % times
登录后复制

使用效果如下:

利用Python实现简易端口扫描器方法介绍

法语写作助手
法语写作助手

法语助手旗下的AI智能写作平台,支持语法、拼写自动纠错,一键改写、润色你的法语作文。

法语写作助手 31
查看详情 法语写作助手

利用Python实现简易端口扫描器方法介绍

立即学习Python免费学习笔记(深入)”;

以上就是利用Python实现简易端口扫描器方法介绍的详细内容,更多请关注php中文网其它相关文章!

相关标签:
python速学教程(入门到精通)
python速学教程(入门到精通)

python怎么学习?python怎么入门?python在哪学?python怎么学才快?不用担心,这里为大家提供了python速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号