看雪熊猫前辈——svchost进程的浅析
/*
看雪熊猫前辈讲得太棒了,故转载过来作为学习资料存放。
看雪是个好论坛~~~
原文链接如下:http://bbs.pediy.com/showthread.php?t=127798
(仅做链接资料存放,CSDN格式复制不适合看,就当是图片预览,请移步到看雪。)
*/
标 题: 【原创】svchost进程的浅析
作 者: 熊猫正正 时 间: 2011-01-08,19:10:53 链 接: http://bbs.pediy.com/showthread.php?t=127798 大家好,先扯点闲话吧~~最近比较忙,很少给大家献上点东西,就像看雪上的一位大牛说过:现在我还只是个半瓶水,所以我会写一些“垃圾”放在论坛上,当我满的时候,就看不到我的身影了,确是,现在我还真没看到过那位大牛在写过什么了,也许这就是看雪上的一些元老们都不曾发言的原因吧~~~不管怎么说,我想每个人都是从一无所知,到成为某个领域的专家的,没有谁天生会什么,但我还是希望那些元老们,能在百忙之中,抽点时间出来写一两篇文章给后面也在奋斗的人们吧~~就像潘爱民先生window原理与实践书中前言的最后一句话说的:如果你在年轻的时候,能遇到像王选(像这样类型,我一直很尊敬像钱学森,华罗庚,王选,陈景润,还有很多,这样为自己喜欢的,不断追求,不断努力的人,他们真的值得尊敬)这样的人的指点,那将会能这位年轻人造成多大的影响!(原话我记不得了,反正就是这意思吧),其实真的有时候,也许因为你们的一句话,真的可以改变点什么,所以请不要吝啬你的言语,这只是后辈的一点建议,也没有指针什么人,什么事(就像记得某位牛人说过:当你问问题的时候,别人没有义务一定要回答你),这里我也要说一些后辈了,首先自己在努力一点,不要连1+1=?都要问问别人,很多问题,我想google都已经告诉你了,其实我知道那些牛人们都挺忙的,所以别人有时真的没时间去和你闲扯1+1=?这样的问题! 最后说明一点:咱,小菜一个,不是什么牛人,只是一直在向大牛努力,也许有一天,真会变成一头“牛”,而不做“鸟”了!同时也鼓励一下大家,没有什么技术是你学不会的,只要你想学,坚持学下去,你总有一天会和你曾经崇拜的牛人们一样的,趁我们还年轻,想做什么就坚持做吧!就像《orange's操作系统》的作者说的:当你有个想法时,就去努力做吧!学习贵在坚持,还有一句话我很喜欢:自助者天助,当你坚强勇敢的时候,不说大牛们,连老天爷也会帮你的~~因为我想大牛们也曾经是很坚强勇敢执着的为着自己的理想的人,所以他们更愿意帮助--志同道合的人~~~~~~ 最近一直在研究windnow内核驱动,本来想买老毛的<windows内核情景分析>无懒,淘宝价也要一百三十多,买不起,其实买这个价应该还算公道,必竟别人花了三年时间去写,听说内容还不错,驱动开发确是一个需要花大量的时间和精力去研究的东西,相对于驱动开发,我认为一般rootkit之类的技术也不算什么,只是很巧炒的利用了HOOK技术吧了,真正能写出一个完整的操作系统才真的需要很多优秀的人努力才能做得到的,如果你对操作系统底层知识不了解,我敢说你写出来的rootkit基本上没有多大用处,只有对操作系统的底层有了一个很深的认识,才能写出优秀的rootkit,而不是搞几个很简单的Hook就算是rootkit了,所以我个人认为,要想写出一流的rootkit(这里不是鼓励大家编写木马和病毒啦),你必须花大量的时间去研究操作系统底层的架构和原理,包括很底层的(GDT,LDT,中断等),但这是需要花大量时间研究的,如果你浮燥,就请趁早放弃,找几本《21天搞定C++》《VC++实例编程》之类的书,花几个月学学,然后找个程序员(其实是外包工作者)的活做做算了!如果你想做一些比较伟大的事,如果你想真正掌屋window和linux,你一定要有足够的耐心和坚持不懈的努力去研究他们的后面的东西,这样你才能成为真正的程序员~~中国这样的人太少了!!!我只是小菜鸟一个,但我会努力朝着之个方向努力,我想也会 有很多志同道合的朋友在研究着,一起努力吧! 每次给大家写个什么东西,都会给大家讲讲大道理,其实不管我说的这些是对的还是错的,对的你就看看,错的你就当我是喝多了,在这瞎放屁~~~上面的话,不针对任何人,任何事,因为我想每个人的追求和理想是不同的,所以我也不好评价过多,(最主要的是我不想因为这篇文章而引起什么口水战之类的,我没时间和你口水战,如果我说错了,你就大人大量,别我计较好了,谢谢) 不知不觉就说了这么多,就当2010年新年献文吧,呵呵,好了,下面正式进入今天的主题吧~~~~ 今天我就以为个人的能力去研究一下,一个重要的进程svchost,本人水平极其有限,而svchost又是微软的一个非常重要的进程,很强大,所以题目就叫svchost进程的浅析,如果 有高手,可以后面跟贴补充~~~不甚感激! 科普一下: 定会用到它,由于杀毒软件的发展,一些杀毒软件已经严密监控住了这个进程(只是部分),所以svchost进程也一时受到冷默,大部分人转向了rootkit技术,可是现在rootkit技 术也成为各大杀软的头号目标,什么高启发式,云查杀,主动防御等技术都会对一般的rootkit绝不留情的,呵呵~~不过,道高一尺,魔高一丈,聪明的病毒和木马制作者总是会想 出一些更高操作的技术........ svchost.exe是NT核心系统的一个重要的进程,通过ctrl+alt+del打开任务管理器,就会在进程列表中看到进程中会出现几个svchost,这些svchost提供很多系统服务,如:rpcss服 务,dmserver服务,dhcp服务等,要想知道svchost进程,提供了哪些服务,很简单,(xp系统)在cmd中输入tasklist /svc即可,我们就会看到一大堆我们熟悉的服务: 下面借用网上一段话来详细讲解一下svchost进程! 了节省系统资源,微软把很多服务做成共享方式,交由 Svchost.exe进程来启动。 呢? 服务该调用哪个动态链接库呢?这是通过系统服务在注册表中设置的参数来实现。 系统的正常运行是非常重要,而且是不能被结束的。 Svchost的启动方式和位置的不同运行不同的服务,这样可以更好地进行控制且更加便于调试。 组,并在我们查看活动进程时作为单独的实例显示。这里的键值均为REG_MULTI_SZ类型的值,并且包含该Svchost组里运行的服务名称 总结一点:服务是靠Svchost来启动的(并不是所有的) 举例说明: 执行文件的路径为“c:\windows\system32\svchost -k rpcss”,这说明rpcss服务是依靠svchost调用“rpcss”参数来实现的,而参数的内容则是存放在系统注册表中的。 ”的键“magepath”,其键值为“%systemroot%system32svchost -k rpcss”(这就是在服务窗口中看到的服务启动命令),另外在“parameters”子项中有个名为“servicedll ”的键,其值为“% systemroot%system32rpcss.dll”,其中“rpcss.dll”就是rpcss服务要使用的动态链接库文件。这样 svchost进程通过读取“rpcss”服务注册表信息,就能 启动该服务了。 上面介绍了svchost的基本原理,下面我通过分析svchost主要代码来说明svchost,代码参考开源操作系统ReactOS~~ 还是先按调试的顺序,先从函数入口看起吧,哈哈~~~ if (argc < 3) if (_tcscmp(argv[1], _T("-k")) != 0) //检查第两个参数是不是-k NrOfServices = LoadServiceCategory(argv[2]); //如果参数正确,则检查注册表中的服务部分,以构建需要加载的服务列表,并在其中加载所有服务 DPRINT1("NrOfServices: %lu\n", NrOfServices); ServiceTable =(LPSERVICE_TABLE_ENTRY)HeapAlloc(GetProcessHeap(), 0, sizeof(SERVICE_TABLE_ENTRY) * (NrOfServices + 1)); //分配存放服务列表的堆栈,构 建服务列表 if (NULL != ServiceTable) //填充服务列表,使用了数据结构中的链表进行操作 //用一个空的服务,做为服务列表的结束 if (FALSE == StartServiceCtrlDispatcher(ServiceTable)) //启动服务的分发函数 HeapFree(GetProcessHeap(), 0, ServiceTable); //释放分配的服务列表堆栈 DPRINT1("Freeing services...\n"); return 0; 代码很简单,主要用到了StartServiceCtrlDispatcher启动服务,其实这就是编写svchost启动的服务和编写一般服务的区别,一般的服务会写成一个EXE的文件,然后自己编写一 个安装启动服务的程序,但是用svchost,其实svchost就帮我们做了这些工作,我们只需要在某个注册表下写入svchost的值,svchost会在像上面操作的一样,在系统启动时,通 过svchost的参数,来检查注册表,然后建立一个服务列表,再通过遍历服务列表,一项一项的加启它们就OK了! 看了上面的一段话,我想大家都已经很清楚了svchost进程,下面我在进一步讲解一下~~上面用到了一个自定义函数LoadServiceCategory来检查注册表,我们来看看它做了哪些工 作吧~~ //得到所有的服务 if (ERROR_SUCCESS != RegQueryValueEx(hServicesKey, ServiceCategory, NULL, &KeyType, (LPBYTE)Buffer, &BufferSize)) //对应上面的RegOpenKeyEx //加载所有的服务 if (TRUE == PrepareService(ServiceName)) //写入到注册表的相应位置,加载服务 BufferIndex += (Length + 1) * sizeof(TCHAR); ServiceName = &Buffer[BufferIndex]; return NrOfServices; 通过上面的这个函数,将SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\SvcHost键下的所有服务名,写入到注册表相应位置,并加载服务,这个函数很简单只进行了注册 表的查寻,然后将得到的键值存入一个数组中,在从数组中取出相应值进行操作,逐个操作,并调用了一个自定义函数PrepareService~~再来分析一下PrepareService这个函数在 为我们做哪些工作~~~ //构建服务在注册表中的一些参数 if (LeftOfBuffer < 0) //打开相应注册表项,查找要加载的DLL名 do Buffer = (PTSTR)HeapAlloc(GetProcessHeap(), 0, BufferSize); RetVal = RegQueryValueEx(hServiceKey, _T("ServiceDll"), NULL, &KeyType, (LPBYTE)Buffer, &BufferSize); } while (ERROR_MORE_DATA == RetVal); RegCloseKey(hServiceKey); if (ERROR_SUCCESS != RetVal || 0 == BufferSize) //传换成系统中的DLL的目录 HeapFree(GetProcessHeap(), 0, Buffer); DPRINT1("Trying to load dll\n"); if (NULL == hServiceDll) ServiceMainFunc = (LPSERVICE_MAIN_FUNCTION)GetProcAddress(hServiceDll, "ServiceMain"); //查找DLL中存在的ServiceMain函数,现在知道为什么每个DLL服务中 必须包括一个ServiceMain函数了吧 //分配一个服务列表中的一个服务 memset(Service, 0, sizeof(SERVICE)); Service->Next = FirstService; return TRUE; 在上面的操作中我们为服务列表中的服务分配了堆栈,最后一定要记得释放~~于是在main函数的最后调用了一个自定义的函数FreeServices用来释放前面分配的堆栈空间,代码如 下: FreeLibrary(Service->hServiceDll); //释放前面加载的服务的DLL HeapFree(GetProcessHeap(), 0, Service->Name); 释放堆栈 如果你能看到这里,基本上svchost的进程的原理你已经掌握了,如果你写过用svchost启动的服务,我想你一定知道为什么要那么写了~~~其实每个事物的存在都会有它的原因,我们只要肯花时间去研究,就没有什么不懂的!(至于,怎么样编写基于svchost的服务,我就不说了,大家自己google吧,以前有位很牛的前辈用Win32汇编写过一篇很详细的文章) 上面我们详细的分析了一下开源的操作系统ReactOS的Svchost的源代码,其实Windows的Svchost的实现方式和这是差不多的,只是其中还应用了一些用于处理多线程同步的代码,有人也许会问,windows不开布源代码,为何ReactOS组织的人会写出如此相近的源代码,其实,以我个人的想法,无非就是他们经过反汇编windows的svchost进程,而得到的,因为windows中的所有的DLL,EXE,SYS等等之类的东东,微软并没有加壳保护,所以只要反汇编牛一点的人,我想写出类似的代码也不是问题的!!呵呵,只是我的猜想~~有兴趣的人,可以去反汇编看看Windnows中的svchost进程(可以用IDA反汇编看看,还可以用OD跟踪调试,只是记住带参数,不然就直接返回了,我是直接把那句判断跳过,只想看看他的实现原理就可以),你会发现,原来就是这样的! 好了,就写这么多吧,写多了,大家看着也累,我想svchost的基本原理和方法,大家一定都有了一个大概的了解,本人水平有限,听说老毛的《windows内核情景分析》中最后有一章讲到过svchost进程,我没看过,只看过目录上有,也不知道他老人家是怎么讲的,肯定没他老人家那等功夫,如果还看不懂,可以去看看他老人家的书,就是有点贵~~不过说不定,一狠心我就买了,我喜欢拿着书看,并把它看成黑黑的,然后整理成薄薄的笔记,也许就是别人说的,把一本很厚的书看薄了,你就学会了~~再见,我会用一整年的时间(只是有个大概认识,呵呵,真正在理解可能要等以后工作中慢慢体会才能得到windows和linux的精华所在),好好研究一下windows的内核,因为打算以后就从事系统底层驱动开发这方面的工作了,也许过几年还会去研究linux内核,不过都是后话了,在这期间,如果偶有心得体会,我会及时将自己的一些学习休会与心得发到论坛上,希望能给更多喜欢研究内核的朋友们一点帮助,先把windows这个难缠的家伙搞定,学习windows内核不像linux内核(相对难一点,个人观点),linux内核源码网上有很多,但windows有时要反汇编才能明白其中的原理和精华~~其实我们只有掌握了一种学习能力,在加上坚持不懈的努力,最后都可以变成“牛”,学习能力的培养就在于你平时的日积月累了,呵呵,这个谁都帮不了你的!!(最后补充非常重要的一点:小弟前面的一些言论,可以不完全正确,如果实在看不下去的,可以直接跳过,我不想看到因为我的一些胡言乱语,又引起后面一些口水战之类的,再次重申:我的言论不针对任何个人,任何组织和公司,因为我没时间和你口水战,我想大家有时间,还是多花在时间在自己喜欢的值得为之努力奋斗的事情上),但是对于文中的错误和对此有更深层的理解,欢迎指点,后面跟贴,以免我这小菜误导很多看到我这篇文章的人! 最后,把我在vc6.0下编译通过的svchost源码附加上去,用vs2008同样编译通过!
上传的附件
|
|||
此帖于 2011-01-08 19:16:59 被 熊猫正正 最后编辑 原因: 上传附件
|
看雪熊猫前辈——svchost进程的浅析相关推荐
- svchost进程的浅析
今天我就以为个人的能力去研究一下,一个重要的进程svchost,本人水平极其有限,而svchost又是微软的一个非常重要的进程,很强大,所以题目就叫svchost进程的浅析,如果 有高手,可以后面跟贴 ...
- Windows进程系列(2) -- Svchost进程
在基于NT内核的Windows操作系统家族中,Svchost.exe是一个非常重要的进程.很多病毒.木马驻留系统与这个进程密切相关,因此深入了解该进程是非常有必要的.本文主要介绍Svchost进程的功 ...
- 看雪软件安全精选:二进制各种漏洞原理实战分析总结
看雪安全二进制漏洞专区0xbird原创 本部分将对常见的二进制漏洞做系统分析,方便在漏洞挖掘过程中定位识别是什么类型漏洞,工欲善其事,必先利其器. 0x01栈溢出漏洞原理 栈溢出漏洞属于缓冲区漏洞的一 ...
- 看雪技术论坛加密与解密工具新年大礼包2007光盘
看雪技术论坛加密与解密工具新年大礼包2007光盘 2009年10月30日 ├─Debuggers ;调试器 │ ├─OllyDbg │ │ ├─plugin ;各类OllyDbg插件 │ │ ├─Ol ...
- DLL注入的方式 (转载自看雪学院)
DLL 注入技术的 N 种姿势 看雪学院 看雪学院,为IT专业人士.技术专家提供了一个民间交流与合作空间. 18 人赞同了该文章 本文中我将介绍DLL注入的相关知识.不算太糟的是,DLL注入技术可以被 ...
- 看雪学院-浅入浅出Android安全 笔记
Note 看雪学院-浅入浅出Android安全 原作地址:http://www.kanxue.com/?article-read-547.htm 翻译作者:飞龙 Android 由四个层组成:Linu ...
- svchost进程解惑
M$的东东处处体现了OLE技术,就是对象链接嵌入.不仅在word这些常用的工具里,在整个操作系统中,也处处体现着这种技术或者说思想的运用.这种思想,将程序不再看成枯燥的代码,而是和现实世界类似的一个系 ...
- 有种程序员的浪漫叫看雪
1972年的图灵奖颁发给了42岁的戴克斯特拉(Edsger W. Dijkstra,简称EWD).在获奖演说中,他深情地回顾了自己的经历,其中特别提到了一个有趣的故事. EDW在做图灵奖获奖演讲(19 ...
- 最近总蓝屏死机,发现是其中一个svchost进程一直占用我cpu使用率25%导致机器非常热,散热风扇狂转,像被人当矿机了
最近总蓝屏死机,发现是其中一个svchost进程一直占用我cpu使用率25%导致机器非常热,散热风扇狂转,像被人当矿机了,断网1,2分钟就会好,连接网络几分钟就又开始了,结束我的这个进程,过一会又开始 ...
最新文章
- 别再用kill -9关闭程序了......
- 基于相关系数的影像匹配_智库丨陈晓勇:低空摄影测量立体影像匹配的现状与展望...
- windows下常用命令
- 17.2?Replication Implementation 复制实施:
- (转载)Linux 信号signal处理机制
- wxpython动态实时绘图_wxPython: 简单的绘图例子
- PAT (Advanced Level) 1015 Reversible Primes(进制转换)
- php静态地图api,静态图API | 百度地图API SDK
- 软工实践(二)——构建之法读后感
- Sentinel降级简介_分布式系统集群限流_线程数隔离_削峰填谷_流量控制_速率控制_服务熔断_服务降级---微服务升级_SpringCloud Alibaba工作笔记0038
- SAP License:制造企业信息化新动向
- iis服务器怎么限制运行asp文件,Win2008 r2 IIS7.5制定目录禁止执行脚本的方法
- DEV MessageBox
- python内置函数分类_注意 Python 内置函数并不是万能的!
- UTAU中文版安装教程
- ibmx3100M5服务器装win7系统,详细教程:如何安装win7系统?
- 同样是VPS,为什么RAKsmart更受欢迎
- 算法笔记(胡凡)刷题收获@Kaysen
- HTML5响应式企业集团织梦模板,(自适应手机版)响应式企业集团通用类网站织梦模板 HTML5响应式大气通用企业织梦源码+PC+wap+利于SEO优化...
- lol网通服务器位置,LOL转区系统地址在哪里 国服转区方法介绍