1. svchost
1.1 svchost 개요
svchost.exe: Windows 서비스들을 실행하는 호스트 프로세스(Host Process for Windows Services)
많은 Windows 서비스는 실행 파일(.exe)이 아닌 DLL(Dynamic Link Library) 형태로 제공되는데, DLL은 독립적으로 실행될 수 없기 때문에 이를 대신 실행하고 관리하는 호스트 프로세스가 필요하다. svchost.exe는 이러한 DLL 기반 서비스들을 불러와 실행하는 역할을 한다.
*DDL
https://xsreem.tistory.com/211
[System] DLL
1. DLL 개요1.1 DLL+ 로드 라이브러리 1.2 IAT1.3 EAT1.4 DLL Injectioniat가 변조 대상, 공격 벡터여기를 변조하여 임의의 것을 올릴 수 있음 1.5 DLL Ejection 2. dll이 exe가 동작하는 방식 확인2.0 설명- 대상: loader.
xsreem.tistory.com
1.2 정상 동작 시나리오
1) svchost.exe 시작
2) 레지스트리에서 ServiceDll 경로 읽기
3) LoadLibrary()로 ServiceDLL.dll 로드 (메모리 매핑)
4) GetProcAddress()로 ServiceMain 찾기
5) ServiceMain 호출
6) 서비스 실행 중 - DLL은 메모리에 계속 로드됨
2. svchost 서비스 등록 및 생성
2.1 DLL권한 설정
1) SYSTEM 계정에 읽기 권한 부여
SYSTEM 계정이 ServiceDLL.dll을 읽을 수 있게 하기 위해 권한을 설정한다.

*icacls: Windows에서 파일·폴더의 접근 권한(ACL, Access Control List)을 조회하고 수정하는 명령어
icacls [파일경로] /grant "[사용자]:[권한]"
2) 권한 확인

2.2 서비스 등록
1) Svchost 그룹 등록
svchost.exe가 사용할 서비스 그룹 "MyServiceGroup"을 생성하고, 그 그룹에 “MyTestService”를 속하게 만든다.

reg add [레지스트리 키 경로] /v [이름] /t [타입] /d [데이터] /f
| 명령어 구성 | 해석 |
| reg add | 레지스트리 키/값을 추가하는 명령어 |
| "HKLM\...\Svchost" | Svchost 그룹을 관리하는 레지스트리 위치 |
| /v MyServiceGroup | 값 이름(Value Name) → 만들 그룹명 |
| /t REG_MULTI_SZ | 값 타입(Multi String) |
| /d MyTestService | 실제 데이터(서비스 이름) |
| /f | 강제로 덮어쓰기(Confirm 없이 적용) |
2) 서비스 생성
svchost.exe를 이용한 DLL 기반 서비스 MyTestService 를 생성한다.

sc create [서비스이름] binPath= "[실행프로그램]" type= [own/share] start= [auto/demand /disabled]
| 명령어 구성 | 해석 |
| sc create | 새로운 Windows 서비스를 생성 |
| MyTestService | 서비스 이름(Service Name) |
| binPath= | 서비스를 실행할 실제 실행 파일 경로 지정 |
| "svchost.exe -k MyServiceGroup" | svchost.exe를 실행하되, MyServiceGroup 그룹으로 동작 |
| type= share | 공유 서비스(SHARE PROCESS) → 여러 서비스가 한 svchost에서 동작 가능 |
| start= demand | 시작 유형: 수동 (SC START로 시작해야 함) |
3) ServiceDll 경로 등록(Parameters 생성)

