'internal'에 해당되는 글 3건

  1. 2008.01.05 개체 관리자 (1)
  2. 2007.11.13 Windows Internal 3장 - System Mechanism
  3. 2007.11.12 Windows Internal 1장 - 기본개념과 용어

Windows 개체 관리자는 개체의 생성, 삭제, 보호, 추적을 담당하는 실행부 구성요소이다. 이것은 다른말로 운영체제의 Resource Control을 위한 목적으로 이용된다고도 할 수 있다. 개체 관리자를 확인할 수 있는 방법은 간단하다. Winobj (www.sysinternals.com에서 Download가능)를 통해서 개체 관리자의 Count, Handle등을 확인할 수 있다.

● 개체 관리자의 설계 목적

  1. System Resource에 공통된 Mechanism을 제공하며, 개체 보안을 격리 / 강화한다.
  2. Process들이 Object를 이용할 경우 Resource 제한을 위함, Resource를 상속을 지원하기 위함

● 개체 관리자의 구분

  1. 실행부 개체 (Process관리자, 메모리 관리자, I/O 서브시스템)
  2. 커널 개체

     실행부 개체는 실행부 내에서만 생성되고 사용되며, 커널 개체는 동기화 같은 기능들을 제공한다.

● 실행부 개체

  Windows 환경 서브시스템은 OS의 Image를 Application에 반영한다. 즉, 환경 서브시스템이 개체들과 다른 리소스들의 자체 버전을 구축하기 위해 사용된다(?) --> 이 의미가 정확이 무엇을 말하는 것인지...

image

예를들면, A라는 파일을 생성한다고 가정한다. 파일 생성을 위해서는 Application은 Windows내의 CreateFile 함수를 호출하고 (사용자 Mode), 이 명령은 실행부 개체(이때 사용되는 DLL은 Kernel32.dll)에서 몇가지 단계를 거친후에 NtCreateFile을 호출하여 실행부 파일 개체를 생성한다.

image

※ 위의 표를 보면 일관된 Access를 위해 동기화 하는 Mutex에 별표가 표시되어 있다. 이 용어는 Windows API에서 뮤턴트라는 개념은 Mutex라고 부르며, 이것의 기초가 되는 Kernel 개체를 뮤턴트라고 부른다.

● 개체 구조

image 각 개체는 Header부분과 Body부분으로 구성되어 있다. Object Manager(개체 관리자)는 Header 부분을 소요하고 실행부 구성요소들은 Object Body를 제어한다. 이중 Object Header부분에서 Object Type은 프로세스 목록과 각 인스턴스에 대한 공통적인 정보를 가지고 있는 특별한 구조를 지니고 있다. Object Header에 대한 상세내용은 생략하기로 하고 형식개체라고 불리는 type Object에 대해서 알아보겠다.

 

 

 

● 형식 개체들 (Type Object)

개체 해더들은 모든 개체들에 대한 공통의 Data를 가지지만, 각 개체의 Instance에 대한 내용을 서로 다를 수 있다. 이말을 그림으로 표현하면, 아래와 같다.

image

이러한 개념을 직접 확인해 보려면 Windbg를 통해 확인해 볼 수 있다.

[명령어]

!process : 프로세스 개체 형식 Data구조 확인

!object 프로세스 개체 주소를 지정하여 실행

dt : 개체 구조체를 확인

확인방법은 동영상 참조

위에서 확인한 형식 개체들은 사용자 모드에서는 조작할 수 없다.

● 개체 핸들과 프로세스 핸들 테이블

프로세스가 개체를 생성하거나 Open할때 핸들을 받는다. 즉, 모든 사용자 프로세스들은 그들의 스레드들이 개체를 사용할 수 있도록 하기 전에 개체에 대한 핸들을 소유해야 하는데, 이는 Resource를 조작하기 위함이다. 이러한 Logic은 Application이 System Data구조를 직접적으로 Access하는 것을 못하기 위함이다.

