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

More Related Content

What's hot

07 스레드스케줄링,우선순위,그리고선호도
07 스레드스케줄링,우선순위,그리고선호도07 스레드스케줄링,우선순위,그리고선호도
07 스레드스케줄링,우선순위,그리고선호도
ssuser3fb17c
 
스레드
스레드스레드
스레드
xxbdxx
 
리플렉션과 가비지 컬렉션
리플렉션과 가비지 컬렉션리플렉션과 가비지 컬렉션
리플렉션과 가비지 컬렉션
QooJuice
 

What's hot (20)

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/c++ 스터디9장
Windows via c/c++ 스터디9장Windows via c/c++ 스터디9장
Windows via c/c++ 스터디9장
 
Jupyter notebok tensorboard 실행하기_20160706
Jupyter notebok tensorboard 실행하기_20160706Jupyter notebok tensorboard 실행하기_20160706
Jupyter notebok tensorboard 실행하기_20160706
 
Gcd ppt
Gcd pptGcd ppt
Gcd ppt
 
07 스레드스케줄링,우선순위,그리고선호도
07 스레드스케줄링,우선순위,그리고선호도07 스레드스케줄링,우선순위,그리고선호도
07 스레드스케줄링,우선순위,그리고선호도
 
Gpg1
Gpg1Gpg1
Gpg1
 
Storm 훑어보기
Storm 훑어보기Storm 훑어보기
Storm 훑어보기
 
스톰 미리보기
스톰 미리보기스톰 미리보기
스톰 미리보기
 
윈도우 메모리맵파일
윈도우 메모리맵파일 윈도우 메모리맵파일
윈도우 메모리맵파일
 
04 프로세스
04 프로세스04 프로세스
04 프로세스
 
스레드
스레드스레드
스레드
 
fengfengfeng
fengfengfengfengfengfeng
fengfengfeng
 
Lock free queue
Lock free queueLock free queue
Lock free queue
 
Apache ZooKeeper 소개
Apache ZooKeeper 소개Apache ZooKeeper 소개
Apache ZooKeeper 소개
 
Memory & object pooling
Memory & object poolingMemory & object pooling
Memory & object pooling
 
리플렉션과 가비지 컬렉션
리플렉션과 가비지 컬렉션리플렉션과 가비지 컬렉션
리플렉션과 가비지 컬렉션
 
Windows kernel basic exploit
Windows kernel basic exploitWindows kernel basic exploit
Windows kernel basic exploit
 
Anatomy of Realm
Anatomy of RealmAnatomy of Realm
Anatomy of Realm
 
Nodejs_chapter3
Nodejs_chapter3Nodejs_chapter3
Nodejs_chapter3
 
Realm.io for iOS
Realm.io for iOSRealm.io for iOS
Realm.io for iOS
 

Similar to Windows via c/c++ ch03. 커널오브젝트

Openstack Swift overview
Openstack Swift overviewOpenstack Swift overview
Openstack Swift overview
어형 이
 
동기화, 스케줄링
동기화, 스케줄링동기화, 스케줄링
동기화, 스케줄링
xxbdxx
 
Mec++ chapter3,4
Mec++ chapter3,4Mec++ chapter3,4
Mec++ chapter3,4
문익 장
 
Api design for c++ ch3 pattern
Api design for c++ ch3 patternApi design for c++ ch3 pattern
Api design for c++ ch3 pattern
jinho park
 
Game programming patterns 2
Game programming patterns 2Game programming patterns 2
Game programming patterns 2
QooJuice
 
Effective c++(chapter3,4)
Effective c++(chapter3,4)Effective c++(chapter3,4)
Effective c++(chapter3,4)
문익 장
 
04 안드로이드 응용프로그램의 구조
04 안드로이드 응용프로그램의 구조04 안드로이드 응용프로그램의 구조
04 안드로이드 응용프로그램의 구조
Wanbok Choi
 

Similar to Windows via c/c++ ch03. 커널오브젝트 (20)

Openstack Swift overview
Openstack Swift overviewOpenstack Swift overview
Openstack Swift overview
 
동기화, 스케줄링
동기화, 스케줄링동기화, 스케줄링
동기화, 스케줄링
 
DDD 구현기초 (거의 Final 버전)
DDD 구현기초 (거의 Final 버전)DDD 구현기초 (거의 Final 버전)
DDD 구현기초 (거의 Final 버전)
 
effective c++ chapter 3~4 정리
effective c++ chapter 3~4 정리effective c++ chapter 3~4 정리
effective c++ chapter 3~4 정리
 
