120114 windows viacpp_03

26
Windows via C/C++ Chaper 03. 커커 커커커커 아아아 아아아 2012. 01. 14 아 아 아 [email protected]

Transcript of 120114 windows viacpp_03

Page 1: 120114 windows viacpp_03

Windows via C/C++

Chaper 03. 커널 오브젝트

아꿈사 스터디2012. 01. 14

김 한 솔[email protected]

Page 2: 120114 windows viacpp_03

커널 오브젝트를 알기 전에 ..

커널 ?

Page 3: 120114 windows viacpp_03

네이버 백과사전에 의하면…

Page 4: 120114 windows viacpp_03

네이버 백과사전에 의하면…

즉 , 커널 오브젝트를 관리하는 운영체제의 핵심요소

Page 5: 120114 windows viacpp_03

커널 오브젝트 ?

프로세스 오브젝트스레드 오브젝트잡 오브젝트IOCP 오브젝트세마포어 오브젝트뮤텍스 오브젝트

…… ETC

Page 6: 120114 windows viacpp_03

커널 오브젝트 ?

• 자원을 사용하기 위해 커널에 의해 할당된 간단한 메모리 블럭 .

• 메모리 블록에는 커널 오브젝트에 대한 세부정보 포함 .

• 커널에 의해서만 접근이 가능한 구조체로 구성 .

• 커널 오브젝트의 소유자는 프로세스가 아닌 커널 .

Page 7: 120114 windows viacpp_03

자원커널애플리케이션

자원 1

자원 2

자원 3

…커널

오브젝트 1

커널오브젝트 2

커널오브젝트 3

…핸들 1

핸들 2

핸들 3

Page 8: 120114 windows viacpp_03

사용 카운트

보안 디스크립터

타입에 따른 고유의 정보

커널 오브젝트

Page 9: 120114 windows viacpp_03

사용 카운트

보안 디스크립터

타입에 따른 고유의 정보

커널 오브젝트• 레퍼런스 카운트와 비슷 • 커널 오브젝트가 생성되거나 다른 프로세스가 접근 권한을 획득하면 1 증가 .

• CloseHandle() 함수를 이용하거나 프로세스가 종료 되면 1 감소

• 이거시 0 이 되면 커널 오브젝트 삭제 !!

Page 10: 120114 windows viacpp_03

사용 카운트

보안 디스크립터

타입에 따른 고유의 정보

커널 오브젝트

• 커널 오브젝트의 소유자 , 접근권한 / 제한 정보 .

• 주로 서버 개발에 사용 . Private Namespace 추가로 클라이언트 사용 .........?

Page 11: 120114 windows viacpp_03

Create* 함수 매개변수

Page 12: 120114 windows viacpp_03

보안 주의 사항

• 보안 접근 플래그를 간과하지 말 것 .

올바른 플래그 사용하면 다른 윈도우 버전으로 포팅이 쉬워짐 .

EX) 사용자 계정 컨트롤 (UAC)

Page 13: 120114 windows viacpp_03

커널 오브젝트 핸들 테이블 ?

• 프로세스가 초기화 되면 커널 오브젝트 핸들 테이블 할당 . ( 데이터 구조체 배열 )

• 프로세스 별로 핸들이 독립적으로 유지 . • 유저오브젝트나 GDI 오브젝트 는 사용되지 않는 Only 커널 오브젝트를 위한 테이블 .

• MS 는 핸들 테이블 구조와 관리방법등을 문서화 X

Page 14: 120114 windows viacpp_03

인덱스

커널 오브젝트 메모리 포인터

액세스 마스크

플래그

1 0x00000000 0x???????? 0x????????

2 0x00000000 0x???????? 0x????????

… … … ..Create 호출

커널 오브젝트 할당 또는 기존 오브젝트 반환(0xF0000001)

인덱스

커널 오브젝트 메모리 포인터

액세스 마스크

플래그

1 0xF0000001 0x???????? 0x00000000

2 0x00000000 0x???????? 0x????????

… … … ..

커널 오브젝트 생성

테이블에 등록된

핸들반환

사용 카운트 + 1

Page 15: 120114 windows viacpp_03

커널 오브젝트 생성

• Create 함수로 반환되는 핸들을 (/ 4) 나 (>>2) 하면 커널 오브젝트 테이블의 인덱스를 얻을 수 있음 .

• 대부분의 Create 함수 실패 -> return NULL; CreateFile 같은 함수 실패 -> INVALID_HANDLE_VALUE; 주의 요망 .

Page 16: 120114 windows viacpp_03

인덱스

커널 오브젝트 메모리 포인터

액세스 마스크

플래그

1 0xF0000001 0x???????? 0x00000000

2 0x00000000 0x???????? 0x????????

… … … ..CloseHandle()

사용 카운트가 0 이면 삭제 .(0xF0000001)

인덱스

커널 오브젝트 메모리 포인터

액세스 마스크

플래그

1 0x00000000 0x???????? 0x????????

2 0x00000000 0x???????? 0x????????

… … … ..

커널 오브젝트 삭제

사용 카운트 - 1

핸들 테이블에서 “핸들 “삭제

Page 17: 120114 windows viacpp_03

프로세스 별로 독립적 ?다른 프로세스에서 같은 커널 오브젝트를 쓰고 싶은데…

프로세스간 같은 파일 매핑 오브젝트나 뮤텍스를 쓰고 싶다면 ?

Page 18: 120114 windows viacpp_03

프로세스간 커널 오브젝트의 공유

1. 오브젝트 핸들의 상속 이용

2. 명명된 오브젝트 사용

3. 오브젝트 핸들의 복사 이용

Page 19: 120114 windows viacpp_03

오브젝트 핸들의 상속 이용

Page 20: 120114 windows viacpp_03

오브젝트 핸들의 상속 이용

인덱스

커널 오브젝트 메모리 포인터

액세스 마스크

플래그

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

정확히 같은 위치에 복사

Page 21: 120114 windows viacpp_03

오브젝트 핸들의 상속 이용

조건 및 제한

• Parent Process 와 Child Process 간에만 가능

• 새로 생성되는 Child Process 만 가능

• Child Process 는 어떤 핸들이 상속되었는지 모름 알려줘야만 쓸 수 있다 .

Page 22: 120114 windows viacpp_03

오브젝트 핸들의 상속 이용

Page 23: 120114 windows viacpp_03

명명된 오브젝트 사용

Create 호출 커널 오브젝트 이름 검사

커널 오브젝트 타입 검사 핸들 반환

Page 24: 120114 windows viacpp_03

오브젝트 핸들 복사

복사 옵션DUPLICATE_SAME_ACCESS Source 와 동일한 엑세스 마스크

( 보안 플래그 무시 )

DUPLICATE_CLOSE_SOURCE 이동 .

Page 25: 120114 windows viacpp_03

인덱스

커널 오브젝트 메모리 포인터

액세스 마스크

플래그

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

Page 26: 120114 windows viacpp_03

오브젝트 핸들 복사

Target Process 는 복사된 커널 오브젝트를

사용할 수 있다는 통보를 받지 못하므로

윈도우 메시지나 프로세스간 통신 메커니즘으로

핸들을 전달해야 한다 .