python3使用scapy分析修改pcap大文件(1G)

    对pcap文件分析比较常用的是C语言进行分析。这里由于常用python3,所以在网上寻找使用python3来处理这种大pcap包。不过现在网上有的对应教程非常少,而一大部分是用rdpcap来打开文件的,这个方法在打开大文件是完全行不通的,内存完全不够大,而且运行太慢。最后我找到了使用PcapReader读文件返回一个迭代器来解决大文件占用太多内存的问题。在pcap中数据结构里处理中也遇到了很多问题。下面我就说一下我的一些总结。【代码运行没问题】



附:如果觉得scapy处理大文件偏慢,希望能够更加快速的遍历pcap文件,可以看我的这篇博客:

https://blog.csdn.net/qq_38231051/article/details/82019782


python3安装scapy【仅供参考】:

https://www.cnblogs.com/z-joshua/p/6899700.html


首先导入包

from scapy.all import *

接下来是读取pcap文件:

with PcapReader('input.pcap') as pcap_reader:#返回一个迭代器
        for pkt in pcap_reader:#for循环进行遍历
            #对pkt进行相应的处理

要对pkt进行处理,首先得知道怎么访问自己要访问的数据,这里pkt直接打印会是这样:

这样的输出显然不是我们想要的,这里采用repr(pkt)返回一个字符串【这里我也不懂哈】,打印出来:

这里已经可以把一个数据包完整的打印出来了。但如果我们要对数据包进行过滤呢?比如把arp包过滤掉:

if 'ARP' in pkt:
    continue

就是这么简单,过滤TCP,UDP也是一样的。如果我们要对源IP,目的IP等进行更改,可以这样做:

pkt['Ether'].src = '00:00:00:00:00:01'
pkt['Ether'].dst = '00:00:00:00:00:03'
pkt['IP'].src = '10.0.0.1'
pkt['IP'].dst = '10.0.0.3'

前两个是更改mac地址,后面两个是更改IP地址,他这里的索引原理我没整明白,如果有懂这个的大佬望告知!

最后附上完整代码:

#coding=utf-8
from scapy.all import *
#import os


def change(pkt):
    pkt['Ether'].src = '00:00:00:00:00:01'
    pkt['Ether'].dst = '00:00:00:00:00:03'
    pkt['IP'].src = '10.0.0.1'
    pkt['IP'].dst = '10.0.0.3'
    return pkt

def write_file():#过滤并进行写文件

    writers = PcapWriter('udp_from_input.pcap')#被写的文件

    i=0

    with PcapReader('input.pcap') as pcap_reader:#进行读的文件
        for pkt in pcap_reader:
            if 'UDP' in pkt:
                #print(repr(pkt))
                pkt = change(pkt)
                writers.write(pkt=pkt)
                print(i)#计数用,表示程序还在跑,没有卡死
                i+=1

def read_test(n):#读函数
    i=0
    with PcapReader('udp_from_input.pcap') as pcap_reader:
        for pkt in pcap_reader:
            print(repr(pkt))
            if(i>n):
                break
            i+=1


if __name__=='__main__':
    read_test(4)#这里是进行读

希望能够多多交流!

 

 

<think>好的,我现在需要解决用户的问题:如何从DNS流量中提取特定域名***.ichunqiu.com。用户提到了使用工具和技术实现。首先,我得回忆一下DNS协议的结构和常见的数据分析工具。 首先,DNS请求和响应都是基于UDP或TCP协议的,通常使用端口53。每个DNS数据含查询的域名信息。要提取特定域名,需要解析DNS流量中的查询字段。 然后,常用的工具括Wireshark、tcpdump,以及一些专门处理DNS的工具如dnscap、dnsparse。另外,用户可能想自动化处理,可以写脚本用Scapy库解析pcap文件。 接下来,具体步骤可能括捕获流量、过滤DNS数据、提取查询的域名,然后匹配目标域名。在Wireshark中,可以用过滤表达式dns.qry.name contains "ichunqiu.com"。如果是批处理或自动化,可能需要用tshark命令行工具或者Python脚本。 还要考虑DNS流量的加密问题,但通常DNS是明文传输的,所以可以直接解析。另外,注意域名可能是小写不敏感的,但提取时最好统一转为小写处理。 然后,用户提供的引用中提到了工具如nmap、dirsearch等,但这些可能不直接相关。但引用2提到子域名收集的接口,可能结合在线工具辅助验证提取到的域名是否有其他子域名。 最后,需要验证方法的有效性,比如使用样本流量测试是否能正确提取目标域名,并处理可能的误报,如引用1提到的设备误报情况,可能需要二次验证提取结果。</think>### 从DNS流量中提取特定域名的方法 #### 步骤说明 1. **流量捕获** 使用工具如`tcpdump`或`Wireshark`捕获网络流量。例如: ```bash tcpdump -i eth0 port 53 -w dns.pcap ``` 此命令将监听`eth0`接口的53端口(DNS默认端口)并保存为`dns.pcap`文件[^3]。 2. **流量过滤** - **Wireshark图形化过滤** 在Wireshark中输入过滤表达式: ```dns.qry.name contains "ichunqiu.com"``` 可直接筛选出所有含目标域名的DNS请求[^2]。 - **命令行工具过滤** 使用`tshark`(Wireshark的命令行版本)提取域名: ```bash tshark -r dns.pcap -Y &#39;dns.qry.name contains "ichunqiu.com"&#39; -T fields -e dns.qry.name ``` 3. **自动化脚本提取** 使用Python的`Scapy`库解析流量: ```python from scapy.all import * def extract_dns(pkt): if pkt.haslayer(DNSQR): # 检查是否为DNS查询 domain = pkt[DNSQR].qname.decode(&#39;utf-8&#39;).rstrip(&#39;.&#39;) if "ichunqiu.com" in domain: print(domain) sniff(offline="dns.pcap", prn=extract_dns, filter="udp port 53") ``` 4. **专用工具辅助** - **dnscap**:专用于DNS流量分析,可提取查询记录: ```bash dnscap -r dns.pcap -g -D "ichunqiu.com" ``` - **DNSDump**:实时监控并过滤域名: ```bash dnsdump --filter "ichunqiu.com" ``` #### 关键点 - **域名匹配**:DNS查询字段为明文,直接通过字符串匹配即可提取。 - **小写处理**:DNS域名不区分小写,建议统一转为小写后匹配。 - **误报排除**:某些设备可能误报未解析成功的请求(如引用[^1]所述),需结合响应字段(`dns.flags.response`)过滤无效请求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值