Kubernetes
Kubernetes Kubernetes
Kubernetes
 
[넥슨] kubernetes 소개 (2018)
[넥슨] kubernetes 소개 (2018)[넥슨] kubernetes 소개 (2018)
[넥슨] kubernetes 소개 (2018)
 
Mec++ chapter3,4
Mec++ chapter3,4Mec++ chapter3,4
Mec++ chapter3,4
 
Api design for c++ ch3 pattern
Api design for c++ ch3 patternApi design for c++ ch3 pattern
Api design for c++ ch3 pattern
 
Api design for c++ pattern
Api design for c++ patternApi design for c++ pattern
Api design for c++ pattern
 
Game programming patterns 2
Game programming patterns 2Game programming patterns 2
Game programming patterns 2
 
Effective c++(chapter3,4)
Effective c++(chapter3,4)Effective c++(chapter3,4)
Effective c++(chapter3,4)
 
Microsoft pp lpdf
Microsoft pp lpdfMicrosoft pp lpdf
Microsoft pp lpdf
 
도커 이미지 레이어 구조
도커 이미지 레이어 구조도커 이미지 레이어 구조
도커 이미지 레이어 구조
 
Effective STL 1~4장 정리
Effective STL 1~4장 정리Effective STL 1~4장 정리
Effective STL 1~4장 정리
 
Packer, Terraform, Vault를 이용해 만드는 
재현 가능한 게임 인프라
Packer, Terraform, Vault를 이용해 만드는 
재현 가능한 게임 인프라Packer, Terraform, Vault를 이용해 만드는 
재현 가능한 게임 인프라
Packer, Terraform, Vault를 이용해 만드는 
재현 가능한 게임 인프라
 
[Solr 스터디] Solr 설정 및 색인 (2017)
[Solr 스터디] Solr 설정 및 색인 (2017)[Solr 스터디] Solr 설정 및 색인 (2017)
[Solr 스터디] Solr 설정 및 색인 (2017)
 
04 안드로이드 응용프로그램의 구조
04 안드로이드 응용프로그램의 구조04 안드로이드 응용프로그램의 구조
04 안드로이드 응용프로그램의 구조
 
객체지향 프로그래밍 기본
객체지향 프로그래밍 기본객체지향 프로그래밍 기본
객체지향 프로그래밍 기본
 
Android Network
Android NetworkAndroid Network
Android Network
 
TenforFlow Internals
TenforFlow InternalsTenforFlow Internals
TenforFlow Internals
 

Recently uploaded

Recently uploaded (8)

JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개
JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개
JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개
 
실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석
실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석
실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석
 
JMP를 활용한 가속열화 분석 사례
JMP를 활용한 가속열화 분석 사례JMP를 활용한 가속열화 분석 사례
JMP를 활용한 가속열화 분석 사례
 
JMP를 활용한 전자/반도체 산업 Yield Enhancement Methodology
JMP를 활용한 전자/반도체 산업 Yield Enhancement MethodologyJMP를 활용한 전자/반도체 산업 Yield Enhancement Methodology
JMP를 활용한 전자/반도체 산업 Yield Enhancement Methodology
 
(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?
(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?
(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?
 
공학 관점에서 바라본 JMP 머신러닝 최적화
공학 관점에서 바라본 JMP 머신러닝 최적화공학 관점에서 바라본 JMP 머신러닝 최적화
공학 관점에서 바라본 JMP 머신러닝 최적화
 
데이터 분석 문제 해결을 위한 나의 JMP 활용법
데이터 분석 문제 해결을 위한 나의 JMP 활용법데이터 분석 문제 해결을 위한 나의 JMP 활용법
데이터 분석 문제 해결을 위한 나의 JMP 활용법
 
JMP가 걸어온 여정, 새로운 도약 JMP 18!
JMP가 걸어온 여정, 새로운 도약 JMP 18!JMP가 걸어온 여정, 새로운 도약 JMP 18!
JMP가 걸어온 여정, 새로운 도약 JMP 18!
 

Windows via c/c++ ch03. 커널오브젝트

  • 1. Chapter03. 커널 오브젝트 제프리 리처의 Windows via C/C++
  • 2. 커널 오브젝트 1. 커널 오브젝트란 무엇인가? 2. 프로세스의 커널 오브젝트 핸들 테이블 3. 프로세스간 커널 오브젝트의 공유
  • 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 변수가 가지고 있는 핸들 값을 전 달해야한다 • 윈도우 메시지나 프로세스간 통신 메커니즘을 사용하면 된다. 오브젝트 핸들 복사