从高级程序员讲解扫描ip并编写python运行的扫描ip
扫描IP地址是网络安全中常用的一项技术,在此,我将从高级程序员的角度讲解如何扫描IP地址,并编写Python程序进行扫描。
首先,我们需要了解IP地址扫描的基本原理。IP地址扫描就是通过发送一系列网络数据包来探测网络中的主机,从而确定哪些主机在线并且可以访问。扫描工具通常使用ICMP协议或TCP协议来发送数据包,并根据接收到的响应来确认目标主机是否在线。
接下来,我们将讲解如何使用Python编写一个简单的IP地址扫描程序。我们将使用Python的socket和struct模块来构造和发送数据包,使用time模块来计算延迟时间,使用multiprocessing模块来实现多线程并发扫描。
首先,我们需要定义一个函数来发送ICMP数据包。以下是该函数的代码:
import socket
import struct
import time
def send_icmp_packet(dest_addr, ttl):
icmp_type = 8
icmp_code = 0
icmp_checksum = 0
icmp_id = 1
icmp_seq = 1
# 构造ICMP数据包
icmp_packet = struct.pack("bbHHh", icmp_type, icmp_code, icmp_checksum, icmp_id, icmp_seq)
# 创建socket
icmp_socket = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.getprotobyname("icmp"))
icmp_socket.setsockopt(socket.IPPROTO_IP, socket.IP_TTL, ttl)
# 发送数据包并记录时间
icmp_socket.sendto(icmp_packet, (dest_addr, 0))
send_time = time.time()
# 接收响应包并计算延迟时间
try:
_, _, _, _, _ = icmp_socket.recvfrom(1024)
recv_time = time.time()
delay_time = (recv_time - send_time) * 1000
except socket.timeout:
delay_time = -1
# 关闭socket并返回延迟时间
icmp_socket.close()
return delay_time
上述代码中,我们通过struct模块构造了一个ICMP数据包,然后使用socket模块创建了一个原始套接字,并设置它的TTL值为指定的值。接着,我们发送数据包,并记录发送时间。然后,我们等待接收响应包,并计算接收时间与发送时间之间的差值,即为延迟时间。最后,我们关闭socket并返回延迟时间。
接下来,我们需要定义一个函数来扫描一个IP地址范围。以下是该函数的代码:
import multiprocessing
def scan_ips(start_ip, end_ip, ttl):
for i in range(start_ip, end_ip):
dest_addr = f"192.168.1.{i}"
delay_time = send_icmp_packet(dest_addr, ttl)
if delay_time > 0:
print(f"IP地址 {dest_addr} 可达,延迟时间为 {delay_time}ms")
上述代码中,我们遍历指定的IP地址范围,并调用send_icmp_packet函数来扫描每个IP地址。如果延迟时间大于0,则说明该IP地址可达,并将其输出到控制台。
最后,我们需要将任务分配给多个进程来实现并发扫描。以下是完整的Python程序代码:
import multiprocessing
def send_icmp_packet(dest_addr, ttl):
icmp_type = 8
icmp_code = 0
icmp_checksum = 0
icmp_id = 1
icmp_seq = 1
# 构造ICMP数据包
icmp_packet = struct.pack("bbHHh", icmp_type, icmp_code, icmp_checksum, icmp_id, icmp_seq)
# 创建socket
icmp_socket = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.getprotobyname("icmp"))
icmp_socket.setsockopt(socket.IPPROTO_IP, socket.IP_TTL, ttl)
# 发送数据包并记录时间
icmp_socket.sendto(icmp_packet, (dest_addr, 0))
send_time = time.time()
# 接收响应包并计算延迟时间
try:
_, _, _, _, _ = icmp_socket.recvfrom(1024)
recv_time = time.time()
delay_time = (recv_time - send_time) * 1000
except socket.timeout:
delay_time = -1
# 关闭socket并返回延迟时间
icmp_socket.close()
return delay_time
def scan_ips(start_ip, end_ip, ttl):
for i in range(start_ip, end_ip):
dest_addr = f"192.168.1.{i}"
delay_time = send_icmp_packet(dest_addr, ttl)
if delay_time > 0:
print(f"IP地址 {dest_addr} 可达,延迟时间为 {delay_time}ms")
if __name__ == "__main__":
start_ip = 1
end_ip = 255
ttl = 64
num_processes = 4
# 计算每个进程扫描的IP地址范围
ips_per_process = (end_ip - start_ip) // num_processes
start_ips = [start_ip + i * ips_per_process for i in range(num_processes)]
end_ips = [start_ip + (i + 1) * ips_per_process for i in range(num_processes - 1)] + [end_ip]
# 创建并启动多个进程
processes = []
for i in range(num_processes):
p = multiprocessing.Process(target=scan_ips, args=(start_ips[i], end_ips[i], ttl))
p.start()
processes.append(p)
# 等待所有进程结束
for p in processes:
p.join()
上述代码中,我们使用multiprocessing模块创建了4个进程,并将任务分配给每个进程。每个进程将扫描一定范围的IP地址,并输出结果到控制台。最后,我们等待所有进程结束。
总结:IP地址扫描是网络安全中常用的一项技术,本文主要介绍了如何使用Python编写一个简单的IP地址扫描程序。通过使用socket和struct模块,我们构造了ICMP数据包,并使用multiprocessing模块实现了多线程并发扫描。
原文地址: https://www.cveoy.top/t/topic/INg 著作权归作者所有。请勿转载和采集!