맨위로가기

객체 관리자

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

객체 관리자는 윈도우 NT에서 프로세스에 할당된 자원을 추적하고 관리하는 핵심 구성 요소이다. 모든 자원은 객체로 표현되며, 객체는 논리적 네임스페이스에 속하고 타입을 갖는다. 객체 관리자는 참조 횟수 계산 방식을 통해 객체의 사용 현황과 소유자 정보를 유지하며, 프로세스들의 자원 할당 상태를 변경하는 모든 시스템 호출은 객체 관리자를 거쳐야 한다. 객체는 커널 객체 또는 Executive 객체일 수 있으며, Executive 객체는 하나 이상의 커널 객체를 캡슐화하여 커널 외부에서 실행되는 응용 프로그램과 서비스에 자원 및 확장된 서비스를 제공한다. 객체가 생성되거나 열릴 때 핸들이 생성되며, 객체 관리자는 이름과 핸들을 통해 객체들의 색인을 만든다. 윈도우 NT에서 노출되는 Executive 객체 타입에는 프로세스, 스레드, 파일 등이 있다. 각 객체는 헤더와 바디를 가지며, 헤더는 상태 정보를, 바디는 객체 특유의 데이터와 서비스를 담는다. 객체는 `Object name`과 `Object directories`를 통해 관리되며, 네임스페이스에 포함되어 각 사용자 세션에 따라 다르게 관리된다.

더 읽어볼만한 페이지

  • 윈도우 NT 아키텍처 - WoW64
    WoW64는 64비트 윈도우에서 32비트 응용 프로그램을 실행하기 위한 호환성 계층으로, 32비트 코드를 변환하고 시스템 자원을 관리하며 파일 시스템 리디렉션을 제공하지만, 완벽한 호환성을 보장하지 않고 성능 오버헤드 및 API 관련 문제점을 가질 수 있다.
  • 윈도우 NT 아키텍처 - 로컬 보안 인증 하위 시스템 서비스
  • 윈도우 구성 요소 - 인터넷 익스플로러
    마이크로소프트가 개발한 웹 브라우저인 인터넷 익스플로러는 윈도우 운영 체제와의 통합으로 높은 시장 점유율을 유지했으나, 웹 표준 문제와 보안 취약점으로 비판받으며 2015년 엣지에 자리를 내주고 2022년 지원이 종료되었지만, 엣지의 IE 모드로 레거시 호환성을 유지하고 있다.
  • 윈도우 구성 요소 - 원격 데스크톱 서비스
    원격 데스크톱 서비스(RDS)는 네트워크를 통해 원격으로 컴퓨터의 데스크톱 환경에 접근할 수 있게 해주는 기술이며, 클라이언트 소프트웨어, 서버 구성 요소, 다양한 역할을 수행하는 구성 요소로 구성된다.
