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