Upload
steve-hansol-kim
View
1.111
Download
1
Embed Size (px)
Citation preview
커널 오브젝트를 알기 전에 ..
커널 ?
네이버 백과사전에 의하면…
네이버 백과사전에 의하면…
즉 , 커널 오브젝트를 관리하는 운영체제의 핵심요소
커널 오브젝트 ?
프로세스 오브젝트스레드 오브젝트잡 오브젝트IOCP 오브젝트세마포어 오브젝트뮤텍스 오브젝트
…… ETC
커널 오브젝트 ?
• 자원을 사용하기 위해 커널에 의해 할당된 간단한 메모리 블럭 .
• 메모리 블록에는 커널 오브젝트에 대한 세부정보 포함 .
• 커널에 의해서만 접근이 가능한 구조체로 구성 .
• 커널 오브젝트의 소유자는 프로세스가 아닌 커널 .
자원커널애플리케이션
자원 1
자원 2
자원 3
…
…커널
오브젝트 1
커널오브젝트 2
커널오브젝트 3
…
…핸들 1
핸들 2
핸들 3
…
…
사용 카운트
보안 디스크립터
타입에 따른 고유의 정보
커널 오브젝트
사용 카운트
보안 디스크립터
타입에 따른 고유의 정보
커널 오브젝트• 레퍼런스 카운트와 비슷 • 커널 오브젝트가 생성되거나 다른 프로세스가 접근 권한을 획득하면 1 증가 .
• CloseHandle() 함수를 이용하거나 프로세스가 종료 되면 1 감소
• 이거시 0 이 되면 커널 오브젝트 삭제 !!
사용 카운트
보안 디스크립터
타입에 따른 고유의 정보
커널 오브젝트
• 커널 오브젝트의 소유자 , 접근권한 / 제한 정보 .
• 주로 서버 개발에 사용 . Private Namespace 추가로 클라이언트 사용 .........?
Create* 함수 매개변수
보안 주의 사항
• 보안 접근 플래그를 간과하지 말 것 .
올바른 플래그 사용하면 다른 윈도우 버전으로 포팅이 쉬워짐 .
EX) 사용자 계정 컨트롤 (UAC)
커널 오브젝트 핸들 테이블 ?
• 프로세스가 초기화 되면 커널 오브젝트 핸들 테이블 할당 . ( 데이터 구조체 배열 )
• 프로세스 별로 핸들이 독립적으로 유지 . • 유저오브젝트나 GDI 오브젝트 는 사용되지 않는 Only 커널 오브젝트를 위한 테이블 .
• MS 는 핸들 테이블 구조와 관리방법등을 문서화 X
인덱스
커널 오브젝트 메모리 포인터
액세스 마스크
플래그
1 0x00000000 0x???????? 0x????????
2 0x00000000 0x???????? 0x????????
… … … ..Create 호출
커널 오브젝트 할당 또는 기존 오브젝트 반환(0xF0000001)
인덱스
커널 오브젝트 메모리 포인터
액세스 마스크
플래그
1 0xF0000001 0x???????? 0x00000000
2 0x00000000 0x???????? 0x????????
… … … ..
커널 오브젝트 생성
테이블에 등록된
핸들반환
사용 카운트 + 1
커널 오브젝트 생성
• Create 함수로 반환되는 핸들을 (/ 4) 나 (>>2) 하면 커널 오브젝트 테이블의 인덱스를 얻을 수 있음 .
• 대부분의 Create 함수 실패 -> return NULL; CreateFile 같은 함수 실패 -> INVALID_HANDLE_VALUE; 주의 요망 .
인덱스
커널 오브젝트 메모리 포인터
액세스 마스크
플래그
1 0xF0000001 0x???????? 0x00000000
2 0x00000000 0x???????? 0x????????
… … … ..CloseHandle()
사용 카운트가 0 이면 삭제 .(0xF0000001)
인덱스
커널 오브젝트 메모리 포인터
액세스 마스크
플래그
1 0x00000000 0x???????? 0x????????
2 0x00000000 0x???????? 0x????????
… … … ..
커널 오브젝트 삭제
사용 카운트 - 1
핸들 테이블에서 “핸들 “삭제
프로세스 별로 독립적 ?다른 프로세스에서 같은 커널 오브젝트를 쓰고 싶은데…
프로세스간 같은 파일 매핑 오브젝트나 뮤텍스를 쓰고 싶다면 ?
프로세스간 커널 오브젝트의 공유
1. 오브젝트 핸들의 상속 이용
2. 명명된 오브젝트 사용
3. 오브젝트 핸들의 복사 이용
오브젝트 핸들의 상속 이용
오브젝트 핸들의 상속 이용
인덱스
커널 오브젝트 메모리 포인터
액세스 마스크
플래그
1 0xF0000001 0x???????? 0x00000000
2 0x00000000 0x???????? 0x????????
3 0xF0000010 0x???????? 0x00000001
bIn-heritHandle == TRUE
인덱스
커널 오브젝트 메모리 포인터
액세스 마스크
플래그
1 0x00000000 0x???????? 0x????????
2 0x00000000 0x???????? 0x????????
3 0xF0000010 0x???????? 0x00000001
Parent Process
Child Process
정확히 같은 위치에 복사
오브젝트 핸들의 상속 이용
조건 및 제한
• Parent Process 와 Child Process 간에만 가능
• 새로 생성되는 Child Process 만 가능
• Child Process 는 어떤 핸들이 상속되었는지 모름 알려줘야만 쓸 수 있다 .
오브젝트 핸들의 상속 이용
명명된 오브젝트 사용
Create 호출 커널 오브젝트 이름 검사
커널 오브젝트 타입 검사 핸들 반환
오브젝트 핸들 복사
복사 옵션DUPLICATE_SAME_ACCESS Source 와 동일한 엑세스 마스크
( 보안 플래그 무시 )
DUPLICATE_CLOSE_SOURCE 이동 .
인덱스
커널 오브젝트 메모리 포인터
액세스 마스크
플래그
1 0xF0000001 0x???????? 0x00000000
2 0x00000000 0x???????? 0x????????
3 0xF0000010 0x???????? 0x00000001인덱
스커널 오브젝트 메모리 포인터
액세스 마스크
플래그
1 0x00000000 0x???????? 0x????????
2 0xF0000030 0x???????? 0x00000000
3 0x00000000 0x???????? 0x????????
Source Process
복사 전 Target Process
Source Han-dle
인덱스
커널 오브젝트 메모리 포인터
액세스 마스크
플래그
1 0xF0000010 0x???????? 0x00000001
2 0xF0000030 0x???????? 0x00000000
3 0x00000000 0x???????? 0x????????
복사 후 Target Process
Target Handle
오브젝트 핸들 복사
Target Process 는 복사된 커널 오브젝트를
사용할 수 있다는 통보를 받지 못하므로
윈도우 메시지나 프로세스간 통신 메커니즘으로
핸들을 전달해야 한다 .