核心编程随笔4

来源:互联网 发布:美工证书 编辑:程序博客网 时间:2024/05/17 23:51

Note 1:
在Windows Vista中,系统DLLs是在进程地址空间的随机地址加载的.所以,不要像在Windows XP中那样将PEB的地址硬编码为0x7ffdf000.相反,你需要调用NtQueryInformationProcess,并传递ProcessBasicInformation作为参数.别忘了,在一个版本的Windows中发现的未文档化的细节可能在下一个版本中发生改变.
Note 2:
audiodg.exe(Windows Audio Device Graph Isolation)是一个受保护的进程.这种新的进程类型是从Windows Vista开始引入的.
例如,可以用它为DRM(数字权限保护)应用程序提供更大程度的隔离.另外,理所当然地,远程进程访问受保护进程的虚拟内存的权限也被取消了.由于这个权限是列出已加载的DLL所必须的,所以ToolHelp API自然无法返回这些细节了.可从以下网址下载受保护进程的白皮书:http://www.microsoft.com/whdc/system/vista/process_Vista.mspx
Note 3:
Windows Vista还实现了另一个安全机制,即“Windows完整性机制"(Windows Integrity Mechanism),以前称为“强制完整性控制"(Mandatory Integrity Control).

除了众所周知的安全描述符(SID)和访问控制列表(ACL),现在还为一个受保护的资源分配了一个所谓的完整性级别(integrity level),这是通过系统访问控制列表(SACL)中的一个新增的ACE(访问控制项)来实现的.凡是没有这个ACE的安全对象,将被操作系统默认为拥有“中"(Medium)完整性级别.另外,每个进程都有一个基于其安全令牌的完整性级别,它与系统授予的一个信任级别是对应的.
信任级别
级别   应用程序示例
低    保护模式中的Internet Explorer是以“低"信任级别来运行的,它将拒绝从网上下载的代码修改其他应用程序和Windows环境.
中    默认情况下,所有应用程序都以“中"信任级别来启动,并使用一个筛选过的令牌来运行.
高    如果以提升后的权限来启动,会以“高"信任级别来运行.
系统   只有以Local System或Local Service的身份运行的进程,才能获得这个信任级别.
代码试图访问一个内核对象时,系统会将主调进程的完整性级别与内核对象的完整性级别进行比较.如果后者高于前者,就拒绝修改和删除操作.注意,这个比较是在检查ACL之前就完成的.所以,即便进程拥有访问资源的权限,但由于它运行时使用的完整性级别低于资源所要求的完整性级别,所以仍会被拒绝访问.假如一个应用程序要运行从网上下载的代码或脚本,这个设计就尤其重要.在Windows Vista上运行的Internet Explorer 7正是利用了这个机制,以“低"完整性级别来运行.这样一来,下载的代码就不能更改其他任何应用程序的状态,因为那些应用程序的进程默认是以“中"完整性级别来运行的.

Note 4:
对于一个高完整性级别的进程内核对象,即使已经设置了"No-Read-Up",另一个完整性级别较低的进程也能在较高完整性地址空间中读取——只要向这个进程授予了Debug权限.
Note 5:
除了在进程之间提供内核对象的访问保护,窗口系统还利用完整性级别来拒绝低完整性级别的进程访问/更新高完整性级别的进程的用户界面.这个机制称为用户界面权限隔离(User Interface Privilege Isolation,UIPI).操作系统将封锁从完整性级别较低的进程post的(通过PostMessage)、发送的(通过SendMessage)或者拦截的(通过Windows hook)Windows消息,阻止完整性级别较高的进程拥有的一个窗口获取信息或者被注入虚假的信息.你可以使用WindowDump这个实用程序来做实验(http://download.microsoft.com/download/8/3/f/83f69587-47f1-48e2-86a6-aab14f01f1fe/EscapeFromDLLHell.exe)
Note 6:
为了获得一个列表框的每一项所显示的文本,WindowDump调用SendMessage函数,并将LB_GETCOUNT作为参数来传递,这样可以获得要读取文本内容的元素的数量.随后,我们调用SendMessage,并将LB_GETTEXT作为参数来获取文本内容.然而,假如WindowDump进程运行时使用的完整性级别低于拥有列表框的那个进程,那么第一个SendMessage调用虽然能成功,但会返回0作为元素数量.如果以"中"完整性级别来启动Spy++,那么用它获取一个窗口的消息时,如果那个窗口是由一个较高完整性级别的进程创建的,就会观察到相同的行为(对结果进行筛选).