Пока приходит в голову такая штука- получить SECTION_OBJECT(объект секция) например кода драйвера, далее по нему выйти на FILE_OBJECT, а уже потом раскрутить этот FILE_OBJECT. Но тут возникают трудности.
1) Как получить SECTION_OBJECT? Например handle на него легко получить при помощи MmLockPagableCodeSection(надеюсь что она возвращает handle объекта секции), а потом обратно все востановить, но это как-то зверски. В DRIVER_OBJECT есть указатель с именем DriverSection, но я не уверен что это действительно указаетль, а может handle, попытки выяснить это при помощи дебагера ничего не дали- это не похоже ни на указатель ни на handle. В принципе можно посмотреть на дизассемблерный листинг ядра и сделать получение SECTION_OBJECT как там- там какой-то список секций поддерживается.
2) Второй вопрос- а какова связь между файлом на диске и загруженным драйвером(то есть имеет ли смысл копать полученный FILE_OBJECT), например загрузив драйвер, соотвествующий ему файл можно удалить, то есть файл не заблокирован, а соотвественно смысла большого не имеет. Вот тут вопрос- а где же хранятся PAGEABLE секции драйвера, исполняемые файлы как известно не сбрасываются в страничный файл, так как их код всегда доступен из файла на диске, а вот для драйвера это похоже не так, вероятно его код находится в страничном файле.
3) Ну и наконец- структура объекта секции не документирована, но вот у меня есть ее определение(взято с
www.ntndis.com до падения там форума)
struct _SECTION_OBJECT
{
void* StartingVa;
void* EndingVa;
void* Parent;
void* LeftChild;
void* RightChild;
struct _SEGMENT_OBJECT* Segment;
};
struct _SEGMENT_OBJECT
{
void* BaseAddress;
DWORD TotalNumberOfPtes;
struct _LARGE_INTEGER SizeOfSegment;
DWORD NonExtendedPtes;
DWORD ImageCommitment;
struct _CONTROL_AREA* ControlArea;
struct _SUBSECTION* Subsection;
struct _LARGE_CONTROL_AREA* LargeControlArea;
struct _MMSECTION_FLAGS* MmSectionFlags;
struct _MMSUBSECTION_FLAGS* MmSubSectionFlags;
};
struct _CONTROL_AREA
{
struct _SEGMENT* Segment;
struct _LIST_ENTRY DereferenceList;
DWORD NumberOfSectionReferences;
DWORD NumberOfPfnReferences;
DWORD NumberOfMappedViews;
WORD NumberOfSubsections;
WORD FlushInProgressCount;
DWORD NumberOfUserReferences;
struct UnnamedStruct_7ECCD8 u;
struct _FILE_OBJECT* FilePointer;
struct _EVENT_COUNTER* WaitingForDeletion;
WORD ModifiedWriteCount;
WORD NumberOfSystemCacheViews;
};
//
// yoi aeaeii union e aai ii?ii caiaieou ia DWORD
//
struct UnnamedStruct_7ECCD8
{
DWORD LongFlags;
struct _MMSECTION_FLAGS Flags;
};
struct _MMSECTION_FLAGS
{
unsigned BeingDeleted;
unsigned BeingCreated;
unsigned BeingPurged;
unsigned NoModifiedWriting;
unsigned FailAllIo;
unsigned Image;
unsigned Based;
unsigned File;
unsigned Networked;
unsigned NoCache;
unsigned PhysicalMemory;
unsigned CopyOnWrite;
unsigned Reserve;
unsigned Commit;
unsigned FloppyMedia;
unsigned WasPurged;
unsigned UserReference;
unsigned GlobalMemory;
unsigned DeleteOnClose;
unsigned FilePointerNull;
unsigned DebugSymbolsLoaded;
unsigned SetMappedFileIoComplete;
unsigned CollidedFlush;
unsigned NoChange;
unsigned HadUserReference;
unsigned ImageMappedInSystemSpace;
unsigned UserWritable;
unsigned Accessed;
unsigned GlobalOnlyPerSession;
unsigned Rom;
unsigned filler;
};
и второй вариант(откуда взял- не помню)
struct _SECTION_OBJECT
{
void* StartingVa;
void* EndingVa;
void* Parent;
void* LeftChild;
void* RightChild;
struct _SEGMENT_OBJECT* Segment;
};
struct _SEGMENT_OBJECT
{
void* BaseAddress;
DWORD TotalNumberOfPtes;
struct _LARGE_INTEGER SizeOfSegment;
DWORD NonExtendedPtes;
DWORD ImageCommitment;
struct _CONTROL_AREA* ControlArea;
struct _SUBSECTION* Subsection;
struct _LARGE_CONTROL_AREA* LargeControlArea;
struct _MMSECTION_FLAGS* MmSectionFlags;
struct _MMSUBSECTION_FLAGS* MmSubSectionFlags;
};
struct _CONTROL_AREA
{
struct _SEGMENT* Segment;
struct _LIST_ENTRY DereferenceList;
DWORD NumberOfSectionReferences;
DWORD NumberOfPfnReferences;
DWORD NumberOfMappedViews;
WORD NumberOfSubsections;
WORD FlushInProgressCount;
DWORD NumberOfUserReferences;
struct UnnamedStruct_7ECCD8 u;
struct _FILE_OBJECT* FilePointer;
struct _EVENT_COUNTER* WaitingForDeletion;
WORD ModifiedWriteCount;
WORD NumberOfSystemCacheViews;
};