当我在编译这个项目https://github.com/namazso/hdd_serial_spoofer时,
我收到了上面的错误信息,我该如何解决这个问题?我使用的是VS 2017和WDK 10。
(Must在发行版中编译,不支持调试模式。此项目中没有DriverEntry函数,hwid.cpp中的EntryPoint(void* ntoskrn,void* image,void* alloc)函数是真实的入口点。)
我做了很多研究,但仍然没有得到它的工作。我是一个菜鸟在内核模式驱动程序开发。
5条答案
按热度按时间k4emjkb11#
只需在NTSTATUS返回值之前使用extern“C”,如下所示:
dzjeubhm2#
有几个原因产生的问题。在我的例子中,代码中的try/except可以在x64上编译,但不能在x86上编译。
链接器工具错误LNK 2019https://learn.microsoft.com/en-us/cpp/error-messages/tool-errors/linker-tools-error-lnk2019?view=msvc-170
qij5mzcb3#
该项目使用(一个显然被忽略的)选项
<EntryPointSymbol>
将EntryPoint
定义为条目。这是文档here,但目前的文档似乎意味着这是真的只有.exe和.dll项目。
从Windows驱动程序系统调用的消息的形式
与项目中的EntryPoint不兼容
这并不是那么糟糕,因为没有使用为EntryPoint调用的参数。
所以最简单的实现是
内核开发不适合胆小的人,在计算机上运行无效的内核代码可能会使 Boot 变得困难,或者在极端情况下损坏计算机。我没有检查项目中的任何代码的正确性。
请在虚拟机(vmware、virtualbox、hyper-v)中运行代码,以限制其可能造成的损害
pod7payv4#
这不是WDF直接支持的那种普通驱动程序。它是一个“无人驾驶的驱动程序”,它使用了一个没有文档的黑客,吸引了那些为了乐趣和利润而编写rootkit的程序员。DriverEntry()函数实际上不是驱动程序的入口点,它是回调函数。就像WinMain()函数实际上不是原生Win32程序的入口点一样。项目源代码中的EntryPoint()函数是本机驱动程序入口点的替代。请注意,该项目似乎有rootkitty般的行为,旨在欺骗一个简单的复制保护方案,检查驱动器序列号。
GsDriverEntry()函数是一个普通的Kendash驱动程序中的真实的入口点。它执行基本的初始化以支持/GS compiler option,旨在检测缓冲区溢出。完成后,它调用DriverEntry()。项目将此入口点替换为EntryPoint()。
此项目是使用旧版本的Visual Studio项目模板编写的。要使其正确构建,需要进行以下几项更改:
在此之后,它会变得干净。我没有测试产生的hwid.sys,看起来有点太邪恶,暴露我的机器。
nwwlzxa75#
不要使用
.cpp
源文件来编写驱动程序。将它们更改为.c
,应该可以工作。对我来说就是这样。我知道这看起来微不足道,或者不太可能,但请记住Windows内核代码是C代码,Visual Studio会根据源文件的文件扩展名做出各种假设。