객체 관리자
개요
종류마이크로커널 아키텍처 컴포넌트
운영 체제Windows NT 기반 운영 체제 (Windows 2000, Windows XP, Windows Server 2003, Windows Vista, Windows Server 2008, Windows 7, Windows 8, Windows 10, Windows 11)
역할시스템 자원 (파일, 디렉터리, 레지스트리 키, 이벤트 등)의 생성, 관리, 접근 제어
프로세스 간 통신 메커니즘 제공
설계 방식계층적 구조, 객체 기반
핵심 기능객체 생성 및 삭제
객체 이름 관리 (namespace)
객체 접근 권한 관리
객체 공유 및 보호
역사
개발 시작1980년대 후반, Windows NT 개발 프로젝트의 일부
최초 공개1993년, Windows NT 3.1
주요 변경 사항Windows NT 4.0: 성능 개선, GUI 통합
Windows 2000: Active Directory 통합, 보안 강화
Windows XP: 사용자 인터페이스 개선, 안정성 향상
Windows Vista: 보안 모델 변경 (UAC), 커널 구조 변경
Windows 7: 성능 최적화, 전원 관리 개선
Windows 8: Metro 스타일 UI 도입, Windows Store 추가
Windows 10: 유니버설 앱 플랫폼, 코타나 통합
Windows 11: 새로운 UI 디자인, 안드로이드 앱 지원
아키텍처
구조계층적 네임스페이스 (Object Namespace)
객체 핸들 (Object Handle)
객체 속성 (Object Attributes)
접근 제어 리스트 (ACL)
주요 구성 요소Object Manager 루틴: 객체 생성, 삭제, 이름 관리 등을 담당
Object Namespace: 객체 이름과 실제 객체 간의 매핑 관리
Object Handle Table: 프로세스별로 열려 있는 객체 핸들 관리
동작 방식프로세스가 객체에 접근하려면 먼저 Object Manager를 통해 객체 핸들을 얻어야 함
Object Manager는 객체 접근 권한을 확인하고, 핸들을 통해 객체에 대한 접근을 허용
모든 시스템 자원은 Object Manager를 통해 관리되므로, 보안 및 안정성 유지에 중요한 역할
기능
객체 관리객체 생성 (Create): 시스템 자원 생성
객체 삭제 (Delete): 더 이상 필요 없는 자원 해제
객체 이름 관리 (Name Management): 객체를 식별하고 접근하기 위한 이름 부여
보안접근 제어 (Access Control): 객체에 대한 접근 권한 설정 및 검사
권한 관리 (Privilege Management): 시스템 자원에 대한 접근 권한 관리
보안 감사 (Security Auditing): 보안 이벤트 로깅 및 감사
프로세스 간 통신 (IPC)명명된 파이프 (Named Pipes): 프로세스 간 데이터 통신을 위한 통로 제공
공유 메모리 (Shared Memory): 여러 프로세스가 공유하는 메모리 영역 제공
이벤트 (Events): 프로세스 간 신호 전달 메커니즘 제공
활용
주요 사용 사례파일 시스템: 파일 및 디렉터리 관리
레지스트리: 시스템 설정 및 구성 정보 관리
프로세스 및 스레드: 프로세스 및 스레드 생성, 관리, 스케줄링
장치 드라이버: 하드웨어 장치 관리 및 제어
APINtCreateFile: 파일 생성 또는 열기
NtOpenFile: 기존 파일 열기
NtDeleteFile: 파일 삭제
NtCreateKey: 레지스트리 키 생성
NtOpenKey: 레지스트리 키 열기
NtDeleteKey: 레지스트리 키 삭제
기타
장점중앙 집중식 자원 관리: 시스템 자원을 효율적으로 관리하고 추적
보안 강화: 객체에 대한 접근 권한을 엄격하게 제어하여 보안 강화
안정성 향상: 시스템 자원 관리의 일관성을 유지하여 시스템 안정성 향상
단점복잡성: 구현 및 유지 관리가 복잡할 수 있음
성능 오버헤드: 객체 관리에 따른 성능 오버헤드 발생 가능성
학습 곡선: 개발자가 Object Manager의 작동 방식을 이해하는 데 시간이 걸릴 수 있음
참고 자료
관련 자료Windows Object Manager - Windows drivers
Undocumented Windows NT Kernel - Object
ReactOS Wiki - Object Manager

2. 아키텍처

객체 관리자는 윈도우 NT에서 프로세스에 할당된 자원을 추적하고 관리하는 핵심 구성 요소이다. 모든 종류의 자원을 관리할 수 있으며, 자원은 객체로 표현된다. 객체는 논리적 네임스페이스(Namespace)에 속하며, 타입을 가진다. 객체 관리자는 참조 횟수 계산 방식을 통해 객체의 사용 현황과 소유자 정보를 유지한다. 프로세스들에 대한 자원 할당 상태를 변경하는 모든 시스템 호출은 객체 관리자를 거쳐야 한다.

객체는 커널 객체 또는 Executive 객체일 수 있다. 커널 객체는 OS 서비스를 구현하는 기본형의 자원을 표현하며, 사용자 모드 코드에 노출되지 않는다. 응용 프로그램과 서비스들은 윈도우 NT 아키텍처를 통해 노출된 Executive 객체를 이용해 커널 외부에서 실행된다. Executive 객체는 하나 이상의 커널 객체를 캡슐화하고, 커널과 관련된 자원 및 확장된 서비스 집합을 노출한다.

객체가 생성되거나 열릴 때, 핸들이라는 인스턴스에 대한 참조가 생성된다. 객체 관리자는 이름과 핸들을 통해 객체들의 색인을 만든다. 핸들을 통한 참조가 더 빠르다. 핸들은 프로세스들에 의해 관련되며 프로세스들 사이에 넘겨질 수 있다. 프로세스는 객체를 사용하기 전에 꼭 핸들을 소유하고 있어야 하며, 생성 과정 동안 기본 객체들의 핸들을 얻게 된다. 파일 핸들이나 이벤트 핸들 같이 다른 타입의 핸들이 존재하지만, 객체 관리자는 핸들 종류 구별만 도와주어 다양한 객체 타입 처리의 일관성을 유지한다. 핸들 생성과 분해는 오직 객체 관리자에 의해서만 중재되므로, 어떤 자원도 간과되지 않는다.

