def handle_tls_packet(pkt):
如果pkt.haslayer(原始):
B=字节(pkt[raw].加载)
如果b[0]==0x16:
version=int.from_bytes(b[1:3],'大')
message_len=int.from_bytes(b[3:5],'大')
握手类型=B[5]
握手长度=从字节开始的整数(b[6:9],“大”)。
打印(“v=”,版本,“len=”,消息长度,“htype=”,握手类型
,“hlen=”,握手长度)
如果握手类型=11:
#从来没有发生过-为什么?
certs_len=int.from_bytes(b[7:11],'大')
edit2:
如cukic0d所建议的,我使用了load_layer(“ssl”)。
显然,pkt[tls].msg
is a list(to hold multiple tls messages in one packet?)不管怎样,我把每一条这样的信息的类型都打印出来了:
def handle_tls_packet(pkt):
对于pkt[tls].msg中的tls_msg:
打印(类型(tls_msg))
我期望看到一个tlscertificateobject,但从未见过这样的对象。
为什么?
edit3:
我愿意使用scapy-ssl_l tlsif that will make life easier.Raw
. 如果是这样,我提取的有效载荷如下:b = bytes(pkt[Raw].load)
. 接下来,我检查一下第一个字节为0x16
下面的两个字节需要是一个合适的TLS版本。
问题是此消息无法通过这些条件。Wireshark给我看的\x16\x03\x03
字节在位置吗0000
(附图片),但我想这是为了方便。
我的假设是有效载荷必须从0x16
错了?
附笔
我不想用scapy-ssl_tls
图书馆。

编辑
这是代码:
def handle_tls_packet(pkt):
if pkt.haslayer(Raw):
b = bytes(pkt[Raw].load)
if b[0] == 0x16:
version = int.from_bytes(b[1:3], 'big')
message_len = int.from_bytes(b[3:5], 'big')
handshake_type = b[5]
handshake_length = int.from_bytes(b[6:9], 'big')
print("v = ", version, " len = ", message_len, " htype =", handshake_type
, "hlen =", handshake_length)
if handshake_type == 11:
# never happens - Why?
certs_len = int.from_bytes(b[7:11], 'big')
编辑2:
按照建议Cukic0d公司我用过load_layer("ssl")
.
显然地,pkt[TLS].msg
是一个列表(在一个数据包中保存多个TLS消息?)不管怎样,我打印了每一条这样的信息的类型:
def handle_tls_packet(pkt):
for tls_msg in pkt[TLS].msg:
print(type(tls_msg))
我希望看到TLSCertificate
对象,但从未见过这样的对象。
为什么?
EdTe3:
我愿意用scapy-ssl_tls
如果这能让生活更轻松。