본문 바로가기
WebBook/윈도우 구조

시스템 프로세스(Windows Startup Process) - 서비스 관리자 Services.exe

by 올엠 2022. 3. 14.
반응형

Service Control Manager SCM(이하 SCM)이라고도 불리며, 부팅시 Winlogon에 의해(윈도우 7/8/10/11 Wininit) %Systemroot%\System32\Services.exe를 실행하게 된다. 이 프로세스는 서비스의 시작, 중지와 같은 서비스들과 상호 작용을 담당하고 상태 정보를 서비스 관리도구에게 전달하는등의 단순 서비스 제어 역활을 수행하게 된다..

서비스는 대화식 로그온이 없이도 시스템 부팅 중 자동으로 실행되게 구성이 가능한 프로세스를 의미하며, 로그온 이후 수동으로 서비스를 시작하거나, 중지할 수 있다. 이 프로세스는 서비스 관리 도구와 상호 작용을 위해 단순히 윈도우 함수만을 호출한다.그리고 서비스는 HKLM\SYSTEM\CurrentControlSet\Services 에 정의되어 있는데, 여기에는 드라이버들도 포함된다.

서비스 리스트와 설정을 레지스트리에서 확인할 수 있다

이 중 일부 서비스는 %Systemroot%\System32\svchost.exe에 의지하여 실행되며 이 SvchostDll(동적 연결 라이브러리)에서 실행되는 서비스에 대한 일반적인 호스트 프로세스라 할 수 있다.

Tasklist 를 통해 확인한 Svchost를 통해 실행되는 서비스들

그리고

HKLM\Software\Microsoft\Windows NT\CurrentVersion\Svchost

Svchost를 이용하는 서비스들이 등록되어 사용되는데, Svchost는 해킹(백도어) 등에서 약간의 이름과 경로를 변경하는 방식으로 자주 사용되므로 주의 깊게 관찰할 필요가 있다. 이에 대해서는 차후 3부 역분석 부분에서 한번 더 얘기하도록 하겠다.

서비스 등록은 Advapi32.dll CreateService를 호출해 SCM에 메시지를 보내게 된다. 이때 SCM

HKLM\SYSTEM\CurrentControlSet\Services

에 레지스트리 키를 생성하게 되며, 생성시 서비스 특성에 맞게 여러 옵션값을 통해 필요한 설정을 지정하게 된다.

 

이렇게 서비스를 생성한 이후 StartService 함수를 통해 서비스를 시작할 수 있다.

서비스 중인 프로세스를 확인하기 위해서는 명령 프롬프트 창(Cmd.exe)에서 Sc query(윈도우 기본 내장 명령) Tasklist /svc(윈도우 기본 내장 명령)로 확인할 수 있다.

sc 명령을 통해 확인한 현재 실행중인 서비스 리스트

이외에도 Sc는 아래와 같은 다양한 옵션을 제공한다.

Query: 서비스 상태를 쿼리하거나 서비스 종류의 상태를 열거
Queryex: 서비스의 확장 상태를 쿼리하거나 서비스 종류의 상태를 열거
Start: 서비스를 시작
Pause: 서비스에 PAUSE 제어 요청을 보냄
Interrogate: 서비스에 INTERROGATE 제어 요청을 보냄
Continue: 서비스에 CONTINUE 제어 요청을 보냄
Stop: 서비스에 STOP 요청을 보냄
Config: 서비스 구성을 변경
Description: 서비스 설명을 변경
Failure: 서비스가 실패했을 때 수행할 동작을 변경
Failureflag: 서비스의 오류 동작 플래그를 변경
Sidtype: 서비스의 서비스 SID 형식을 변경
Privs: 서비스에 필요한 권한을 변경
qc: 서비스의 구성 정보를 쿼리
qdescription: 서비스 설명을 쿼리
qfailure: 서비스가 실패했을 때 수행할 동작을 쿼리
qfailureflag: 서비스의 오류 동작 플래그를 쿼리
Qsidtype: 서비스의 서비스 SID 형식을 쿼리
Qprivs: 서비스에 필요한 권한을 쿼리
Qtriggerinfo: 서비스의 트리거 매개 변수를 쿼리
Qpreferrednode: 서비스의 기본 설정 NUMA 노드를 쿼리
Delete: 서비스를 레지스트리에서 삭제
Create: 서비스를 만들고 레지스트리에 추가
Control: 서비스에 제어를 보냄
Sdshow: 서비스의 보안 설명자를 표시
Sdset: 서비스의 보안 설명자를 설정.
Showsid: 임의 이름에 해당되는 서비스 SID 문자열을 표시
Triggerinfo: 서비스의 트리거 매개 변수를 구성
Preferrednode: 서비스의 기본 설정 NUMA 노드를 설정
GetDisplayName: 서비스의 DisplayName을 표시
GetKeyName: 서비스의 ServiceKeyName을 표시
EnumDepend: 서비스 종속성을 열거

그럼 sc를 이용해서 수동으로 서비스를 등록해보자. 단 주의해야 할 점은 파라미터의 등호(=) 이후에 공백이 존재하여야 한다.

sc create notepadsvc binPath= "c:\windows\notepad.exe" displayname= "notepad" start= auto  obj= "LocalSystem"

만약 필요한 프로그램을 서비스로 등록해 놓으면, 부팅 프로세스인 Winlogon(비스타 이후에서는 Wininit)에 의해 사용자가 로그인하지 않은 상태에서도 서비스에 등록한 프로그램을 부팅과 함께 실행하므로, 수백여 대의 서버를 관리해야 하는 기업 환경에서 일일이 로그인 하지 않아도 서비스에 등록한 프로그램을 자동적으로 실행할 수 있어 관리자들에게 유용할 것이다. 하지만 아래 그림과 같이 단순 응용프로그램의 경우 SCM의 제어 방식이 맞지 않기 때문에, 서비스 실행이 실패하게 된다. sc SCM에서 관리 가능한 서비스 프로그램을 수동으로 등록하고, 변경하는 서비스 관리용 도구임을 잊지 말자.

Sc 를 이용해 등록한 일반 프로그램

 

반응형