最近在看SMB协议,在自己构造数据包的时候发现了一个问题。

经过查阅资料发现NETBIOS对主机名的编码方式如下:

1.将字符补齐到16字节,不够的用空格补
2.将每个字符拆成高4bit和低4bit
3.再用0x41就是A加上这个值

举个例子abcd的编码流程:
1.补空格到16字节

"abcd "

2.将每个字符拆开

拆分前
0x61 0x62 0x63 0x64 0x20 0x20 0x20 0x20 0x20 ...
拆分后
0x6 0x1 0x6 0x2 0x6 0x3 0x6 0x4 0x2 0x0 0x2 0x0

3.用0x41加上这个值

0x47 0x42 0x47 0x43 0x47 0x44 0x47 0x45 0x43 0x41 ...
GBGCGDGECA

自己用python实现了一下

def encode(src):
src = src.ljust(16,"\x20")
names = []
for c in src:
char_ord = ord(c)
high_4_bits = char_ord >> 4
low_4_bits = char_ord & 0x0f
names.append(high_4_bits)
names.append(low_4_bits)
res = ""
for name in names:
res += chr(0x41+name)
return res