1. 기본

2. 사용법

.... 2.1 sc 명령어

.... 2.2 service.msc

3. 구조

.... 3.1 동작 구조

.... 3.2 개발

........ 3.2.1 exe 형태

........ 3.2.2 dll 형태

4. 악성코드 분석





1. 기본

  기본적으로 서비스는 실행 가능한 바이너리여야 할 것이고 sys, exe, dll이 그 대상이 될 것이다. 명령 프롬프트에서 다음과 같은 명령을 실행해서 나온 결과 중 "종류"를 확인해 보면 3가지를 확인할 수 있다.


> sc qc [ 서비스 이름 ]


  sys 바이너리 즉 디바이스 드라이버는 KERNEL_DRIVER(1), exe 실행 파일 바이너리는 WIN32_OWN_PROCESS(10), dll은 WIN32_SHARE_PROCESS(20)이다.


  등록된 서비스는 명령 프롬프트에서 sc 명령어를 사용하거나 또는 service.msc 유틸리티, 그리고 레지스트리를 통해서 확인 가능하다. sys나 exe 같은 standard alone한 서비스는 다음의 레지스트리에서 확인 가능하다. ImagePath를 보면 exe 및 sys 파일의 경로를 확인할 수 있다.


[ HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services ]


  DLL 형태의 서비스 프로그램은 조금 다르다. 각 서비스가 위의 키에 존재하는 것은 맞지만 ImagePath에 실행 파일의 경로가 아니라 다음과 같은 형태를 볼 수 있다.


%SystemRoot%\system32\svchost.exe -k  [서비스 그룹 이름]


  이것은 부팅 시에 svchost.exe의 인자로 서비스 그룹의 이름을 넣고 실행함으로써 호출된다는 것이다. dll의 경로는 ImagePath가 아니라 ServiceDll에 위치한다. 참고로 지금까지 언급했던 서비스 그룹은 다음의 레지스트리에 저장되어 있다. 


[ HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Svchost ]


  정리하자면 현재 윈도우의 프로세스 트리를 보면 services.exe를 확인할 수 있다. 이것의 자식 프로세스로 동작하는 exe 프로그램들은 서비스로 동작하는 (그리고 거기에 맞게 개발된) exe 프로그램이다. 이것 말고도 다수의 svchost.exe 프로세스들을 확인할 수 있다. 위의 내용과 같이 각 서비스 그룹 별로 svchost.exe가 실행되며 각각의 svchost.exe에는 담당하는 서비스 그룹에 속하는 dll들이 로드되어 있다.





2. 사용법

2.1 sc 명령어


> sc create [서비스 이름] binpath= [서비스 파일 경로]

> sc delete [서비스 이름]

> sc start [서비스 이름]

> sc stop [서비스 이름]

> sc query

        ; 전체 서비스 조회

> sc query [서비스 이름]

        ; 특정 서비스 조회



2.2 service.msc

실행창 -> service.msc

        ; 위의 명령어로 확인할 수 있다.





3. 구조

3.1 동작 구조

  서비스 프로그램의 경우 dll이나 sys는 당연할테지만, exe 형태를 가지고 있다고 하더라도 서비스로서 동작하도록 개발된 프로그램이기 때문에 일반적인 더블 클릭을 통해 실행되는 것이 아니라 앞에서 보았던 sc.exe 같은 프로그램이 해당 서비스를 등록하고 실행시켜 주는 역할을 해주어야 한다.


  이러한 sc.exe 같은 프로그램들을 SCP라고 한다. 이외에도 SCM이라는 개념도 있는데 모든 서비스들을 관리하는 역할을 한다. 위의 내용을 보고 추측할 수 있듯이 SCM은 services.exe이다. dll 형태의 경우 svchost.exe가 관리하는 것으로 생각할 수 있겠지만 이것도 궁극적으로는 부모 프로세스인 services.exe가 관리한다.


  일반적으로 간단하게 sc.exe를 이용할 수 있겠지만 직접 SCP를 만드는 것도 가능하다. SCP의 경우 간단하게 OpenSCManager()로 SCM을 오픈하고, 여기서 받은 핸들을 통해 CreateService()로 서비스를 생성한다. 그러면 SCM은 HKLM\SYSTEM\CurrentControlSet\Services 아래에 서비스에 대한 레지스트리 키를 생성한다. 삭제할 때는 DeleteService() 함수를 사용할 수 있다.



3.2 개발