svchost가 MyTestService를 실행할 때 로드해야 하는 DLL이 C:\lab\ServiceDLL.dll 임을 지정한다.
reg query [레지스트리 경로]
| 명령어 구성 | 해석 |
| reg add | 레지스트리 값 추가 |
| "HKLM\SYSTEM\...\Parameters" | 서비스 설정 정보(Parameter) 저장 위치 |
| /v ServiceDll | Svchost가 로드할 DLL 이름(고정 키) |
| /t REG_EXPAND_SZ | 문자열 타입(환경 변수 포함 가능) |
| /d "C:\lab\ServiceDLL.dll" | DLL 실제 파일 경로 |
| /f | 강제 덮어쓰기 |
4) 등록 확인
등록해둔 DLL 경로(ServiceDll)가 제대로 반영되었는지 확인한다.

*reg query: 레지스트리 값을 조회하는 명령어
reg query [레지스트리 경로]
2.3 C:\Temp 디렉토리 생성 및 권한 설정
C:\Temp 아래의 모든 파일/폴더에 SYSTEM의 Full 권한(F)을 상속한다.

| 권한 | 해석 |
| (OI) | Object Inherit → 파일에 상속 |
| (CI) | Container Inherit → 하위 폴더에 상속 |
2.4 서비스 시작 및 확인
1) MyTestService 서비스 시작

| 출력 항목 | 출력값 | 해석 |
| SERVICE_NAME | MyTestService | 시작한 서비스 이름 |
| 종류(Type) | 30 WIN32 | WIN32_SHARE_PROCESS (svchost 기반 DLL 서비스) |
| 상태(Status) | 2 START_PENDING | 서비스가 실행 준비 중(초기화 단계) |
| 상태 플래그 | NOT_STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN | 시작 과정에서는 중지/일시정지 불가, 종료 신호 무시 |
| WIN32_EXIT_CODE | 0 (0x0) | Win32 계층에서 오류 없음 |
| SERVICE_EXIT_CODE | 0 (0x0) | 서비스(ServiceMain) 내부 오류 없음 |
| 검사점(Checkpoint) | 0x0 | 시작 초기 상태(아직 진행 단계 증가 전) |
| WAIT_HINT | 0x7d0 | 서비스가 완전히 시작될 때까지 예상 대기 시간(2000ms) |
| PID | (이전에 캡쳐한거라 PID 다름) |
이 서비스를 실행하는 svchost.exe의 프로세스 ID |
| 플래그(Flags) | 없음 | 특수 플래그 없음 (정상) |
2) 상태 확인

서비스 시작 출력값과 위와 동일하다.
3) 로그 확인
ServiceDLL.dll 내부 코드가 기록한 로그 파일을 확인한다.

| 로그 내용 | 해석 |
| ServiceMain called | DLL이 svchost에 의해 성공적으로 시작됨 |
| Worker started | 서비스 작업 스레드 생성 완료 |
| Service running | Windows 서비스 상태 RUNNING 전환 성공 |
| Service is running... | 스레드 루프 정상 반복 중(서비스 계속 실행 중) |
3. 프로세스 확인
3.1 cmd
ServiceDLL.dll을 로드하고 있는 프로세스를 출력한다.

| 출력 항목 | 출력값 | 해석 |
| 이미지 이름(Image Name) | svchost.exe | 해당 DLL을 로드한 프로세스 이름 |
| PID | 8360 | ServiceDLL.dll을 로드한 svchost.exe의 프로세스 ID |
| 모듈(Module) | ServiceDLL.dll | 해당 프로세스가 메모리에 로드한 DLL 이름 |
*tasklist: 전체 프로세스 목록을 출력하는 명령어
| 옵션 | 설명 | 추가 |
| /m | 각 프로세스가 로드한 모든/특정 모듈(DLL) 목록 표시 | /m [ModuleName] : 특정 DLL(모듈)을 로드한 프로세스를 표시 |
| /fi | 필터 조건을 적용하여 목록을 제한하여 출력(PID, 이미지 이름, 세션 등 원하는 항목만 출력 가능) | /fi "imagename eq [프로세스명]" : 특정 프로세스 이름만 조회 /fi "pid eq [PID]" : 특정 PID만 조회 |
| /svc | 프로세스가 호스팅하는 서비스 목록 표시 | - |
| /v | 자세한 정보(메모리, 상태 등) 표시(Verbose) | |
| /fo | 출력 형식 지정(table, list, csv) | - |
| /nh | 헤더 라인 제거 | - |
3.2 ProcessExplorer

