1
- Я пытаюсь вставить слой GRErouting между GRE и IP с помощью Scapy. Pcap, который я читаю, содержит один пакет, уложенный следующим образом: Ethernet/IPv4/GRE/IPv4/ICMP. Я вижу, что getLayer возвращает текущий слой + его полезную нагрузку, которая может включать в себя другие слои, и это не хорошо для меня. Я бы хотел получить только текущий слой. Когда я делаю getLayer для каждого слоя, а затем пишу весь массив, я получаю странный pcap из-за дополнительной полезной нагрузки, которую каждый слой имеет над ней.
Я также не могу использовать простую «печать» для вывода любых данных на консоль. Я понимаю, это связано с тем, что Scapy добавляет модуль протоколирования и подавляет регистрацию системы, но я хотел бы знать, как отменить это и использовать инструкцию print.Scapy: Вставка нового слоя и проблемы с регистрацией
import os import sys import logging logging.basicConfig() logging.getLogger("scapy.runtime").setLevel(logging.ERROR) from scapy.all import PcapReader, PcapWriter, fuzz, Packet from scapy.layers.l2 import GRE, GRErouting from scapy.layers.inet import IP logging.getLogger("scapy.runtime").setLevel(logging.DEBUG) logging.getLogger().setLevel(logging.DEBUG) def foo(in_filename, out_filename): f = PcapReader(in_filename) o = PcapWriter(out_filename) p = f.read_packet() while p: layers = [] counter = 0 while True: layer = p.getlayer(counter) if (layer != None): layers.append(layer) if (type(layer) is IP): del layer.chksum if (type(layer) is GRE): logging.getLogger().debug("there is a GRE layer") layer.routing_present = 1 gr = GRErouting() fuzz(gr) layers.append(gr) del layer.chksum else: break counter += 1 logging.getLogger().debug("Layers are: %s\t\t",layers) for l in layers: logging.getLogger().debug("%s", l) o.write(layers) p = f.read_packet() f.close() o.close() if __name__ == "__main__": logging.getLogger().debug('Executing main') if (len(sys.argv) == 3): in_filename = str(sys.argv[1]) out_filename = str(sys.argv[2]) if os.path.exists(in_filename) == False: sys.stderr.write("Either {0} does not exist, or you do not have proper permissions\n".format(in_filename)) else: foo(in_filename, out_filename) else: sys.stderr.write("USAGE: {0} <path to input file> <path to output file>\n".format(str(sys.argv[0])))
Обязательно принимайте ваш собственный ответ. – RyPeck