![](/img/trans.png)
[英]How to add bits to the application layer when building a packet with 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.