python 抓包与解包

我使用的环境为:Windows10、python3.6、scapy 2.4.0
一、基本知识

Sniff方法定义:

sniff(filter="",iface="any", prn=function, count=N)

filter的规则使用 Berkeley Packet Filter (BPF)语法
iface用来指定要在哪个网络接口上进行抓包(通常不指定即所有网络接口)
prn指定回调函数,每当一个符合filter的报文被探测到时,就会执行回调函数,通常使用lambda表达式来写回调函数
count指定最多嗅探多少个报文(是指符合filter条件的报文,而非所有报文)

filter写法举例:

抓取源地址为 www.baidu.com 的报文:

>>> sniff(filter="ip src www.baidu.com", iface=ifs, prn=lambda x:x.summary(), count=3)

Ether / IP / TCP 14.215.177.39:https > 192.168.2.204:6593 A / Padding
Ether / IP / TCP 14.215.177.39:https > 192.168.2.204:6593 A / Padding
Ether / IP / TCP 14.215.177.39:https > 192.168.2.204:6593 A / Raw
Out[15]: <Sniffed: TCP:3 UDP:0 ICMP:0 Other:0>

抓取目的地址网段为192.168.2.204/24的报文,没有设置count,所以会一直输出:

>>> sniff(filter="dst net 192.168.2.204", iface=ifs, prn=lambda x:x.summary())

Ether / IP / TCP 180.97.162.191:8202 > 192.168.2.204:4963 PA / Raw
Ether / IP / TCP 180.97.162.191:8202 > 192.168.2.204:4963 PA / Raw
Ether / IP / TCP 180.97.162.191:8200 > 192.168.2.204:4967 PA / Raw / Padding
Ether / IP / TCP 180.97.162.191:8202 > 192.168.2.204:4963 PA / Raw
。。。

抓取非ICMP的报文:

>>> sniff(filter="not icmp", iface=ifs, prn=lambda x:x.summary(), count=3)

Ether / IP / TCP 192.168.2.204:4963 > 180.97.162.191:8202 A
Ether / IP / TCP 180.97.162.191:8202 > 192.168.2.204:4963 PA / Raw
Ether / IP / TCP 192.168.2.204:4962 > 180.97.162.191:8202 A
Out[9]: <Sniffed: TCP:3 UDP:0 ICMP:0 Other:0>

prn函数举例:
将抓取到的报文的summary打印出来:

>>> sniff(filter="", iface=ifs, prn=lambda x:x.summary(), count=3)
Ether / IP / TCP 180.97.162.191:8202 > 192.168.2.204:4963 PA / Raw
Ether / IP / TCP 192.168.2.204:4963 > 180.97.162.191:8202 A
Ether / IP / TCP 180.97.162.191:8202 > 192.168.2.204:4963 PA / Raw
<Sniffed: TCP:3 UDP:0 ICMP:0 Other:0>

将所有IP报文的源地址打印出来:

>>> sniff(filter="", iface=ifs, prn=lambda x:x[IP].src, count=3)

180.97.162.191
192.168.2.204
14.215.177.39
<Sniffed: TCP:3 UDP:0 ICMP:0 Other:0>

也可使用回调函数:

def packet_callback(packet):
    print packet.show()

sniff(prn=packet_callback, count=10)

二、代码示例

import os
from scapy.all import sniff,wrpcap,Raw,IP,TCP

def get_pcap(ifs,ip=None,size=100):
    ''' 获取指定 ifs(网卡), 指定数量size 的数据包;
        如果有指定ip,则这里只接收tcp,80端口,指定ip的包 '''
    filter = ""
    if ip:
        filter += "ip src %s and tcp and tcp port 80"%ip
        dpkt = sniff(iface=ifs,filter=filter,count=size)
    else:
        dpkt = sniff(iface=ifs,count=size)
    # wrpcap("pc1.pcap",dpkt) # 保存数据包到文件
    return dpkt

def get_ip_pcap(ifs,sender,size=100):
    ''' 获取指定 ifs(网卡), 指定发送方 sender(域名或ip) 的数据包
        size:(一次获取数据包的数量) '''
    if 'www.' in sender:
        v = os.popen('ping %s'%sender).read()
        ip = v.split()[8]
        print("准备接收IP为 %s 的数据包..."%ip)
    else:
        ip = sender
        print("准备接收IP为 %s 的数据包..."%ip)
    count = 0
    while count<10:
        d = get_pcap(ifs,ip=sender,size=size)
        for i in d:
            try:
                if i[IP].src==ip: # 发送方的IP为:ip  接收方的IP:i[IP].dst==ip
                    print(i[Raw].load)
            except:
                pass
        count+=1

def main():
    ifs = 'Realtek PCIe GBE Family Controller' # 网卡
    ip = "116.4.8.127"  # ip地址,也可写域名,如:www.baidu.com
    get_ip_pcap(ifs,ip,size=1)  # 一次接收一个包

if __name__ =='__main__':
    main()

保存文件为:grab_unpack.py
然后打开网站页面,是一个动态刷新的图

执行:python grab_unpack.py
输出结果:

原文地址:https://www.cnblogs.com/enumx/p/12330586.html

时间: 2024-08-30 08:08:28

python 抓包与解包的相关文章

Python中的参数解包:`*`表达式和 `**`表达式

目录 1.参数解包:方法调用中的*表达式和**表达式 2.参数解包:方法定义中的*表达式和**表达式 3.在元组,列表,集合和字典中解包 4.Extended Unpacking:赋值表达式左边的*表达式 1.参数解包:方法调用中的*表达式和**表达式 如果语法*表达式出现在函数调用中,则该表达式必须是可迭代的. 这些可迭代集合的元素被视为附加的位置参数. 对于调用f(x1, x2, *y, x3, x4),如果y等于序列[y1,...,yM],则等效于调用f(x1, x2, y1, ...,

python之打包,解包

#coding:utf-8 #字符串,列表,元组打包与解包 aString = 'abc' aList = [1, 2, 3] aTuple = 'a', 'A', 1 print('Unpacking string......') first, second, third = aString print("string values:", first, second, third) print('\nUnpacking list......') first, second, thir

函数参数自动解包

你使用*, **可以自动的对一个list,dict做函数参数,自动的解包 例子: def draw_point(x, y): # do some magic point_foo = (3, 4) point_bar = {'y': 3, 'x': 2} draw_point(*point_foo) draw_point(**point_bar) 这是一个非常捷径的用法. NOTE: 请看这两个程序的不同... def cheeseshop(kind, *arguments, **keywords

《双星物语》游戏资源格式分析与解包

作为一款 2001 年发行的老游戏,封包算法应该不会很复杂才对,抱着这样想法的博主,尝试着去分析游戏资源包的封包格式,最后成功将资源解包,下面我们来看看双星物语的游戏资源包封包格式: 游戏资源包以 dat 作为扩展名,一共有两个,分别是 wav.dat 和 BIN.dat,其中 wav.dat 体积较小,先从它下手,用十六进制编辑器打开后,可以看到整齐的文件头部,经过观察发现,整个资源包以[包头][文件类型信息][文件信息][文件数据]这样子的结构组织而成: 首先是[包头],大小为 8 字节,前

R关联规则分析之Arules包详解

Arules包详解 包基本信息 发布日期:2014-12-07 题目:挖掘关联规则和频繁项集 描述:提供了一个表达.处理.分析事务数据和模式(频繁项集合关联规则)的基本框架. URL:http://R-Forge.R-project.org/projects/arules/,http://lyle.smu.edu/IDA/arules/ 依赖包: Matrix包 建议学习包:pmml, XML, arulesViz, testthat 作者(牛牛们):Michael Hahsler [aut,

python抓包截取http记录日志

#!/usr/bin/python import pcap import dpkt import re def main(): pc=pcap.pcap(name="eth1")                                             # 抓取 eth1 pc.setfilter('tcp port 80')                                                       # 过滤表达式 tcp port 80

2.TCP_IP互联线缆_TCP_UDP报文抓包详解

TCP_IP互联线缆_TCP_UDP报文抓包详解 2.1网线标准 直通线 交叉线 异种设备互联使用直通线 同种设备互联使用交叉线 TCP和UDP 端口寻址 TCP数据格式 TCP三次握手 UDP数据格式 IP报头格式 ICMP报文格式 ARP协议 ARP报文格式

iOS开发——使用Charles进行https网络抓包详解

我在前面两篇博客中<网络抓包工具Charles的介绍与使用><iOS开发--使用Charles进行http网络抓包详解>对Charles的http抓包进行了详细的讲解.今天我们来实现一下进行https的抓包,比http抓包稍微麻烦一点. (1)https初级的配置请参考<网络抓包工具Charles的介绍与使用>中的https配置部分. (2)由于目前iOS9更改了对于https网络的安全机制,所以还需要在iPhone上安装一个证书,安装方式如下: 在iPhone的Saf

python 输入参数解包,模块导入,接收IO输入参数

#coding=utf-8 from sys import argv script,first,second,third = argv print "the script is=",script print "the first is=",first print "the second is=",second print "the third is=",third """ 执行方法 D:\>