Device Driver 관련 문서를 읽다 보면 장치 노드, 장치 스택 등 필요한 용어들의 정리가 필요하다.
물론 처음 공부할 때 이해보다는 부딪처보는 스타일이여서 막 코딩해보고 파란 화면을 보면서 했지만,
전문적으로 공부하고 싶어진 만큼 용어부터 정리하고자 한다.
Device node
우리가 컴퓨터를 할 때 여러가지 장치들을 사용한다.
장치[Device]라고 하면 다른게 아니라 마우스나 키보드, USB와 같은 것들이 장치라고 말할 수 있다.
그리고 운영체제에서는 이러한 장치를 편리하게 사용하기 위해서 PnP[플러그 앤 플레이]라는 기능이있다.
*추가 : 레거시 플러그 앤 플레이(Legacy Plug and Play[1]) 또는 줄여서 PnP[2]는 꽂으면 실행된다는 뜻
컴퓨터 실행 중에 주변 장치를 부착해도 별다른 설정 없이 작동함, 마이크로소프트 윈도우는 윈도우 95 버전부터 지원
PnP라 하면 새로운 장치를 컴퓨터에 집어 넣었을 때, 컴퓨터가 그 장치를 자동으로 인식할 수 있는 능력을 주는 표준을 말한다.
Windows에서는 이러한 Device들이 연결될 때 PnP[플러그 앤 플레이] 장치 트리의 장치 노드[Device node]로 표시 되어진다.
간단하게 말하면 하나의 usb가 연결되면 PnP 트리의 하나의 노드로 표시된다는 것이다.
그 표시된 노드를 Device node라고 명명 한것이다. 또한 PnP 트리 또한 간단하게 장치 트리라고 명명한다.
그리고 트리라면 루트가있을 것인데 그 루트 노드를 루트 장치 노드[root device node]라고 부른다.
하지만 이러한 장치 노드가 꼭 장치만 표현 하는 것이 아니다. MS에서 설명 하기를 해당 장치 노드를 표시에서
장치 말고도 하위 장치가 연결되어 있는 버스를 표시하기도 하고, 실제 장치와 연결되지 않은 소프트웨어 구성 요소를 나타내기도 한다.
* 소프트웨어 구성 요소의 예가 무엇이 있을까?
예를 들어 설명하면 PCI 버스 노드가 있다..
PCI[Peripheral Component Interconnect] Bus 는 메인보드에 주변 장치를 장착하는데 쓰이는 버스 중 하나이다.
그리고 이 PCI Bus에 장치가 연결된다고 생각해보자 그러면 PCI Bus 하위 트리로 연결된 장치 노드가 생성될 것을 상상할 수 있다.
밑의 그림을 보면 좀 더 쉽게 이해할 수 있었다. PCI 버스를 보면 장착 위치가 존재 한다. 저기에 장치를 연결하거나, 다시 장치 노드를 연결하면
하위 노드로 생성되는 것이다.
정리하면 장치 노드로 표현 될 수 있는 것은 장치[Device] USB, 마우스, 키보드 와 장치 버스[Device Bus] PCI Bus, Audio Bus 라고 정리 할 수있다.
Device Object[장치 개체]
해당 내용을 이해하는데 난 오래 걸렸다. 멍청하다고 할 수있지만 .. 그래도 나같은 분들이 있을것 같아 정리하고자 한다.
또 한, 엄연히.. 당연한 이야기지만 Driver Object와 Device Object는 다른 것이다...
참고 페이지에서 "장치 개체는 DEVICE_OBJECT 구조의 인스턴스"라고 설명 하였다.
여기서 먼저 DEVICE_OBJECT 구조를 보고 넘어가고자 한다.
typedef struct _DEVICE_OBJECT { CSHORT Type; USHORT Size; LONG ReferenceCount; struct _DRIVER_OBJECT *DriverObject; struct _DEVICE_OBJECT *NextDevice; struct _DEVICE_OBJECT *AttachedDevice; struct _IRP *CurrentIrp; PIO_TIMER Timer; ULONG Flags; ULONG Characteristics; __volatile PVPB Vpb; PVOID DeviceExtension; DEVICE_TYPE DeviceType; CCHAR StackSize; union { LIST_ENTRY ListEntry; WAIT_CONTEXT_BLOCK Wcb; } Queue; ULONG AlignmentRequirement; KDEVICE_QUEUE DeviceQueue; KDPC Dpc; ULONG ActiveThreadCount; PSECURITY_DESCRIPTOR SecurityDescriptor; KEVENT DeviceLock; USHORT SectorSize; USHORT Spare1; struct _DEVOBJ_EXTENSION * DeviceObjectExtension; PVOID Reserved; } DEVICE_OBJECT, *PDEVICE_OBJECT;
[출처] https://ko.wikipedia.org/wiki/%ED%94%8C%EB%9F%AC%EA%B7%B8_%EC%95%A4_%ED%94%8C%EB%A0%88%EC%9D%B4
[출처] https://msdn.microsoft.com/en-us/library/windows/hardware/ff554721(v=vs.85).aspx
'reversing > rootkit' 카테고리의 다른 글
EPROCESS 구조체 [ 프로세스 숨기기_1 ] (0) | 2016.08.11 |
---|---|
Kernel Debug 준비[windbg] (0) | 2016.08.10 |
Driver 개념 (0) | 2016.08.02 |
Anti Disassembly[안티 디스어셈블] (0) | 2016.08.01 |
Debug Principle[디버거 구조와 원리] : 디버그 이벤트 (0) | 2016.08.01 |