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爬虫代理IP快速增加博客阅读量
Dec 14 Python
如何用itertools解决无序排列组合的问题
May 18 Python
Python 快速实现CLI 应用程序的脚手架
Dec 05 Python
python2.7读取文件夹下所有文件名称及内容的方法
Feb 24 Python
mac PyCharm添加Python解释器及添加package路径的方法
Oct 29 Python
Python 二叉树的层序建立与三种遍历实现详解
Jul 29 Python
python 字典有序并写入json文件过程解析
Sep 30 Python
Pytorch 实现冻结指定卷积层的参数
Jan 06 Python
python里的单引号和双引号的有什么作用
Jun 17 Python
scrapy结合selenium解析动态页面的实现
Sep 28 Python
Python常用base64 md5 aes des crc32加密解密方法汇总
Nov 06 Python
利用python实现后端写网页(flask框架)
Feb 28 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
pw的一个放后门的方法分析
2007/10/08 PHP
逆序二维数组插入一元素的php代码
2012/06/08 PHP
ajax取消挂起请求的处理方法
2013/03/18 PHP
php实现简单爬虫的开发
2016/03/28 PHP
微信企业转账之入口类分装php代码
2018/10/01 PHP
PHP8.0新功能之Match表达式的使用
2020/07/19 PHP
jQuery autocomplate 自扩展插件、自动完成示例代码
2011/03/28 Javascript
五段实用的js高级技巧
2011/12/20 Javascript
javascript重写alert方法的实例代码
2013/03/29 Javascript
javascript将浮点数转换成整数的三个方法
2014/06/23 Javascript
快速掌握Node.js模块封装及使用
2016/03/21 Javascript
Angular 4环境准备与Angular cli创建项目详解
2017/05/27 Javascript
Angular+Node生成随机数的方法
2017/06/16 Javascript
angular4 共享服务在多个组件中数据通信的示例
2018/03/30 Javascript
在 Vue 项目中引入 tinymce 富文本编辑器的完整代码
2018/05/04 Javascript
Node.js npm命令运行node.js脚本的方法
2018/10/10 Javascript
VSCode使用之Vue工程配置eslint
2019/04/30 Javascript
详解在Angular4中使用ng2-baidu-map的方法
2019/06/19 Javascript
vue响应式更新机制及不使用框架实现简单的数据双向绑定问题
2019/06/27 Javascript
[01:03:27]Optic vs VGJ.S 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
在Python中使用pngquant压缩png图片的教程
2015/04/09 Python
Python设计模式之命令模式原理与用法实例分析
2019/01/11 Python
Django使用uwsgi部署时的配置以及django日志文件的处理方法
2019/08/30 Python
Python sep参数使用方法详解
2020/02/12 Python
4行Python代码生成图像验证码(2种)
2020/04/07 Python
彻底解决Python包下载慢问题
2020/11/15 Python
Pandas数据分析的一些常用小技巧
2021/02/07 Python
浅谈利用缓存来优化HTML5 Canvas程序的性能
2015/05/12 HTML / CSS
一套Java笔试题
2016/08/20 面试题
2014医学院领导干部四风对照检查材料思想汇报
2014/09/16 职场文书
2014年办公室文员工作总结
2014/11/12 职场文书
大学生党员个人总结
2015/02/13 职场文书
同学聚会通知短信
2015/04/20 职场文书
志愿者服务活动总结报告
2015/05/06 职场文书
摩登时代观后感
2015/06/03 职场文书
《我们的民族小学》教学反思
2016/02/19 职场文书