DRIVER_OBJECT.DriverSection - PullRequest
       8

DRIVER_OBJECT.DriverSection

1 голос
/ 26 января 2012

Кто-нибудь имеет представление о структуре указателя DriverSection в 64-битной версии win7. В 32-битном я использовал следующее:

typedef struct _KLDR_DATA_TABLE_ENTRY {
   LIST_ENTRY InLoadOrderLinks;
   PVOID ExceptionTable;
   ULONG ExceptionTableSize;
   //ULONG padding1;
   PVOID GpValue;
   PVOID NonPagedDebugInfo;
   PVOID DllBase;
   PVOID EntryPoint;
   ULONG SizeOfImage;
   UNICODE_STRING FullDllName;
   UNICODE_STRING BaseDllName;
   ULONG Flags;
   USHORT LoadCount;
   USHORT __Unused5;
   PVOID SectionPointer;
   ULONG CheckSum;
   //ULONG Padding2;
   PVOID LoadedImports;
   PVOID PatchInformation;
} KLDR_DATA_TABLE_ENTRY, *PKLDR_DATA_TABLE_ENTRY; 

И все работало, но на x64 происходит сбой при попытке разыменования LIST_ENTRY. Любые указатели / советы будут с благодарностью

1 Ответ

1 голос
/ 08 января 2013

И все работало, но на x64 происходит сбой при попытке разыменования LIST_ENTRY. Любые указатели / советы будут с благодарностью

Если вы можете подключить отладчик ядра, вы можете проверить, соответствует ли объект DriverSection вашему определению. Чтобы сделать это, выберите драйвер, который вы хотите отладить - я использую простой, который есть у меня. Загрузите его символы, зафиксировав путь к символу, чтобы включить его pdb, затем разбейте windbg или kd и введите:

.reload

Чтобы перезагрузить символы. Затем вы можете загрузить драйвер с:

sc start drivername

создав службу, предполагая, что это устаревший драйвер. Тип:

bu drivername!DriverEntry

для установки точки останова на DriverEntry для этого модуля. Разница между bp и bu заключается в том, что bu контрольные точки оцениваются и устанавливаются при загрузке модуля. В настоящее время, конечно, DriverEntry не будет вызываться, но если мы перезагрузим драйвер, он будет:

sc stop drivername
sc start drivername

Теперь ваша точка останова должна быть достигнута, и rcx будет содержать структуру DRIVER_OBJECT, поскольку это аргумент указателя, а аргументы указателя / целого числа передаются в rcx, rdx, r8, r9 в соответствии с ABI Windows. Таким образом, вы можете распечатать структуру объекта драйвера с помощью:

dt _DRIVER_OBJECT (address of rcx)

Что даст вам указатель на раздел драйверов. Затем введите:

dt _LDR_DATA_TABLE_ENTRY (driver section object pointer)

Это должно дать вам объект раздела драйвера. _LDR_DATA_TABLE_ENTRY фактически присутствует в символах Windows, так что это будет работать.

Используя отладчик, вы сможете успешно разыменовать указатели LIST_ENTRY (.flink и .blink) (попробуйте dpps по адресу _LDR_DATA_TABLE_ENTRY structure, for example). If you do it successfully, one of those addresses will resolve to nt! PsLoadedModuleList`.


Я пытаюсь сказать, что окольным путем это:

  1. Либо в вашем коде есть ошибка, либо
  2. Вы столкнулись с проблемой синхронизации. Помните, эта структура должна быть непрозрачной, и мы не должны изменять ее каким-либо образом. Он также может измениться, и мы не знаем, где находится замок для синхронизации доступа к нему.

Если вы уверены, что 1 - это не тот случай, скорее всего, это 2. К счастью, Microsoft фактически предоставила функцию для получения информации из этих структур, которая называется AuxKlibQueryModuleInformation(). Вам нужно добавить дополнительную библиотеку в ваш драйвер, но это еще не конец света. Включите Aux_klib.h. На странице MSDN также есть пример кода, показывающий, как его использовать - это довольно просто.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...