산타는 없다

Window via C/C++ 3장 - 커널 오브젝트 본문

프로그래밍 서적/Window via C++

Window via C/C++ 3장 - 커널 오브젝트

LEDPEAR 2021. 11. 7. 17:58
반응형
  • 0. 개요
    • 운영체제나 우리가 개발하는 애플리케이션은 프로세스, 스레드, 파일 등과 같은 수많은 리소스를 관리하기 위해 커널 오브젝트를 사용한다.
  • 1. 커널 오브젝트란 무엇인가?
    • Sysinternals에서 무료로 제공하는 툴인 WinObj를 사용하면 모든 커널 오브젝트 타입을 나열하고 확인해 볼 수 있다.
    • 함수의 이름에 포함된 오브젝트의 명칭이 반드시 커널 레벨의 오브젝트 이름과 일치하는 것은 아니다.
    • 커널(섹션?) 오브젝트 : 커널에 의해 할당된 간단한 메모리 블록. 이 메모리 블록은 커널에 의해서만 접근 가능한 구조체로 구성되어 있으며, 커널 오브젝트에 대한 세부 정보들을 저장하고 있다.
    • 마이크로 소프트는 커널 오브젝트의 구조체가 가능한 한 일관되게 유지될 수 있도록 하기 위해 메모리에 직접 접근하여 내용을 변경하지 못하게 하였다.
    • 마이크로 소프트는 정제된 방법을 통해 구조체의 내용에 접근할 수 있도록 일련의 함수 집합을 제공하고 있다.
    • 핸들 : 프로세스 내의 모든 스레드에 의해 사용 가능한 값이지만 특별한 의미를 가지고 있지는 않다. 32비트 운영체제에선 32비트, 64비트에선 64비트
    • 핸들 값들은 프로세스 별로 독립적으로 유지된다. 만일 어떤 스레드가 다른 프로세스의 스레드에게 자신의 핸들 값을 전달했을 경우, 이 핸들 값을 이용하여 수행하는 동작은 실패할 수도 있고 혹은 더 좋지 않은 결과를 초래할 수도 있다. 이는 각 프로세스별로 독립된 프로세스 핸들 테이블이 존재하고 동일한 핸들 값이라도 전혀 다른 커널 오브젝트를 참조할 수 있기 때문이다.
    • ① 사용 카운트
      • 커널 오브젝트는 프로세스가 아니라 커널에 의해 소유된다. 다시 말해, 만일 프로세스가 특정 함수를 통해 커널 오브젝트를 생성한 후 종료된다 하더라도 반드시 생성된 커널 오브젝트가 프로세스와 함께 삭제되는 것은 아니라는 의미이다. 다른 프로세스가 동일 커널 오브젝트를 사용하고 있다면 커널 오브젝트를 사용하는 모든 프로세스가 종료될 때까지 삭제되지 않고 남아 있는다.
      • 기억해야 할 점은 커널 오브젝트는 자신을 생성한 프로세스보다 더 오랫동안 삭제되지 않고 남아 잇을 수 있다는 것이다.
      • 각 커널 오브젝트는 내부적으로 사용 카운트 값을 유지하고 있어 얼마나 많은 프로세스들이 사용하고 있는지 알 수 있다.
    • ② 보안
      • 커널 오브젝트는 보안 디스크립터(security descriptor)를 통해 보호될 수 있다.
      • 보안 디스크립터는 누가 커널 오브젝트를 소유하고 있으며, 어떤 그룹과 사용자들에 의해 접근되거나 사용될 수 있는지, 혹은 어떤 그룹과 사용자들에 대해 접근이 제한되어 있는지에 대한 정보를 가지고 있다.
      • 이미 존재하는 커널 오브젝트를 이용하려면(새로운 오브젝트를 생성하는 대신) 먼저 오브젝트를 이용하여 어떤 작업을 수행하려 하는지를 알려주어야 한다.
      • 상당히 많은 윈도우 함수들이 보안 정보를요구한다
      • 개발자가 저지르는 가장 큰 실수 중의 하나가 알맞는 보안 접근 플래그를 쉽게 간과한다는 것이다.
반응형
Comments