APP下载

基于NetBIOS名字服务获取MAC地址的原理及实现

2014-12-23陈争光冯惠妍王德福

关键词:字段字节整数

陈争光,冯惠妍,王德福

(1.黑龙江八一农垦大学信息技术学院,黑龙江大庆163319;2.东北农业大学工程学院,黑龙江哈尔滨150030)

Media Access Control(MAC)地址,或称为MAC位址、物理地址,用来定义网络设备的位置,长度为48 bit,在网络底层的物理传输过程中,通过MAC来识别主机.此外,MAC地址在多方面起着重要作用,基于MAC协议的无线网络传输具有简单、高效和稳定等特点[1].在大型计算机机房的网络管理中,MAC地址起着非常重要的作用[2-4];在交换机中实现IP和MAC绑定可以有效防止随意配置IP地址,多机配置同一IP地址,一机配置多个IP地址,甚至有意盗用IP地址等混乱局面;在机器的路由表中通过静态绑定IP和MAC地址的方式可以有效防止ARP病毒的攻击.MAC地址具有全球唯一性,因此,可用网卡的MAC地址对应用程序加密从而保证应用程序仅在被授权的机器上运行,有效地防止了软件产品的非法拷贝.由此可见,MAC地址在很多方面有着广泛的应用.

获取MAC地址是基于MAC地址的应用的前提,特别是对于拥有大量计算机的实验室或高校计算机机房而言,如何快速准确获取每台机器的MAC地址对于实验室管理者来说有着非常重要的意义.关于获取MAC地址的方法,有大量的文献报道.伍红兵[5]介绍了基于Windows平台获取网卡MAC地址的多个方法以及通过NetBIOS获取网卡的MAC地址的方法,但是其文中介绍的方法只是获取本地机器的 MAC地址.Windows提供的API函数SendARP能获取远程主机的MAC地址信息,但是该函数功能单一,只能获取MAC地址,不能同时获取远程主机的机器名和所在的工作组名或域名等信息.

文中从NetBIOS名字服务标准入手,深入分析与获取MAC地址信息密切相关的NODE STATUS REQUEST数据包和NODE STATUS RESPONSE数据包的组成,并在Visual C++2010环境中实现基于socket通信的远程主机MAC地址获取程序.

1 NetBIOS Over TCP/IP

NetBIOS(network basic input/output system)最初开发的目的是用于只有很少数量的微型计算机网络.随着计算机网络的发展,到目前为止,全球已有许多平台和应用程序需要依赖于 NetBIOS.文献[6-7]在不同的操作系统中实现了NetBIOS,并对性能进行了比较,但是没有在目前最常用的Windows平台上实现.NetBIOS有基于多种协议的实现版本,比如 NetBIOS Over IPX,NetBIOS Over TokingRing等.但是,基于这些协议的实现已经过期,基本不再使用.目前最常使用的是NetBIOS Over TCP/IP(NBT).

NBT提供3种类型的服务:① 基于UDP/TCP 137端口提供 NetBIOS name service(简称 NBNS),实现的是计算机名和IP地址之间的映射;② 基于UDP 138端口的 NetBIOS datagram service(简称NBDS),较少使用;③ 基于TCP 139端口的NetBIOS session service服务(简称 NBSS),为 Windows文件和打印机共享提供支持.

文中的主要内容基于NBNS原理的MAC地址获取,NBNS服务在 RFC1002[8]中有描述,在 Windows Server平台中有一个称为WINS(Windows Internet name service)的服务实现了NBNS,但是该服务很难集成到用户特定应用程序中.

2 获取远程主机MAC地址原理分析

获取远程计算机MAC地址的原理是基于RFC1001/1002之规定的NetBIOS名称服务.其原理简图如图1所示,计算机1向远程计算机2的137端口发送一个NODE STATUS REQUEST请求数据包,计算机2收到该数据包后,向计算机1返回一个NODE STATUS RESPONSE响应数据包,该数据包中包含计算机2的MAC地址、机器名称、所属的工作组等信息.下面介绍请求数据包和响应数据包的格式.

