Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python SCAPY HTTP请求URL PCAP_Python_Scapy_Pcap - Fatal编程技术网

Python SCAPY HTTP请求URL PCAP

Python SCAPY HTTP请求URL PCAP,python,scapy,pcap,Python,Scapy,Pcap,我正在尝试使用SCAPY和HTTP层请求读取PCAP文件,但没有输出。预计产量应为: 192.168.1.70刚刚请求了GET 192.168.1.68:8060/dial/dd.xml 任何帮助都将不胜感激。多谢各位 try: from scapy.all import * except ImportError: import scapy try: import scapy_http.http except ImportError: from scapy.l

我正在尝试使用SCAPY和HTTP层请求读取PCAP文件,但没有输出。预计产量应为:

192.168.1.70刚刚请求了GET 192.168.1.68:8060/dial/dd.xml

任何帮助都将不胜感激。多谢各位

try:
    from scapy.all import * 
except ImportError:
    import scapy

try:
    import scapy_http.http
except ImportError:
    from scapy.layers import http



packet = rdpcap('lo.pcap')

for p in packet:
    if not packet.haslayer('HTTPRequest'):
        return
    http_layer= packet.getlayer('HTTPRequest').fields
    ip_layer = packet.getlayer('IP').fields
    print('\n{0[src]} just  requested a {1[Method]} {1[Host]}{1[Path}]}'.format(ip_layer,http_layer))

大部分情况下都是这样的,但是变量名混淆了,所以我在for语句中将第一个包重命名为packets,并将p重命名为packet,而且return语句也不正确-您需要一个continue。知道在get/haslayer调用中可以将“HTTPRequest”与scapy_http.http.HTTPRequest互换使用是很有用的。这里有一个固定版本:

packets = rdpcap('lo.pcap')

for packet in packets:
    if not packet.haslayer('HTTPRequest'):
        continue
    http_layer= packet.getlayer('HTTPRequest').fields
    ip_layer = packet.getlayer('IP').fields
    print('\n{0[src]} just requested a {1[Method]} {1[Host]}{1[Path]}'.format(ip_layer,http_layer))
更新:Scapy现在内置了处理HTTP的支持。Scapy_HTTP包现在不推荐使用。虽然它们实际上不需要用于提取此应用程序的HTTP请求,因此您可以省略session=TCPSession,但对于提取多数据包响应非常有用。因此,虽然现在需要将字节解码/转换为字符串,但这可能更简单:

from scapy.layers.http import HTTPRequest
from scapy.all import *    
sniff(offline='lo.pcap', session=TCPSession, prn=lambda x: f'{x[IP].src} just requested a {x[HTTPRequest].Method.decode("utf-8")} {x[HTTPRequest].Host.decode("utf-8")}{x[HTTPRequest].Path.decode("utf-8")}' if x.haslayer(HTTPRequest) else None)

您在哪里调用进程\u tcp\u数据包?谢谢。我发现了一个错误,它不能帮助程序执行:@pchaigno谢谢你,先生