这学期选修了“信息安全”专业的《网络安全》课程,这是网络安全课程的第一个实验,要求写一个程序,多线程扫描目的主机的端口。
很简单的一个小程序,鉴于正在学python,所以就用python写了,刚学python,所以可能有点不pythonic.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
|
import threading import socket
def scan(ip, port): """ """ global portList try: sk = socket.socket() sk.settimeout(0.1) address = (ip, port) if sk.connect_ex(address) == 0: print port portList.append(port) except Exception, e: print "error %s" %e
sk.close()
class sniff(threading.Thread): """ """
def __init__(self, ip): """ """ threading.Thread.__init__(self) self.ip = ip
def run(self): """ """ global portBegin, portEnd, mutex while True: mutex.acquire() portBegin += 1 if portBegin > portEnd: mutex.release() break mutex.release() scan(self.ip, portBegin)
def main(): """ """ url = str(raw_input("please input a host name or a ip address\n--->")) ip = str(socket.gethostbyname(url))
threads = [] global mutex, portBegin, portEnd, portList portList = [] portBegin = 0 portEnd = 1023 mutex = threading.Lock() for i in range(10): thread = sniff(ip) thread.start() threads.append(thread)
for thread in threads: thread.join()
portList.sort() print "on host \"",url,"\" port:[", for port in portList: print port, print "]is open"
main()
|
主要思想就是建立socket,然后使用threading模块开了十个线程,并行扫描目的主机的0~1023号端口。 并使用了锁机制来实现线程同步。 输入的时候可以直接域名,也可以直接输入ip地址。
使用本机ip测试:
使用本地域名测试
启动本机的http服务,即开启本机的80端口:
可以看到端口80已经被扫描到了,证明程序有效。