⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 创建svchost_exe调用的服务原理与实践.htm

📁 创建SvcHost_exe调用的服务原理与实践
💻 HTM
📖 第 1 页 / 共 5 页
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3c.org/TR/1999/REC-html401-19991224/loose.dtd">
<!-- saved from url=(0046)http://www.xfocus.net/articles/200308/601.html -->
<HTML><HEAD><TITLE>创建SvcHost.exe调用的服务原理与实践</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<META 
content="安全焦点, xfocus, 陷阱网络, honeynet, honeypot, 调查取证, forensic, 入侵检测, intrusion detection, 无线安全, wireless security, 安全论坛, security forums, 安全工具, security tools, 攻击程序, exploits, 安全公告, security advisories, 安全漏洞, security vulnerabilities, 安全教程, security tutorials, 安全培训, security training, 安全帮助, security help, 安全标准, security standards, 安全代码, security code, 安全资源, security resources, 安全编程, security programming, 加密, cryptography,SvcHost,共享进程,系统服务" 
name=Keywords><LINK href="创建SvcHost_exe调用的服务原理与实践.files/plone.css" type=text/css 
rel=stylesheet>
<META content="MSHTML 6.00.2800.1400" name=GENERATOR></HEAD>
<BODY text=#000000 bgColor=#ffffff>
<DIV class=top>
<DIV class=searchBox>
<FORM name=searchform action=http://www.google.com/search method=get><INPUT 
type=hidden value=www.xfocus.net name=domains> <INPUT type=hidden 
value=www.xfocus.net name=sitesearch> <INPUT name=q> <INPUT type=submit value="Google Search" name=btnG> </FORM></DIV><IMG height=80 
alt="xfocus logo" src="创建SvcHost_exe调用的服务原理与实践.files/logo.gif" width=180 
border=0> <IMG height=20 alt="xfocus title" 
src="创建SvcHost_exe调用的服务原理与实践.files/title.gif" width=230 border=0> </DIV>
<DIV class=tabs><A class=plain href="http://www.xfocus.net/index.html">首页</A> <A 
class=plain href="http://www.xfocus.net/releases/index.html">焦点原创</A> <A 
class=selected href="http://www.xfocus.net/articles/index.html">安全文摘</A> <A 
class=plain href="http://www.xfocus.net/tools/index.html">安全工具</A> <A 
class=plain href="http://www.xfocus.net/vuls/index.html">安全漏洞</A> <A class=plain 
href="http://www.xfocus.net/projects/index.html">焦点项目</A> <A class=plain 
href="https://www.xfocus.net/bbs/index.php?lang=cn">焦点论坛</A> <A class=plain 
href="http://www.xfocus.net/about/index.html">关于我们</A> </DIV>
<DIV class=personalBar><A 
href="https://www.xfocus.net/php/add_article.php">添加文章</A> <A 
href="http://www.xfocus.org/">English Version</A> </DIV>
<TABLE class=columns>
  <TBODY>
  <TR>
    <TD class=left>
      <DIV class=box>
      <H5>&nbsp;文章分类&nbsp;</H5>
      <DIV class=body>
      <DIV class="content odd">
      <DIV style="WHITE-SPACE: nowrap"><IMG 
      src="创建SvcHost_exe调用的服务原理与实践.files/folder_icon.gif" border=0> <A 
      href="http://www.xfocus.net/articles/4.html">专题文章</A><BR><IMG 
      src="创建SvcHost_exe调用的服务原理与实践.files/folder_icon.gif" border=0> <A 
      href="http://www.xfocus.net/articles/2.html">漏洞分析</A><BR><IMG 
      src="创建SvcHost_exe调用的服务原理与实践.files/folder_icon.gif" border=0> <A 
      href="http://www.xfocus.net/articles/3.html">安全配置</A><BR><IMG 
      src="创建SvcHost_exe调用的服务原理与实践.files/folder_icon.gif" border=0> <A 
      href="http://www.xfocus.net/articles/1.html">黑客教学</A><BR><IMG 
      src="创建SvcHost_exe调用的服务原理与实践.files/folder_icon.gif" border=0> <A 
      href="http://www.xfocus.net/articles/5.html"><B>编程技术 
      &lt;&lt;</B></A><BR><IMG 
      src="创建SvcHost_exe调用的服务原理与实践.files/folder_icon.gif" border=0> <A 
      href="http://www.xfocus.net/articles/7.html">工具介绍</A><BR><IMG 
      src="创建SvcHost_exe调用的服务原理与实践.files/folder_icon.gif" border=0> <A 
      href="http://www.xfocus.net/articles/6.html">火墙技术</A><BR><IMG 
      src="创建SvcHost_exe调用的服务原理与实践.files/folder_icon.gif" border=0> <A 
      href="http://www.xfocus.net/articles/8.html">入侵检测</A><BR><IMG 
      src="创建SvcHost_exe调用的服务原理与实践.files/folder_icon.gif" border=0> <A 
      href="http://www.xfocus.net/articles/9.html">破解专题</A><BR><IMG 
      src="创建SvcHost_exe调用的服务原理与实践.files/folder_icon.gif" border=0> <A 
      href="http://www.xfocus.net/articles/11.html">焦点公告</A><BR><IMG 
      src="创建SvcHost_exe调用的服务原理与实践.files/folder_icon.gif" border=0> <A 
      href="http://www.xfocus.net/articles/12.html">焦点峰会</A><BR></DIV></DIV></DIV></DIV>
      <DIV class=box>
      <H5>&nbsp;文章推荐&nbsp;</H5>
      <DIV class=body>
      <DIV class="content odd"><IMG 
      src="创建SvcHost_exe调用的服务原理与实践.files/document_icon.gif" border=0> <A 
      href="http://www.xfocus.net/articles/200308/593.html">技术挑战&lt;一&gt;</A><BR><IMG 
      src="创建SvcHost_exe调用的服务原理与实践.files/document_icon.gif" border=0> <A 
      href="http://www.xfocus.net/articles/200306/562.html">任意用户模式下执行 ring 0 
      代码</A><BR><IMG src="创建SvcHost_exe调用的服务原理与实践.files/document_icon.gif" 
      border=0> <A 
      href="http://www.xfocus.net/articles/200307/563.html">IIS的NSIISLOG.DLL溢出问题分析</A><BR></DIV></DIV></DIV></TD>
    <TD class=main>
      <H1>创建SvcHost.exe调用的服务原理与实践</H1><BR>创建时间:2003-08-27 
      更新时间:2003-08-27<BR>文章属性:原创<BR>文章提交:<A 
      href="https://www.xfocus.net/bbs/index.php?lang=cn&amp;act=Profile&amp;do=03&amp;MID=1249">bingle</A> 
      (bingle_at_email.com.cn)<BR><BR>创建SvcHost.exe调用的服务原理与实践<BR>&nbsp;&nbsp; by 
      bingle_at_email.com.cn<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A 
      href="http://www.binglesite.net/" 
      target=_blank>http://www.binglesite.net/</A><BR><BR><BR>1. 
      多个服务共享一个Svchost.exe进程利与弊<BR><BR>windows 系统服务分为独立进程和共享进程两种,在windows 
      NT时只有服务器管理器SCM(Services.exe)有多个共享服务,随着系统内置服务的增加,在windows 
      2000中ms又把很多服务做成共享方式,由svchost.exe启动。windows 
      2000一般有2个svchost进程,一个是RPCSS(Remote Procedure 
      Call)服务进程,另外一个则是由很多服务共享的一个svchost.exe。而在windows 
      XP中,则一般有4个以上的svchost.exe服务进程,windows 2003 
      server中则更多,可以看出把更多的系统内置服务以共享进程方式由svchost启动是ms的一个趋势。这样做在一定程度上减少了系统资源的消耗,不过也带来一定的不稳定因素,因为任何一个共享进程的服务因为错误退出进程就会导致整个进程中的所有服务都退出。另外就是有一点安全隐患,首先要介绍一下svchost.exe的实现机制。<BR><BR><BR>2. 
      Svchost原理<BR><BR>Svchost本身只是作为服务宿主,并不实现任何服务功能,需要Svchost启动的服务以动态链接库形式实现,在安装这些服务时,把服务的可执行程序指向svchost,启动这些服务时由svchost调用相应服务的动态链接库来启动服务。<BR><BR>那么svchost如何知道某一服务是由哪个动态链接库负责呢?这不是由服务的可执行程序路径中的参数部分提供的,而是服务在注册表中的参数设置的,注册表中服务下边有一个Parameters子键其中的ServiceDll表明该服务由哪个动态链接库负责。并且所有这些服务动态链接库都必须要导出一个ServiceMain()函数,用来处理服务任务。<BR><BR>例如rpcss(Remote 
      Procedure 
      Call)在注册表中的位置是&nbsp;&nbsp;HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RpcSs,它的参数子键Parameters里有这样一项:<BR>"ServiceDll"=REG_EXPAND_SZ:"%SystemRoot%\system32\rpcss.dll"<BR>当启动rpcss服务时,svchost就会调用rpcss.dll,并且执行其ServiceMain()函数执行具体服务。<BR><BR>既然这些服务是使用共享进程方式由svchost启动的,为什么系统中会有多个svchost进程呢?ms把这些服务分为几组,同组服务共享一个svchost进程,不同组服务使用多个svchost进程,组的区别是由服务的可执行程序后边的参数决定的。<BR><BR>例如rpcss在注册表中 
      HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RpcSs 
      有这样一项:<BR>"ImagePath"=REG_EXPAND_SZ:"%SystemRoot%\system32\svchost -k 
      rpcss"<BR>因此rpcss就属于rpcss组,这在服务管理控制台也可以看到。<BR><BR>svchost的所有组和组内的所有服务都在注册表的如下位置: 
      HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows 
      NT\CurrentVersion\Svchost,例如windows 
      2000共有4组rpcss、netsvcs、wugroup、BITSgroup,其中最多的就是netsvcs=REG_MULTI_SZ:EventSystem.Ias.Iprip.Irmon.Netman.Nwsapagent.Rasauto.Rasman.Remoteaccess.SENS.Sharedaccess.Tapisrv.Ntmssvc.wzcsvc..<BR><BR>在启动一个svchost.exe负责的服务时,服务管理器如果遇到可执行程序内容ImagePath已经存在于服务管理器的映象库中,就不在启动第2个进程svchost,而是直接启动服务。这样就实现了多个服务共享一个svchost进程。<BR><BR><BR>3. 
      Svchost代码<BR><BR>现在我们基本清楚svchost的原理了,但是要自己写一个DLL形式的服务,由svchost来启动,仅有上边的信息还有些问题不是很清楚。比如我们在导出的ServiceMain()函数中接收的参数是ANSI还是Unicode?我们是否需要调用RegisterServiceCtrlHandler和StartServiceCtrlDispatcher来注册服务控制及调度函数?<BR><BR>这些问题要通过查看svchost代码获得。下边的代码是windows 
      2000+ service pack 4 
      的svchost反汇编片段,可以看出svchost程序还是很简单的。<BR><BR>主函数首先调用ProcCommandLine()对命令行进行分析,获得要启动的服务组,然后调用SvcHostOptions()查询该服务组的选项和服务组的所有服务,并使用一个数据结构 
      svcTable 来保存这些服务及其服务的DLL,然后调用PrepareSvcTable() 函数创建SERVICE_TABLE_ENTRY 
      结构,把所有处理函数SERVICE_MAIN_FUNCTION 指向自己的一个函数FuncServiceMain(),最后调用API 
      StartServiceCtrlDispatcher() 注册这些服务的调度函数。<BR><BR>; 
      =============================== Main Funcion 
      ===========================================<BR>.text:010010B8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      public start<BR>.text:010010B8 
      start&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; proc 
      near<BR>.text:010010B8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      push&nbsp;&nbsp;&nbsp;&nbsp;esi<BR>.text:010010B9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      push&nbsp;&nbsp;&nbsp;&nbsp;edi<BR>.text:010010BA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      push&nbsp;&nbsp;&nbsp;&nbsp;offset sub_1001EBA ; 
      lpTopLevelExceptionFilter<BR>.text:010010BF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      xor&nbsp;&nbsp;&nbsp;&nbsp; edi, 
      edi<BR>.text:010010C1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      call&nbsp;&nbsp;&nbsp;&nbsp;ds:SetUnhandledExceptionFilter<BR>.text:010010C7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      push&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      ; 
      uMode<BR>.text:010010C9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      call&nbsp;&nbsp;&nbsp;&nbsp;ds:SetErrorMode<BR>.text:010010CF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      call&nbsp;&nbsp;&nbsp;&nbsp;ds:GetProcessHeap<BR>.text:010010D5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      push&nbsp;&nbsp;&nbsp;&nbsp;eax<BR>.text:010010D6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      call&nbsp;&nbsp;&nbsp;&nbsp;sub_1001142<BR>.text:010010DB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      mov&nbsp;&nbsp;&nbsp;&nbsp; eax, offset 
      dword_1003018<BR>.text:010010E0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      push&nbsp;&nbsp;&nbsp;&nbsp;offset unk_1003000 ; 
      lpCriticalSection<BR>.text:010010E5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      mov&nbsp;&nbsp;&nbsp;&nbsp; dword_100301C, 
      eax<BR>.text:010010EA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      mov&nbsp;&nbsp;&nbsp;&nbsp; dword_1003018, 
      eax<BR>.text:010010EF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      call&nbsp;&nbsp;&nbsp;&nbsp;ds:InitializeCriticalSection<BR>.text:010010F5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      call&nbsp;&nbsp;&nbsp;&nbsp;ds:GetCommandLineW<BR>.text:010010FB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      push&nbsp;&nbsp;&nbsp;&nbsp;eax&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      ; 
      lpString<BR>.text:010010FC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      call&nbsp;&nbsp;&nbsp;&nbsp;ProcCommandLine<BR>.text:01001101&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      mov&nbsp;&nbsp;&nbsp;&nbsp; esi, 
      eax<BR>.text:01001103&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      test&nbsp;&nbsp;&nbsp;&nbsp;esi, 
      esi<BR>.text:01001105&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      jz&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;short 
      lab_doservice<BR>.text:01001107&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      push&nbsp;&nbsp;&nbsp;&nbsp;esi<BR>.text:01001108&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      call&nbsp;&nbsp;&nbsp;&nbsp;SvcHostOptions<BR>.text:0100110D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -