커널에 로드된 모듈의 목록과 정보를 구하기 위한 방법중, _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 |