먼저 NtQuerySystemInformation은 첫번째 인자인 SystemInformationClass를 참조하여 어떤 정보를 보여줄 것인지 판단하고 두번째 인자인 SystemInformation 버퍼를 통해 결과를 보여준다.
(또 NtQuerySystemInformation은 두번의 호출로 값을 얻어오기도 하는데 방식은 4번째 인자가 있고 없고의 차이가 있다. 있으면 Information 크기를 얻어오고, 없으면 Information 크기로 값을 얻어오는 것 같다. 더 확인이 필요함....그러니깐 4번쩌 인자가 들어갔을 때 그 크기를 구해오는 거고 크기를 바탕으로 다시한번 함수를 호출하는 방식으로 정보를 얻는 것..)
NtQuerySystemInformation으로 SystemModuleInformation정보를 얻고자 할 때, 로드되는 메모리 구조는 다음과 같다.
typedef struct _SYSTEM_MODULE_INFORMATION {
ULONG ModulesCount; 0000006f
SYSTEM_MODULE Modules[0];
} SYSTEM_MODULE_INFORMATION, *PSYSTEM_MODULE_INFORMATION;
typedef struct _SYSTEM_MODULE {
ULONG Reserved[2]; 00000000 00000000
PVOID Base; 804d9000
ULONG Size; 001f8c80
ULONG Flags; 0c004000
USHORT Index; 0000
USHORT Unknown; 0000
USHORT LoadCount; 0001
USHORT ModuleNameOffset; 0012
CHAR ImageName[256];
} SYSTEM_MODULE , *PSYSTEM_MODULE
위의 이미지를 예로 들면 ntkrnlpa.exe의 IMG_BASE는 '804d9000'이 되겠다.
활용하자면 NtQuerySystemInformation의 SYSTEM_MODULE_INFORMATION으로 로드된 모듈과 img base, 또는 로드된 모듈 개수, 또는 커널 이미지 정보를 확인 가능하다.
'유용한 지식 자료들 > 드라이버, 커널 관련' 카테고리의 다른 글
IRP 구조체 중 IoStatus.Status에 대한.. (0) | 2012.12.13 |
---|---|
SYSTEM_INFORMATION_CLASS Enumeration (0) | 2012.12.06 |
IRP Dispatch routines (0) | 2012.07.30 |
SDT 후킹의 창과 방패에 대해 쉽게 설명한 글 (0) | 2012.07.03 |
IRP_MJ_QUERY_SECURITY ? (0) | 2012.03.08 |