Как решить LNK2019 с неразрешенным внешним символом DriverEntry, на который ссылается функция GsDriverEntry? - PullRequest
0 голосов
/ 11 сентября 2018

Пока я компилировал этот проект https://github.com/namazso/hdd_serial_spoofer

Я получил сообщение об ошибке выше, как я могу решить эту проблему?Я использую vs 2017 и wdk 10.

(Должен компилироваться в релизе, режим отладки не поддерживается. В этом проекте нет функции DriverEntry, EntryPoint (void * ntoskrn, void * image, void *Функция alloc) в hwid.cpp - реальная точка входа.)

Я провел много исследований, но все еще не смог заставить его работать. Я новичок в разработке драйвера режима ядра.

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

Это не обычный драйвер, который поддерживается напрямую WDF.Это «драйвер без драйверов», он использует недокументированный хак, который привлекает программистов, которые пишут руткиты для удовольствия и получения прибыли.Функция DriverEntry () на самом деле не является точкой входа для драйвера, это обратный вызов.Как и функция WinMain (), она не является точкой входа для родной программы Win32.Функция EntryPoint () в исходном коде проекта заменяет исходную точку входа драйвера.Имейте в виду, что у проекта, похоже, есть руткитти-поведение, предназначенное для обмана упрощенной схемы защиты от копирования, которая проверяет серийный номер диска.

Функция GsDriverEntry () является реальной точкой входа в обычный драйвер KMDF.Он выполняет необходимую инициализацию для поддержки опции компилятора / GS , предназначенной для обнаружения переполнения буфера.После этого он вызывает DriverEntry ().Проект заменяет эту точку входа на EntryPoint ().

Этот проект был написан со старой версией шаблона проекта Visual Studio.Для правильной сборки необходимо внести несколько изменений:

  • C / C ++> Генерация кода> Проверка безопасности.Должно быть «Отключить проверку безопасности (/ GS-)», исходный файл проекта получил это право.
  • Же страница свойств> Control Flow Guard.Должно быть установлено «Нет», чтобы предотвратить ошибку компоновщика.Эта опция добавляет дополнительные проверки безопасности, которые не могут работать и должны быть отключены.
  • C / C ++> General> SDL проверки.Используйте стрелку выпадающего меню, чтобы переопределить «наследовать от родителя», чтобы опция оставалась пустой.Дополнительные проверки безопасности, которые необходимо отключить, подавляют предупреждение о том, что sdl- несовместимо с /gs-.
  • Страница того же свойства> Уровень предупреждения.Переопределить на «Level3 (/ W3)», подавляет предупреждения о том, что аргументы функции не используются.
  • Линкер> Ввод> Дополнительные зависимости.Нажмите стрелку выпадающего меню> Изменить.Снимите флажок «Наследовать от родителя» и замените его на $ (DDK_LIB_PATH) ntoskrnl.lib.Обратите внимание на запись $ (KernelBufferOverflowLib) в списке Inherited values, которая преобразуется в bufferoverflowfastfailk.lib, который содержит GsDriverEntry () и выдает ошибку компоновщика.
  • Linker> Advanced> Entry Point.Должно быть, «EntryPoint», оригинальный шаблон проекта получил это право.

После этого он строит чистый.Я не проверял полученный hwid.sys, выглядит слишком злым, чтобы выставлять мою машину ему.

0 голосов
/ 17 сентября 2018

В проекте используется (очевидно игнорируемый) параметр

<EntryPointSymbol> для определения EntryPoint в качестве записи.

Это задокументировано здесь , но текущая документацияПо-видимому, это означает, что это действительно только для проектов .exe и .dll.

Форма сообщения, вызываемого из системы драйверов Windows

NTSTATUS DriverInitialize(
  _DRIVER_OBJECT *DriverObject,
  PUNICODE_STRING RegistryPath
)

Несовместима с EntryPoint в проекте

EntryPoint(void* ntoskrn, void* image, void* alloc)

Это не так уж и плохо, так как не используется ни один из параметров, вызываемых для EntryPoint.

Поэтому простейшей реализацией будет

extern "C"
{
    DRIVER_INITIALIZE DriverEntry;
    _Use_decl_annotations_
        NTSTATUS
        DriverEntry(
            struct _DRIVER_OBJECT  *DriverObject,
            PUNICODE_STRING  RegistryPath
        )
    {
        EntryPoint(NULL, NULL, NULL);
        return STATUS_SUCCESS;
    }
}

Разработка ядраэто не для слабонервных, и запуск недействительного кода ядра на вашем компьютере может затруднить загрузку или в экстремальных случаях повредить компьютер.Я не проверял ни один код в проекте на правильность.

Пожалуйста, запустите код на виртуальной машине (vmware, virtualbox, hyper-v), чтобы ограничить ущерб, который он может нанести

...