这学期选修了“信息安全”专业的《网络安全》课程,这是网络安全课程的第一个实验,要求写一个程序,多线程扫描目的主机的端口。
很简单的一个小程序,鉴于正在学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
# -*- coding: utf-8 -*-
# Time-stamp: <2013-06-04 10:35:58 Tuesday by pein>
# Email: <pein0119@gmail.com>

import threading
import socket

def scan(ip, port):
"""
"""

global portList #建立了一个list,将目的主机开放的端口号加入portlist中(使用append函数)
try:
sk = socket.socket()
sk.settimeout(0.1)#设定连接时的超时限制,这里是100ms
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): #重写run函数
"""
"""

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 = [] #创建list,存储线程
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已经被扫描到了,证明程序有效。