3. 1. 커널 오브젝트란 무엇인가?
• 커널(Kernal)
• 컴퓨터 과학에서 커널(kernel)은 컴퓨터 운영 체제의 핵심이 되는 컴퓨터
프로그램으로, 시스템의 모든 것을 완전히 통제한다. 운영 체제의 다른
부분 및 응용 프로그램 수행에 필요한 여러 가지 서비스를 제공한다.
• 커널 오브젝트(Kernel Object)
• 커널 오브젝트는 커널에 의해 할당된 간단한 메모리 블록이다.
• 이 메모리 블록은 커널에 의해서만 접근이 가능한 구조체로 구성되어
있으며, 커널 오브젝트에 대한 세부 정보들을 저장하고 있다.
• Windows 운영체제는 프로세스, 스레드 혹은 파일과 같은 리소스들을 관
리하기 위해 필요한 정보를 저장해야 한다. 이 때 데이터를 저장하는 메
모리 블록을 가리켜 커널 오브젝트라 한다.
4. • Windows에서 관리하는 리소스 특성을 변경하기 위해 커널 오브젝트를 조작
• 커널 오브젝트의 데이터 구조체는 커널에 의해서만 접근이 가능
• 일련의 함수 집합을 통해 커널 오브젝트의 내부 값에 접근
• 리소스를 관리하기 위한 커널 오브젝트를 생성하면 핸들 값을 반환
• 커널 오브젝트 핸들 값을 함수의 매개변수로 전달해 조작하고자 하는 커널 오브젝트 구분
• 커널 오브젝트의 핸들 값은 프로세스별 독립적으로 유지
애플리케이션 커널 오브젝트의 사용
5. • 모든 오브젝트 타입에 공통적으로 존재하는 값
• 사용카운트
• 보안 디스크립터
• 각 오브젝트 타입에 존재하는 값
• 프로세스 오브젝트
• 프로세스 ID
• 기본 우선순위
• 종료 코드 등
• 파일 오브젝트
• 바이트 오프셋
• 공유 모드
• 오픈 모드 등
커널 오브젝트
6. • 커널이 얼마나 많은 프로세스들이 해당 커널 오브젝트를 사용하고 있는지 확인하는 값
• 커널 오브젝트가 최초로 생성되면 1 로 설정
• 다른 프로세스가 이미 생성된 커널 오브젝트에 접근 권한을 획득하면 증가
• 프로세스가 종료되면 커널은 이 프로세스가 사용하고 있던 모든 커널 오브젝트의 사용 카운트를 감소
• 사용 카운트 값이 0 이 되면 커널 오브젝트는 삭제
• 커널 오브젝트를 생성한 프로세스가 종료되어도 커널 오브젝트는 남아있을 수 있다
• 커널 오브젝트를 사용하는 모든 프로세스가 종료될 때까지 삭제되지 않는다
사용 카운트
7. • 커널 오브젝트의 소유자 및 접근 권한/제한에 대한 정보
• 커널 오브젝트 생성시 SECURITY ATRIBUTES 구조체를 통해 전달
• 예) CreateFileMapping 함수
• SECURITY ATRIBUTES 구조체
보안 디스크립터
8. • 이미 존재하는 커널 오브젝트 이용할 땐 수행할 작업 전달
• 예) OpenFileMapping
• 첫 번째 매개변수로 FILE_MAP_READ를 전달, 이 커널 오브젝트를 이용하여 읽는 동작만을 수행할 것임을 나타
낸다
• OpenFileMapping 함수는 보안 권한을 먼저 확인해서 사용자가 이 파일-매핑 커널 오브젝트에 접근할 수 있는
권한이 있다면 유효한 핸들 값을 반환
• 보안 접근 플래그를 올바르게 사용하면 새로운 윈도우로의 포팅이 쉽다
• 윈도우 비스타에 새로 추가된 사용자 계정 컨트롤(UAC)과 같은 새로운 제약에 대응
보안 디스크립터
9. 2. 프로세스의 커널 오브젝트 핸들 테이블
• 커널 오브젝트 핸들 테이블
• 프로세스가 초기화되면 운영 체제는 프로세스를 위해 커널 오브젝트 핸들 테이블을 할당
• 데이터 구조체 배열: 커널 오브젝트에 대한 포인터, 액세스 마스크, 플래그로 구성된다
• 각각의 프로세스 별로 핸들이 독립적으로 유지
• 오직 커널 오브젝트를 위한 테이블
10. • 커널 오브젝트를 생성하는 함수를 호출하면 커널은 메모리 블록 할당 및 초기화
• 커널은 프로세스의 핸들 테이블을 확인해 비어있는 위치에 초기화 수행
• 포인터는 커널 오브젝트의 자료 구조를 가리키는 내부적인 메모리 주소로 할당
• 액세스 마스크는 “풀 액세스" 로 초기화
• 플래그는 “설정” 상태로 초기화
• 커널 오브젝트를 생성하는 함수는 프로세스별로 고유한 핸들 값을 반환
• 커널 오브젝트 핸들을 인자로 취하는 함수는, 핸들 값을 바탕으로 프로세스 핸들 테이블로부터 사용하고자 하
는 커널 오브젝트의 실제 주소를 획득
• 핸들 값은 프로세스별로 고유한 값
• 핸들 값을 4로 나누면 프로세스 핸들 테이블의 인텍스 값을 얻을 수 있다
커널 오브젝트 생성과 핸들 테이블
11. • CloseHandle 함수를 호출해 커널 오브젝트 삭제
• 핸들 값이 유효하고 시스템이 커널 오브젝트의 자료 구조를 획득하면, 사용 카운트 감소
• 사용 카운트 값이 0이 되면 커널 오브젝트를 파괴하고 메모리로부터 제거
커널 오브젝트 삭제
12. 3. 프로세스간 커널 오브젝트의 공유
• 다른 프로세스에서 각기 수행되는 스레드들 간에 커널 오브젝트를 공유해야 하는 경우
• 파일-매핑 오브젝트는 단일 머신에서 수행되는 두 프로세스 사이에서 데이터의 블록을 공유하도록 해 준다
• 메일슬롯과 명명 파이프를 이용하면 네트워크로 연결된 서로 다른 머신 사이에서 데이터를 주고받을 수 있다
• 뮤텍스, 세마포어, 이벤트는 서로 다른 프로세스에서 수행되는 스레드 간에 동기화를 수행할 수 있게 해 준다.
• 핸들이 프로세스별로 고유한 값인 이유: 안정성과 보안
• 프로세스들 간에 커널 오브젝트를 공유하는 3가지 방법
• 오브젝트 핸들의 상속을 이용하는 방법
• 명명된 오브젝트를 사용하는 방법
• 오브젝트 핸들의 복사를 이용하는 방법
13. • 페어런트 프로세스가 새로운 차일드 프로세스를 생성할 때 차일드 프로세스가 페어런트 프
로세스가 사용하고 있는 커널 오브젝트에 접근할 수 있도록 해 주는 방법
• 오브젝트를 공유하고자 하는 프로세스들이 페어런트-차일드 관계를 가질 때에만 사용
• 예) 뮤텍스 오브젝트를 생성하 고 상속 가능한 핸들을 얻어내는 코드
• 상속 가능한 핸들을 반환하도록 SECURITY ATTRIBUTES를 초기화
오브젝트 핸들의 상속을 이용하는 방법
14. • CreateProcess 함수의 blnhertHandles 매개변수로 TRUE를 전달하여 차일드 프로세스 생성
• 페어런트 프로세스의 핸들 테이블에서 상속 가능한 핸들을 차일드 프로세스의 핸들 태이블에 복사
• 이때 복사 위치는 페어런트 프로세스 핸들 테이블에서의 위치와 일치
• 특정 커널 오브젝트를 구분하는 핸들 값이 페어런트 프로세스와 차일드 프로세스에서 동일한 값
오브젝트 핸들의 상속을 이용하는 방법
15. • A프로레스에서 Create 함수의 pszName에 커널 오브젝트 이름 전달해서 오브젝트 생성
• B 프로세스에서 동일한 이름 전달해 Crate 함수 실행
• 동일 이름, 동일 타입 커널 오브젝트가 존재하는지 확인
• B 프로세스가 오브젝트에 대한 최대 접근 권한을 가지고 있는지 확인
• 확인 후 B 프로세스의 핸들 테이블에 비어 있는 항목을 추가하고 해당 커널 오브젝트를 가리키도록 설정
• B 프로세스는 A 프로세스의 차일드 프로세스일 필요는 없으며, 명명된 커널 오브젝트를 생
성할 때에는 상속 가능한 핸들을 생성할 필요가 없다.
명명된 오브젝트 사용
16. • DuplicateHandle 함수를 사용해 특정 프로세스 핸들 테이블 내의 항목을 다른 프로세스 핸들
테이블로 복사
• Target 프로세스는 새로운 커널 오브젝트에 접근 가능하게 되었다는 사실을 통보받지 못하므
로 프로세스간 통신 방법을 이용하여 T 프로세스에게 hObj 변수가 가지고 있는 핸들 값을 전
달해야한다
• 윈도우 메시지나 프로세스간 통신 메커니즘을 사용하면 된다.
오브젝트 핸들 복사