객체구조 – 객체 헤더와 본체
- Windows Server 2008
객체는 객체 헤더와 객체 본체를 가진다. 객체 관리자는 객체 헤더를 제어하고 객체를 소유하는 익스큐티브 구성요소는 자신들이 생성하는 객체 유형의 객체 본체를 제어한다. 각 객체 헤더는 객체의 각 인스턴스에 공통적인 정보를 포함하는 형식객체로 불리는 특별한 객체를 가리킨다. 그리고 옵션으로 4개까지의 서브헤더(이름 정보 헤더, 쿼터 정보 헤더, 핸들정보 헤더, 생성자 정보헤더)가 존재 한다.
객체 관리자는 객체의 유형에 관계 없이 객체를 관리하기 위해 객체 헤더에 저장된 데이터를 사용한다. 다음 표는 객체 헤더 필드 이다.
필드 | 목적 |
핸들 카운트 | 객체에 대한 현재 오픈 되어 있는 핸들의 수를 관리한다. |
포인터 카운트 | 각 핸들에 대해 하나의 참조를 포함해 객체에 대한 참조 횟수를 관리한다. 커널 모드 구성 요소는 핸들을 사용하지 않고 포인터로서 객체를 참조할 수 있다. |
보안 디스크립터 | 누가 객체를 사용할 수 있는지와 무엇을 사용할 수 있는지를 결정한다. 정의에 의해 이름이 없는 객체는 보안성을 갖지 않는다. |
객체 유형 | 이 유형의 객체에 공통적인 속성을 포함하는 형식 객체를 가리킨다 |
서브헤더 오프셋 | 서브헤더 구조체에 대한 음수 오프셋, 생성자 정보는 예외. 생성자 정보 서브헤더는 존재하는 경우에 항상 객체 헤더보다 앞에 위치한다. |
플래그 | 객체의 특성과 객체 속성. |
객체 서브헤더는 객체의 특정 부분에 관한 옵션 정보를 포함한다. 이들 구조체는 객체 헤더의 상단에서부터 여러 오프셋에 위치하며 오프셋의 값은 객체 헤더 내에 저장되어 있다. 이때 생성자 정보의 경우는 예외이다. 이들 오프셋 중에 어떤 값이 0이라면 객체 관리자는 이 오프셋과 관련된 서브헤더가 없다고 가정한다. 생성자 정보의 경우 객체 헤더 플래그 내의 값은 서브헤더가 존재하는지를 결정한다.
이름 | 목적 | 위치 |
이름 정보 | 객체 이름과 객체 디렉터리에 대한 포인터를 포함한다. | 객체 헤더 – NameInfoOffset |
쿼터 정보 | 프로세스가 객체에 대한 핸들을 오픈 할 때 프로세스에 할당한 자원양을 나열한다. | 객체헤더 – QuotaInfoOffset |
핸들 정보 | 객체에 대한 오픈 핸들을 갖는 프로세스 엔트리들에 대한 데이터베이스를 포함한다. | 객체헤더 - HandleInfoOffset |
생성자 정보 | 객체를 같은 유형의 모든 객체 리스트에 연결하며 객체를 생성한 프로세스를 백트레이스와 함께 기록한다. | 객체 헤더 – 생성자 정보 구조체의 크기 |
쿼터 정보 서브헤더는 객체가 배타적인 객체 플래그로 생성되었다면 이 객체를 접근할 수 있는 배타적인 프로세스에 대한 포인터도 포함할 수 있다. 이 서브헤더는 프로세스에 할당된 쿼터 정보를 포함할 필요는 없다.
각 서브헤더는 옵션이며 특정 조건에서만 존재 한다. 다음의 조건에 대해서 알아보자.
이름 | 조건 |
이름 정보 | 객체가 이름을 가지고 생성되어야 한다 |
쿼터 정보 | 객체는 객체 유형 생성 동안에 구성되는 디폴트값과는 다른 메모리 사용 값을 가져야 한다. 또는 2KB 이상의 보안 디스크립터를 가져야 하며 초기 시스템 프로세스가 아니어야 한다. 또는 배타적인 객체 플래그로써 생성되어야 한다. |
핸들 정보 | 객체 유형에 핸들 카운트 유지 플래그가 활성화 되어 있어야 한다. 파일 객체와 WindowStation 객체, Desktop 객체는 객체 유형 구조체에 이 플래그가 설정되어 있다. |
생성자 정보 | 객체 유형에 유형 목록 유지 플래그가 활성화 되어 있어야 한다. LPC 포트 객체와 드라이버 객체는 이 플래그가 설정되어 있다. 하지만 객체 유형 목록 유지 전역 플래그를 활성화 한다는 것은 모든 객체에 대해 이 플래그를 활성화하는 것이다. |
객체 관리자는 새로운 객체가 생성될 때마다 객체 속성으로 불리는 구조체를 통해 마지막 생성 시점이나 특정 동작에 대한 플래그를 전달 받는다. 이 구조체는 객체 이름과 객체가 위치할 루트 객체 디렉터리, 객체의 보안 디스크립터, 객체 속성 플래그를 정의한다.
속성 플래그 | 헤더 플래그 | 용도 |
OBJ_INHERIT | 핸들 테이블 엔트리에 저장 | 객체에 대한 핸들이 자식 프로세스로 상속될지와 프로세스가 복사본을 만드는 데 DuplicateHandle을 사용할 수 있는지를 결정 한다. |
OBJ_PERMANENT | OB_FLAG_PERMANENT_OBJECT | 참조 카운트와 관계된 객체 유지 동작을 정의 |
OBJ_EXCLUSIVE | OB_FLAG_EXCLUSIVE_OBJECT | 객체는 자신을 생성한 프로세스에 의해서만 사용될 수 있다는 점을 명시 |
OBJ_CASE_INSENSITIVE | 핸들 테이블 엔트리에 저장 | 이름 공간에서 이 객체를 찾을 때 대소문자 구별이 됨을 명시. 객체 유형 플래그인 대소문자 구분안함에 의해 오버라이드 될 수 있다. |
OBJ_OPENIF | 저장 안됨. 실행 시에 사용 | 이 객체 이름에 대한 생성 동작은 객체가 존재하면 오픈이 되며 존재하지 않는다면 실패됨을 나타낸다. |
OBJ_OPENLINK | 저장 안됨. 실행 시에 사용 | 객체 관리자는 대상(target)이 아닌 심볼릭 링크에 대한 핸들을 오픈해야 함을 명시 한다 |
OBJ_KERNEL_HANDLE | OB_FLAG_KERNEL_OBJECT | 이 객체에 대한 핸들은 대상(target)이 아닌 커널핸들 심볼릭 링크이어야 함을 명시한다. |
OBJ_FORCE_ACCESS_CHECK | 저장 안됨. 실행 시에 사용 | 객체가 커널모드에서 오픈된다고 할지라도 완전한 접근 검사가 이루어저야 함을 나태난다. |
OBJ_KERNEL_EXCLUSIVE | 객체 이름 서브헤더 내의 QueryReferences에 저장 되어 있다. | 유저모드 프로세스의 객체 핸들 오픈을 하지 못하게 한다. /Device/PhysicalMemory 섹션 객체를 보호하는 데 사용한다. |
N/A | OB_FLAG_CREATOR_INFO | 객체 헤더의 최상단 부분에 객체 생성자 정보 서브헤더가 있음을 나타낸다. |
N/A | OB_FLAG_DEFAULT_SECURITY_QUOTA | 객체 보안 디스크립터가 디폴트 2KB 쿼터를 사용하고 있음을 나타낸다 |
N/A | OB_FLAG_SINGLE_HALDLE_ENTRY | 핸들 정보 서브헤더가 한 엔트리만을 포함하며 데이터베이스는 포함하지 않음을 나타낸다 |
N/A | OB_FLAG_NEW_OBJECT | 객체가 생성되었지만 객체 이름 공간에 아직 넣어지지 않았음을 나타낸다 |
N/A | OB_FLAG_DEFER_DELETE | 객체가 지연된 삭제 작업자 스레드를 통해 삭제 중임을 나타낸다. |
각 객체는 객체 헤더와 더불어 형식과 내용이 객체 유형에 따라 고유한 객체 본체를 가진다. 동일한 유형의 모든 객체는 동일한 객체 본체 형식을 공유한다. 익스큐티브 구성 요소는 객체 유형을 생성하고 이에 대한 서비스를 제공함으로써 이 유형의 모든 객체 본체에 있는 데이터 조작을 제어할 수 있다.
객체 헤더는 정적이고 잘 알려진 크기를 가지므로 객체 관리자는 객체의 포인터에서 헤더 크기를 뺌으로써 객체의 객체 헤더를 쉽게 찾을 수 있다. 객체 관리자는 서브헤더에 접근하기 위해 객체 헤더의 포인터에서 추가적인 값을 한번 더 뺀다.
표준화된 객체 헤더와 서브헤더 덕택에 객체 관리자는 어떤 객체 헤더에 저장되어 있는 속성이라도 조작할 수 있고 어떤 유형의 객체에도 사용 될 수 있는 소수의 범용 서비스를 제공하면 된다. 이런 범용 객체 서비스가 모든 객체 유형에 지원될지라도 각 객체는 자신만의 생성과 열기, 쿼리 서비스를 가진다.
다음 표는 범용 객체 서비스이다.
서비스 | 용도 |
Close | 객체의 핸들을 닫는다 |
Duplicate | 핸들을 복사해 그 핸들을 다른 프로세스에 줌으로써 객체를 공유한다 |
Query object | 객체의 표준 속성 정보를 구한다 |
Query security | 객체의 보안 디스크립터를 구한다 |
Set security | 객체의 보호 설정을 변경한다 |
Wait for a single object | 한 객체를 사용해 스레드의 실행을 동기화 한다 |
Wait for multiple objects | 여러 객체를 사용해 스레드의 실행을 동기화 한다. |
[참고자료]
Windows Internals
'Windows , IIS' 카테고리의 다른 글
객체구조 – 객체 메소드 (0) | 2015.07.16 |
---|---|
객체구조 – 형식 객체 (0) | 2015.07.16 |
익스큐티브 객체 (0) | 2015.07.16 |
커널모드 시스템 디스패칭과 서비스 디스크립터 테이블 (0) | 2015.07.16 |
32비트, 64비트 시스템 서비스 디스패칭 (0) | 2015.07.16 |