Nano Hash - криптовалюты, майнинг, программирование

Как инвертировать биты пакета Scapy (дополнение пакета)

Скажем, у меня есть пакет, содержащий поля, все значения которых являются шестнадцатеричными. Как я могу определить функцию, которая возвращает пакет, в котором все шестнадцатеричные значения полей в пакете инвертированы? Вот что у меня есть до сих пор:

def complementPacket(pkt):
    '''
        Function: complementPacket
        Purpose: Takes a packet as an input and inverts all bits in the packet.
        Return: Inverted packet of same structure as the input packet
    '''
    retPkt = pkt
    while(pkt): # iterate through the packets
        for field in pkt.fields_desc:
            print(fmtToLen(field.fmt)) # converts scapy field.fmt to the number of bits for that field type
            # invert bits, assign to retPkt
        pkt = pkt.payload
    return retPkt

Единственное решение, которое я могу придумать, - это перебрать пакет и создать новый пакет, взяв дополнение всех полей. Есть лучший способ сделать это?

Для пакета P с шестнадцатеричными (двоичными) значениями я хочу вернуть ~P.


Пример:

def customPacket(Packet):
    name = "myPacket"
    fields_desc = [XByteField("data", 1)]

pkt = customPacket()

pkt.show() выведет, что значение 'data' равно 0x1

complementedPkt = complementPacket(pkt)

complementedPkt.show() выведет, что значение 'data' равно 0xE

(0x1 = 0001, ~0001 = 1110, 1110 = 0xE)

17.02.2018

  • вы можете использовать str() для преобразования пакета в необработанную строку, тогда есть тривиальные способы инвертировать эту строку, например, удалить все байты с помощью 0xff 17.02.2018
  • Это может быть глупый вопрос, но после того, как я это сделаю, как мне вернуть его обратно в объект пакета Scapy? 17.02.2018
  • вы МОЖЕТЕ создать пакет практически с любыми данными, которые вы хотите, но некоторые значения не могут быть изменены, как бы вы ни старались, например поля длины... зачем вам это в форме пакета? отправить его? в зависимости от типа пакета ОС может быть буквально не в состоянии отправить его 17.02.2018
  • Да, я хочу отправить. 19.02.2018
  • Пока ваш комментарий наиболее близок к возможному ответу. Не могли бы вы опубликовать это как ответ, чтобы, если он работает, я мог выбрать его как правильный? (может быть, немного подробнее) @AntiMatterDynamite 19.02.2018

Ответы:


1

Насколько я понял ваш вопрос, вам просто нужно инвертировать пакет, верно? В этом случае:

class Packet(object):
""" Class represents a Packet object """

# _fields - is a list containing all hexa values, e.g. 0xff, 0x14 
def __init__(self,vals):
    self._fields = list(vals)
'''
def __iter__(self):
    for field in self._fields:
        yield field '''

''' 
Function mimics  bit (~) inversion. For instance, 
1. 0xA4 -> ~1010 0100 -> 0101 1011 -> 0x5B
Param:
  mask -> number of bytes'''
def invert(self, mask=2):
    for (i, f) in zip(range(len(self._fields)), self._fields):
        #check is needed for Ox0000 value(s)
        if f.lower().lstrip('0x') == '':
            xor = int('0', 16) ^ int('f'*mask, 16)
            self._fields[i] = hex(xor)
        else:
            xor = int(f.lower().lstrip('0x'), 16) ^ int('f'*mask, 16)
            self._fields[i] = hex(xor)

def __str__(self):
    return ", ".join(x for x in self._fields)

def __repr__(self):
    return ", ".join(x for x in self._fields)  

Чтобы проверить это, вам нужно создать объект Packet и заполнить его данными. Вы можете попробовать это:

p1 = Packet([hex(x) for x in range(32)])
p2 = Packet([hex(x) for x in range(32,64)])
p3 = Packet([hex(x) for x in range(64,128)])

print("Original packet(p1): \n", p1)
p1.invert()
print("Packet after inversion(p1):\n",p1)
#----------------------------------------------
print("Original packet(p2): \n", p2)
p2.invert()
print("Packet after inversion(p2):\n",p2)
#----------------------------------------------
print("Original packet(p3): \n", p3)
p3.invert(3)
print("Packet after inversion(p3):\n",p3)
17.02.2018
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..