티스토리 뷰

서비스(Service) 프로그램은 SCM(Service Control Manager)에 의해서 관리가 됩니다.

서비스 애플리케이션이 실행되기 위해서는 시작 명령을 내려줄 수 있는 서비스 제어기(Service Controller)가 필요합니다.

서비스 제어기는 SCM에게 서비스 제어 요청을 하면 SCM이 서비스 프로그램에게 제어 명령을 전달하고 리턴 값을 돌려 받는 구조로 되어 있습니다.




모든 서비스 프로그램은 외부(서비스 제어기)에서 StartService() API를 호출하면서 시작됩니다. 




서비스 프로세스 시작 과정


1. 서비스 제어기에서 StartService() 호출

- 서비스 제어기에서 StartService()를 호출하면 SCM은 해당 서비스 프로세스를 생성합니다. 그리고 서비스 프로세스의 EP 코드가 실행됩니다.


2. 서비스 프로세스에서 StartServiceCtrlDispatcher() 호출

- 서비스로 동작하기 위해서는 반드시 서비스 프로세스 내부에서 StartServiceCtrlDispatcher() API를 호출하여 서비스 메인 함수 SvcMain() 주소를 동록해야 합니다. StartServiceCtrlDispatcher()가 호출되면 서비스 제어기의 StartService() 함수가 리턴됩니다. 그리고 SCM은 서비스 프로세스의 서비스 메인 함수 SvcMain()를 호출합니다.


3. 서비스 프로세스에서 SetServiceStatus() 호출

- 서비스 프로세스가 생성되긴 했지만 아직 정식 서비스로 동작하는 것은 아닙니다. 현재까지는 SERVICE_START_PENDING 상태입니다. 서비스 메인 함수 SvcMain() 내부에서 SetServiceStatus(SERVICE_RUNNING) API를 호출해야 비로소 정상적인 서비스 프로세스로서 동작할 수 있습니다.



서비스 프로그램은 결국 SCM에 의해서 프로세스가 생성되고 SvcMain() 함수로 제어가 넘어오면서SetServiceStatus(SERVICE_RUNNING) API를 호출해야만 비로소 정상적인 서비스 프로세스로 동작할 수 있는 것입니다. 


참고 : 리버싱핵심원리

'리버싱 > 정리' 카테고리의 다른 글

[Self Creation 디버깅 방법]  (0) 2015.08.13
[서비스 디버깅 방법]  (0) 2015.08.12
IDA pro 사용법  (0) 2015.08.12
[코드인젝션]기본 뼈대  (0) 2015.08.11
[Cheat Engine] 사용법  (6) 2015.08.11
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함