思路
这里使用了TCP连接扫描,利用操作系统原生的网络功能。
用户无需特殊权限,但因为建立了TCP连接,很容易被发现,而且会留下IP地址。
还有另外一种扫描方式是SYN扫描,端口扫描工具不使用操作系统原生网络功能,而是自行生成、发送IP数据包,并监控其回应。这种扫描模式被称为“半开放扫描”,因为它从不建立完整的TCP连接。端口扫描工具生成一个SYN包,如果目标端口开放,则会返回SYN-ACK包。扫描端回应一个RST包,然后在握手完成前关闭连接。如果端口关闭了但未使用过滤,目标端口应该会持续返回RST包。这种粗略的网络利用方式有几个优点:给扫描工具全权控制数据包发送和等待回应时长的权力,允许更详细的回应分析。关于哪一种对目标主机的扫描方式更不具备入侵性存在一些争议,但SYN扫描的优势是从不会建立完整的连接。然而,RST包可能导致网络堵塞,尤其是一些简单如打印机之类的网络设备。
1.使用TCP握手连接来扫描指定的(ip,port)
对
2.将单线程改成多线程
3.第一次使用面向对象编程
源码
说白了就是调接口,然后加了个多线程……
import socket
import threading
ip = "82.157.174.226"
post_list = [i for i in range(1,65536)]
output = [0 for i in range(1,65536)]
delay = 1
lock = threading.Semaphore(150)
class MyThread(threading.Thread):
def __init__(self, ip, port_number, output, delay):
self.ip = ip
self.port_number = port_number
self.output = output
self.delay = delay
threading.Thread.__init__(self)
def run(self):
if lock.acquire():
#初始化socket,参数1是ipv4,参数2是TCP
TCP_sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#设置参数,参数1表示我们正在使用的socket选项,参数2表示支持多个进程或者线程绑定到同一端口
TCP_sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
#设置超时等待时间,单位秒
TCP_sock.settimeout(self.delay)
# UDP_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# UDP_sock.sendto(str(message), (ip, int(port_number)))
try:
result = TCP_sock.connect_ex((ip, int(self.port_number)))
if result == 0:
output[self.port_number] = 'OPEN'
print(str(self.port_number) + ":" + output[self.port_number])
else:
output[self.port_number] = 'CLOSE'
TCP_sock.close()
except socket.error as e:
output[self.port_number] = 'error'
#print(str(self.port_number) + ":" + output[self.port_number])
pass
lock.release()
ThreadList = []
for i in post_list:
t = MyThread(ip, i, output, delay)
ThreadList.append(t)
for t in ThreadList:
t.start()
for t in ThreadList:
t.join()
for i in output:
if output[i] !='CLOSE':
print("PORT:" + str(i) + ":" + output[i])
其他
对handle的理解
首先在 PowerShell 中获取进程信息并以程序 ID 进行排序,第一列出现handles。
PS C:\Users\Lenovo> Get-Process | Sort-Object ID
Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName
------- ------ ----- ----- ------ -- -- -----------
0 0 60 8 0 0 Idle
8174 0 48 148 4 0 System
0 16 14708 62260 160 0 Registry
430 17 4216 21944 2.11 480 1 RuntimeBroker
57 3 1068 1160 556 0 smss
2019 30 10004 24904 596 0 lsass
904 12 6616 10796 604 0 services
245 29 24792 11608 616 0 PresentationFont...
154 10 1804 6648 848 0 svchost
在代码里,handle 通常是某个数字标记,通过这个标记来操作资源。
是否可以简单把Handles理解为Id?不好。 首先分配16位的标记,再用 8 位密码将 16 位标记加密,之后将 4 位类型、4 位权限、8 位密码、16 位加密结果打包成一个 32 位的整数,这时再简单理解的Handles为索引,就不恰当。
对socket的理解
TCP/IP只是一个协议栈,如果想要有具体的应用,就需要提供对外的操作接口,就像操作系统会提供标准的编程接口,TCP/IP也必须对外提供编程接口,这就是Socket。
现在我算明白了socket和http的区别:
对概念来说:
Http协议:基于TCP连接的简单的对象访问协议,对应于应用层。
Socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议。
对一次连接过程而说:
Http连接:所谓的无状态连接,客户端向服务器发送一次请求,服务器进行一次回应就断开。
SOCKET连接:长连接,(如果期间没有数据的传输,会发送心跳包确认。)