image 좌측 그림은 Windows 2000 handle Table Arch를 보여주는 그림이다. 한 Page는 4096 Byte로 구성되어 있고 핸들 Table 항목의 크기(8 Byte)로 나누면 512에서 1을 빼면 전체 511항목들이 있다.

 

 

 

 

이러한 구조는 Windbg에서 !handle 명령어로 알 수 있는데 이것에 대한 개념은 다음과 같다.

!handle

The !handle extension displays information about a handle or handles that one or all processes in the target system own.

Syntax

User-Mode

!handle [Handle [UMFlags [TypeName]]] 
!handle -?

Kernel-Mode

!handle [Handle [KMFlags [Process [TypeName]]]]

Parameters
Handle
Specifies the index of the handle to display. If Handle is -1 or if you omit this parameter, the debugger displays data for all handles that are associated with the current process. If Handle is 0, the debugger displays data for all handles.
UMFlags
(User mode only) Specifies what the display should contain. This parameter can be a sum of any of the following bit values. (The default value is 0x1.)
Bit 0 (0x1)
Displays handle type information.
Bit 1 (0x2)
Displays basic handle information.
Bit 2 (0x4)
Displays handle name information.
Bit 3 (0x8)
Displays object-specific handle information, when available.
KMFlags
(Kernel mode only) Specifies what the display should contain. This parameter can be a sum of any of the following bit values. (The default value is 0x3.)
Bit 0 (0x1)
Displays basic handle information.
Bit 1 (0x2)
Displays information about objects.
Bit 2 (0x4)
Displays free handle entries. If you do not set this bit and you omit Handle or set it to zero, the list of handles that are displayed does not include free handles. If Handle specifies a single free handle, it is displayed even if you do not set this bit.
Bit 4 (0x10)
(Windows XP and later) Displays the handle from the kernel handle table instead of the current process.
Bit 5 (0x20)
(Windows XP and later) Interprets the handle as a thread ID or process ID and displays information about the corresponding kernel object.
Process
(Kernel mode only) Specifies a process. You can use the process ID or the hexadecimal address of the process object. This parameter must refer to a currently running process on the target system. If this parameter is -1 or if you omit it, the current process is used.
TypeName
Specifies the type of handle that you want to examine. Only handles that match this type are displayed. TypeName is case sensitive. Valid types include Event, Section, File, Port, Directory, SymbolicLink, Mutant, WindowStation, Semaphore, Key, Token, Process, Thread, Desktop, IoCompletion, Timer, Job, and WaitablePort.
-?
(User mode only) Displays some Help text for this extension in the Debugger Command window.
DLL

Windows NT 4.0
Kdextx86.dll
Uext.dll
Ntsdexts.dll

Windows 2000
Kdextx86.dll
Uext.dll
Ntsdexts.dll

Windows XP and later
Kdexts.dll
Uext.dll
Ntsdexts.dll

Comments

You can use the !handle extension during user-mode and kernel-mode live debugging. You can also use this extension on kernel-mode dump files. However, you cannot use this extension on user-mode dump files, unless you specifically created them with handle information. (You can create create such dump files by using the .dump /mh (Create Dump File) command.)

During live user-mode debugging, you can use the .closehandle (Close Handle) command to close one or more handles.

The following examples are user-mode examples of the !handle extension. The following command displays a list of all handles.

0:000> !handle
Handle 4
  Type          Section
Handle 8
  Type          Event
Handle c
  Type          Event
Handle 10
  Type          Event
Handle 14
  Type          Directory
Handle 5c
  Type          File
6 Handles
Type            Count
Event           3
Section         1
File            1
Directory       1

The following command displays detailed information about handle 0x8.

0:000> !handle 8 f
Handle 8
  Type          Event
  Attributes    0
  GrantedAccess 0x100003:
         Synch
         QueryState,ModifyState
  HandleCount   2
  PointerCount  3
  Name          <none>
  Object Specific Information
    Event Type Auto Reset
    Event is Waiting

The following examples are kernel-mode examples of !handle. The following command lists all handles, including free handles.

