修改 Windows SMB 的 port

2007-01-11 17:52

在 Windows 2000(包括XP) 以後,
運作 SMB Client 時 (就是一般俗稱的網芳) ,
會先連接目標的 tcp 445 port , 若失敗才改用舊的 139 port ,
想連接其他 port 的話 ,
一些常見有人提出的方法如 \\host:port 或 \\host port 是沒有用的 ...

而為什麼需要更改 port 呢 ?
因為之前許多 Worm 的災情實在太慘烈, 加上安全性的考量 ....
所以許多單位、或是學校都直接把這幾個 port 封掉了 ...

如果親朋好友間想分享 A .... merican 的一些影集,
或是自己架了 samba 放在學校,
就沒辦法從外面存取了 ....
這時就需要來惡搞, 把 windows 裡預設會連線的 port 換掉 .

這兩個 port 沒辦法直接修改,
不過可藉由一些逆向工程的手法分析 (當然不是我分析的, 我只是學別人這樣講 XD),
而知道在系統啟動時, 會去載入 %windir%\system32\drivers\netbt.sys ,
相關的動作就是在這個檔案裡定義,
所以要更改 port 也可以從這個檔案下手 ...

拿 IDA Pro 等軟體對其作 disassembly 後, 會找到類似這樣的一段 ASM -
( 我的該檔案版本為 5.1.2600.2180 )

; __stdcall ReadSmbDeviceInfo(x)
_ReadSmbDeviceInfo@4:      ; CODE XREF: LmGetFullPath(x,x)+FBC↓p
  mov   edi, edi
  push  ebp
  mov   ebp, esp
  push  esi
  lea   eax, [ebp+PoolType]
  push  eax
  push  offset aParametersSmb ; “Parameters\\Smb”
  push  [ebp+PoolType]
  call  _NbtOpenRegistry@12 ; NbtOpenRegistry(x,x,x)
  mov   esi, eax
  test  esi, esi
  jge   loc_321A6
  mov   word_2B9DC, 1BDh
  mov   word_2B9DE, 1BDh

loc_321A6:           ; CODE XREF: LmGetFullPath(x,x)+C21↑j
  push  1
  push  1BDh
  push  offset aSessionport ; “SessionPort”
  push  [ebp+PoolType]
  call  _NbtReadSingleParameter@16 ; NbtReadSingleParameter(x,x,x,x)
  push  1
  push  1BDh
  push  offset aDatagramport ; “DatagramPort”
  push  [ebp+PoolType]
  mov   word_2B9DC, ax
  call  _NbtReadSingleParameter@16 ; NbtReadSingleParameter(x,x,x,x)
  push  [ebp+PoolType] ; Handle
  mov   word_2B9DE, ax
  call  ds:__imp__ZwClose@4 ; ZwClose(x)
  jmp   loc_2E058

loc_2E058:           ; CODE XREF: LmGetFullPath(x,x)+4DC4↓j
  mov   eax, esi
  pop   esi
  pop   ebp
  retn  4
 
 
可以發現在取得 port 時,
會先去找 Parameters\Smb\SessionPort 及 Parameters\Smb\DatagramPort
如果沒有的話, 就用預設的 port 445 ( 1BDh )

再往前推, 會看到是找 registry 裡的
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\NetBT\ 這個機碼

所以 445 port 這個部份, 可以透過新增 registry 處理,
例如產生一個檔案存成 test.reg , 內容像這樣 -

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NetBT\Parameters\Smb]
“SessionPort”=dword:000003DB
“DatagramPort”=dword:000003DB

然後匯入 registry , 就會把預設的 445 port 改成 987 (3DB)
 
 
一般來說, 想連非標準 port 的 samba 時 (或其他台 windows 也這樣子改過),
只要加完機碼重開機就可以 ... (通常我會拿 sniffer 作驗證)
因為 windows 會先試這個 port , 不行才轉向用 139 ...

不過如果想改預設的 139 port 的話,
似乎就沒有機碼可以搞了 ...
找了一下 , 在 NbtCreateDeviceObject 這個 function , 往下跳了幾次後 ...
會看到這樣的 code -

.text:0001CAE5         mov   word ptr [esi+1F8h], 8Bh
.text:0001CAEE         mov   word ptr [esi+1FAh], 89h
.text:0001CAF7         mov   word ptr [esi+1FCh], 8Ah

89h = 137
8Ah = 138
8Bh = 139

分別是傳統的 Nameservice Port、Datagram Port、Session Port
只要用 hex editor 直接改這些地方 , 換成想改的 port 即可 ~~
當然 445 要直接這樣改也可以啦 ... 不過加 registry 比較好看 :p
 
 
要注意的是 , 作了這些設定後 ,
自己對外連、或是本機相關 service 的 listen port 都會一起變,
除非有特定用途 (像我就有需要) , 且知道自己在幹嘛, 不然不要亂搞哦 ^_^

Reference :
修改Windows SMB相關服務的默認端口


呼 .. Windows 白痴 + ASM 智障 的我 , 弄這些弄了好久  :S


Windows 類別的文章 :
IBM Driver linkPutty 0.59

2 則留言 新增留言

  • 1. SpongeBob  |  January 29th, 2007 at 11:46

    您~真行!!

  • 2. saber  |  December 27th, 2008 at 02:25

    我在XP下是OK的

    但是VISTA好像修改過無法成功

    請問vista的話應該要如何處理?

新增留言

*

*

訂閱這則留言的 RSS Feed


各分類文章

最近的 20 篇文章