图1 获取远程主机MAC地址过程

2.1 NODE STATUS REQUEST数据包格式

NODE STATUS REQUEST数据包由12 byte的HEADER域和38 byte的QUESTION ENTRIES域2部分组成,HEADER域在前.

2.1.1 HEADER域组成

NODE STATUS REQUEST数据包中12 byte的HEADER域分为8个字段.其结构如图2所示.

图2 HEADER域组成

图2各字段意义如下:

NAME_TRN_ID:16 bit无符号整数,事务标记(Transaction ID),在Request请求数据包中,可以任意设置该字段,远程主机返回的Response应答数据包中含有相同的Transaction ID.这个字段主要用于标记请求和应答数据包之间的对应关系.如果不需这种对应关系,该字段可以填充0x0或任意值.

OPCODE:5 bit,最高位为0表示数据包为Request请求,最高位为1表示数据包为Response应答,其余4个比特位均为0.

NM_FLAGS:7 bit,操作标志,最低位为1表示广播或多播,最低位为0表示单播,其他位均为0.

RCODE:4 bit,请求结果码,一般为0.

QDCOUNT:16 bit无符号整数,请求查询问题的个数,对于Request数据包,该值为1,对于Response数据包,该值为0.

ANCOUNT:16 bit无符号整数,对于Response数据包有用,Response数据包中资源记录(响应问题)的个数,一般为1.

NSCOUNT:16 bit无符号整数,对于本应用,始终为0x0.

ARCOUNT:16 bit无符号整数,对于本应用,始终为0x0.

因此,对于NODE STATUS REQUEST数据包,其HEADER域的取值如图3所示,其中,广播或多播时比特位B的取值为1,单播时比特位B的取值为0.

图3 NODE STATUS REQUEST数据包HEADER域取值

2.1.2 QUESTION ENTRIES域组成

NODE STATUS REQUEST数据包中QUESTION ENTRIES部分由3个字段组成,其结构如图4所示.

图4 QUESTION域组成

图4中,QUESTION_NAME为要查询的远程计算机的名称,长度为34 byte.

NBNS规定,计算机NetBIOS的名称不超过16 byte,且最后一个字节必须为0x0.在发送 NODE STATUS REQUEST数据包之前,必须将16 byte的NetBIOS名称进行转换,转换过程是将16 byte的计算机名映射到32 byte空间,图5所示的流程是将1个字节映射为2个字节的过程.

图5 NetBIOS名称转换过程

转换过程中将每个字符ASCII码的8位二进制均分成2部分,2部分右对齐,左侧补0,形成2个“半字符”,这2个“半字符”分别加上字符‘A’的ASCII码.很显然,上述过程是可逆的,并且任意一个字符经过上面的转换之后变成了2个大写字符,这2个大写字符的只能是{A,B,C,…,N,O,P}16个字符中的一个.

由于发送NODE STATUS REQUEST数据包时并不知道远程计算机的NetBIOS名称,为了让接收数据包的计算机能分辨出数据包为NetBIOS名称查询类型数据包,机器名使用通配符“*”,即NetBIOS名称为“*”后面跟15 byte的0x0,共16 byte.经过名称映射后变为以下32个字符,称为 NetBIOS Name ServiceWildcard Query[9],即 变 为:CKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.

QUESTION_NAME字段的第1个字节存储远程计算机(映射后的)NetBIOS名称的长度,其值为0x20,最后一个字节为0x0,代表NetBIOS名称结束.因此,对于名字查询数据包,QUESTION_NAME字段的内容是如下的34 byte(十六进制形式):0x20 0x43 0x4b 0x41 0x41 0x41 0x41 0x41 0x41 0x41 0x41 0x41 0x41 0x41 0x41 0x41 0x41 0x41 0x41 0x41 0x41 0x41 0x41 0x41 0x41 0x41 0x41 0x41 0x41 0x41 0x41 0x41 0x41 0x00.

