[프로세스와 잡] 프로세스 생성
[프로세스와 잡] 프로세스 생성
- 윈도우 API는 프로세스 생성을 위한 여러 함수를 제공한다.
- 프로세스를 생성하는 프로세스와 동일한 접근 토큰으로 프로세스의 생성을 시도하는
CreateProcess
- 다른 토큰이 필요한 경우 사용하는
CreateProcessAsUser
- 이외
CreateProcessWithToken
,CreateProcessAsLogon
- 프로세스 생성을 위해 원격 프로시저 호출(RPC)을 함으로써 2차 로그온 서비스(svchost.exe의 seclogon.dll)를 호출한다.
- seclogon은
SlrCreateProcessWithLogon
함수에서 이 호출을 수행하며, 최종적으로CreateProcessAsUser
함수를 호출한다.
- 프로세스를 생성하는 프로세스와 동일한 접근 토큰으로 프로세스의 생성을 시도하는
- 실행 경로
CreateProcess
,CreateProcessAsUser
→CreateProcessInternal
→NtCreateUserProcess
CreateProcessWithLogon
,CreateProcessWithToken
→SlrCreateProcessWithLogon
→CreateProcessAsUser
- 모든 실행 경로는 궁극적으로
CreateProcessInternal
함수에 이르게 된다. CreateProcessInternal
은 커널 모드로 전환해NtCreateUserProcess
를 호출한다.
CreateProcess 함수 인자
- 유저 모드에서 생성된 프로세스는 하나의 스레드를 가지며, 실행 파일의 메인 함수를 실행한다.
CreateProcess
함수의 중요 인자CreateProcessAsUser
와CreateProcessWithToken
의 경우 토큰 핸들이 필요하다.CreateProcessWithLogon
은 유저 이름과 도메인, 암호를 필요로 한다.- 실행 파일의 경로와 커맨드라인 인자
- 생성될 새로운 프로세스와 스레드 객체에 적용할 선택적 보안 속성
- 상속 불가능으로 표시된 현재 프로세스 내의 모든 핸들이 새로운 프로세스로 상속되어야 하는지 나타내는 플래그
- 프로세스 생성에 영향을 주는 여러 플래그
CREATE_SUSPENDED
: 새로운 프로세스의 초기 스레드를 일시 중지 상태로 생성DEBUG_PROCESS
: 생성 프로세스가 자신이 디버거임을 선언하고 자신의 통제 하에 새로운 프로세스 생성EXTENDED_STARTUPINFO_PRESENT
:STARTINFO
구조체 대신 확장STARTUPINFOEX
구조체 제공
- 새로운 프로세스에 대한 선택적 환경 블록(지정하지 않으면 상속)
- 새로운 프로세스에 대한 선택적 현재 디렉터리
- 프로세스 생성에 대한 추가적인 구성을 제공하는
STARTUPINFO
구조체 또는STARTUPINFOEX
구조체 - 프로세스 생성의 결과물인
PROCESS_INFORMATION
구조체- 새로운 PID, TID
- 새로운 프로세스에 대한 핸들과 스레드에 대한 핸들
윈도우 최신 프로세스 생성
- UWP 앱(이머시브 프로세스)에 대한 프로세스를 생성하는 것은
CreateProcess
를 단순히 호출하는 그 이상을 필요로 한다.- 이는
PROC_THREAD_ATTRIBUTE_PACKAGE_FULL_NAME
(스토어 앱 패키지 이름으로 설정된 값)으로 명명된 키로서 문서화되지 않은 프로세스 속성을UpdateProcThreadAttribute
로 추가하는 것이다. - 위 방법은 문서화되지 않았으며, API 관점에서 스토어 앱을 실행하기 위한 다른 방식도 있다.
- 이는
- 윈도우 API는 CLSID_ApplicationActivationManager라는 CLSID로 시작하는 COM 클래스에 구현된
IApplicationActivationManager
라는 COM 인터페이스를 가진다.- 인터페이스 내의 한 메소드로
ActivateApplication
이 있다. - 이 메소드는
GetPackage-ApplicationIds
를 호출해 스토어 앱 전체 패키지 이름으로부터AppUserModelId
로 알려진 무엇인가를 구한 이후 스토어 앱을 시작하는 데 사용된다.
- 인터페이스 내의 한 메소드로
다른 종류의 프로세스 생성
- 네이티브 프로세스, 최소 프로세스, 피코 프로세스와 같이 윈도우 API를 우회해서 시작하는 추가적인 종류의 프로세스들은
NtCreateUserProcess
를 호출한다.- 이러한 프로세스의 생성은 커널 모드 호출자 용도만으로 예약된
NtCreateProcessEx
시스템 호출에 의해 제공된다. - 네이티브 프로세스는 윈도우 애플리케이션에서 실행될 수 없다.
CreateProcessInternal
함수는 네이티브 서브시스템 이미지 유형을 가진 파일을 거부하기 때문이다. - 이런 복잡함을 완화하기 위해 네이티브 라이브러리와 ntdll은
RtlCreateUserProcess
라는 보조 함수를 가진다.
- 이러한 프로세스의 생성은 커널 모드 호출자 용도만으로 예약된
- 피코 공급자는 최소 프로세스의 생성과 피코 공급자 컨텍스트를 초기화하는 것을 책임지는 보조 함수
PspCreatePicoProcess
를 호출한다.- 이 함수는 노출되어 있지 않으며, 피코 공급자의 특수한 인터페이스를 통해 피코 공급자만 이용 가능하다.
NtCreateProcessEx
와NtCreateUserProcess
는 작업 수행에 동일한 내부 루틴인PspAllocateProcess
와PspInsertProcess
가 사용된다.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.