새 프로토콜을 Scapy에 추가하고 구체적인 필드에 어려움이 있습니다. 이 필드는 패키지 페이로드의 길이를 지정합니다. 필드는 페이로드의 길이에 따라 1, 2, 3 또는 4 바이트가 될 수 있습니다. 또한 인코딩됩니다. 필드의 크기가 1, 2, 3 또는 4 바이트인지 확인하기 위해 찾은 방법은 값의 첫 번째 바이트를 가져오고 127보다 작 으면 필드가 1 바이트로 표시됩니다. 127이고 x보다 작 으면 2 바이트로 표시됩니다 (인코딩 알고리즘 때문입니다).Scapy - 동적 길이가있는 새 필드 추가
그래서 문제는 첫 번째 바이트의 값에 따라이 필드 길이를 동적으로 정의 할 수 없다는 것입니다. 내가 시도한 첫 번째 일은 ConditionalFields
으로이 문제를 처리하는 것이지만 잘못된 경로와 같은 느낌입니다.
ConditionalField(ByteField("length",1), lambda pkt:pkt.length <= 127),
ConditionalField(ShortField("length",None), lambda pkt:pkt.length > 127),]
나는이 솔루션은 새로운 Scapy 필드를 정의하는 것입니다 생각하지만, 그에 따라 첫 번째 바이트 및 설치 길이에 액세스하는 방법을 모르겠어요. 모든 제안을 부탁드립니다. 미리 감사드립니다.
디코딩 알고리즘 : 당신은 구현해야
def test(encoded_byte):
if((encoded_byte & 128) != 0):
return True
else:
return False
def decoding(bytes):
multiplier = 1
value = 0
offset = 0
condition = True
while condition:
encoded_byte = bytes[offset]
value += (encoded_byte & 127) * multiplier
multiplier *= 128
if multiplier > 128 ** 3:
raise Exception('Malformed Remaining Length')
offset += 1
condition = test(encoded_byte)
return value
제시하고자하는 코드가 있습니까? –
필드 값에 대해 프로그래밍 한 조건부 필드와 디코딩 알고리즘이 있습니다. – somarhs