上面的分析过程及数据解释了文献[10-11]中“NetBIOS Name Service Wildcard Query”的由来.

QUESTION_TYPE:16 bit无符号整数,对于NODE STATUS REQUEST数据包,取值为0x0021.

QUESTION_CLASS:16 bit无符号整数,取值为0x0001.

2.2 NODE STATUS RESPONSE数据包格式

当某台机器的137端口收到NODE STATUS REQUEST请求数据包之后,由该机器的NETBIOS服务随即生成并返回一个NODE STATUS RESPONSE响应数据包.该响应数据包由HEADER域和RESOURCE RECORD域 2部分组成.其中HEADER域与REQUEST数据包的HEADER域在结构上完全一致,在此不再介绍.

2.2.1 RESOURCE RECORD域组成

RESOURCE RECORD域组成如图6所示.

图6 RESOURCE RECORD域组成

图6中各字段的意义如下:

RR_NAME:34 byte,与Request数据包的QUESTION_NAME格式定义相同.

RR_TYPE:16 bit无符号整数,与前面Request数据包的QUESTION_TYPE字段取值相同.

RR_CLASS:16 bit无符号整数,与前面Request数据包的QUESTION_CLASS字段取值相同.

TTL:4 byte,取值为 0x00000000.

RDLENGTH:16 bit无符号整数,表示从NUM_NAMES字段开始,到整个RESOURCE RECORD结束(包括NUM_NAMES,NODE_NAME ARRAY和STATISTICS)共有多少个字节.

NUM_NAMES:1 byte,表示紧随其后的NODE_NAME ARRAY数组的元素的个数.数组的每个元素具有NODE_NAME结构,如图7所示.

图7 NODE_NAME结构

图7 中,NETBIOS FORMAT NAME:16 byte,表示远程主机的机器名或组名,具体依赖于NAME_FLAGS字段的取值.NAME_FLAGS:2 byte,当最高位为1时,NETBIOS FORMAT NAME字段中存储的是Group NetBIOS名称,即工作组名,当最高位为0时,NETBIOS FORMAT NAME字段中存储的是机器名.

2.2.2 RESOURCE RECORD中的MAC地址

MAC地址的获取是文中主要关心的问题,RESOURCE RECORD的STATISTICS域所含的字段非常多,其开始的6 byte即是远程主机的MAC地址,图8是STATISTICS组成的开始部分,字段UNIT_ID即是MAC地址.由于其他字段不在文中关注之列,因此未画出来,但不影响程序的实现和运行.

图8 STATISTICS域组成

3 远程获取MAC地址实现

3.1 结构体定义

3.1.1 NODE STATUS REQUEST请求数据包定义

综合上面关于HEADER域和QUESTION ENTRIES域结构的分析,可以定义NODE STATUS REQUEST数据包结构体如下:

3.1.2 NODE STATUS RESPONSE数据包定义

根据上面的分析,可以定义NODE STATUS RESPONSE数据包的HEADER域和RESOURCE RECORD(部分)如下:

NODE STATUS RESPONSE数据包的STATISTICS域定义(部分):

NODE_NAME ARRAY数组元素NODE_NAME结构定义:

因此,完整的NODE STATUS RESPONSE数据包定义如下:

3.2 数据包的发送

为了获取远程计算机的信息,只需要定义nbname_request类型的结构体变量request并按要求赋值,将request变量通过TCP或UDP发送给远程主机的137端口,然后等待远程主机的应答数据包即可.结构体变量定义、成员赋值及数据发送代码如下:

上面代码中的函数name_mangle的功能就是前面提到的名称转换.实际上,由于结构体变量request的各个成员的值都是常量,因此,其全部50个字节十六进制形式如下:00 00 00 10 00 01 00 00 00 00 00 00 20 43 4b 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 00 00 21 00 01.

在实际的编程中,为了简化程序代码,可以简单地定义一个具有50个字节的字符数组存储上面的数据,并将这个数据发送到远程计算机的137端口即可.

3.3 数据包的接收

