AntiDebug

好好学习,天天向上。

导航

[转载]以下哪个修改过的userinit键值的数据会导致用户开机反复注销

A.%systemroot%\system32\userinit.exe
B.userinit.exe
C.c:\windows\system32\userinit.exe,virus.exe
D.c:\windows\system32\userinit.exe

答案是A。这是一个极具迷惑性的题目。迷惑项目主要是C。因为一般的答题者通常会认为,由于病毒跟随userinit.exe启动,才导致了反复注销。其实这种理解是错误的。

出现开机反复注销的根源是系统找不到userinit.exe文件,而不是在启动userinit.exe的同时启动了病毒。
那么,A项选择为什么会导致系统找不到userinit.exe文件呢?
原因是A项的字符串中使用了环境变量%systemroot%
对于环境变量,这又是一个答题者容易忽略的注册表常识:在注册表中并不是所有字符串类型的键值,都支持环境变量的替换。
注册表键值中两种主要的字符串形式的键类型,一个是REG_SZ,一个是REG_EXPAND_SZ,两者的一个显著区别就是只有REG_EXPAND_SZ类型的键支持在键值中使用%systemroot%这样的环境变量。

具体到本题,相关注册表键位于
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon]
大家可以打开注册表,睁大眼睛看看这个键,你会发现在默认情况下它的类型是REG_SZ!

因此,这个键值不支持A选项这种包含环境变量的设置方法。当系统启动过程中读取这个键值时,没有办法将其中的%systemroot%当成环境变量并转化为WINDOWS文件夹的路径,于是导致系统找不到userinit.exe文件,不能启动userinit.exe,因此用户会遭遇登录后立即注销的问题。

REG_SZ与REG_EXPAND_SZ类型的某些区别是经常被我们忽略的问题,比如SREng的启动项添加和编辑功能,默认只是创建REG_SZ类型的,因此不支持环境变量。

然而事情是不是如此简单?未必。因为在注册表键值中使用环境变量,不单单要考虑键类型的问题,在某些条件下还要考虑这个环境变量是否已经被初始化的问题。

环境变量一般分为系统环境变量和用户环境变量。从系统启动到成功创建用户会话,到用户终于可以看到桌面的过程中,系统环境变量和用户环境变量的初始化是在不同的阶段进行的。

系统环境变量的初始化,是由会话管理器smss.exe完成的。smss.exe完成初始化后,创建csrss.exe和winlogon.exe进程,winlogon.exe进程再创建其他用户态进程。

userinit.exe进程是由winlogon.exe创建的,执行用户环境的初始化工作,完成如环境变量初始化、运行登陆脚本和应用安全策略等任务后运行缺省的Shell,即explorer.exe

从以上的两段中,你看出了什么?对了,在userinit.exe被启动之前,用户环境变量未被初始化,已被初始化的只有系统环境变量。

因此,即使Userinit键的类型是REG_EXPAND_SZ,也不代表它能使用所有的环境变量。这说明,在我们对系统的修改涉及到系统启动过程的时候,我们的考虑应该更加细致。

posted on 2015-03-30 11:12  AntiDebug  阅读(505)  评论(0编辑  收藏  举报