kd> !handle 0 4
processor number 0
PROCESS 80559800  SessionId: 0  Cid: 0000    Peb: 00000000  ParentCid: 0000
    DirBase: 00039000  ObjectTable: e1000d60  TableSize: 380.
    Image: Idle
New version of handle table at e1002000 with 380 Entries in use
0000: free handle, Entry address e1002000, Next Entry fffffffe
0004: Object: 80ed5238  GrantedAccess: 001f0fff
0008: Object: 80ed46b8  GrantedAccess: 00000000
000c: Object: e1281d00  GrantedAccess: 000f003f
0010: Object: e1013658  GrantedAccess: 00000000
......
0168: Object: ffb6c748  GrantedAccess: 00000003 (Protected)
016c: Object: ff811f90  GrantedAccess: 0012008b
0170: free handle, Entry address e10022e0, Next Entry 00000458
0174: Object: 80dfd5c8  GrantedAccess: 001f01ff
......

The following command show detailed information about handle 0x14 in the kernel handle table.

kd> !handle 14 13
processor number 0
PROCESS 80559800  SessionId: 0  Cid: 0000    Peb: 00000000  ParentCid: 0000
    DirBase: 00039000  ObjectTable: e1000d60  TableSize: 380.
    Image: Idle
Kernel New version of handle table at e1002000 with 380 Entries in use
0014: Object: e12751d0  GrantedAccess: 0002001f
Object: e12751d0  Type: (80ec8db8) Key
    ObjectHeader: e12751b8
        HandleCount: 1  PointerCount: 1
        Directory Object: 00000000  Name: \REGISTRY\MACHINE\SYSTEM\CONTROLSET001\CONTROL\SESSION MANAGER\EXECUTIVE

Additional Information

For more information about handles, see the !htrace extension, the Microsoft Windows SDK documentation and Microsoft Windows Internals by Mark Russinovich and David Solomon.

 

● 개체 보안

파일을 Open할때는 읽을 내용인 것인지 지정해야 한다. 이렇듯 실행부에서 프로세스가 개체를 생성하거나 존재하는 개체에 대한 핸들을 열때 프로세스는 액세스 권한을 지정해야 한다.

프로세스가 개체에 대한 핸들을 Open할 때 개체 관리자는 Security Reference Monitor를 호출하는데 Kernel Mode 부분에 있는 보안 서술자가 Access 형식을 검사하여, 증인된 Access 권한을 반환하고 개체 관리자는 이러한 정버를 가지고 생성한 개체 Handle에 저장한다. 이것에 대한 자세한 설명은 뒤의 8장에서 다루기로 하겠다.

● 개체 유지 (Object Retention)

Object 형식에는 크게 임시 개체와 영구 개체가 있는데 대부분의 개체는 임시 개체로 생성된다. 임시 개체는 휘발성, 영구 개체는 비 휘발성이라고 생각하면 된다. 대부분의 개체가 생성될 경우 임시 개체로 생성이 되기 때문에 개체 관리자가 개체를 계속 유지할 수 있는 방법이 중요하게 된다.  개체 관리자는 개체 유지를 두단계로 구현하는데, 첫번째 단계는 이름유지 단계(Handle수로 제어, 프로세스에서 Handle을 Open할 경우 Handle Count증가)가 있고, 더 이상 사용하지 않은 개체에 대해서는 개체유지를 중지한다.

이런 개체 유지에 대한 Mechanism은 다음과 같다.

image

이러한 개체유지 방법으로 인해 Application은 개체에 대한 핸들 유지를 통해 개체와 개체의 이름이 Memory에 있도록 보장한다. 이는 Resource 계산에 중요한 모체가 되는데 Windows에서 각 프로세스는 비 페이징 풀, 페이징 풀, 페이징 파일 사용률에 대한 현재값과 제한값을 할당하는 구조체를 가지고 있는게 비 부분이 바로 Dump 분석시 자주 보이는 EPPROCESS에 내용을 담고 있다. 구조체 확인은 (dt nt!RPPROCESS_QUOTA_ENTRY)

● 개체 이름

