一、认识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会话连接的代码示例,希望对读者有所帮助。