2009年2月16日星期一

vista里的事

设置系统调试引导:
{GUID}要替换为bcdedit /copy {current} /d DebugEntry产生的值。
bcdedit /copy {current} /d DebugEntry
bcdedit /dbgsetting serial baudrate:115200 debugport:1
bcdedit /displayorder {current} {GUID}
bcdedit /debug {GUID} on

其实,简单的说bcdedit /debug on就可以打开调试引导,然而如果机器上还有以前的操作系统需要引导还要加入:
bcdedit /create {legacy} /d "XP"
bcdedit /set {legacy} device boot
bcdedit /set {legacy} path ntldr
bcdedit /displayorder {legacy} /addlast

一般的,使用bcdedit /displayorder {legacy} /addlast就可以了。

打开调试信息:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Debug Print Filter
下建立项Debug Print Filter并建立DWORD值Defaut为0xfffffff。
Vista 主要设计目标客户机,所以打印调试信息需要用掩码打开,mask在Vista DDK
中有详细讲解。如果不想重启操作系统可以在windbg中直接设置mask。

VC6:
VC6带的编译器无法编译Vista DDK中的代码。错误信息是在DDK的一个头文件中
打印出来的,意思是这个版本的编译器无法被DDK支持。
SDK也有类似的情况,Windows 2003 sp1 SDK和之后版本也不再支持VC6
编译器。

libpcap:
在调试libpcap代码时,由于本机已经安装了libpcap,所以调试的时候系统使用了
早已安装好的release dll而不是要调试的刚刚编译好的debug dll。这样奇怪的事情
发生了。

DbgView:
OutPutDebugString是把User Mode调试信息发送给调试器的API。
如果使用OutPutDebugStrng的进程被Ring3调试器调试那么,调试信息会被发送
给Ring3调试器。如果有系统调试器工作,那么系统调试器也会收到。
而使用DbgView观察的User Mode调试信息是使用HooK。所以如果发现DbgView
不能工作应该先看看其capture菜单的设置情况。OSR上有关于Vista 64和DbgView
的相关讨论,但还没有来得急看。我们发现DbgView不能得到服务的调试信息,之
后发现,DbgView不能得到其它session的调试信息。原因是要访问别的Session
对象必须要加Global前缀并设置好权限。在新版的DbgView中要使用capture中的
Capture Global Win32。

nsi:
测试中发现,Vista在设置IP地址的时候使用了\device\nsi这个设备。我们上网搜索
到一篇相关文章,作者是CardMagic。那篇文章介绍了一种使用nsi来隐藏本机端口的
方法,因为以前的方法在Vista通通都废了。在HooK NtDeviceIoControlFile之
后我们得到了120013这个东西。事情还不算完,测试时发现Ping也会使用这个ControlCode,在对比了三个机器上数据结构格式之后,又加了一些判断。
在Ring3中,开UAC的时候dllhost用netsh.dll发送此controlcode,而没有UAC的
时候explorer会直接使用netsh.dll。

UAC:
万恶的UAC是最令我们痛苦的。在administrators组除了administrator之外,所有
的用户都使用标准用户权限,只有在询问用户之后才会被赋予真正的管理员权限。
在msconfig中可以配置UAC。需要提升权限的应用程序必须使用manifest文件编译
之后图标中就会出现一个小盾牌,但不幸的是这样也有例外,如果名字中patch等
字样的程序也会有小盾牌,并询问用户提升权限。Vista中新加入了一个
会话0隔离的概念,以前的操作系统会把高权限服务和普通应用程序放在同一个
会话之中,而Vista是把高权限的服务放在session 0之中,而session 0没有
打开桌面对象\windows\windowstations\winsta0,所以没有和用户交互的能力。
微软这么做是把高权限和与用户交互两种能力分开。我们以前的产品却有这样的
特性,比如客户端的某个服务,以高权限运行却又可以弹出提示窗口。现在在
微软的地盘上这是不被允许的。当然我们也不是没有办法。刚跳槽到微软内核组的
Mark Russinovich在谈到安全边界时提到CreateRemoteThread是个不安全的API,
Vista还有个完整性检查的概念(MIC)就是用来控制这个的,大概意思是低的打不开
高的,即使有权限。但我们不在这个概念的绞杀范围内,我们有正规的高权限
和高MIC的服务。这样用CreateRemoteThread注如到在session 1的winlogon.exe
让它来帮我们启动ClientUI。还可以用服务打开winlogon的token,在赋予我们的
ClientUI。但最后落到项目上还是顺着微软的意思把高权限和与用户交互功能分开。
我怀疑Mark Russinovich就是UAC的设计者,毕竟他是因为sony rootkit事件而名声大噪。有个设置UAC的工具叫TweakUAC.exe。

rename:
HooK NtSetInfomationFile把改名字的动作加以判断,阻止掉非法的改文件名操作。
但是用户可以在本路径下用剪切并复制创建一个名为"复件 filename.exe”的文件。
这样我们又HooK NtCreateFile判断创建的文件名是不是"复件 filename.exe"。
即使是这样还有漏洞,因为跨分区的文件操作还是不能阻止,但大家认为
这样熟悉文件系统并熟练使用cmd.exe的一般用户是不存在的。appmgr的一个不是
漏洞的漏洞是并没有判断NTFS文件系统特性:使用OBJECT ID访问文件。

1 条评论: