ip = struct.unpack('4s', data[16:20])
时间: 2024-01-17 21:06:07 浏览: 37
这行代码用于将字节流中从第16个字节到第20个字节(不包括第20个字节)的4个字节数据解析成一个IP地址。具体地,使用Python标准库中的struct模块的unpack函数,将字节流按照指定的格式进行解包。其中,'4s'表示将4个字节解析成一个字符串。解析后得到的是一个bytes类型的对象,需要使用socket库中的inet_ntoa函数将其转换成IP地址的字符串形式。
相关问题
请给我一段python3代码,用于端口扫描。其中有多个进程,发包进程在端口5050只进行发包,收包进程监听端口5050的收包,查看源ip确定哪些ip存活
以下是一个基于Python 3的多进程端口扫描器,使用了多个进程进行端口扫描和响应处理:
```python
import socket
import struct
import os
import multiprocessing as mp
def send_packet(ip_addr, port):
# 创建套接字对象
sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_ICMP)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)
# 构造IP头
source_ip = socket.inet_aton('192.168.1.1')
dest_ip = socket.inet_aton(ip_addr)
ip_header = struct.pack('!BBHHHBBH4s4s', 69, 0, 20 + 8, os.getpid() & 0xFFFF, 0, 255, socket.IPPROTO_ICMP, 0, source_ip, dest_ip)
# 构造ICMP头
icmp_type = 8
icmp_code = 0
icmp_checksum = 0
icmp_identifier = os.getpid() & 0xFFFF
icmp_sequence = 1
icmp_data = b'Hello, World!'
icmp_header = struct.pack('!BBHHH', icmp_type, icmp_code, icmp_checksum, icmp_identifier, icmp_sequence)
# 计算ICMP校验和
icmp_checksum = socket.htons(~(icmp_type + icmp_code + icmp_identifier + icmp_sequence + len(icmp_data)))
icmp_header = struct.pack('!BBHHH', icmp_type, icmp_code, icmp_checksum, icmp_identifier, icmp_sequence)
# 发送数据包
sock.sendto(ip_header + icmp_header + icmp_data, (ip_addr, port))
def receive_packet():
# 创建套接字对象
sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_ICMP)
# 监听端口5050
sock.bind(('192.168.1.1', 5050))
# 循环接收ICMP响应包
while True:
packet, addr = sock.recvfrom(1024)
ip_header = packet[0:20]
icmp_header = packet[20:28]
icmp_type, icmp_code, icmp_checksum, icmp_identifier, icmp_sequence = struct.unpack('!BBHHH', icmp_header)
if icmp_type == 0 and icmp_code == 0 and icmp_identifier == os.getpid() & 0xFFFF and icmp_sequence == 1:
print('Host %s is up!' % addr[0])
if __name__ == '__main__':
# 创建进程池
pool = mp.Pool()
# 发送数据包
for i in range(1, 255):
ip_addr = '192.168.1.%d' % i
pool.apply_async(send_packet, (ip_addr, 5050))
# 接收响应包
receive_packet()
```
该程序使用了两个进程,一个进程用于发送数据包到目标主机的端口5050,另一个进程监听端口5050的响应包,并输出存活的主机IP地址。您可以通过修改`send_packet()`函数中的端口参数来扫描不同的端口。需要注意的是,该程序需要以管理员权限运行才能正常工作。
请在这段代码的基础上,向一个ip和端口组成列表发送SYN包,一段时间内检测哪些ip和端口没有返回
好的,可以使用 `socket` 模块创建原始套接字,构造 `SYN` 数据包,向指定的 IP 和端口列表发送 `SYN` 包,然后通过 `select.select` 函数等待一段时间,检测哪些 IP 和端口没有返回。具体实现方式可以参考如下代码片段:
```python
import select
import socket
import struct
import time
# 构造 IP 报文头部
def make_ip_header(src_ip, dest_ip):
ip_version = 4
ip_header_len = 5
ip_tos = 0
ip_total_len = 0
ip_id = 0
ip_frag_off = 0
ip_ttl = 255
ip_proto = socket.IPPROTO_TCP
ip_checksum = 0
src_ip_bytes = socket.inet_aton(src_ip)
dest_ip_bytes = socket.inet_aton(dest_ip)
ip_header = struct.pack('!BBHHHBBH4s4s',
(ip_version << 4) | ip_header_len,
ip_tos,
ip_total_len,
ip_id,
ip_frag_off,
ip_ttl,
ip_proto,
ip_checksum,
src_ip_bytes,
dest_ip_bytes)
return ip_header
# 构造 TCP 报文头部
def make_tcp_header(src_port, dest_port, seq_num, ack_num, flags):
tcp_header_len = 5
tcp_reserved = 0
tcp_data_offset = (tcp_header_len << 4) | tcp_reserved
tcp_window_size = socket.htons(8192)
tcp_checksum = 0
tcp_urgent_ptr = 0
tcp_header = struct.pack('!HHLLBBHHH',
src_port,
dest_port,
seq_num,
ack_num,
tcp_data_offset,
flags,
tcp_window_size,
tcp_checksum,
tcp_urgent_ptr)
return tcp_header
# 计算校验和
def checksum(data):
if len(data) % 2 != 0:
data += b'\0'
res = sum(struct.unpack('!{}H'.format(len(data) // 2), data))
res = (res >> 16) + (res & 0xffff)
res += (res >> 16)
return ~res & 0xffff
# 构造 SYN 数据包
def make_syn_packet(src_ip, src_port, dest_ip, dest_port, seq_num):
ip_header = make_ip_header(src_ip, dest_ip)
tcp_header = make_tcp_header(src_port, dest_port, seq_num, 0, 2)
pseudo_header = struct.pack('!4s4sBBH',
socket.inet_aton(src_ip),
socket.inet_aton(dest_ip),
0,
socket.IPPROTO_TCP,
len(tcp_header))
tcp_checksum = checksum(pseudo_header + tcp_header)
syn_packet = ip_header + tcp_header[:16] + struct.pack('!H', tcp_checksum) + tcp_header[18:]
return syn_packet
# 设置要扫描的目标 IP 和端口列表
target_list = [('127.0.0.1', 80), ('127.0.0.1', 443)]
# 创建原始套接字
sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_RAW)
# 设置源 IP 和端口号
src_ip = '127.0.0.1'
src_port = 12345
# 发送 SYN 包
for dest_ip, dest_port in target_list:
seq_num = int(time.time() * 1000) & 0xffffffff
syn_packet = make_syn_packet(src_ip, src_port, dest_ip, dest_port, seq_num)
sock.sendto(syn_packet, (dest_ip, dest_port))
# 等待一段时间,检查哪些 IP 和端口没有返回 SYN+ACK 包
timeout = 5
start_time = time.time()
inputs = [sock]
unreachable_list = []
while True:
if time.time() - start_time > timeout:
break
readable, _, _ = select.select(inputs, [], [], timeout)
for r in readable:
if r is sock:
data, addr = sock.recvfrom(65535)
ip_header_len = (data[0] & 0xf) * 4
tcp_header_len = (data[ip_header_len + 12] >> 4) * 4
src_ip = socket.inet_ntoa(data[12:16])
src_port = struct.unpack('!H', data[ip_header_len:ip_header_len+2])[0]
dest_ip = socket.inet_ntoa(data[16:20])
dest_port = struct.unpack('!H', data[ip_header_len+2:ip_header_len+4])[0]
flags = data[ip_header_len+tcp_header_len+13]
if (src_ip, src_port) in target_list and flags == 18:
print('{}:{} is reachable'.format(src_ip, src_port))
elif (src_ip, src_port) in target_list:
unreachable_list.append((src_ip, src_port))
# 输出未返回 SYN+ACK 包的 IP 和端口
for ip, port in unreachable_list:
print('{}:{} is unreachable'.format(ip, port))
```
在上述代码中,我们首先定义了一些函数来构造 IP、TCP 报文头部,计算校验和,以及构造 `SYN` 数据包。然后,我们设置了要扫描的目标 IP 和端口列表,并通过原始套接字向列表中的每个 IP 和端口发送 `SYN` 包。接着,我们使用 `select.select` 函数等待一段时间,检测哪些 IP 和端口没有返回 `SYN+ACK` 包。最后,我们输出未返回 `SYN+ACK` 包的 IP 和端口。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![7z](https://img-home.csdnimg.cn/images/20210720083312.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)