windows启动顺序大概流程和服务程序遇到的问题

本文详细介绍了Windows启动过程中服务程序的启动顺序,包括会话管理器(smss.exe)的创建及进程、winlogon启动的服务控制管理器(services.exe)等。同时,文章列举了服务程序在启动过程中可能遇到的问题,如剪贴板监控、磁盘卷标设置等。

1.服务程序目前遇到的问题

(1)服务程序无法监控剪贴板;

(2)服务程序无法设置挂载的磁盘卷标;

(3)服务端发到客户端的thritf消息,调用剪贴板写入时会提示com失败的问题;

2.服务程序的启动顺序

参考文档:https://blog.youkuaiyun.com/singleyellow/article/details/104031963/

电脑开机后,大致的启动顺序是BIOS—>MBR—>活动分区—>Ntoskrnl.exe、HAL—>服务类型为0、1的服务—>会话管理器(smss.exe进程)。

服务程序的启动顺序先后,可能导致某些功能实现时出问题。比如说,系统环境还没有设置好,但是某个服务先启动,导致功能异常。

https://i-blog.csdnimg.cn/blog_migrate/0290df099c8e9f1793cae49b87161eca.png

2.1 会话管理器(smss.exe进程)

smss.exe由进程4(Ntoskrnl.exe)创建。

在使用基于ETW(Event Tracing for Windows事件查询)的进程监控工具procmon.exe的开机监控功能中看到,smss.exe是由进程4创建;

https://i-blog.csdnimg.cn/blog_migrate/0b714e6e304e7e8554ffb004c5f285cc.png

2.1.1 读取3处注册表项

HKLM\System\CurrentControlSet\Control\Session Manager\BootExecute,        定义了Native程序。

HKLM\System\CurrentControlSet\Control\Session Manager\SubSystems,        决定启动哪些环境子系统进程。

HKLM\System\CurrentControlSet\Control\Session Manager\PendingFileRenameOperations        上次系统重启前未完成的重命名工作。

2.1.2 创建3个进程;

https://i-blog.csdnimg.cn/blog_migrate/bfdf8a347503b2582e14b501d0718e14.png

(1)Native程序:全部使用ntdll.dll中的API编写,先于环境子系统进程(csrss)启动,注册表HKLM\System\CurrentControlSet\Control\Session Manager\BootExecute 处决定了开机时smss.exe负责启动那些native程序(杀毒软件会在此处放置程序清除顽固病毒)。

https://i-blog.csdnimg.cn/blog_migrate/e867343bc9323221893890b6f32239c0.png

(2)环境子系统进程:

https://i-blog.csdnimg.cn/blog_migrate/9f7d015de06054d075644bb6fdbcda22.png

发现两个环境子系统posix、windows,其中psxss.exe程序并不存在,就只能启动csrss.exe程序;(说明注册表关联的路径不存在的exe不会导致系统异常。)

(3)PendingFileRenameOperations(有些电脑上没有这个注册表项)

具体见https://blog.youkuaiyun.com/singleyellow/article/details/100175816

 

2.2 winlogon启动了4个进程

https://i-blog.csdnimg.cn/blog_migrate/0290df099c8e9f1793cae49b87161eca.png

2.2.1 服务控制管理器(services.exe)

下面一大堆svchost.exe进程,一些远控、窃密病毒最喜欢冒充或者寄生里面;这个进程除了负责服务方面的管理工作,里面还寄生了Eventlog,PlugPlay服务,强行结束该进程,操作系统会关闭或者重启动。关于服务方面的东西可以看这里:https://blog.youkuaiyun.com/singleyellow/article/details/80486721

2.2.1.1 dll类型的服务

该类型的服务,可以通过svchost.exe通过命令行的方式启动。ZwCreateThreadEx函数是比CreateRemoteThread更底层的函数,可以注入dll到服务程序中。ZwCreateThreadEx函数没有在ntdll.dll中声明,所以需要使用GetProcAddress从ntdll.dll中获取该函数的导出地址。

以上几个服务启动的命令行如下:

C:\Windows\System32\svchost.exe -k PeerDist

C:\Windows\system32\svchost.exe -k netsvcs

C:\Windows\System32\svchost.exe -k wsappx –p

参考这个文档:https://blog.youkuaiyun.com/liujiayu2/article/details/76955903

