簡體   English   中英

如何反轉Scapy數據包的位(數據包的補碼)

[英]How to invert the bits of a Scapy packet (complement of a packet)

假設我有一個數據包,其中包含都是十六進制值的字段。 如何定義一個返回數據包的函數,其中該數據包中所有字段的十六進制值都將反轉? 這是我到目前為止的內容:

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)

據我了解您的問題,您只需要反轉數據包,對嗎? 在這種情況下:

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM