#c# #windows #driver #system-calls #internals
Вопрос:
Я надеюсь, что вы все в добром здравии
Я пишу загрузчик драйверов, который использует syscall для большей части своих функций в качестве хобби-проекта (в C#, просто чтобы прояснить это)
Я реализовал более двух десятков системных пакетов, которые, похоже, работают так, как ожидалось. Таким образом, нет ничего плохого в коде, который собирает системные вызовы и выполняет их из памяти.
Однако один вызов syscall, «NtLoadDriver», всегда завершается неудачей при обстоятельствах, в которых он должен работать. Т. е.,
- Служба драйверов должна быть зарегистрирована в разделе «РеестрМашинаСистемаТекущий контрольный наборСлужбы» с соответствующими значениями
- Вызывающая программа должна иметь значение LoadDriverPrivilege со значением включено
- Вызывающая программа повышена, имеет права администратора
Код NTSTATUS: STATUS_NO_CALLBACK_ACTIVE C0000258
Описание: Системную службу возврата обратного вызова нельзя выполнить, если обратный вызов не активен.
К сожалению, это ошибка, которую я не могу понять. Может быть, кто-то сможет объяснить это проще.
Я использую загрузчик драйверов OSR для проверки того, зарегистрирована/незарегистрирована служба или запущена/остановлена. И я могу подтвердить, что служба зарегистрирована, и ее можно запускать и останавливать с помощью загрузчика драйверов OSR. И я также могу получить доступ к драйверу, как только он запустится.
Я провел тест, чтобы проверить, не ошиблась ли моя сигнатура функции для NtLoadDriver, или структура UNICODE_STRING, которую я использовал, была неправильной. Итак, я перенес NtLoadDriver из ntdll.dll и проверено с помощью этого. Я использовал ту же подпись, которую использовал для делегата syscall, и передал точно такой же аргумент.
И, к моему удивлению, он, кажется, работает идеально и дает успешный результат (NT_SUCCESS).
Итак, вопрос сводится к следующему: почему NtLoadDriver не работает при прямом вызове через системный вызов? И почему это работает при использовании экспорта ntdll?
Мое предположение состоит в том, что ntdll.dll выполняет некоторую инициализацию и пишет некоторый код вокруг NtLoadDriver, который заставляет его работать. У меня нет навыков обратного проектирования, чтобы на самом деле подтвердить это.
Любая помощь будет оценена по достоинству.
Заранее спасибо.