본문 바로가기

reversing/rootkit

장치 노드[Device node], 장치 개체[Device Object] 개념

SMALL

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;

각 장치가 연결되면 각 장치마다 위의 구조와 같은 구조의 인스턴스가 생성되는 것이다.

좀 더 직관적으로 설명하고자 한다. 하나의 USB가 연결되면 해당 USB를 관리 할 때 사용 하기 위해서

커널에서 위의 구조와 같은 개체를 생성해서 관리하는 것이다.  생성된 개체를 장치 개체라고 하는 것이다.

위의 구조를 보면 알수 있지만 장치를 관리하기 위한 여러가지 정보들이 들어 있는 것을 알 수있다.

관련된 자세한 내용은 다음에 정리하고자 한다.

만약에 5개의 USB와 1개와 오디오가 연결 된다면, 각 각 USB 5개 오디오 1개 장치 개체가 생성될 것이다.

USB1 Device object 

USB2 Device object 

USB3 Device object 

USB4 Device object 

USB5 Device object 

Audio Device object


to be continue.





[출처] 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

LIST