题目可能有点拗口,解释一下,有时候,我们希望在服务器上开机运行某个批处理,而不用登入系统,首先想到的就是利用计划任务和注册服务,我们说下如何用服务来达到目的,我们知道一个应用程序,如果满足微软的服务接口,可被注册的话,那么可以直接用
sc create srvName binPath= "application path" start= auto type= own type= interact
这样的方式来注册一个系统服务,这可以使你的程序以SYSTEM的身份运行,而不用非得用一个账号登录到系统后才运行。但如果我们想运行的是一个批处理该如何办呢?直接将批处理路径写进去?你会发现服务正常注册,但是运行不起来,服务会因为无法及时响应而中止,这是因为你的批处理不是一个符合微软服务接口的应用程序,服务运行机制会因为得不到合法反馈而中止,为了处理这种事务,微软专门提供了一对应用程序来作为补充,即instsrv.exe和srvany.exe,前者用于注册服务,后者用于配置服务详情。经实验,前者其实和sc create的效果差不多,而srvany.exe是一个标准的符合服务规定的应用程序,我们需要注册的服务binPath只需要指向它,即可运行起服务,而它又提供了一些扩展属性,比如Parameters项下面的Application子键,用于读取注册表配置并将之运行,这即意味着,我们可以将非exe程序也放在它的运行参数里面被执行,也就达到了我们将批处理注册为服务而启动的目的。
比较省事一点的做法,可以将srvany.exe与批处理一并提供,然后在注册服务时调用srvany.exe,如果不想要那么多文件,只用一个批处理就搞定,那就要做到一件事情:用批处理临时生成srvany.exe程序,然后再注册它完成相应目的,用批处理生成exe程序,那就得请debug出山了,两种思路:
1)用copy /b 将exe程序复制二进制代码到批处理中,然后在执行时用debug将批处理自身调用内存,并将exe部分内在写入磁盘,存成srvany.exe文件,这要求事先精心构建好批处理代码,对字节级偏移控制到位
2)事先将srvany.exe的内存写入过程写好,跟在批处理后面,直接用more +n的行偏移来执行debug命令,输出srvany.exe程序,这种方法的优点是不用精确控制字节单位,只需要将debug代码的起始偏移行知道就OK了
下面给同第二种方法的实现:复制代码 PS:对于第一种方法的实现,也测试出了具体方法,直接构建一个精确到字节的批处理,然后将EXE程序直接用copy /b将二进制代码附到文件最后,合起来构建成一个只能使用,不能更改的批处理,因为整个文件会被读到内存中,稍动一个字节,可能将导致输出的EXE程序完全走样,比如我用下列批处理作为母版来制作一个定制的bat文件,那么它的整个长度,内存起始位置,都会被事先安排好,利用more跳转到批处理执行语句,并将之输送到对本身文件的debug过程中,利用n指定文件名,并用rbx和rcx指定输入内存的长度,最后用w+内存偏移(记得加上debug的地址偏移0x100)的方法从指定内在开始输出二进制代码,最后利用ren将输出文件还原为exe程序:- @echo off
- setlocal enabledelayedexpansion
- more +15 %0|debug %0
- ren srvany.bin srvany.exe
- pause
- chcp 936
- (sc query xxxservice|findstr /i win32 >nul 2>nul) && ((sc stop xxxservice 2>nul) && (sc delete xxxservice) ||(sc delete xxxservice))
- sc create xxxservice binPath= "%cd%\srvany.exe" start= auto type= own type= interact
- REG ADD HKLM\SYSTEM\CURRENTCONTROLSET\SERVICES\xxxSERVICE /V DESCRIPTION /T REG_SZ /D "xxx SERVICE, PLEASE DON'T DELETE IT!"
- REG ADD HKLM\SYSTEM\CURRENTCONTROLSET\SERVICES\xxxSERVICE\PARAMETERS /V APPLICATION /T REG_SZ /D "%CD%\RUN.BAT"
- sc start xxxservice
-
- goto :EOF
-
- :_masmCode
- n srvany.bin
- r bx
- 0000
- r cx
- 2000
- w 03ad
- q
-
-
-
- :_exeBinary
-
复制代码 测试环境:XP SP3 |