SlideShare a Scribd company logo
Windows via C/C++

Chaper 03. 커널 오브젝트


                    아꿈사 스터디
                            2012. 01. 14


                         김한솔
                      itsfitsol@gmail.com
커널 오브젝트를 알기 전에..




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




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

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

 …… ETC
커널 오브젝트?

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

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

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

• 커널 오브젝트의 소유자는 프로세스가 아닌 커널.
애플리케이션   커널       자원

  …       …       …
          커널
  핸들 1
         오브젝트 1
                  자원 1

          커널
  핸들 2
         오브젝트 2
                  자원 2

          커널
  핸들 3
         오브젝트 3
                  자원 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



인덱    커널 오브젝트        액세스          플래그
스     메모리 포인터        마스크
                                               테이블에
1     0xF0000001   0x????????   0x0000000       등록된
                                    0          핸들반환
2     0x00000000   0x????????   0x????????
…         …            …            ..
커널 오브젝트 생성
• Create 함수로 반환되는 핸들을 (/ 4) 나 (>>2) 하면
  커널 오브젝트 테이블의 인덱스를 얻을 수 있음.

• 대부분의 Create 함수 실패      -> return NULL;
  CreateFile 같은 함수 실패    -> INVALID_HANDLE_VALUE;
  주의 요망.
커널 오브젝트 삭제
인덱   커널 오브젝트        액세스          플래그
스    메모리 포인터        마스크
1    0xF0000001   0x????????   0x0000000
                                   0
2    0x00000000   0x????????   0x????????
…        …            …            ..       CloseHandle()

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


인덱   커널 오브젝트        액세스          플래그
스    메모리 포인터        마스크
1    0x00000000   0x????????   0x????????   핸들 테이블에서
                                             “핸들 “삭제
2    0x00000000   0x????????   0x????????
…        …            …            ..
프로세스 별로 독립적?
         다른 프로세스에서 같은 커널 오브젝트를 쓰고 싶은데…



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

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

 2. 명명된 오브젝트 사용

 3. 오브젝트 핸들의 복사 이용
오브젝트 핸들의 상속 이용
오브젝트 핸들의 상속 이용
Parent Process
인덱    커널 오브젝트         액세스          플래그
스     메모리 포인터         마스크
 1     0xF0000001   0x????????   0x0000000
                                     0
 2     0x00000000   0x????????   0x????????   bInheritHandle
 3     0xF0000010   0x????????   0x0000000       == TRUE
                                     1
Child Process
인덱 커널 오브젝트            액세스          플래그
 스      메모리 포인터       마스크
 1     0x00000000   0x????????   0x????????
 2     0x00000000   0x????????   0x????????
 3     0xF0000010   0x????????   0x0000000     정확히 같은
                                     1         위치에 복사
오브젝트 핸들의 상속 이용


조건 및 제한

• Parent Process 와 Child Process 간에만 가능

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

• Child Process 는 어떤 핸들이 상속되었는지 모름
  알려줘야만 쓸 수 있다.
오브젝트 핸들의 상속 이용
명명된 오브젝트 사용




            커널 오브젝트   커널 오브젝트
Create 호출                       핸들 반환
             이름 검사     타입 검사
오브젝트 핸들 복사




복사 옵션
DUPLICATE_SAME_ACCESS         Source 와 동일한 엑세스 마스크
                         (보안 플래그 무시)

DUPLICATE_CLOSE_SOURCE   이동.
Source Process
인덱    커널 오브젝트         액세스          플래그
스     메모리 포인터         마스크
 1     0xF0000001   0x????????   0x0000000
                                     0
 2     0x00000000   0x????????   0x????????
                                              Source Handle
 3   0xF0000010     0x????????   0x0000000
복사 전 Target Process                  1
인덱    커널 오브젝트         액세스          플래그
스     메모리 포인터         마스크
 1     0x00000000   0x????????   0x????????
 2     0xF0000030   0x????????   0x0000000
                                     0
 3    0x00000000    0x????????   0x????????
복사 후 Target Process
인덱    커널 오브젝트         액세스          플래그
스     메모리 포인터         마스크
 1     0xF0000010   0x????????   0x0000000     Target Handle
                                     1
 2     0xF0000030   0x????????   0x0000000
                                     0
오브젝트 핸들 복사
Target Process 는 복사된 커널 오브젝트를

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

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

핸들을 전달해야 한다.

More Related Content

What's hot

Windows via c/c++ 스터디9장
Windows via c/c++ 스터디9장Windows via c/c++ 스터디9장
Windows via c/c++ 스터디9장
HolyTak
 
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
sung ki choi
 
windows via c++ Ch 5. Job
windows via c++ Ch 5. Jobwindows via c++ Ch 5. Job
windows via c++ Ch 5. Job
Hyosung Jeon
 
Windows via c++ chapter6
Windows via c++   chapter6Windows via c++   chapter6
Windows via c++ chapter6
Shin heemin
 
Effective STL 1~4장 정리
Effective STL 1~4장 정리Effective STL 1~4장 정리
Effective STL 1~4장 정리
Shin heemin
 
동기화, 스케줄링
동기화, 스케줄링동기화, 스케줄링
동기화, 스케줄링xxbdxx
 
