基于Python socket的端口扫描程序实例代码

时间:2022-05-09 20:43:42

本文研究的主要是Python的端口扫描程序,具体实例代码如下。

先来看看第一个端口扫描程序代码,获取本机的IP和端口号:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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 socket.error:
  return "127.0.0.1"
 
def int_to_ip(int_ip):
 return socket.inet_ntoa(struct.pack('I', socket.htonl(int_ip)))
 
 
def ip_to_int(ip):
 return socket.ntohl(struct.unpack("I", socket.inet_aton(str(ip)))[0])
 
(ip,port)=get_my_ip()
print "ip=%s port=%d" %(ip,port)

PortScan.py

?
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
#!/usr/bin/python
# -*- coding: utf-8 -*-
 
import optparse
from socket import *
from threading import *
 
screenLock = Semaphore(value=1)
 
def connScan(tgtHost, tgtPort):
 try:
  connSkt = socket(AF_INET, SOCK_STREAM)
  connSkt.connect((tgtHost, tgtPort))
  connSkt.send('ViolentPython\r\n')
  results = connSkt.recv(100)
  screenLock.acquire()
  print '[+] %d/tcp open' % tgtPort
  print '[+] ' + str(results)
 except:
  screenLock.acquire()
  print '[-] %d/tcp closed' % tgtPort
 finally:
 screenLock.release()
 connSkt.close()
 
def portScan(tgtHost, tgtPorts):
 try:
  tgtIP = gethostbyname(tgtHost)
 except:
  print "[-] Cannot resolve '%s': Unknown host" %tgtHost
  return
 
 try:
  tgtName = gethostbyaddr(tgtIP)
  print '\n[+] Scan Results for: ' + tgtName[0]
 except:
  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 %prog '+\
  '-H <target host> -p <target port>')
 parser.add_option('-H', dest='tgtHost', type='string',\
  help='specify target host')
 parser.add_option('-p', dest='tgtPort', type='string',\
  help='specify target port[s] separated by comma')
 
 (options, args) = 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 socket的端口扫描程序

?
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
#-------------------------------------------------------------------------------
# Name:  PortScan
# Purpose:  扫描网段主机的端口开放情况
# Author:  Hao Chen
# Python3.4
#-------------------------------------------------------------------------------
import socket
def main():
 ip_start=input('请输入开始IP:(默认:127.0.0.1)')
 if ip_start=='':
  ip_start='127.0.0.1'
  ip_end='127.0.0.1'
 else:
  ip_end=input('请输入结束IP:')
  if ip_end=='':
   ip_end='127.0.0.1'
   
 s=input('请输入目标主机开始端口:(默认扫描常用端口)')
 if s=='':
  portList=[21, 22, 23, 25, 80, 135, 137, 139, 445, 1433, 1502, 3306, 3389, 8080, 9015]
 else:
  startport=int(s)
  s=input('请输入目标主机结束端口:(默认:65535)')
  if s=='':
   endport=65535
  else:
   endport=int(s)
  portList=[i for i in range(startport,endport+1)]
  
 while 1:
  #ip_start<ip_end
  x1=ip_start.rfind('.');     
  x2=ip_end.rfind('.')
  if int(ip_start[x1+1:])>int(ip_end[x2+1:]):
   break;
   
  #开始扫描端口
  for port in portList:
   print('正在扫描%s :%d' %(ip_start,port))
   try:
    sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sk.settimeout(10)
    sk.connect((ip_start,port))
    sk.settimeout(None)
    print('Server %s port %d OK!' % (ip_start,port))
    sk.close()
 
    #结果保存在文件中
    f=open("IP_Port.txt",'a')
    f.write(ip_start+' : '+str(port)+'\n')
    f.close()    
   except Exception:
    print('Server %s port %d is not connected!' % (ip_start,port))
    
  #更新ip_start
  i=ip_start.rfind('.')
  x=int(ip_start[i+1:])+1
  ip_start=ip_start[:i+1]+str(x)
   
 print('扫描完成,结果保存在IP_Port.txt文件中')
 
if __name__ == '__main__':
 main()

总结

以上就是本文关于基于Python socket的端口扫描程序实例代码的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

原文链接:http://blog.csdn.net/cighao/article/details/44731709