条目1、注册表也是Windows执行体和内核所维护的各种内存中数据结构的一个窗口。(P183)查看和修改注册表使用regedit.exe工具(P184)注册表中的配置数据通常在系统引导过程中、登陆过程中、应用程序启动过程中被读取。(P184)
条目2、RegNotifyChangeKey函数会让一个线程进入睡眠,直到它们感兴趣的注册表区域中发生变化。(P185)
条目3、注册表数据类型中REG_LINK类型让一个键可以透明地指向另一个键或者值。(P186)
条目4、HKCU根键包含了与当前本地登陆用户的参数和软件配置有关的数据。它是一个链接,指向HKEY_USERS下该用户的子键。当某个用户被加载的时候,HKCU就会被创建出来。(P187)
条目5、HKEY_USERS为系统中每个加载的用户轮廓和用户类注册数据库包含了一个子键。它也包含了一个名为HKU/DEFAULT的子键:这是一个链接,指向该系统的轮廓(运行在本地系统账号下的进程会用到该轮廓信息))。(P188)
条目6、HKEY_CLASSES_ROOT(HKCR)包含了两种类型的信息:文件扩展名关联和COM类注册信息。针对每个已注册的文件扩展名,都有一个对于的键,其值指向HKCR中的另一个键。(P189)
条目7、HKEY_CLASSES_ROOT下的数据有以下两个来源:(P189)
(1)针对每个用户的类注册信息:来源于HKCU/SOFTWARE/Classes。
(2)整个系统范围的类注册信息:来源于HKLM/SOFTWARE/Classes。
条目8、HKEY_LOCAL_MACHINE/HARDWARE维护了有关当前系统中的硬件,以及所有的从硬件设备至驱动程序的映射关系的描述信息。HKEY_LOCAL_MACHINE/SAM存放了本地账户和组的信息,比如用户口令、组定义和域关联信息。HKEY_LOCAL_MACHINE/SECURITY存放了系统全局范围的安全策略和用户权限分配。HKEY_LOCAL_MACHINE/SOFTWARE是Windows存储系统全局配置信息的地方,这些配置信息在系统引导的时候并不需要。HKEY_LOCAL_MACHINE/SYSTEM包含了引导系统所需要的全局配置信息,比如该加载哪些设备驱动程序、该启动哪些服务。(P190)
条目9、HKEY_CURRENT_CONFIG只是一个链接,指向HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Hardware Profiles/Current下的当前硬件轮廓。(P191)
条目10、实验:使用Process Monitor(下载:http://technet.microsoft.com/zh-cn/sysinternals/bb896645.aspx)来找到应用程序注册表设置。
(1)让Notepad保存一个设置:运行Notepad,将字体设置为Algerian,然后退出Notepad即可。
(2)运行Procmon.exe,打开[Filter]->[Filter...],设置过滤器让Procmon只记录notepad.exe的活动。
(3)CTRL+X 清空系统记录,设置只过滤注册表活动,屏蔽掉文件系统监控、网络监控、进程和线程监控、以及事件监控。
(4)再次运行notepad,Procmon将捕获到notepad所有的注册表操作。
(5)按下Ctrl + F,搜索Algerian,Procmon会定位到该行。
(6)最后,右击该行->选择[Jump To...],Procmon将开发regedit.exe并定位到该注册表项。
条目11、在磁盘上,注册表并不是简单的一个大文件,而是一组称为储巢(hive)的单独文件。当配置管理器加载储巢的时候,包括系统轮廓的储巢,它都会在HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/hivelist子键下的注册表值中记录下每个储巢的路径,如果储巢被卸载的话,则删除对应的路径。(P197)
条目12、储巢是有大小限制的,因为在引导过程开始之初,系统除了将储巢读入到物理内存中,还要将Ntoskrnl和引导设备驱动程序加载到物理内存中。(P198)
条目13、配置管理器从逻辑上将一个储巢分成一些称为块(block)的分配单元,注册表块的大小被定义为4096字节(4KB)。一个储巢的第一个块是基本块(base block)。基本块包含了有关该储巢的全局信息,包括一个特征签名regf(将该文件标识成储巢)(P200)
条目14、通过Windows的RegSaveKey和RegReplaceKey函数,先备份注册表,再恢复注册表,从而达到压缩注册表的目的。(P201)
条目15、使用内核命令!reg dumppool,查看储巢换页池的使用量。(P204)
条目16、Windows服务是由三个组件构成的:服务应用、服务控制程序(SCP,Service Control Program),以及服务控制管理器(SCM,Service Control Manager)。(P211)
条目17、服务应用也只是简单的Windows可执行程序(GUI风格或者控制台风格),加上一些代码来接收SCM的命令,以及将应用的状态反馈给SCM。(P212)
条目18、如果一个服务需要存储一些它私有的配置信息,那么习惯的做法是,在它的服务键下面创建一个名为Parameters的子键,并将这些私有信息保存在该子键下的值中。(P214)
条目19、SCM启动一个服务进程的流程:(P216)
(1)服务进程启动并创建命名管道(调用StartServiceCtrlDispatcher函数)等待与SCM通信。
(2)SCM通过命名管道发送一个“服务启动”的命令给进程。
(3)StartServiceCtrlDispatcher接收启动命令,创建线程来调用所启服务的入口点函数,新线程执行该服务的命令循环。
a、入口点函数(RegisterServiceCtrlHandler)接收某个函数指针(称为:控制处理器函数),此函数实现该服务以便处理各种来自SCM的命令。
b、RegisterServiceCtrlHandler并不与SCM通信,但它为StartServiceCtrlDispatcher将此函数指针存储的本地进程内存中。
c、StartServiceCtrlDispatcher接收SCM针对该服务的命令,调用目标服务的控制处理器函数。
(4)StartServiceCtrlDispatcher一直等待来自SCM的命令,只有当该进程的所有服务都停止时它才会将空盒子返回至服务进程的main函数,以便做一些资源清理工作。
条目20、SrvAny工具可以将任何一个应用程序当做一个服务来运行。(P217)
条目21、服务运行的账户分别包括:本地系统账户,网络服务账户、本地服务账户。(P217)
条目22、运行在网络服务账户中的进程所使用的轮廓被加载到HKU/S-1-5-20中,而构成此注册表部分的文件和目录则位于/Documents and Settings/NetworkService中。运行在本地服务账户中的进程所使用的轮廓被加载到HKU/S-1-5-19中,以及存储在/Documents and Settings/LocalService中。(P220)
条目23、Windows子系统将每个Windows进程与一个窗口站(window station)关联起来。Windows将可见的窗口站命名为WinSta0,所有的交互式进程都使用WinSta0。运行在本地系统账户下的服务和所有的非交互式服务一样跟一个名为Service-0x0-3e7$(3e7代表登录会话标识符)的非可见窗口站关联起来。运行在某个用户账户下的服务,都运行在一个不同的非可见窗口站中,这些窗口站使用LSASS分配给该服务的登陆会话的标识符来命名的。(P221)
条目24、SCM(服务控制管理器)的可执行文件是/WINDOWS/system32/services.exe,SCM的启动函数,即SvcctrlMain,会有条不紊地将那些被配置成自动启动的服务激发起来。(P223)
条目25、为了确定一个驱动程序是否已经成功启动,我们可以在名为/Driver的对象管理器名字空间目录中查找该驱动程序的名称。(P225)
条目26、SCM还有另一项与作为服务接口不相关的责任:无论何时当系统创建或者删除一个网络驱动器字母连接时,它都要通知系统中的GUI应用程序。(P225)
条目26、SCM启动“自动启动”的服务和驱动程序的算法按分阶段进行处理,每个阶段对应一个组,这些阶段按照HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/ServiceGroupOrder中List的注册表值存储的组顺序所定义的序列进行处理。(P226)
条目27、设置HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Windows中的NoInteractiveServices值可以防止那些被标记为交互式的服务在控制台上显示窗口。(P228)
条目28、WMI由四个主要的部件构成:管理应用程序、WMI基础设施、提供者和被管理的对象。(P237)