3.2.1 exe 형태

  여기서는 서비스 프로그램의 구조 부터 시작하며 먼저 exe 형태를 다루기로 한다. 일반적인 프로그램은 Entry Point만 존재하면 되겠지만, 서비스 프로그램은 추가적으로 Service Entry Point 및 Service Control Handler가 필요하다.


  일반적인 서비스 프로그램의 형태에 대해 동작 과정 및 SCP와 연관시켜 설명하기로 한다. 만약 sc.exe를 이용해 서비스를 시작시키는 경우 내부적으로 (직접 SCP를 개발한 경우에도 마찬가지이다) StartService() 함수가 호출된다. 그러면 SCM 즉 services.exe에 의해 해당 서비스 프로세스가 생성 및 실행된다. 이 때 서비스 프로그램도 일반적인 프로그램과 마찬가지로 Entry Point 즉 main 함수가 실행된다.


  일반적인 서비스 프로그램의 경우 실질적인 루틴은 main에 존재하지 않으며 대신 간략하게 StartServiceCtrlDispatcher() 함수를 이용해 Service Entry Point 즉 실질적인 서비스 루틴을 담당하는 함수를 등록한다. 이 함수는 Service Main 함수라고 부르도록 한다.


  이후 Service Main 함수가 실행되는데 일반적으로 초기화 루틴부터 시작한다. 먼저 서비스 프로그램의 경우 SCM과의 제어를 담당하는 부분이 필요하다. 이러한 부분을 Service Control Handler라고 부르며 앞에서도 언급하였듯이 Service Main 함수 처럼 추가적인 함수로 구현해 놓을 필요가 있다. 핸들러 함수가 존재해야 서비스에 대한 중지, 시작 등의 제어를 처리할 수 있으며 실제로 그러한 역할을 담당한다.


  이에따라 Service Main 함수의 초기화 루틴에서는 RegisterServiceCtrlHandler()를 통해 핸들러 함수를 등록하는 부분이 존재한다. 다음으로는 서비스를 실행시키는 부분이다. 물론 현재 Service Main 함수 부분에서 이미 실행 중이긴 하지만 SCM 입장에서는 SERVICE_START_PENDING 상태라고 할 수 있다. 그러므로 초기화 이후에는 SetServiceStatus 함수를 이용해 인자로 SERVICE_RUNNGING를 설정하고 호출하여야 이후 서비스 프로세스로서 동작하게 된다.


3.2.2 dll 형태

  DLL 형태의 경우는 앞에서 살펴보았던 exe 형태와는 조금 다르다. dll의 경우 먼저 ServiceMain()이라는 함수를 만들고 이 함수를 export해야 한다. exe의 경우 실행시키면 바로 Entry Point인 main 함수가 실행되듯이, dll의 경우 서비스 시작 시 이 export된 함수를 호출할 것이다. 또한 StartServiceCtrlDispatcher() 함수를 호출할 필요가 없다. 그렇기 때문에 실제 서비스로서의 역할을 이 ServiceMain()에서 수행하면 된다. 물론 SCM과의 커뮤니케이션을 위해 Service Control Handler가 필요하므로 해당 함수를 구현한 후 RegisterServiceCtrlHandler()를 통해 핸들러 함수를 등록할 필요는 있다.





4. 악성코드 분석

  인터넷을 보면 서비스 디버깅 방식이 존재한다. 그러한 방식을 사용하면 exe 형태이든 dll 형태이든 위의 정리된 내용을 바탕으로 분석할 수 있을 것이다. 


  추가적인 팁이 있다면 서비스 프로그램은 시스템 권한으로 실행되기 때문에 EP를 무한 루프로 수정하고 Attach하려고 해도 불가능하다. 이 경우에는 ExecTI 같은 도구를 이용해 디버거를 시스템 권한으로 실행시킨 후 Attach하면 될 것이다.


'악성코드 분석' 카테고리의 다른 글

디버거로 덤프 뜨기  (1) 2018.12.15
[Tool] ejExtractor  (0) 2018.12.10
악성 행위에 사용될 수 있는 시스템 유틸리티  (0) 2018.09.30
윈도우의 작업 스케줄링 및 기타  (1) 2018.09.30
GCC 사용법  (0) 2018.07.19
Posted by SanseoLab

블로그 이미지
Malware Analyst
SanseoLab

태그목록

공지사항

Yesterday
Today
Total

달력

 « |  » 2024.3
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
31

최근에 올라온 글

최근에 달린 댓글

글 보관함