Jupyter notebok tensorboard 실행하기_20160706
Jupyter notebok tensorboard 실행하기_20160706Jupyter notebok tensorboard 실행하기_20160706
Jupyter notebok tensorboard 실행하기_20160706
Yong Joon Moon
 
Storm 훑어보기
Storm 훑어보기Storm 훑어보기
Storm 훑어보기
beom kyun choi
 
스톰 미리보기
스톰 미리보기스톰 미리보기
스톰 미리보기
June Yi
 
Java script의 이해
Java script의 이해Java script의 이해
Java script의 이해
seungkyu park
 
[GPG 스터디] 1.4 게임프로그래밍에서의 STL 활용
[GPG 스터디] 1.4 게임프로그래밍에서의 STL 활용 [GPG 스터디] 1.4 게임프로그래밍에서의 STL 활용
[GPG 스터디] 1.4 게임프로그래밍에서의 STL 활용
Sehyeon Nam
 
HolubOnPatterns/chapter3_3
HolubOnPatterns/chapter3_3HolubOnPatterns/chapter3_3
HolubOnPatterns/chapter3_3suitzero
 
7가지 동시성 모델 - 데이터 병렬성
7가지 동시성 모델 - 데이터 병렬성7가지 동시성 모델 - 데이터 병렬성
7가지 동시성 모델 - 데이터 병렬성
HyeonSeok Choi
 
fengfengfeng
fengfengfengfengfengfeng
fengfengfeng
Kyoungseok Yang
 
Windows kernel basic exploit
Windows kernel basic exploitWindows kernel basic exploit
Windows kernel basic exploit
Kyoungseok Yang
 
Stl vector, list, map
Stl vector, list, mapStl vector, list, map
Stl vector, list, map
Nam Hyeonuk
 
Realm.io for iOS
Realm.io for iOSRealm.io for iOS
Realm.io for iOS
Eunjoo Im
 
C++ VECTOR, LIST, MAP
C++ VECTOR, LIST, MAPC++ VECTOR, LIST, MAP
C++ VECTOR, LIST, MAP
Jae Woo Woo
 
Nodejs_chapter3
Nodejs_chapter3Nodejs_chapter3
Nodejs_chapter3
Yoon Hee Hwang
 
Stl 컨테이너
Stl 컨테이너Stl 컨테이너
Stl 컨테이너
ssuser7c5a40
 

What's hot (20)

Windows via c/c++ 스터디9장
Windows via c/c++ 스터디9장Windows via c/c++ 스터디9장
Windows via c/c++ 스터디9장
 
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
 
windows via c++ Ch 5. Job
windows via c++ Ch 5. Jobwindows via c++ Ch 5. Job
windows via c++ Ch 5. Job
 
Windows via c++ chapter6
Windows via c++   chapter6Windows via c++   chapter6
Windows via c++ chapter6
 
Effective STL 1~4장 정리
Effective STL 1~4장 정리Effective STL 1~4장 정리
Effective STL 1~4장 정리
 
동기화, 스케줄링
동기화, 스케줄링동기화, 스케줄링
동기화, 스케줄링
 
Jupyter notebok tensorboard 실행하기_20160706
Jupyter notebok tensorboard 실행하기_20160706Jupyter notebok tensorboard 실행하기_20160706
Jupyter notebok tensorboard 실행하기_20160706
 
Storm 훑어보기
Storm 훑어보기Storm 훑어보기
Storm 훑어보기
 
스톰 미리보기
스톰 미리보기스톰 미리보기
스톰 미리보기
 
Java script의 이해
Java script의 이해Java script의 이해
Java script의 이해
 
[GPG 스터디] 1.4 게임프로그래밍에서의 STL 활용
[GPG 스터디] 1.4 게임프로그래밍에서의 STL 활용 [GPG 스터디] 1.4 게임프로그래밍에서의 STL 활용
[GPG 스터디] 1.4 게임프로그래밍에서의 STL 활용
 
HolubOnPatterns/chapter3_3
HolubOnPatterns/chapter3_3HolubOnPatterns/chapter3_3
HolubOnPatterns/chapter3_3
 
7가지 동시성 모델 - 데이터 병렬성
7가지 동시성 모델 - 데이터 병렬성7가지 동시성 모델 - 데이터 병렬성
7가지 동시성 모델 - 데이터 병렬성
 
fengfengfeng
fengfengfengfengfengfeng
fengfengfeng
 
Windows kernel basic exploit
Windows kernel basic exploitWindows kernel basic exploit
Windows kernel basic exploit
 
Stl vector, list, map
Stl vector, list, mapStl vector, list, map
Stl vector, list, map
 
Realm.io for iOS
Realm.io for iOSRealm.io for iOS
Realm.io for iOS
 
C++ VECTOR, LIST, MAP
C++ VECTOR, LIST, MAPC++ VECTOR, LIST, MAP
C++ VECTOR, LIST, MAP
 
Nodejs_chapter3
Nodejs_chapter3Nodejs_chapter3
Nodejs_chapter3
 
Stl 컨테이너
Stl 컨테이너Stl 컨테이너
Stl 컨테이너
 

120114 windows viacpp_03

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