Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4057
  • 博文数量: 1
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 20
  • 用 户 组: 普通用户
  • 注册时间: 2013-05-26 19:40
文章分类
文章存档

2014年(1)

我的朋友
最近访客

分类: 其他平台

2014-06-06 17:03:58

修改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.

阅读(2343) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:没有了

给主人留下些什么吧!~~