全部博文(290)
分类: WINDOWS
2009-07-06 17:26:20
云舒
替换系统服务是做后门的一个好办法,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。