Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1804425
  • 博文数量: 290
  • 博客积分: 10653
  • 博客等级: 上将
  • 技术积分: 3178
  • 用 户 组: 普通用户
  • 注册时间: 2007-10-24 23:08
文章存档

2013年(6)

2012年(15)

2011年(25)

2010年(86)

2009年(52)

2008年(66)

2007年(40)

分类: WINDOWS

2009-07-06 17:26:20


替换服务但原服务不失效的方法

2009-03-31 11:19:58  来源:
  云舒   替换系统服务是做后门的一个好办法,ring3实现,稳定可靠,也具有一定的隐蔽性。这里简单说说怎么样使用自己的服务替换系统服务,并且保证原来真实的系统服务不失效。   替换服务,主要有两种 ...

  云舒

  替换系统服务是做后门的一个好办法,ring3实现,稳定可靠,也具有一定的隐蔽性。这里简单说说怎么样使用自己的服务替换系统服务,并且保证原来真实的系统服务不失效。

  替换服务,主要有两种常见的办法,第一是修改注册表中对应服务的可执行文件路径,第二个是直接替换服务文件。第一个办法的缺陷是修改注册表,第 二个是需要关闭SFC。而他们共有的缺点是替换了服务之后原来的老服务就失效了,以至没法替换系统关键服务。服务的执行是从ServiceMain函数开 始的(当然也可以自己定义一个别的名字), 因此如果在我们的服务执行的时候,在我们的ServiceMain里面,顺便执行一下真实服务的ServiceMain函数,老服务就不会失效了。最方便 这么做的,莫过于老服务是依附于svchost启动的dll了。LoadLibrary一下,再GetProcAddress一下,再执行一下就好了。

  具体的代码实现很简单,我就不贴了。需要注意的是RegisterServiceCtrlHandler函数的调用,一个服务只能调用 一次,原服务的ServiceMain里面一定会调用的,因此我们自己的ServiceMain里面就不用写了,反而代码变得更少,更干净。另外一个注意 点,服务一般都是要做成死循环的,所以要在调用老服务的ServiceMain之前,创建线程来执行自己的服务主功能。

  有意思的是,这样替换了依附svchost的服务之后,如果线程里面拒绝退出,服务还是可以停掉,但是即使停掉了,我们自己的dll却还是在svchost的空间中执行。

  关于服务的基础知识,可以参见http://www.vckbase.com/document/viewdoc/?id=1474和bingle的http://www.xfocus.net/articles/200308/601.html

阅读(666) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~