윈도우 NT에 의해 노출되는 Executive 객체 타입은 다음과 같다:

프로세스가상 주소 공간과 제어 정보와 함께 실행 가능한 스레드들의 모음.
스레드프로세스 안에 있는, 실행 코드를 포함하는 개체.
프로세스들의 모음.
파일오픈된 파일 또는 I/O 장치.
파일 매핑 객체파일로 매핑된 메모리 영역.
접근 토큰객체에 대한 접근 권한.
이벤트몇몇 정보를 캡슐화한 객체로서, 프로세스들에게 무언가를 알리기 위해 사용된다.
세마포어/상호 배제 (Mutex)다른 자원들에 대한 접근을 직렬화하는 객체.
타이머프로세스에게 고정된 간격을 알리는 객체.
A 레지스트리 키.
데스크톱GUI 요소들을 포함하기 위한 논리적인 디스플레이 표면.
클립보드다른 객체들을 위한 임시적인 저장소.
윈도우 스테이션데스크톱 객체 집합을 포함하는 객체로서, 하나는 클립보드이고 다른 하나는 사용자 객체들이다.
심볼릭 링크다른 객체들에 대한 참조로서 이것을 통해 참조된 객체가 사용될 수 있다.


2. 1. 객체 관리자의 역할

객체 관리자는 윈도우 NT에서 프로세스에 할당된 자원을 추적하고 관리하는 핵심 구성 요소이다. 모든 종류의 자원을 관리할 수 있으며, 자원은 객체로 표현된다. 객체는 논리적 네임스페이스(Namespace)에 속하며, 타입을 가진다. 객체 관리자는 참조 횟수 계산 방식을 통해 객체의 사용 현황과 소유자 정보를 유지한다. 프로세스들에 대한 자원 할당 상태를 변경하는 모든 시스템 호출은 객체 관리자를 거쳐야 한다.

객체는 커널 객체 또는 Executive 객체일 수 있다. 커널 객체는 OS 서비스를 구현하는 기본형의 자원을 표현하며, 사용자 모드 코드에 노출되지 않는다. 응용 프로그램과 서비스들은 윈도우 NT 아키텍처를 통해 노출된 Executive 객체를 이용해 커널 외부에서 실행된다. Executive 객체는 하나 이상의 커널 객체를 캡슐화하고, 커널과 관련된 자원 및 확장된 서비스 집합을 노출한다.

객체가 생성되거나 열릴 때, 핸들이라는 인스턴스에 대한 참조가 생성된다. 객체 관리자는 이름과 핸들을 통해 객체들의 색인을 만든다. 핸들을 통한 참조가 더 빠르다. 핸들은 프로세스들에 의해 관련되며 프로세스들 사이에 넘겨질 수 있다. 프로세스는 객체를 사용하기 전에 꼭 핸들을 소유하고 있어야 하며, 생성 과정 동안 기본 객체들의 핸들을 얻게 된다. 파일 핸들이나 이벤트 핸들 같이 다른 타입의 핸들이 존재하지만, 객체 관리자는 핸들 종류 구별만 도와주어 다양한 객체 타입 처리의 일관성을 유지한다. 핸들 생성과 분해는 오직 객체 관리자에 의해서만 중재되므로, 어떤 자원도 간과되지 않는다.

윈도우 NT에 의해 노출되는 Executive 객체 타입은 다음과 같다:

프로세스가상 주소 공간과 제어 정보와 함께 실행 가능한 스레드들의 모음.
스레드프로세스 안에 있는, 실행 코드를 포함하는 개체.
프로세스들의 모음.
파일오픈된 파일 또는 I/O 장치.
파일 매핑 객체파일로 매핑된 메모리 영역.
접근 토큰객체에 대한 접근 권한.
이벤트몇몇 정보를 캡슐화한 객체로서, 프로세스들에게 무언가를 알리기 위해 사용된다.
세마포어/상호 배제 (Mutex)다른 자원들에 대한 접근을 직렬화하는 객체.
타이머프로세스에게 고정된 간격을 알리는 객체.
A 레지스트리 키.
데스크톱GUI 요소들을 포함하기 위한 논리적인 디스플레이 표면.
클립보드다른 객체들을 위한 임시적인 저장소.
윈도우 스테이션데스크톱 객체 집합을 포함하는 객체로서, 하나는 클립보드이고 다른 하나는 사용자 객체들이다.
심볼릭 링크다른 객체들에 대한 참조로서 이것을 통해 참조된 객체가 사용될 수 있다.