数据包发送之后,可以等待一个时间间隔(100 ms)接收数据包.接收数据包的代码如下:

3.4 程序的运行结果

笔者在Windows平台的Visual C++2010中实现了基于NODE STATUS REQUEST和NODE STATUS RESPONSE数据包结构的获取局域网内计算机MAC地址、机器名和工作组名等信息的程序,程序运行结果如图9所示.

图9 获取远程计算机MAC地址结果

4 结论

1)分析了NetBIOS Service相关协议格式,说明了获取远程计算机MAC地址和机器名等信息的原理和方法,给出了相关结构的C语言定义,并在Windows平台上实现了获取远程计算机的相关信息的功能.

2)参考文中的分析结果及方法,很容易实现对指定IP地址范围计算机的MAC地址进行快速扫描,批量获取MAC地址,为位于局域网内计算机的自动化管理及基于MAC地址的应用等工作奠定基础.

References)

[1]Zhu Jing,Roy Sumit.A 802.11 Based slotted dualchannel reservation MAC protocol for in-building multihop networks[J].Mobile Networks and Applications,2005,10(5):593-606.

[2]刘 波,齐德昱,段丽艳,等.基于IP广播的计算机远程唤醒机制及其实现[J].计算机应用研究,2004,21(7):237-238,247.Liu Bo,Qi Deyu,Duan Liyan,et al.Mechanism and implementation of remote wakening of computers based on IP broadcast[J].Application Research of Computers,2004,21(7):237-238,247.(in Chinese)

[3]Jimeno M,Christensen K,Nordman B.A network connection proxy to enable hosts to sleep and save energy[C]∥Proceedings of2008IEEE International Performance,Computing,and Communications Conference.Piscataway:IEEE,2008:101-110.

[4]沈 泓,范亚芹.企业局域网机密信息传输系统设计[J].吉林大学学报:信息科学版,2009,27(3):324-328.Shen Hong,Fan Yaqin.Design of underhandedness information transmission system with local area network[J].Journal of Jilin University:Information Science E-dition,2009,27(3):324-328.(in Chinese)

[5]伍红兵.如何获取网卡的MAC地址[J].计算机应用,2001,21(9):99-100.Wu Hongbing.How to get MAC address of network card[J].Computer Applications,2001,21(9):99-100.(in Chinese)

[6]Seet P K,Lee B S,Gay R K L.NETBIOS implementation and performance study of different network operating systems[J].Computer Communications,1991,14(1):5-14.

[7]Chutatape O.Performance evaluation and application of IPX network protocol in flexible manufacturing system[C]∥Proceedings of1996IEEE Conference on Emerging Technologies and Factory Automation.Piscataway:IEEE,1996:602-608.

[8]Network Working Group.Protocol standard for a Net-BIOS service on a TCP/UDP transport:detailed specifications[R].RFC 1002,1987.URL:https:∥tools.ietf.org/rfc/rfc1002.txt.

[9]Zurutuza U,Uribeetxeberria R,Zamboni D.A data mining approach for analysis of worm activity through automatic signature generation[C]∥Proceedings of the ACM Conference on Computer and Communications Security.New York:ACM,2008:61-70.

[10]Alonso Á,Porras S,Garitano I,et al.On the visualization of honeypot data through projection techniques[C]∥Proceedings of the10th International Conference on Computational and Mathematical Methods in Science and Engineering.Almeria, Spain:CMMSE,2010:1038-1049.

[11]Portokalidis G.Zero hour worm detection and containment using honeypots[D].Leiden,Dutch:School of Computer Science,Leiden University,2004.

猜你喜欢

字段字节整数
图书馆中文图书编目外包数据质量控制分析
No.8 字节跳动将推出独立出口电商APP
No.10 “字节跳动手机”要来了?
一类整数递推数列的周期性
简谈MC7字节码
聚焦不等式(组)的“整数解”
CNMARC304字段和314字段责任附注方式解析
无正题名文献著录方法评述
关于CNMARC的3--字段改革的必要性与可行性研究
人类进入“泽它时代”