Kernel mode2013. 8. 19. 14:51

커널에 로드된 모듈의 목록과 정보를 구하기 위한 방법중, _LDR_DATA_TABLE_ENTRY 구조체를 가져와서 리스트를 순회하면서 구해오는 방법이 있다.

_LDR_DATA_TABLE_ENTRY 구조체의 시작 주소는 DriverEntry의 파라미터로 전달되는 DRIVER_OBJECT 구조체에서 찾을 수 있다. 아래는 _DRIVER_OBJECT 구조체의 일부이며 여기서 DriverSection은 자기자신의 _LDR_DATA_TABLE_ENTRY 구조체 주소를 가리키고 있다.



커널 모듈의 경우 리스트 형태로 되어있으며, 모듈이 로드될때마다 리스트 형태로 재구성된다.

커널 모듈하면 가장 먼저 떠오르는 ntoskrnl.exe / ntkrnlpa.exe 모듈이 첫번째로 로드가 되고 드라이버가 설치되는 시점에는 자기자신의 드라이버가 리스트 가장 마지막에 위치하게 된다.


우선 DriverSection의 주소를 _LDR_DATA_TABLE_ENTRY 형태로 출력해보면 자기자신의 정보가 출력된다.

자기 자신이 가장 마지막에 로드되어 있을 것이므로 InLoadOrderLinks의 FLink는 첫번째 로드된 모듈의 정보가 있을 것이다.

- InLoadOrderLinks : 메모리에 로드된 순서

- InMemoryOrderLinks : 메모리에 위치한 순서

- InInitializationOrderLinks : 초기화된 순서

하지만 InLoadOrderLinks->FLink의 값을 출력해보면 뭔가 맞지 않다는 것을 알 수 있다.

EntryPoint, SizeOfImage, FullDllName, BaseDllName 등 _LDR_DATA_TABLE_ENTRY 구조체 형태가 아닌 것을 알 수 있다.


 

MyDriver.sys


 

첫번째 커널 모듈


리스트 처음에 해당하는 0x82D83810주소를 리스트로 출력해보면, 2번째 리스트에 있는 주소가 ntoskrnl.exe 모듈의 구조체 주소인 것을 알 수 있다.


 


즉, 현재 메모리에 로드된 순서로 리스트를 보면 다음과 같은 형태로 되어있다.

가장 처음에 무엇인지 모를 리스트 주소가 있고, 그 다음에 ntoskrnl.exe가 로드되고,

그 뒤로 쭉쭉쭉 모듈들이 로드되는 것이다.


82d83810  84531c98 85b915b0 00000005 00000a98    -> nt!PsLoadedModuleList

84531c98  84531c20 82d83810 82ca3764 00000012    -> ntoskrnl.exe

84531c20  84531ba0 84531c98 82c05d50 00000003

...

85ab3d38  85b915b0 85aa4ca0 90367560 00000002

85b915b0  82d83810 85ab3d38 903d02b0 00000002    -> MyDriver.sys


이 정체불명의 주소가 무엇인지 확인을 해보니, 이미 적어놓은것처럼 커널 모듈의 리스트를 가리키는 PsLoadedModuleList가 있다. WinDbg에서 심볼이 로드되어 있다면 아래처럼 확인이 가능하다.


'Kernel mode' 카테고리의 다른 글

ConfigFlags  (0) 2013.11.15
Prefetch / Process Carving : 종료된 프로세스 탐지  (0) 2013.10.31
Windows Kernel  (0) 2013.08.20
ObjectHook - OpenProcedure  (0) 2013.08.06
ddkbuild - #pragma message  (0) 2013.08.06
Posted by hswang