如何解决LNK2019 unresolved external symbol DriverEntry referenced in function GsDriverEntry?

How to solve LNK2019 unresolved external symbol DriverEntry referenced in function GsDriverEntry?

我在编译这个项目的时候https://github.com/namazso/hdd_serial_spoofer

我收到上面的错误信息,我该如何解决? 我正在使用 vs 2017 和 wdk 10。

(release必须编译,不支持debug模式,本项目没有DriverEntry函数,hwid.cpp中的EntryPoint(void* ntoskrn, void* image, void* alloc)函数是真正的入口点。)

我做了很多研究,但还是没能成功。我是内核模式驱动程序开发的菜鸟。

该项目使用(显然被忽略的)选项

<EntryPointSymbol>EntryPoint 定义为条目。

这已记录 here,但当前文档似乎意味着这实际上仅适用于 .exe 和 .dll 项目。

从Windows驱动系统

调用的消息形式
NTSTATUS DriverInitialize(
  _DRIVER_OBJECT *DriverObject,
  PUNICODE_STRING RegistryPath
)

与项目中的入口点不兼容

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

这还不错,因为使用了为 EntryPoint 调用的参数中的 none 个。

所以最简单的实现是

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)中的代码来限制它可能造成的损害

这不是普通的驱动,是WDF直接支持的那种。它是一个 "driverless driver",它使用了一种未记录的 hack,它对那些为了乐趣和利润而编写 rootkit 的程序员很有吸引力。 DriverEntry() 函数实际上并不是驱动程序的入口点,它是回调函数。很像 WinMain() 函数实际上并不是本机 Win32 程序的入口点。项目源代码中的 EntryPoint() 函数替代了本机驱动程序入口点。请注意,该项目似乎具有类似 rootkitty 的行为,旨在欺骗检查驱动器序列号的简单复制保护方案。

GsDriverEntry() 函数是普通 KMDF 驱动程序中的真正入口点。它执行必要的初始化以支持 /GS compiler option,旨在检测缓冲区溢出。完成后,它调用 DriverEntry()。该项目将此入口点替换为 EntryPoint()。

此项目是使用旧版本的 Visual Studio 项目模板编写的。需要进行一些更改才能正确构建它:

  • C/C++ > 代码生成 > 安全检查。必须是"Disable security check (/GS-)",原来的工程文件就对了
  • 同一 属性 页面 > 控制流防护。必须设置为 "No" 以防止链接器错误。此选项添加额外的安全检查,这些检查无法工作且必须禁用。
  • C/C++ > 常规 > SDL 检查。使用下拉箭头覆盖 "inherit from parent",使该选项显示为空白。需要禁用更多安全检查,禁止显示 sdl- 与 /gs- 不兼容的警告。
  • 同一 属性 页面 > 警告级别。覆盖 "Level3 (/W3)",抑制有关未使用函数参数的警告。
  • 链接器 > 输入 > 附加依赖项。单击下拉箭头 > 编辑。取消选中 "Inherit from parent" 复选框并更改为 $(DDK_LIB_PATH)ntoskrnl.lib。请注意继承值列表框中的 $(KernelBufferOverflowLib) 条目解析为 bufferoverflowfastfailk.lib,即包含 GsDriverEntry() 并产生链接器错误的条目。
  • 链接器 > 高级 > 入口点。一定是"EntryPoint",原项目模板做对了。

在此之后它构建干净。我没有测试生成的 hwid.sys,看起来有点太邪恶了,不能让我的机器接触它。

不要使用 .cpp 源文件来编写您的驱动程序。将它们更改为 .c,它应该可以工作。我就是这样。

我知道它看起来微不足道,或者不太可能,但请记住 Windows 内核代码是 C 代码并且 Visual Studio 会根据源文件的文件扩展名做出各种假设。

产生该问题的原因有多种。在我的例子中,代码中的 try/except 在 x64 上编译,但在 x86 上不编译。

链接器工具错误 LNK2019 https://docs.microsoft.com/en-us/cpp/error-messages/tool-errors/linker-tools-error-lnk2019?view=msvc-170