개체 생성시 중요한 고려사항으로는 한개체를 다른 개체와 구별하는 방법과 특정 개체를 찾는 방법이다. 예를 들면 선택된 resource, File, Pipe, Shared Memory Block에 이름을 부여하는 기능을 말한다. 기본적으로 명명된 개체들을 확인하려면, Windbj.exe 실행후 \BASE\NamedObjects에서 확인할 수 있다.

image

image 

출처 : Microsoft Windows Internals

신고
Posted by hotpoto

[3장의 주요내용]

   ● 실행부, 커널, 장치 드라이버와 같은 커널 모드 구성요소가 사용하는 메카니즘

[Trap Dispatching]

   ● 인터럽트(Interrupt), 예외 (Exception)은 정상적인 제어 흐름에서 벗어나

      다른 코드로 전환하게 되는 운영체제의 특수한 경우이다.

   - Trap은 인터럽트나 예외가 발생하였을 때 실행 Thread를 잡아서 운영체제의

     정해진 위치에 제어를 전달하는 메카니즘을 말하는 것으로 여기서 제어를 전달하여

     처리하는 함수를 Trap Handler라고 한다.

 

image

위에 명시된 그림은 Trap Handler를 활성화 하는 조건을 나타낸 것이다.

커널은 Interrupt와 Exception을 구별할 수 있는 구별 방법은 비동기 이벤트이냐,

동기식 이벤트이냐를 판별해서 구분한다. 즉 Interrupt는 I/O장치, 프로세스 클럭,

타이머 등에 대해 어느때나 발생하지만 Exception은 특정한 명령의 실행으로 발생하는

운영체제의 특수한 경우이다.

만약 장치 인터럽트가 발생하였다면 Kernel Trap Handler는 ISR에 제어를 전달한다.

ISR은 장치 드라이버가 인터럽트를 일으키는 장치를 위해 제공하는

Service Routine이다.

 

   ● Interrupt Dispatching

1. H/W Interrupt Processing

   - H/W Platform I/O Interrupt → Interrupt Controller → Processor 통지 →

     IRQ획득 → Interrupt Controller에서 IRQ를 Interrupt Num으로 변환 →

     IDT

     에 인덱스를 사용하여 Interrupt Dispatch Routine에 전달

2. x86 Interrupt Controller

   - 종류 : i8259A PIC(유니프로세서 시스템에서 동작),

                i82489 APIC(멀티프로세서 시스템에서 동작, 256개 Interrupt지원)

3. IRQL (Software Interrupt Request Levels)

image

  - Interrupt는 IRQL의 우선순위 순서에 따라 서비스 되며, 더 높은

    우선순위  Interrupt가 낮은 우선순위 Interrupt의 서비스를 선점한다.

    IRQL은 각 프로세서별로 설정하는데 이는 프로세서가 어떤 인터럽트를

    받을 수 있는지 결정하며 커널 모드 데이터 구조에 대한 액세스를 동기화

    를 위해 사용된다. 커널은 프로세스처리를 위하여 IRQL의 순위를 조절하

    는데 이때 PIC를 엑세스하여 처리할 경우 Data 처리 속도가 지연되기 때

    문에 지연 IRQL이라는 성능 최적화 방법을 구현하여 프로세서의

    인터럽트를 처리한다.

  - Interrupt를 IRQL에 Mapping

     Windows는 하드웨어에서 IRQL들의 개념을 구현하지 않는다. 그러한

    이유로 HAL에서 버스 드라이버(PCI, USB)는 자신들의 존재가 어떠한

    인터럽트 장치에 할당될 수 있을까를 결정하는데 이러한 역활을 하는

    플러그 앤 플레이 관리자는 인터럽트 할당을 고려한 후

    HalpGetSystemInterruptVector를 호출하여 매핑 한다.

  - Predefined IRQLs

     ▶ High : KeBugCheckEx로 인한 System Halting이 있을경우나 모든 인터

                  럽트들이 Masking할때

     ▶ Power Fail : Power Fail이 있을 경우 사용되지만 IRQL은 사용되지 않음

     ▶ Inter-processor Interrupt

        다른 프로세서가 특정 Thread를 실행하고자 할때 DISPATCH_LEVEL

        인터럽트가 요청될경우, 프로세서의 TLB가 Update 될경우,

        System Crash나 Shutdown이 요청될경우

     ▶ Clock  : Kernel의 날짜 유지 및 Thread에 대한 CPU 시간 측정 및 할당

     ▶ Dispatch : S/W에서 사용할 수 있는 가장 상위값

     ▶ APC : 드라이버는 사용 불가, I/O Manager가 사용

- Interrupt Objects (Kernel Control Object)

   커널에서 Interrupt 요청이 있을 경우 장치 드라이버를 ISR에 등록할 때 사용

   Interrupt Object는 ISR주소와, 장치 인터럽트의 IRQL을 포함한다.

   Interrupt에 대한 자세한 내용을 알려고 노력했지만... 도통 무슨말인지

   쉽게 이해가지 않아 아래 그림을 첨부하였다. 아래그림에서 알수 있는것은

   어떤 처리를 위한 구조체 정도로 생각해야 되는것은 아닌지....^^

   이후에 나오는 DPC, APC Object모두 프로세스간의 동기화를 위해 사용된다

   는 것만 명심하자!!!

   image

  4. Software Interrupts

       - DPC Interrupts (Dispatch or Deferred Procedure Call)

image

    높은 Interrupt Level에서 낮은 Interrupt Level로 지연처리될 때 사용

      ▶ Driver queues request

      ▶ CPU당 queue가 존재할 경우

신고
Posted by hotpoto

● Windows API
   - Windows 응용 프로그래밍 인터페이스로 Windows OS에 대한 시스템 프로그래밍 인터페이스로 각 OS Version별로 다른 부분집합을 구성하고 있다. 즉 다른말로 하면 Windows에서 기본적으로 제공하는 기능들을 모아놓은 함수라고 할 수 있다. 32 비트 버전의 Windows OS의 프로그래밍 인터페이는 Win32 API 하지만 지금 부터는 Windows 2000, Windows XP, Windows 2003의 32 및 64비트 프로그래밍 인터페이스를 지칭한다.

● Native System Service
   - 운영체제에서 하부에 있는 사용자 모드에서 호출 가능한 문서화 되지 않는 서비스들을 말하는 것으로 3장의 System Mechanism에서 내용을 다룰 것이다.

● 동적 링크 라이브러리 (DLL, Dynamic-Link Library)
   - Application에 의해 동적으로 로드될 수 있느 ㄴ바이너리 파일과 함께 일크된 호출 가능한 서브루틴들의 집합을 말한다. Static Library에 비해 DLL들이 제공하는 장점은 Application간 DLL을 공유 할수 있다는 것과 DLL 코드의 사본을 메모리에만 유지 한다는 것을 보장하는 점이다.

● Process
   - 우리가 착각하기 쉬운 개념으로 프로그램와 비교되는 개녑이다. 간단히 설명하자만 프로그램은 명령들의 Static 순서이라고 말할 수 있지만, Process는 프로그램의 Instance를 실행할 때 사용되는 리소스의 집합에 대한 컨테이너라고 할 수 있다.

"사용자
 
   - Process는 전용 가상 주소공간(VAD). 실행프로그램, 보안 컨텍스트, 프로세스ID, 하나이상의 Thread를 포함하고 있다. 이중 중요한 개념은 VAD와 컨텍스트, Thread 3가지로 압축할 수 있는데 여기서는 개념 설명정도의 수준만 설명하겠다.

1. VAD (Virtual Address Descriptor)
   - 프로세스가 사용할 수 있는 가장 메모리 주소들의 집합이다. 즉 메모리 관리자가 프로세스에서 가장 주소를 추적하기 위해 사용하는 데이터 구조체로 자세한 내용은 Memory 관리 부분에 서술되어 있다.

출처 : Windows Internal

신고
Posted by hotpoto
TAG API, DLL, internal, VAD

티스토리 툴바