核心编程随笔4

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++,那么用它获取一个窗口的消息时,如果那个窗口是由一个较高完整性级别的进程创建的,就会观察到相同的行为(对结果进行筛选).

时间: 2024-09-10 07:44:46

核心编程随笔4的相关文章

核心编程随笔1

最理想的比较字符串函数是CompareString(Ex)和CompareStringOrdinal.对于需要以符合用户语言习惯的方式向用户显示的字符串,请用CompareString(Ex)进行比较.CompareString函数的原型如下:int CompareString( LCID locale,                  //LCID GetThreadLocale(); DWORD dwCmdFlags, PCTSTR pString1, int cch1,         

核心编程随笔7——线程调度和优先级

NOTE0--何为上下文切换 每一个线程都有一个上下文.后者保存在线程的内核对象中.这个上下文反映了线程上一次执行时cpu寄存器的状态.大约每隔20ms(GetSystemTimeAdjustMent函数第二个参数的返回值),windows都会查看所有当前存在的线程内核对象,这些对象中只有一些是认为可以调度的.window在可调度的线程内核对象中选择一个,并将上次保存在线程上下文中的值载入cpu寄存器.这一操作成为上下文切换,可以通过spy++看线程属性. 说明:怎么确保某个线程在数据到达串行端

核心编程随笔3

Note 1:一个线程可以调用以下两个函数来获取和设置其进程的当前驱动器和目录:DWORD GetCurrentDirectory(DWORD cchCurDir,PTSTR pszCurDir);BOOL SetCurrentDirectory(PCTSTR pszCurDir);注意WinDef.h文件中被定义为260的常量MAX_PATH是目录名称或文件名称的最大字符数.所以在调用GetCurrentDirectory的时候,向该函数传递由MAX_PATH个TCHAR类型的元素构成的一个缓

核心编程随笔5

Note 0: Windows提供了一个作业(job)内核对象,它允许你将进程组合在一起并创建一个"沙箱"来限制进程能够做什么.最好将作业对象想象成一个进程容器.但是,即使作业中只包含一个进程,也是非常有用的,因为这样可以对进程施加平时不能施加的限制.Note 1: 以下的StartRestrictedProcess函数将一个进程放入一个作业中,以限制此进程具体能够做哪些事情,如下所示: void StartRestrictedProcess() { // Check if we ar

[原创/讨论][windows核心编程一外传]关于访问虚拟地址0的方法。

接上一篇 Windows 核心编程研究系列之一(改变进程 PTE) 内容 上一篇观赏地址 :http://community.csdn.net/Expert/topic/5124/5124747.xml?temp=.2832453 当然系统保证不让访问地址0出于一种保护的目的,是防止未初始化的指针读取数据.我说的访问地址0只是出于一种纯实现的目的,也不提倡大家这样做.说白了只是好玩罢了. 大家都知道在 windows 中读取/写入地址0的指令肯定会出错: // 写 0 地址的内容xor edx,

SWT/JFace核心编程目录(未完待续)

编程 <<SWT/Jface核心编程>>                          目录                     第一部分 从 Swing 到SWT 第1章        SWT/Jface 简介 1.1 最初的Swing工具包 1.2 什么是SWT/Jface 1.3 Swing 与 SWT 1.4 SWT/Jface 的包 1.5 如何安装 SWT Designer    1.5.1 下载    1.5.2 安装 SWT Designer    1.5.

SWT/Jface核心编程 一书目录

编程 <<SWT/Jface核心编程>>                          目录                     第一部分 从 Swing 到SWT 第1章        SWT/Jface 简介 1.1 最初的Swing工具包 1.2 什么是SWT/Jface 1.3 Swing 与 SWT 1.4 SWT/Jface 的包 1.5 如何安装 SWT Designer    1.5.1 下载    1.5.2 安装 SWT Designer    1.5.

Java核心编程卷1:基础

现在已经步入了21世纪,我们很难想象曾经Java相关的图书是那样的稀少,但这就是Java刚出现时的情况.那时所有与Java相关的图书基本上都是由Sun公司的几个工程师们所发布的,比如说Arthur Van Hoff et.al所写的"Hooked on Java"以及Patrick Naughton所写的"The Java Handbook". 当然了,这些图书填补了Java的空白,不过每本书都有3.400页,这些图书都假设读者了解程序,特别是面向对象程序设计. 1

python核心编程--笔记(不定时跟新)

的解释器options: 1.1 –d   提供调试输出 1.2 –O   生成优化的字节码(生成.pyo文件) 1.3 –S   不导入site模块以在启动时查找python路径 1.4 –v   冗余输出(导入语句详细追踪) 1.5 –m mod 将一个模块以脚本形式运行 1.6 –Q opt 除法选项(参阅文档) 1.7 –c cmd 运行以命令行字符串心事提交的python脚本 1.8 file   以给定的文件运行python脚本 2 _在解释器中表示最后一个表达式的值. 3 prin