python构造icmp echo请求和实现网络探测器功能代码分享


Posted in Python onJanuary 10, 2014

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 相关文章推荐
Python数据结构之顺序表的实现代码示例
Nov 15 Python
python距离测量的方法
Mar 06 Python
jupyter notebook引用from pyecharts.charts import Bar运行报错
Apr 23 Python
PyQt5每天必学之拖放事件
Aug 27 Python
python取数作为临时极大值(极小值)的方法
Oct 15 Python
Python OOP类中的几种函数或方法总结
Feb 22 Python
Python中函数的基本定义与调用及内置函数详解
May 13 Python
解决Keras 与 Tensorflow 版本之间的兼容性问题
Feb 07 Python
浅谈Keras中shuffle和validation_split的顺序
Jun 19 Python
python打包生成so文件的实现
Oct 30 Python
python urllib和urllib3知识点总结
Feb 08 Python
Python基础之操作MySQL数据库
May 06 Python
python中mechanize库的简单使用示例
Jan 10 #Python
python使用新浪微博api上传图片到微博示例
Jan 10 #Python
python发腾讯微博代码分享
Jan 10 #Python
python实现2014火车票查询代码分享
Jan 10 #Python
python抓取豆瓣图片并自动保存示例学习
Jan 10 #Python
python文件比较示例分享
Jan 10 #Python
python发送伪造的arp请求
Jan 09 #Python
You might like
索尼SONY SRF-S83/84电路分析和打磨
2021/03/02 无线电
PHPEXCEL 使用小记
2013/01/06 PHP
PHP时间戳与日期之间转换的实例介绍
2013/04/19 PHP
谈谈PHP中substr和substring的正确用法及相关参数的介绍
2015/12/16 PHP
解决PHP上传非标准格式的图片pjpeg失败的方法
2017/03/12 PHP
用javascript实现改变TEXTAREA滚动条和按钮的颜色,以及怎样让滚动条变得扁平
2007/04/20 Javascript
基于jquery的无刷新分页技术
2011/06/11 Javascript
jQuery中offset()方法用法实例
2015/01/16 Javascript
JavaScript中的Number数字类型学习笔记
2016/05/26 Javascript
Javascript 5种方法实现过滤删除前后所有空格
2016/06/22 Javascript
再谈Javascript中的基本类型和引用类型(推荐)
2016/07/01 Javascript
使用JavaScript判断手机浏览器是横屏还是竖屏问题
2016/08/02 Javascript
几种二级联动案例(jQuery\Array\Ajax php)
2016/08/13 Javascript
jQuery文本框得到与失去焦点动态改变样式效果
2016/09/08 Javascript
微信小程序  网络请求API详解
2016/10/25 Javascript
关于Vue.js 2.0的Vuex 2.0 你需要更新的知识库
2016/11/30 Javascript
BootStrap整体框架之基础布局组件
2016/12/15 Javascript
Vuex 单状态库与多模块状态库详解
2018/12/11 Javascript
layui的数据表格+springmvc实现搜索功能的例子
2019/09/28 Javascript
详解小程序如何改变onLoad的执行时机
2019/11/01 Javascript
[01:01:13]2018DOTA2亚洲邀请赛 4.5 淘汰赛 Mineski vs VG 第三场
2018/04/06 DOTA
python 函数传参之传值还是传引用的分析
2017/09/07 Python
Python数据结构与算法之常见的分配排序法示例【桶排序与基数排序】
2017/12/15 Python
python调用matplotlib模块绘制柱状图
2019/10/18 Python
Python编译为二进制so可执行文件实例
2019/12/23 Python
Python常用base64 md5 aes des crc32加密解密方法汇总
2020/11/06 Python
香港No.1得奖零食网:香港零食大王
2016/07/22 全球购物
Agoda西班牙:全球特价酒店预订
2017/06/03 全球购物
EJB3.1都有哪些改进
2012/11/17 面试题
优秀教师先进材料
2014/12/16 职场文书
委托公证书样本
2015/01/23 职场文书
2015年九一八事变纪念日演讲稿
2015/03/19 职场文书
房地产公司工程部经理岗位职责
2015/04/09 职场文书
2015年乡镇组织委员工作总结
2015/10/23 职场文书
公司与个人合作协议书
2016/03/19 职场文书
Python进程池与进程锁之语法学习
2022/04/11 Python