포스트

[프로세스와 잡] 프로세스 생성

[프로세스와 잡] 프로세스 생성
  • 윈도우 API는 프로세스 생성을 위한 여러 함수를 제공한다.
    • 프로세스를 생성하는 프로세스와 동일한 접근 토큰으로 프로세스의 생성을 시도하는 CreateProcess
    • 다른 토큰이 필요한 경우 사용하는 CreateProcessAsUser
    • 이외 CreateProcessWithToken, CreateProcessAsLogon
      • 프로세스 생성을 위해 원격 프로시저 호출(RPC)을 함으로써 2차 로그온 서비스(svchost.exe의 seclogon.dll)를 호출한다.
      • seclogon은 SlrCreateProcessWithLogon 함수에서 이 호출을 수행하며, 최종적으로 CreateProcessAsUser 함수를 호출한다.
  • 실행 경로
    • CreateProcess, CreateProcessAsUserCreateProcessInternalNtCreateUserProcess
    • CreateProcessWithLogon, CreateProcessWithTokenSlrCreateProcessWithLogonCreateProcessAsUser
    • 모든 실행 경로는 궁극적으로 CreateProcessInternal 함수에 이르게 된다.
    • CreateProcessInternal은 커널 모드로 전환해 NtCreateUserProcess를 호출한다.

CreateProcess 함수 인자

  • 유저 모드에서 생성된 프로세스는 하나의 스레드를 가지며, 실행 파일의 메인 함수를 실행한다.
  • CreateProcess 함수의 중요 인자
    • CreateProcessAsUserCreateProcessWithToken의 경우 토큰 핸들이 필요하다.
    • 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를 호출한다.
    • 이 함수는 노출되어 있지 않으며, 피코 공급자의 특수한 인터페이스를 통해 피코 공급자만 이용 가능하다.
  • NtCreateProcessExNtCreateUserProcess는 작업 수행에 동일한 내부 루틴인 PspAllocateProcessPspInsertProcess가 사용된다.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.