修改Windows SMB相关服务的默认端口
Windows NT系列操作系统的NetBTNetBios Over Tcpip服务,是用来处置SMBServer Message Block相关的服务/客户操作的。
NetBT服务对应的驱动程序言件是netbt.sys,对应的注册表项是:HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesNetBT。微软的KB 120642和KB 314053分离描写了Windows NT、Windows 2000、Windows XP上该键值的局部可选参数。
NetBT服务对应的在Windows NT 4.0上对应的端口是:
NameservicePort 137/UDP
DatagramPort 138/UDP
SessionPort 139/TCP
从Windows 2000开始,微软引入了SMB Direct Over TCP的445端口。上述的137、138、139 端口固然被保存,并可畸形工作,但是默认情况下,系统老是会使用445端口进行SMB会话,仅在445端口工作失败的情况下,才会应用139端口作为SessionPort。445端口默认情形下是始终开放的。如果要关闭该端口,可以参考微软KB 301673中的方式,在HKEY_LOCAL_MACHINESystemCurrentControlSetServicesNetBTParameters中增添一个值:
Value Name: SmbDeviceEnabled
Type: REG_DWORD
Value Data: 0
然后重新启动系统。
顺便提一下,如果要封闭139端口,可以参考微软的KB 299977:
1、 单击开端,指向设置,而后单击网络和拨,衔接。
2、 单击你盼望静态配置的本地连接,单击文件菜单中的属性。
3、 单击 Internet 协定 (TCP/IP),单击属性,单击高等,然后单击 WINS 选项卡。
4、 单击禁用 TCP/IP 上的 NetBIOS。
5、 单击断定,单击确定,再次单击肯定。
修正会即时生效,不用从新启动体系。
这个445 端口可不能够改成别的值呢·剖析netbt.sys可知,服务初始化的时候,函数NbtReadRegistry分别调用ReadParameters和ReadSmbDeviceInfo从注册表中获取NetBT服务的配相信息:
;
push .ebp+Handle.
push offset _NbtConfig
call _ReadParameters8 ; ReadParameters(x,x)
push .ebp+KeyHandle.
call _ReadSmbDeviceInfo4 ; ReadSmbDeviceInfo(x)
;
ReadParameters读取的注册表值就在上面提到的三篇KB中基础都有相关阐明,然而ReadSmbDeviceInfo 所获取的信息,仿佛还没有现成的文档描述。下面是逆向工程出来的5.0.2195.6783版本netbt.sys的ReadSmbDeviceInfo函数:
;
; __stdcall ReadSmbDeviceInfo(KeyHandle)
KeyHandle dword ptr 8
push ebp
mov ebp, esp
lea eax, .ebp+KeyHandle.
push esi
push eax ; KeyHandle
push offset aParametersSmb ; "ParametersSmb"
push .ebp+KeyHandle. ; int
call _NbtOpenRegistry12 ; NbtOpenRegistry(x,x,x)
mov esi, eax
test esi, esi
jl short SetDefaultPort ;如果键不存在则转向去设置默认值
push 1
push 1BDh ; 默认值445
push offset aSessionport ; "SessionPort"
push .ebp+KeyHandle.
call _NbtReadSingleParameter16 ; NbtReadSingleParameter(x,x,x,x)
push 1
push 1BDh ; 默认值445
push offset aDatagramport ; "DatagramPort"
mov word_2BA88, ax
push .ebp+KeyHandle.
call _NbtReadSingleParameter16 ; NbtReadSingleParameter(x,x,x,x)
push .ebp+KeyHandle. ; Handle
mov word_2BA8A, ax
call ds:__imp__ZwClose4 ; __declspec(dllimport) ZwClose(x)
jmp short Return
SetDefaultPort:
mov SessionPort, 1BDh ;设置SessionPort为445
mov DatagramPort, 1BDh ;设置DatagramPort为445
Return:
mov eax, esi
pop esi
pop ebp
retn 4
;
显然,ReadSmbDeviceInfo会先试图翻开HKEY_LOCAL_MACHINESystemCurrentControlSetServicesNetBTParametersSmb然后分别读取SessionPort 和DatagramPort,依据其中的值来设置相干端口。假如打开键失败,则转向 SetDefaultPort,将两个端口设置为默认的445,如果读取值失败,NbtReadSingleParameter的第三型参也指定了默认的返回值445。
SessionPort 和DatagramPort分辨对应TCP跟UDP的端口。不外我素来不见到过UDP的SMB会话,所以,仍是SessionPort更加主要一些。
然后NbtCreateAddressObjects根据这些信息,来打开始口,创立服务:
;
mov eax, .ebp+var_8.
mov cx, SessionPort ; tcp端口值
mov esi, offset aSmbserver ; ".SMBSERVER "
mov .eax+1F2h., cx
mov eax, .ebp+var_8.
mov cx, DatagramPort ; udp端口值
mov .eax+1F6h., cx
mov eax, .ebp+var_8.
mov .eax+1F4h., di
mov eax, .ebp+var_8.
lea edi, .eax+1F8h.
阅读(2383) | 评论(0) | 转发(0) |