我尝试加载DLL文件" bcryptprimitives.dll" (在我的情况下,最初位于" C:\ Windows \ syswow64 \ bcryptprimitives.dll")来自其他位置,使用以下代码片段:
LoadLibraryW(L"<altered path>\\bcryptprimitives.dll");
然而,在执行这行代码后,我收到以下错误:
C:\ Program Files(x86)\ Notepad ++ \ bcryptprimitives.dll要么不是设计为在Windows上运行,要么包含错误。尝试使用原始安装介质再次安装程序,或与系统管理员或软件供应商联系以获取支持。错误状态0xc0000428。
我搜索了以下词典中的0xc0000428 NTSTATUS:https://msdn.microsoft.com/en-us/library/cc704588.aspx
显然这种状态意味着STATUS_INVALID_IMAGE_HASH
。
首先出现错误是有道理的,因为我改变了&#34; LoaderFlags&#34;图像PE头中的字段从0x00000000到0x00000001(由于不推荐使用该字段,因此不需要影响任何内容),但即使我更改了字段,我也修复了PE校验和。
但是,LoadLibrary仍然拒绝加载DLL。
潜入ntdll
深入揭示错误是从内核返回的:
它让我认为DLL以某种方式签名,内核检查DLL是否被更改。 所以在我看来,如何从其他位置加载此DLL并删除签名?
答案 0 :(得分:4)
如果DLL已签名,则通过更改文件中的单个字节将使签名无效。看来你正在通过修改PE头来做到这一点。
This blog post可能会对深入了解此技术如何运作感兴趣:
代码完整性是一种通过在每次将驱动程序或系统文件加载到内存时验证其完整性来提高操作系统安全性的功能。代码完整性检测是否正在将未签名的驱动程序或系统文件加载到内核中,或者系统文件是否已被具有管理权限的用户帐户运行的恶意软件修改。在基于x64的操作系统版本中,必须对内核模式驱动程序进行数字签名。
答案 1 :(得分:1)
找到一个快速解决方案:
DWORD dwIndex = 0;
hFile = CreateFileW(L"C:\\Program Files (x86)\\Notepad++\\bcryptprimitives.dll", FILE_READ_DATA | FILE_WRITE_DATA, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
while (ImageRemoveCertificate(hFile, dwIndex))
{
++dwIndex;
}
LoadLibraryW(L"C:\\Program Files (x86)\\Notepad++\\bcryptprimitives.dll");
它像魅力一样工作:)
这就是API的工作原理: