python构造icmp echo请求和实现网络探测器功能代码分享
2014-01-10 00:00
1206 查看
python发送icmp echo requesy请求
扫描探测网络功能(网络探测器)
import socket import struct def checksum(source_string): sum = 0 countTo = (len(source_string)/2)*2 count = 0 while count<countTo: thisVal = ord(source_string[count + 1])*256 + ord(source_string[count]) sum = sum + thisVal sum = sum & 0xffffffff count = count + 2 if countTo<len(source_string): sum = sum + ord(source_string[len(source_string) - 1]) sum = sum & 0xffffffff sum = (sum >> 16) + (sum & 0xffff) sum = sum + (sum >> 16) answer = ~sum answer = answer & 0xffff answer = answer >> 8 | (answer << 8 & 0xff00) return answer def ping(ip): s = socket.socket(socket.AF_INET, socket.SOCK_RAW, 1) packet = struct.pack( "!BBHHH", 8, 0, 0, 0, 0 ) chksum=checksum(packet) packet = struct.pack( "!BBHHH", 8, 0, chksum, 0, 0 ) s.sendto(packet, (ip, 1)) if __name__=='__main__': ping('192.168.41.56')
扫描探测网络功能(网络探测器)
#!/usr/bin/env python3 # -*- coding: utf-8 -*- ''' 探测网络主机存活。 ''' import os import struct import array import time import socket import IPy import threading class SendPingThr(threading.Thread): ''' 发送ICMP请求报文的线程。 参数: ipPool -- 可迭代的IP地址池 icmpPacket -- 构造的icmp报文 icmpSocket -- icmp套字接 timeout -- 设置发送超时 ''' def __init__(self, ipPool, icmpPacket, icmpSocket, timeout=3): threading.Thread.__init__(self) self.Sock = icmpSocket self.ipPool = ipPool self.packet = icmpPacket self.timeout = timeout self.Sock.settimeout( timeout + 3 ) def run(self): time.sleep(0.01) #等待接收线程启动 for ip in self.ipPool: try: self.Sock.sendto(self.packet, (ip, 0)) except socket.timeout: break time.sleep(self.timeout) class Nscan: ''' 参数: timeout -- Socket超时,默认3秒 IPv6 -- 是否是IPv6,默认为False ''' def __init__(self, timeout=3, IPv6=False): self.timeout = timeout self.IPv6 = IPv6 self.__data = struct.pack('d', time.time()) #用于ICMP报文的负荷字节(8bit) self.__id = os.getpid() #构造ICMP报文的ID字段,无实际意义 @property #属性装饰器 def __icmpSocket(self): '''创建ICMP Socket''' if not self.IPv6: Sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.getprotobyname("icmp")) else: Sock = socket.socket(socket.AF_INET6, socket.SOCK_RAW, socket.getprotobyname("ipv6-icmp")) return Sock def __inCksum(self, packet): '''ICMP 报文效验和计算方法''' if len(packet) & 1: packet = packet + '\0' words = array.array('h', packet) sum = 0 for word in words: sum += (word & 0xffff) sum = (sum >> 16) + (sum & 0xffff) sum = sum + (sum >> 16) return (~sum) & 0xffff @property def __icmpPacket(self): '''构造 ICMP 报文''' if not self.IPv6: header = struct.pack('bbHHh', 8, 0, 0, self.__id, 0) # TYPE、CODE、CHKSUM、ID、SEQ else: header = struct.pack('BbHHh', 128, 0, 0, self.__id, 0) packet = header + self.__data # packet without checksum chkSum = self.__inCksum(packet) # make checksum if not self.IPv6: header = struct.pack('bbHHh', 8, 0, chkSum, self.__id, 0) else: header = struct.pack('BbHHh', 128, 0, chkSum, self.__id, 0) return header + self.__data # packet *with* checksum def isUnIP(self, IP): '''判断IP是否是一个合法的单播地址''' IP = [int(x) for x in IP.split('.') if x.isdigit()] if len(IP) == 4: if (0 < IP[0] < 223 and IP[0] != 127 and IP[1] < 256 and IP[2] < 256 and 0 < IP[3] < 255): return True return False def makeIpPool(self, startIP, lastIP): '''生产 IP 地址池''' IPver = 6 if self.IPv6 else 4 intIP = lambda ip: IPy.IP(ip).int() ipPool = {IPy.intToIp(ip, IPver) for ip in range(intIP(startIP), intIP(lastIP)+1)} return {ip for ip in ipPool if self.isUnIP(ip)} def mPing(self, ipPool): '''利用ICMP报文探测网络主机存活 参数: ipPool -- 可迭代的IP地址池 ''' Sock = self.__icmpSocket Sock.settimeout(self.timeout) packet = self.__icmpPacket recvFroms = set() #接收线程的来源IP地址容器 sendThr = SendPingThr(ipPool, packet, Sock, self.timeout) sendThr.start() while True: try: recvFroms.add(Sock.recvfrom(1024)[1][0]) except Exception: pass finally: if not sendThr.isAlive(): break return recvFroms & ipPool if __name__=='__main__': s = Nscan() ipPool = s.makeIpPool('192.168.0.1', '192.168.0.254') print( s.mPing(ipPool) )
相关文章推荐
- python构造icmp echo请求和实现网络探测器功能代码分享
- python实现多线程暴力破解登陆路由器功能代码分享
- python实现多线程暴力破解登陆路由器功能代码分享
- Python实现爬取知乎神回复简单爬虫代码分享
- 从零实现一个高性能网络爬虫(一)网络请求分析及代码实现
- python服务器端收发请求的实现代码
- 40行python代码,搭建一个网站并实现用户登陆功能(附源码下载)
- Cocos2d-x3.3RC0通过JNI调用Android的Java层代码,实现分享功能
- 使用python代码实现三叉搜索树高效率”自动输入提示”功能
- python实现2014火车票查询代码分享
- Python数据结构之栈、队列的实现代码分享
- 微信JS-SDK分享功能的.Net实现代码
- Android用代码实现GPS的开启/关闭功能+网络开关
- 基于php&mysql实现聊天室功能的代码实例分享
- Python实现的石头剪子布代码分享
- Android联网app必用Get请求和Post请求的区别,网络编程代码实现
- 使用requests+beautifulsoup模块实现python网络爬虫功能
- python 请求服务器的实现代码(http请求和https请求)
- Python实现爬取知乎神回复简单爬虫代码分享
- 一个 11 行 Python 代码实现的神经网络