svchost进程解惑

来源:互联网 发布:神的记事本小说9淘宝 编辑:程序博客网 时间:2024/04/30 10:04

M$的东东处处体现了OLE技术,就是对象链接嵌入。不仅在word这些常用的工具里,在整个操作系统中,也处处体现着这种技术或者说思想的运用。这种思想,将程序不再看成枯燥的代码,而是和现实世界类似的一个系统。就像在搭积木,可以很方便的放进去一些东西,也可以去掉他们,但是却不会影响整个系统,因为你操作的都是一些独立的对象,它们构成了系统整体。

 
1. Svchost进程工作基本原理?
Svchost.exe文件存在于“%system root%/system32”(例如C:/Windows/system32)目录下,它是Windows NT核心的重要进程(Windows 9X没有该进程),专门为系统启动各种服务的。例如Svchost.exe调用rpcss.dll文件,就会启动rpcss服务(remote procedure call)。
随着windows系统服务不断增多,为了节省系统资源,微软把很多服务做成共享方式,交由 svchost.exe进程来启动。所以Svchost.exe实际上是一个服务宿主,它本身并不能给用户提供任何服务,但是可以用来运行动态链接库DLL文件,从而启动对应的服务。Svchost.exe进程可以同时启动多个服务。
M$提供了很多服务,它们被做成DLL(动态链接库)的形式,DLL就是OLE技术的体现,是一块块积木。由于DLL是运行时载入的,它们不能够作为独立的进程运行,必须有一个载体,就是loader。那么svchost就来作为这个loader。顾名思义,就是service host,服务的宿主。
2. Svchost如何启动服务?
由于系统服务都是以动态链接库(DLL)形式实现的,它们把可执行程序指向Svchost,因此Svchost只要调用某个动态链接库,即可启动对应的服务。那么Svchost启动某服务时,又是如何知道应该调用哪个动态链接库?这是由于系统服务在注册表中都设置了相关参数,因此Svchost通过读取某服务在注册表中的信息,即可知道应该调用哪个动态链接库,从而启动该服务。
HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion/Svchost分支中,存放着Svchost启动的组和组内的各项服务。以我的win2k server为例,有:
名称         数据
BITSgroup    BITS
Netsvcs       EventSystem Ias Iprip Irmon  Netman Nwsapagent RasAuto RasMan RemoteAccess SENS Sharedaccess  Ntmssvc  wzcsvc  WmdmPmSN
Rpcss         RpcSs
tapisrv        Tapisrv
wugroup       wuauserv
iissvcs          w3svc
 
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services下面,是系统启动的各项服务,凡是启动路径为 (%SystemRoot%/System32/svchost.exe -k BITSgroup),表明该服务是依靠svchost启动的
根据其中的数据如iissvcs对应w3svc在
HKEY_LOCAL_MACHINE/SYSTEM /CurrentControlSet/Services/数据名]在“Parameters”子项中有个名为“ServiceDll”的键,其值为 “%WINDIR%/system32/inetsrv/iisw3adm.dll”,其中“iisw3adm.dll”就是iissvcs服务要使用的动态链接库文件。这样SVCHOST进程通过读取“iissvcs”服务注册表信息,就能启动该服务了
3. Svchost启动了哪些服务?
可以在命令提示符下输入命令来查看。例如在Windows XP中,打开“命令提示符”,键入tasklist /svc命令查看;在Windows 2000中,则输入“Tlist -S”命令来查看。如果你在Windows XP中,想得到所有进程的详细信息,可以打开“命令提示符”,键入tasklist /svc>abc.txt 命令,于是在当前目录中,将会生成一个abc.txt文件,其内容就是当前正在运行的所有进程情况,例如进程名、PID号、该进程启动了哪些服务。
4. 为什么系统中有多个Svchost进程?
MS把服务分为几组,同组服务共享一个svchost进程,不同组服务使用多个svchost进程,组的区别是由服务的可执行程序后边的参数决定的。
5. Svchost程序实现原理?
主函数首先调用ProcCommandLine()对命令行进行分析,获得要启动的服务组,然后调用SvcHostOptions()查询该服务组的选项和服务组的所有服务,并使用一个数据结构 svcTable 来保存这些服务及其服务的DLL,然后调用PrepareSvcTable() 函数创建 SERVICE_TABLE_ENTRY 结构,把所有处理函数SERVICE_MAIN_FUNCTION 指向自己的一个函数FuncServiceMain(),最后调用API StartServiceCtrlDispatcher() 注册这些服务的调度函数。
由于svchost为该组的所有服务都注册了svchost中的一个处理函数,因此每次启动任何一个服务时,服务管理器SCM都会调用 FuncServiceMain() 这个函数。这个函数使用 svcTable 查询要启动的服务使用的DLL,调用DLL导出的ServiceMain()函数来启动服务,然后返回。
6. Svchost病毒如何诊断?
Svchost并不是病毒进程,但是由于svchost的特殊性,许多病毒千方百计入侵svchost,相关病毒有如下两类行为。
1)假冒svchost.exe程序的病毒
病毒并没有直接利用真正的Svchost.exe,而是启动了一个名称同样是Svchost.exe的病毒进程,由于没有加载系统服务,它和真正的 Svchost.exe进程是不同的,只需在命令行窗口中运行一下“Tasklist /svc”,如果看到哪个Svchost.exe进程后面提示的服务信息是“暂缺”,而不是一个具体的服务名,那么它就是病毒进程了,记下这个病毒进程对应的PID数值(进程标识符),即可在任务管理器的进程列表中找到它,结束进程后,在C盘搜索Svchost.exe文件,也可以用第三方进程工具如process explorer直接查 看该进程的路径,正常的Svchost.exe文件是位于% systemroot%/System32目录中的,而假冒的Svchost.exe病毒文件则会在其他目录。
还需注意的是,有些病毒把SVCHOST.exe的字母通过大写方式混淆,字母O 其实是数字0,亦要把字母O改为数字0搜索。同时注意一下进程还有没有混淆的文件执行,例如:svohost.exe、syohost.exe、,或是后 缀名不同,例如:svchost.com、svchost.scr。
2)通过真正的Svchost.exe进程加载病毒程序
一些高级病毒则采用类似系统服务启动的方式,通过真正的Svchost.exe进程加载病毒程序,而Svchost.exe是通过注册表数据来决定要装载的服务列表的,所以病毒通常会在注册表中采用以下方法进行加载:
    添加一个新的服务组,在组里添加病毒服务名
    在现有的服务组里直接添加病毒服务名
    修改现有服务组里的现有服务属性,修改其“ServiceDll”键值指向病毒程序
