windows XP/2003下的UAC

七月 31st, 2008

要增强计算机抵抗病毒木马的能力,最有效的方法是使用低权限帐号执行日常操作,特别是在现在恶意软件普遍采用驱动方式直入系统内核进行操作的环境下,这要比装好几个杀毒软件更能保护你的电脑。Windows Vista在安全上的最大改进就是引入了UAC机制,确保高权限不被滥用。而在Vista之前的系统,微软也提供了runas工具,但操作不太方便,本来系统的用户友好度和安全性就是对立的两个方面,但显然runas在这两者之间的平衡性需要调整一下。

下面这个方法可以不用一次次的用runas运行程序,而是一次性的获得一个管理员权限环境,执行完要求高权限的操作后再返回普通权限环境。

首先创建两个账户,一个Adimistrator一个user。

平时使用一个User权限的帐号,上网看影片什么的,等到需要管理员权限的时候,用runas开一个Adimistrator帐号的CMD,在里面运行taskmgr或tskill杀死explorer,然后重开一个explorer,这时的explorer就有管理权限了,用鼠标双击运行的程序也会继承这个权限,方便执行高权限操作。最后用同样的方法回到user用户环境。

貌似更复杂了,但这个过程可以写成脚本或程序,之后的操作就简单了。

但是有一点,runas以后用户配置文件会改变,这样桌面和程序设置之类的信息就无法保持连贯,能不能让两个帐号用同一个Profile呢?

Windows所有的配置信息都放在注册表。

而注册表本身是几个文件,分别放在系统目录\windows\system32\config和用户主目录下面。详细信息记录在注册表的HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\hivelist这里。

注册表中跟用户环境有关的信息在以下

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders

其值都是一些跟用户主目录相关的内容,其中有一个%USERPROFILE%变量,如果能改变它的值就可以一劳永逸的改变profile位置了,开一个cmd运行一下set,可以看到当前USERPROFILE的值,通常是C:\Documents and Settings\user这样的,而它的值是在

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList

这里设置的,profilelist下有很多项,都是以帐号的SID名命的,帐号sid可以通过systeminternal工具里的 psgetsid获得,如psgetsid Administrator可以得到Administrator这个帐号的sid,一般是S开头加一串数字并以500结尾,具体命名规则《Windows Internals》这本书上有介绍。找到对应的项下面的ProfileImagePath键值,这就是%USERPROFILE%变量对应的值,修改它的值使之指向其他用户的profile目录,注销重登陆,再运行set命令,就可以发现,USERPROFILE到值已经被改变了。

不过实际操作过程中有很多限制,

首先必须用Administrator帐号复用user帐号的profile,反之会因为user到权限不够访问不了admin的profile而无法正常登录(windows会自动创建一个TEMP的profile以供临时使用),试了一下在文件ACL中给user增加完全控制权限也不行。

而先用administrator登录后,不重启只是注销再登录user系统会提示“Windows 不能加载本地存储的配置文件……安全权限不足……”这样的提示,然后为你创建一个TEMP的profile。

另开一个管理员帐号用handle考察一下发现administrator注销以后System这个进程依然打开着administrator 的profile目录中的NTUSER.DAT也就是HKEY_CURRENT_USER注册表的文件,因为user也要用这个文件,但又抢不过 admin所以就登录失败了。

设备管理器里面双击你的网卡,打开高级标签,属性里面有一个Network Address,默认的值是”不存在”,上面的方框可以手动输入任意新的物理地址,当然具体情况,根据装的网卡驱动不同而有所差别。网卡物理地址是48位的,表示成16进制就是12个数字,形如0800200070DF,其中前六位是厂商,如080020开头说明是SUN公司生产的。具体列表见http://www.erg.abdn.ac.uk/users/gorry/course/lan-pages/mac-vendor-codes.html

我在修改的时候, 开了一个Regmon监视写注册表操作,发现HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002bE10318}007\NetworkAddress的键值被改变成刚设置的MAC地址值,于是试了一下直接在注册表里修改,然后重启一下网络连接,发现果然也可以这样修改MAC地址。就写了一个脚本自动修改。

Dim objShell
Set objShell = CreateObject(”Wscript.Shell”)
objShell.RegWrite “HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002bE10318}007\NetworkAddress”,”0800200070DF”
Return =objShell.Run(”netsh int set interface name=”"本地连接”" admin=disabled”,1,true)
Return =objShell.Run(”netsh int set interface name=”"本地连接”" admin=enabled”,1,true)

重启网络连接的方法是从这里学来的http://www.eecx.com/ping/article.asp?id=149,另外发现WSH语法里面引号里转义引号是用两个引号,这个让我小纠结了一会。

Windows跨网段共享文件

七月 14th, 2008

网上邻居的文件共享协议是基于TCP/IP的,既然如此文件共享应该在互联网范围内可用,但事实上,在一般情况下两个不同子网中的电脑都不能共享文件。这主要是因为子网间通信需要经过路由,而大部分路由器都屏蔽了Windows文件共享协议用到的445,139这些端口。
所以只要能更改共享文件用到的端口,就可以突破这个限制了。
Windows用的文件共享协议是SMB,Linux下也有一个实现Samba。
Windows 2000以后的SMB可以直接通过TCP/IP运行,用的是445端口。
但是为了兼容2000以前的Windows,SMB也通过NetBIOS over TCP/IP运行,使用139端口。如果网络中没有2000以前的机器,可以禁用之,完全是冗余的东西而且有不小的安全隐患,在TCP/IP协议属性里更改,不用重启立即生效。当然也可以不禁用,因为等我们改了445端口以后,正常的Windows机器就无法通过455端口和我们共享文件了,这时候139端口就有用了。

修改SMB端口号,只需在注册表中添加下面两个键值,22b即555是新端口号可以改为其他的,但两台电脑要能互相访问共享必须改成同样的端口号。
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NetBT\Parameters\Smb]
"SessionPort"=dword:0000022b
"DatagramPort"=dword:0000022b

重启后,开一个CMD运行netstat -an | findstr 455,检查455端口是否被关闭。
建议把两个键值导出为reg文件,去所有想要共享文件的电脑上双击运行一下。
另外如果有这个键值"UseNewSmb"=dword:00000001先删除之。

更详细的信息见
http://www.xfocus.net/releases/200408/a723.html
http://www.petri.co.il/what%27s_port_445_in_w2k_xp_2003.htm