有效PE文件上的STATUS_INVALID_IMAGE_HASH(0xc0000428)

Avi*_*viv -2 c windows assembly winapi internals

我尝试从另一个位置加载DLL文件“ bcryptprimitives.dll”(在我的情况下,该文件最初位于“ C:\ Windows \ syswow64 \ bcryptprimitives.dll”下),带有以下代码段:

LoadLibraryW(L"<altered path>\\bcryptprimitives.dll");
Run Code Online (Sandbox Code Playgroud)

但是,在执行这一行代码后,我得到了以下错误:

在此处输入图片说明

C:\ Program Files(x86)\ Notepad ++ \ bcryptprimitives.dll并非旨在在Windows上运行,或者包含错误。尝试使用原始安装媒体再次安装程序,或与系统管理员或软件供应商联系以获取支持。错误状态为0xc0000428。

我在以下字典中搜索了0xc0000428 NTSTATUS:https ://msdn.microsoft.com/en-us/library/cc704588.aspx ,显然此状态是STATUS_INVALID_IMAGE_HASH

最初的错误是有道理的,因为我将图像PE标头中的“ LoaderFlags”字段从0x00000000更改为0x00000001(由于此字段已弃用,因此不需要任何影响),但是即使我更改了该字段,我也已修复PE校验和。

在此处输入图片说明

如你看到的: 在此处输入图片说明

但是,LoadLibrary仍然拒绝加载DLL。深入研究ntdll发现错误是从内核返回的:

在此处输入图片说明

这让我认为DLL已通过某种方式签名,并且内核检查DLL是否被更改。因此,就我而言,无论如何我如何从另一个位置加载此DLL并删除符号检查?

小智 5

如果DLL已签名,则通过更改文件中的单个字节将使签名无效。看来您正在通过修改PE标头来做到这一点。

为了更深入地了解该技术的工作原理,这篇博客文章可能很有趣:

代码完整性是一项功能,可通过在每次将驱动程序或系统文件加载到内存中时验证驱动程序或系统文件的完整性来提高操作系统的安全性。代码完整性检测是否将未签名的驱动程序或系统文件加载到内核中,或者系统文件是否已被具有管理权限的用户帐户运行的恶意软件修改。在基于x64的操作系统版本上,内核模式驱动程序必须经过数字签名。