| 출력 항목 | 출력값 | 해석 |
| Handle or DLL substring | ServiceDLL.dll | 이 문자열을 포함하는 핸들이나 DLL을 검색 |
| Process | svchost.exe | ServiceDLL.dll을 로드한 프로세스 |
| PID | 8360 | 해당 svchost.exe 프로세스의 프로세스 ID |
| Type | DLL | 로드된 항목이 DLL이라는 의미 |
| Name | C:\lab\ServiceDLL.dll | svchost.exe가 실제로 로드한 DLL의 전체 경로 |
3.3 powershell

| 출력 항목 | 출력값 | 해석 |
| Handles | 69 | 프로세스가 보유한 핸들 수 |
| NPM(K) | 6 | Non-paged memory(KB) |
| PM(K) | 1148 | Paged memory(KB) |
| WS(K) | 4988 | Working Set(실제 메모리 상주량) |
| CPU(s) | 0.00 | CPU 사용 시간 |
| Id | 8360 | 프로세스 ID (PID) |
| SI | 0 | Session ID |
| ProcessName | svchost | 실행 중인 프로세스 이름 |
*Get-Process: 현재 실행 중인 모든 프로세스 출력하는 명령어
Get-Process | Where-Object { $_.Modules.ModuleName -contains "ServiceDLL.dll" }
| 명령어 구성 | 해석 |
| Get-Process | 현재 실행 중인 모든 프로세스를 가져옴 |
| |(파이프) | 앞 명령어의 출력을 다음 명령어의 입력으로 사용 |
| Where-Object {...} | 조건에 맞는 프로세스만 필터링 |
| $_.Modules.ModuleName | 해당 프로세스가 로드한 DLL(Module) 이름 목록 $_ = 현재 전달된 “프로세스 객체” $_.Modules = 이 프로세스가 로드한 DLL 목록 (배열) $_.Modules.ModuleName = DLL 이름들의 배열 |
| -contains "ServiceDLL.dll" | “ServiceDLL.dll”을 로드한 프로세스만 선택 |
4. 서비스 삭제
4.1 서비스 중지

| 출력 항목 | 출력값 | 해석 |
| SERVICE_NAME | MyTestService | 중지 명령을 내린 서비스 이름 |
| 종류(Type) | 30 WIN32 | WIN32_SHARE_PROCESS → svchost.exe 기반 DLL 서비스 |
| 상태(Status) | 1 STOPPED | 서비스가 정상적으로 종료됨 |
| WIN32_EXIT_CODE | 0 (0x0) | Windows 시스템 계층에서 오류 없음 |
| SERVICE_EXIT_CODE | 0 (0x0) | ServiceMain → WorkerThread → 정상 종료됨 (Stop 처리 완료) |
| 검사점(Checkpoint) | 0x0 | 서비스가 정지된 상태에서 체크포인트 필요 없음 |
| WAIT_HINT | 0x0 | 대기 시간 필요 없음 (이미 종료 완료) |
4.2 서비스 삭제

4.3 레지스트리 정리

4. 분석
4.1 EAT 분석

4.2 IAT 분석


'Program > 토스뱅크 사이버보안 엔지니어 부트캠프(공격&방어 기술)' 카테고리의 다른 글
| [MITRE ATT&CK Framework] ID (0) | 2025.12.10 |
|---|---|
| [APT] APT29 POSHSPY (0) | 2025.12.09 |
| [System] DLL (0) | 2025.11.18 |
| [Network] ARP Spoofing (0) | 2025.11.06 |
| [Network] 네트워크 구성 요소 (0) | 2025.11.04 |