2. 2. 객체의 종류

2. 3. Executive 객체 타입

2. 4. 객체 구조

객체 관리자에 의해 관리되는 각 객체는 헤더와 바디를 가진다. 헤더는 객체 관리자가 사용하는 상태 정보를 가지며, 바디는 객체 특유의 데이터와 노출하는 서비스에 대한 정보를 가진다. 객체 헤더는 `Properties`로 노출되는 특정한 데이터를 가지는데, `Object Name`은 객체를 구별하고, `Object Directory`는 객체가 속한 카테고리, `Security Descriptors`는 객체 접근 권한, `Quota Charges`는 자원 사용 정보, `Open handle count`는 열려있는 핸들 수, `Open handle list`는 객체에 대한 유효한 참조를 가진 프로세스 목록, `Reference count`는 객체 참조 수, `Type`은 객체 바디 구조를 식별하는 객체 등이다.

`Type` 객체는 객체 타입에 대한 유일하고 객체가 제공하는 서비스를 구현하는 정적인 메소드 속성을 포함한다. 객체 관리자에 의해 관리되는 객체들은 `Close`(객체 핸들 닫기), `Duplicate`(객체 공유 접근을 위한 핸들 생성), `Query object`(속성 및 요소 정보 획득), `Query security`(보안 디스크립터 획득), `Set security`(보안 접근 변경), `Wait`(객체 동기화)와 같은 미리 정의된 서비스들을 제공해야 한다. Type 객체는 타입 이름, 접근 권한, 동기화 정보 등 특정한 공통 속성을 가지며, 같은 타입의 모든 인스턴스들은 같은 Type 객체를 공유하고, type 객체는 한 번만 구현된다.

`Object name`은 색인을 지원하고 객체에게 기술적인 구별을 부여하기 위해 사용된다. 객체 관리자는 이미 부여된 이름 목록을 유지하는데, 대부분의 객체 접근이 핸들을 통해 이루어지기 때문에 항상 이름 검색이 필요한 것은 아니다. 색인은 객체가 생성되거나 프로세스가 이름으로 참조할 때 수행된다. `Object directories`는 타입별 범주화를 위해 사용된다. 미리 정의된 디렉토리로는 `\??`(장치 이름), `\BaseNamedObjects`(뮤텍스, 이벤트, 세마포어, waitable timers, 섹션 객체), `\Callback`(콜백 함수), `\Device`, `\Drivers`, `\FileSystem`, `\KnownDlls`, `\Nls`(language tables), `\ObjectTypes`(타입 객체), `\RPC Controls`(RPC 포트), `\Security`(보안 서브시스템 객체), `\Window`(윈도윙 서브시스템 객체) 등이 있다. 객체는 ''Namespace''에도 포함되며, 각 사용자 세션에는 다른 Namespace가 할당된다. 모든 세션 간 공유되는 객체는 `GLOBAL` Namespace에, session-specific 객체는 특정 세션 Namespace에 존재한다.

OBJECT_ATTRIBUTES 구조체의 속성 멤버는 0 또는 OBJ_INHERIT, OBJ_PERMANANT, OBJ_EXCLUSIVE, OBJ_CASE_INSENSITIVE, OBJ_OPENIF, OBJ_OPENLINK, OBJ_KERNEL_HANDLE 플래그들의 조합이 될 수 있다.

2. 5. Type 객체

Type 객체는 객체의 타입에 대한 유일한 정보를 포함하며, 객체에 의해 제공되는 서비스를 구현하는 정적인 메소드(static method) 속성들을 가진다. 객체 관리자에 의해 관리되는 모든 객체는 미리 정의된 서비스들을 제공해야 한다. 이러한 서비스에는 Close (객체에 대한 핸들을 닫음), Duplicate (다른 프로세스가 해당 객체에 대해 공유 접근을 할 수 있도록 하는 또 다른 객체에 대한 핸들 생성), Query object (속성들과 요소들에 관한 정보를 모음), Query security (객체의 security descriptor를 얻음), Set security (보안 접근을 변경), Wait (특정한 이벤트를 통해 하나 이상의 객체들을 동기화)가 있다.

Type 객체는 타입 이름, 접근 권한, 동기화 정보 등 특정한 공통된 속성들을 가진다. 같은 타입의 모든 인스턴스들은 같은 Type 객체를 공유하며, Type 객체는 오직 한 번만 구현된다.

