2016년 1월 11일 월요일

Windows에서 일반 실행 프로그램을 서비스로 실행하기

윈도우즈에서 서비스로 실행할 수 있는 프로그램은 특별한 요구사항을 준수해서 작성해야 합니다. 윈도우즈 서비스용 실행을 고려하지 않은 프로그램은 윈도우즈 서비스로 실행할 수 없습니다.
그런데 일반 프로그램을 서비스로 실행할 필요가 생길때가 있습니다.

1. 컴퓨터를 켜면 로그온을 하지 않을때도 일반 프로그램을 실행시켜 두어야 할때.
2. GNU툴과 같이 Windows를 특정하여 작성하지 않은 서버 프로그램을 서비스로 실행할때.
3. Java, .net와 같은 플랫폼 실행 프로그램을 서비스로 실행할때.

이를 해결하는 다양한 접근이 있습니다.
대개 서버를 구축하는 apache에서 이같은 문제를 해결하기위한 다양한 접근이 있고, Java와 연관된 작업을 하는곳에서도 비슷한 문제에 대해 다양한 해결법을 내놓고 있습니다.

Wiki에 Service Wrapper를 검색하시면 몇가지 전용도구를 통해서도 접근하는 방법을 설명하고 있습니다.

여기서는 윈도우즈에서 제3자의 설치파일 없이 사용하는 방법에 대해서 설명합니다.
두가지로 접근합니다.

1. "cmd /K start"와 같은 방식으로 서비스 프로그램을 등록하여 실행하는법
2. "svrany.exe"를 사용하여 서비스 프로그램을 등록하는법


1. "cmd /K start"를 아용하는 아이디어

"cmd /K start"를 사용하는 방법의 아이디어는 이렇습니다.
윈도우즈의 서비스 관리는 서비스가 시작할때 프로그램이 스스로 종료하면 기동이 안됩니다. 따라서 서비스 실행이미지가 종료하지 않도록 해줘야 합니다.
"cmd /K"는 명령어 실행창을 실행시키되 종료하지 않도록 합니다.
그다음 "start" 명령을 사용해서 실제 프로그램 이미지를 실행하는것입니다.
예제는 다음과 같습니다.

sc create MyServiceName type= own type= interact start= auto error= ignore binpath= "cmd /K start MyServiceProgram.exe"

이렇게 하면 윈도우즈 서비스 관리자는 서비스용 실행이미지가 "cmd"로 알게 되겠지만 실제는 "MyServiceProgram.exe"를 실행하는것입니다.
"MyServiceProgram.exe"를 실행할대는 Full-Path로 써줘야 합니다.

이 방식의 단점은 윈도우즈 서비스 관리자에서 실행할때 1053에러가 뜬다는점입니다.
그 이유는 "cmd"프로그램 자체도 윈도우즈 서비스용 프로그램이 아니라는 점 때문입니다.
그러나 어쨋든 서비스 관리자를 통해서 프로그램은 서비스로 실행할 수 있기 때문에 사용할 수는 있습니다.
대개 해커들이 백도어를 실행할때 주로 쓰는 방법입니다.

2. "svrany.exe"를 이용하는 방법

"svrany.exe"를 사용하는것은 MSDN에 나와있는 방법입니다.

MSDN의 링크는 다음과 같습니다.

설명할 방법의 요약에 대한 링크는 다음과 같습니다.

you tube에도 동영상이 있습니다.

이 실행파일은 "Windows Server 2003 Resource Kit Tools"에 포함되어 있습니다.
다운로드 링크는 아래와 같습니다.


sc를 이용해서 서비스를 등록하되 서비스용 실행 이미지는 "svrany.exe"를 단순히 실행하도록 합니다.
"svrany.exe"는 실행직후에 Windows의 레지스트리를 읽어서 서비스를 기동하는 방식입니다.
따라서 특정위치의 레지스트리에 서비스 실행 파일/옵션/실행폴더를 지정하면됩니다.

"svrany.exe"를 서비스로 등록하는 방법은 아래와 같습니다.

sc create MyServiceName type= own start= auto error= ignore binpath= "C:\Program Files\Windows Resource Kits\Tools\srvany.exe"

만일 "svrany.exe" 를 리소스킷에서 추출하여 분리하셨다면 추출하여 분리한 폴더의 절대위치를 포함해서 지정하면됩니다.
그리고 다음과 같이 레지스트리를 등록합니다.

reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MyServiceName\Parameters" /v "Application" /t REG_SZ /d  "프로그램 실행 이미지 절대위치" /f
reg add 

"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MyServiceName\Parameters" /v "AppParameters" /t REG_SZ /d "프로그램 실행 옵션" /f

reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MyServiceName\Parameters" /v "AppDirectory" /t REG_SZ /d "프로그램 실행 폴더 절대위치" /f

명령행이 귀찮으시면 regedit로 등록해도 됩니다.
sc 를 통해서 MyServiceName를 등독하시고 나면 아래와 같은 레지스트리가 만들어져 있을것입니다.

"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MyServiceName"

이 아래에 "Parameters"추가하고 그 아래에 "Application", "AppParameters", "AppDirectory"를 추가한뒤 REG_SZ 타입으로 만들어서 지정하면 됩니다.

"svrany.exe"를 사용하는 방법은 완벽하게 작동하지만 문제가 있습니다.
대부분 백신프로그램이나 보안 프로그램이 "svrany.exe"를 보안에 위험한 프로그램으로 분류하고 문제가 있다는 보고를 한다는 것입니다.
때문에 보안성이 강화된 설정에서는 사용하는데 어려움이 있을 수 있습니다.