Есть ли способ изменить строки внутри файлов .pcap с помощью python scapy, не выдавая при этом ошибку?Python

Программы на Python
Ответить
Anonymous
 Есть ли способ изменить строки внутри файлов .pcap с помощью python scapy, не выдавая при этом ошибку?

Сообщение Anonymous »

Я экспериментирую со scapy в Python и записал тестовый pcap, который содержит только передачу файла по HTTP. Содержимое файла представляет собой обычный текст.
Я пытаюсь изменить строку сервера:

Код: Выделить всё

HTTP/1.0 200 OK
Server: SimpleHTTP/0.6 Python/3.11.8
на другой, скажем:

Код: Выделить всё

HTTP/1.0 200 OK
Server: A custom one
Дело в том, что после этого изменения размер пакета меняется и в результате многие TCP-пакеты помечаются как повторные, в содержимом HTTP-пакета написано, что байтов не хватает и т. д.
Есть ли способ изменить строки и соответствующие поля размера, чтобы pcap оставался без ошибок?
P.S. Я попытался изменить поля «Длина кадра» и «Длина захвата» слоя Ether, но все равно получал ошибки.
На данный момент мой демонстрационный сценарий:

Код: Выделить всё

from scapy.all import *

def replace_user_agent(packets):
i = 0
for packet in packets:
i+=1
if packet.haslayer(Raw):
raw = packet[Raw].load
if b"SimpleHTTP/0.6 Python/3.11.8" in raw:
raw = raw.replace(b"SimpleHTTP/0.6 Python/3.11.8", b"A custom one"+ b" " * (len("SimpleHTTP/0.6 Python/3.11.8") - len("A custom one"))) # cover the missing length with spaces
packet[Raw].load = raw

# Recalculate length fields and checksums
if packet.haslayer(IP):
del packet[IP].len  # Recalculate IP length
del packet[IP].chksum  # Recalculate IP checksum
if packet.haslayer(TCP):
del packet[TCP].chksum  # Recalculate TCP checksum
elif packet.haslayer(UDP):
del packet[UDP].len  # Recalculate UDP length
del packet[UDP].chksum  # Recalculate UDP checksum

return packets

if __name__ == "__main__":
input_pcap = "input.pcap"
output_pcap = "output.pcap"

packets = rdpcap(input_pcap)
modified_packets = replace_user_agent(packets)
wrpcap(output_pcap, modified_packets)
Этот сценарий делает и не делает то, чего я пытаюсь достичь. По сути, он заменяет строку сервера моей более короткой пользовательской строкой, а для недостающих байтов просто используются пробелы.


Подробнее здесь: https://stackoverflow.com/questions/792 ... py-wthiout
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»