객체 관리자에 의해 관리되는 각 객체는 헤더와 바디를 가진다. 헤더는 객체 관리자에 의해 사용되는 상태 정보를 가지며, 바디는 객체에 특정한(object-specific) 데이터와 노출하는 서비스들에 대한 정보를 가진다. 객체 헤더는 `Properties`로 노출되는 특정 데이터를 가지는데, `Object Name`(객체를 구별), `Object Directory`(객체가 속한 카테고리), `Security Descriptors`(객체에 대한 접근 권한), `Quota Charges`(객체를 위한 자원 사용 정보), `Open handle count`(열려있는 핸들의 수), `Open handle list`(객체에 대한 유효한 참조를 가진 프로세스들의 목록), `Reference count`(객체에 대한 유효한 참조의 수), `Type`(객체 바디의 구조를 식별하는 객체) 등이 있다.

`Object name`은 객체에게 기술적인 구별을 주기 위해 사용되며, 객체 관리자는 이미 객체에게 부여된 이름들의 목록을 유지한다. 대부분의 객체 접근이 핸들을 통해 이루어지기 때문에 객체 참조를 위해 이름을 찾는 것이 항상 필요한 것은 아니다. 색인은 오직 객체가 생성되거나 프로세스가 이름으로 참조할 경우에 수행된다.

`Object directories`는 타입 별로 범주화하기 위해 사용된다. 미리 정의된 디렉토리로는 `\??` (장치 이름), `\BaseNamedObjects` (뮤텍스, 이벤트, 세마포어, waitable timers, 섹션 객체들), `\Callback` (콜백 함수들), `\Device`, `\Drivers`, `\FileSystem`, `\KnownDlls`, `\Nls` (language tables), `\ObjectTypes` (타입 객체들), `\RPC Controls` (RPC 포트들), `\Security` (보안 서브시스템 객체들), `\Window` (윈도윙 서브시스템 객체들)이 있다.

객체들은 또한 ''Namespace''에 포함된다. 각 유저 세션에는 다른 Namespace가 배정된다. 모든 세션들 사이에 공유되는 객체들은 ''GLOBAL'' Namespace, 그리고 session-specific 객체들은 특정한 세션 Namespace에 존재한다.

2. 6. 객체 네임스페이스(Namespace)

객체 관리자에 의해 관리되는 각 객체는 헤더와 바디를 가진다. 헤더는 객체 관리자가 사용하는 상태 정보를 가지며, 바디는 객체 특화 데이터와 제공되는 서비스에 대한 정보를 포함한다. 객체 헤더는 `Object Name`, `Object Directory`, `Security Descriptors`, `Quota Charges`, `Open handle count`, `Open handle list`, `Reference count`, `Type` 등의 `Properties`를 가진다.

`Type` 객체는 객체 타입에 대한 고유 정보와 객체가 제공하는 서비스를 구현하는 정적 메소드 속성을 포함한다. 객체 관리자에 의해 관리되는 객체들은 `Close`, `Duplicate`, `Query object`, `Query security`, `Set security`, `Wait`와 같은 미리 정의된 서비스들을 제공해야 한다. 같은 타입의 모든 인스턴스들은 같은 `Type` 객체를 공유하며, `Type` 객체는 한 번만 구현된다.

`Object name`은 객체를 구별하기 위해 사용되며, 객체 관리자는 이미 부여된 이름들의 목록을 유지한다. 대부분의 객체 접근은 핸들을 통해 이루어지기 때문에, 이름으로 객체 참조를 찾는 것은 객체 생성 시 또는 프로세스가 이름으로 참조할 때만 수행된다. `Object directories`는 객체를 타입별로 분류하는 데 사용된다.

객체들은 Namespace에 포함되어 관리된다. 각 사용자 세션에는 다른 Namespace가 할당된다. 모든 세션 간에 공유되는 객체는 GLOBAL Namespace에, 세션 특정 객체는 특정 세션 Namespace에 존재한다.

미리 정의된 디렉터리는 다음과 같다:

  • `\??` (장치 이름)
  • `\BaseNamedObjects` (뮤텍스, 이벤트, 세마포어, waitable timers, 섹션 객체들)
  • `\Callback` (콜백 함수들)
  • `\Device`
  • `\Drivers`
  • `\FileSystem`
  • `\KnownDlls`
  • `\Nls` (language tables)
  • `\ObjectTypes` (타입 객체들)
  • `\RPC Controls` (RPC 포트들)
  • `\Security` (보안 서브시스템 객체들)
  • `\Window` (윈도윙 서브시스템 객체들)

2. 7. OBJECT_ATTRIBUTES 구조



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com