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