NetBIOS Name Service (NBNS)和Session Service (SMB)(SMB和NetBIOS的关系)

一、认识NetBIOS

NetBIOS是一种基于应用程序编程接口(API)的协议,它提供了网络中的会话会计服务、消息传递服务和名称解析服务等功能。NetBIOS可以运行在TCP/IP、IPX/SPX等多个网络协议上,用于在网络中寻址和访问计算机资源。

二、NBNS的作用

NetBIOS Name Service(NBNS)是NetBIOS的一部分,它负责将NetBIOS名称解析成网络地址,以便在网络上唯一标识计算机。NBNS将NetBIOS名称注册到WINS服务器或广播它们以获取名称解析响应。NBNS还负责缓存名称解析,以便在需要时可以快速解析名称。

三、Session Service(SMB)的作用

Session Service(SMB)是一种用于文件和打印机共享的协议。SMB可以在计算机之间建立会话连接,以便打开、读取、写入和关闭文件。SMB还提供了很多其他功能,如目录和文件管理、安全性、并发性和远程过程调用等。

四、NBNS和SMB的关系

NBNS和SMB的关系非常密切,因为计算机之间的SMB会话需要通过NetBIOS名称解析来建立和维护。当计算机A需要与计算机B建立SMB会话时,它会使用NetBIOS名称解析服务查找计算机B的IP地址,并使用此地址建立SMB会话连接。

五、代码示例

1、注册NetBIOS名称

import socket

# 定义NetBIOS名称
nbname = b'MYCOMPUTER'

# 创建UDP套接字
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

# 发送NetBIOS注册请求到广播地址
sock.sendto(nbname + b'x00x00x20x00x01x00x00x00x00x00x00x00x00x00x00x00x00', ('', 137))

# 等待NetBIOS注册响应
data, addr = sock.recvfrom(1024)

# 解析NetBIOS注册响应
if len(data) >= 57 and data[0:2] == b'x45x00' and data[3] == 0x00 and data[4] == 0x3c:
    ip = socket.inet_ntoa(data[-4:])
    print('NetBIOS名称已注册到IP地址', ip)
else:
    print('无法注册NetBIOS名称')
sock.close()

2、建立SMB会话连接

import socket

# 定义目标计算机的NetBIOS名称
nbname = b'MYCOMPUTER'

# 获取目标计算机的IP地址
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.settimeout(3)
sock.sendto(nbname + b'x00x00x21x00x01x00x00x00x00x00x00x00x00x00x00x00x00', ('', 137))
data, addr = sock.recvfrom(1024)
if len(data) >= 57 and data[0:2] == b'x45x00' and data[3] == 0x00 and data[4] == 0x3c:
    ip = socket.inet_ntoa(data[-4:])
sock.close()

# 建立SMB会话连接
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((ip, 445))
sock.send(b'x00x00x00x90xffx53x4dx42x72x00x00x00x00x08x01')
sock.recv(1024)

# 认证SMB会话连接
sock.send(b'x00x00x00x8exffx53x4dx42x73x00x00x00x00x18x07xc0x03x64x00')
ntlm = sock.recv(1024)

# 完成SMB会话连接
sock.send(b'x00x00x00x94xffx53x4dx42x32x00x00x00x00x08x01x00x0ex00x00x00x00x00x02x00x01x00x00x01x00xffxffx00x00x00x00x00x00x00x00x00x00x20x00x01x00x00x04xffx00x00x00')
data = sock.recv(1024)

sock.close()

六、总结

本文详细介绍了NetBIOS Name Service和Session Service的作用,以及它们之间的关系。同时,我们还给出了NetBIOS名称注册和SMB会话连接的代码示例,希望对读者有所帮助。

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注