服务启动命令-k netsvcs参数,并不是在告诉svchost.exe启动哪个服务。netsvcs代表的是组,表示这个服务是属于哪个组的。组具体有啥用,大概就是节省资源。正是由于采用了分组机制,系统中才会有多个svchost.exe进程,每个进程代表一个组。svchost.exe进程名字相同,主要是根据服务名字区分具体是哪个服务。

Browser服务来说,在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services路径下有一个Browser项,名字和服务名字一样(也就是说,有多少个服务,这个路径下就有多少个项,和服务名称相对应),这个项里里边又有一个Parameters子项,Parameters子项里有一个名字叫ServiceDll的键,它的值就是dll的路径。如图:

2.2.1.2 exe类型的服务

可以通过SC命令或是windows API实现。在服务控制管理器中类似于下面这样。

"C:\Program Files (x86)\Uniontech P2V tool\uos-p2v-service.exe" "-d"

在注册表里面的表现形式是:

2.2.2 安全授权LSA(lsass.exe)

据说你的登录密码就在这个进程里面,不过有个法国人写了一个猕猴桃的工具运行一遍就可以直接拿到。记得永恒之蓝那个漏洞吧,漏洞触发之后就是使用APC注入到这个进程的。

2.2.3 登录界面(logoui.exe)

windows的登录界面。先于PE加载器(Explorer.EXE)启动,所以很多自启动的应用程序没有启动。

2.2.4 userinit.exe

winlogon.exe进程通过读取HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon下的userinit项完成启动;系统刚启动时,如果你调出任务管理器就会看到userinit.exe ,但过一段时间,系统各项加载完毕后,userinit.exe就会自动消失的记。不记得ranmit那个蠕虫 (到现在互联网上都没有清理干净),它就是通过这个注册表项和userinit.exe并行启动的。

https://i-blog.csdnimg.cn/blog_migrate/0640832556298a87fea4ee7339dafb72.png

2.2.5 PE加载器(Explorer.EXE)

Explorer.EXE为用户提供了图形用户界面(也称为图形壳),简单的说就是用来显示系统的桌面环境,包括桌面图标和文件管理。

注册表项Run、RunOnce、启动文件夹这些地方的开机启动,估计都是由PE加载器启动起来的。其中RunOnce里面的项是由 runonce.exe 调起,runonce.exe 又由 Explorer调起,runonce.exe 的完整级别为High Mandatory Level。

2.2.6 AppInit_Dlls注册表项

AppInit_Dlls这个注册表项,用来全局注入dll模块,该功能可以用来做后门持久化。任何使用到User32.dll 的EXE、DLL、OCX等类型的PE文件都会读取这个地方,并且根据约定的规范将这个键值下指向的DLL文件进行加载,加载的方式是调用 LoadLibrary( )函数。

https://i-blog.csdnimg.cn/blog_migrate/d0e7c0e5c08e9afaf45195ccc023d8a9.png

微软默认阻止用户通过appinit功能去加载未知的dll。不过,可以通过修改注册表键值LoadAppInit_DLLs为1去关闭该功能。将待加载的dll保存在Program Files文件夹,并且将AppInit_DLLs键值修改为待加载dll的路径,即可让所有windows进程都加载该dll。

Enable LoadAppInit_DLLs - 32bit and 64bit:

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Windows\LoadAppInit_DLLs - 0x1

HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\Windows NT\CurrentVersion\Windows\LoadAppInit_DLLs - 0x1

3.服务启动类型

服务启动类型定义为5个等级,0、1级别的由操作系统启动,windows的驱动都是以服务形式存在,作为操作系统的一部分代码运行;2、3、4级别的则是由服务管理器(services.exe进程)启动;微软对服务启动类型的定义:

https://i-blog.csdnimg.cn/blog_migrate/037edbc79be282dec45faa675394ed0c.png

·  在打开的注册表中,定位到这个位置:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ServiceGroupOrder

·  在右侧面板中右键单击,执行:新建--字符串值

·  将其命名为List ,如果该值已经存在,可以直接进行修改

·  右键单击该项,然后在右键菜单中,选择修改

·  在数值数据中,输入windows的各项服务,这些服务就是按照从上到下的顺序启动的。然后点击确定按钮。完成设定。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值