病毒程序要通过真正的Svchost.exe进程加载,就必须要修改相关的注册表数据,可以打开 [HKEY_LOCAL_MACHINE/Software /Microsoft/WindowsNT/CurrentVersion/Svchost],观察有没有增加新的服务组,同时要留意服务组中的服务列表,观察有没有可疑的服务名称,通常来说,病毒不会在只有一个服务名称的组中添加,往往会选择LocalService和netsvcs这两个加载服务较多的组,以干扰分析。
还有通过修改服务属性指向病毒程序的,通过注册表判断起来都比较困难,这时可以利用工具如windows服务管理专家,分别打开 LocalService和netsvcs分支,逐个检查右边服务列表中的服务属性,尤其要注意服务描述信息全部为英文的,很可能是第三方安装的服务,同时要结合它的文件描述、版本、公司等相关信息,进行综合判断。例如发现文件版本、公司、描述信息全部为空,要知道微软的系统服务程序是绝对不可能出现这种现象的,所以这样很可能是病毒。当猜测Svchost.exe进程加载运行的为病毒时可先用服务管理专家停止该服务的运行,然后运行regedit.exe打开“注册表编辑器”,删除[HKEY_LOCAL_MACHINE/System /CurrentControlSet/
Services/]下对应服务主键,重新启动计算机,再删除%systemroot% /System32目录中的病毒源程序。
原创粉丝点击