본문 바로가기

reversing/Windows Driver

MDL(Memory Descriptor List)[1]

SMALL

MDL의 구조체는 다음과 같이 구성되어있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
typedef struct _MDL
{
     PMDL Next;
     SHORT Size;
     SHORT MdlFlags;
     PEPROCESS Process;
     PVOID MappedSystemVa;
     PVOID StartVa;
     ULONG ByteCount;
     ULONG ByteOffset;
} MDL, *PMDL;
 
 
cs


그리고 이제 아래 그림을 통해서 MDL을 설명한다.

            [그림1]

그리고 해당 구조체 다음에 바로 유저의 가상 메모리와 매핑되는 물리 메모리를 가리키는 포인터가 존재한다.

MDL에 어떠한 유저 프로세스에서 접근하는지 알 수 있는 eprocess 포인터 값과 MDL 간의 관계를 표현하기 위한 리스트(PMDL)도 존재한다.

그리고 해당 MDL에서 설명 해야할 가상 주소를 표현하고 있다. 가상 메모리의 A,B,C 연속된 부분을 읽는다고 하면 위와 같이 BaseAddr을 기준으로

Offset, Size를 이용한 부분을 표현한다. 

위에서 설명한 내용의 경우 유저의 가상메모리와 물리 메모리 사이의 관계에 대해서만 서술되어 있다.

그렇기에 커널모드에서 상주하고 있는 드라이버는 위의 페이지 A,B,C에 관한 정보를 구할수 없다.


[그림2]

그렇기에 드라이버가 해당 물리 주소를 찾을수 있게 추가적인 조치가 필요하다. 

다시 정리하면 해당 물리주소의 페이지 조각들은 유저 모드 버퍼의 데이터들의 내용이다.

그리고 지금 드라이버가 필요한 내용은 저 유저 모드 데이터가 저장되어 있는 커널 모드의 가상주소이다.

그렇기에 해당 물리 주소를 가리키는 커널모드의 가상 주소를 할당하는 것이다. 여기서 물리 주소가 할당되는게 아닌 단순히 커널모드 가상주소 할당이다.

그래서 단순히 해당 주소만 연결만 해주면 된다. 

[그림3]


이러한 방식으로 구성되어지면 드라이버는 이제 유저 영역과 물리 메모리와 직접적인 데이터를 통신할수 있게 된다.

그리고 이 MDL의 포인터 값은 IRP 구조체의 멤버로 존재하는데.. 좀 더 주절 주절하면 I/O 통신할 때 IRP를 이용해서 진행된다.

그리고 유저와 직접적인 물리 메모리 통신을 할 때, IRP은 MDL을 참조해서 진행한다.



[출처] https://www.nirsoft.net/kernel_struct/vista/MDL.html

[출처2] http://pk09.tistory.com 의 디바이스-드라이버-0016-애플리케이션과-드라이버-간의-데이터-전송-방법-1


LIST

'reversing > Windows Driver' 카테고리의 다른 글

Buffered I/O  (0) 2017.08.17
I/O Control Codes [IOCTL] 정리  (0) 2017.08.09
WinDBG 명령어 [CallStack]  (0) 2017.08.08
IRP, I/O Stack 관련 내용 정리 [3]  (0) 2017.08.04
IRP, I/O Stack 관련 내용 정리 [2]  (0) 2017.08.04