Python报文操作模块scapy

pip install scapy
-----------------------------------------------
import scapy
'''
介绍:
Scapy 是一个强大的操纵报文的交互程序。
它可以伪造或者解析多种协议的报文,还具有发送、捕获、匹配请求和响应这些报文以及更多的功能。
Scapy 可以轻松地做到像扫描(scanning)、路由跟踪(tracerouting)、探测(probing)、单元测试(unit tests)、攻击(attacks)和发现网络(network discorvery)这样的传统任务。
它可以代替hping,arpspoof,arp-sk,arping,p0f 甚至是部分的Namp,tcpdump和tshark 的功能

'''
-----------------------------------------------
中文文档:https://www.ctolib.com/docs-scapy-doc-c-Introduction.html
demo:
from scapy.all import *
from scapy import all
from scapy.layers.inet import IP,ICMP
import logging
from random import randint
'''
介绍:
Scapy 是一个强大的操纵报文的交互程序。
它可以伪造或者解析多种协议的报文,还具有发送、捕获、匹配请求和响应这些报文以及更多的功能。
Scapy 可以轻松地做到像扫描(scanning)、路由跟踪(tracerouting)、探测(probing)、单元测试(unit tests)、攻击(attacks)和发现网络(network discorvery)这样的传统任务。
它可以代替hping,arpspoof,arp-sk,arping,p0f 甚至是部分的Namp,tcpdump和tshark 的功能
中文文档:https://www.ctolib.com/docs-scapy-doc-c-Introduction.html
'''

logging.getLogger("scapy.runtime").setLevel(logging.ERROR)

def start(host):
    id_ip = randint(1,65535)#ip_id
    id_ping = randint(1,65535)#ping_id
    seq_ping = randint(1,65535)#ping序列号
    #构造ping数据包
    packet = IP(dst=host,ttl=1,id=id_ip,)/ICMP(id=id_ping,seq=seq_ping)/b'hello man'
    #获取响应信息,超时2秒,开启详细信息。
    ping = sr1(packet,timeout=2,verbose=True)
    #sr1:发送三层数据包,只等待接受一个数据包响应
    if ping:
        ping.show()
        os._exit(3)


if __name__ == '__main__':
    start(sys.argv[1])
ping——demo
import ipaddress
import time
from multiprocessing import Process,Queue
import sys
from Scapy_demo.ping_demo import start

def more_start(network):
    net = ipaddress.ip_network(network)
    ip_process = {}
    for ip in net:
        ip_addr = str(ip)
        ping_one = Process(target=start,args=(ip_addr,))
        # ping_one.join()
        ping_one.start()
        ip_process[ip_addr] = ping_one
    ip_list = []
    for ip,process in ip_process.items():
        if process.exitcode == 3 :
            ip_list.append(ip)
        else:
            process.terminate()
    return sorted(ip_list)

if __name__ == '__main__':
    begin = time.time()
    active_ip = more_start(sys.argv[1])
    print("*****ACTIVE IP*****")
    for ip in active_ip:
        print(ip)
    end = time.time()
    print(end-begin)

更多内容需要对照官方文档自学

 
原文地址:https://www.cnblogs.com/cou1d/p/14315648.html