本帖最后由 www-tekeze 于 2019-5-1 22:57 编辑
这个问题应该请教@wowocock 大佬吧。。。我刚问了下度娘,64位内核系统只能运行64位驱动程序,而且还多了两项保护机制。。。但还是等大肉鸡来回复你。。 摘录:
“在用户层上,64 位系统为了向下兼容 32 位程序,确保 32 位程序可以正常在 64 位系统上正常运行,于是提供了 WOW64 子系统。WOW64 为现有的 32 位应用程序提供了 32 位的模拟环境,可以使大多数 32 位应用程序在无需修改的情况下运行在 64 位Windows版本上。但是,在内核层下,Windows并没有提供类似WOW64的子系统,所以,64 位内核系统只能运行 64 位的驱动程序。
无论是用户层还是内核层程序开发,绝大部分程序功能是基于 Windows 提供的API函数接口实现的。尽管各个版本的 Windows 操作系统 API 函数内部的实现方法不尽相同,但 API 函数保持着相同的函数名称、相同的参数以及返回值。这便保证了绝大多数的程序,不需要修改源码,也不用重新编译,即可在不同版本的 Windows 上运行,保证二进制级的兼容性。所以,对于基于 API 函数接口实现的功能代码,无论是 32 位还是 64 位 Windows 系统都是兼容的。在 32 位和 64 位程序开发中,需要额外注意指针长度变化的问题。 但是,内核层下的 Rootkit 开发与正常的开发有一个很大的不同就是,Rootkit 程序为了躲避杀软的检测,将自己做得更底层,所以就会舍弃调用 Windows 提供的API函数接口,而去调用更底层的、Windows 未公开、未文档化的函数或者结构。由于各个版本的 Windows 内核是不相同的,导致各个版本上的特征码也不相同,所以通过特定码定位地址的方式兼容性很差,需要获取各个系统版本的特征码。 32 位和 64 位的内核开发也有很大的不同,总的来说,64 位内核增加了两大保护机制,一个是KPP(Kernel Patch Protection)内核补丁保护,另一个是DSE((Driver Signature Enforcement)驱动签名强制。KPP 保护机制利用 Patch Guard 技术来检查内核的关键内存有没有被修改,若保护区域被修改,则会触发蓝屏。其中,Patch Guard 技术保护的内存包括关键的结构体(例如 SSDT 和 GDT 等)以及关键的系统驱动内存(例如ntoskrnl.exe、ndis.sys、hal.dll等)。DSE 保护机制则是拒绝加载不包含正确签名的驱动,要求驱动程序必须正确签名方可加载运行。 所以,要想在 64 位 Windows 内核下开发稳定运行的驱动程序,就不要触犯上述两大保护机制。当然,有保护机制出现,自然也会有相应的绕过方法。由于绕过方法已经超出了本书《WINDOWS黑客编程技术详解》的内容范围,在此就不进行介绍了。”
|