0

我们通过 HKLM\Software\Microsoft\WindowsNT\CurrentVersion\Windows\AppInit_DLLS 路径挂钩一个库(比如 xyz.dll)。

我需要调试这个库,所以我创建了非调试 dll(&pdb) 并将其替换为 System32 目录中的原始 xyz.dll 库。现在,当一个进程尝试加载这个库时,我得到一个“坏图像”错误,如下所示 -

“C:\Windows\system32\xyz.dll 不是为在 Windows 上运行而设计的,或者它包含错误。请尝试使用原始安装介质重新安装该程序,或联系您的系统管理员或软件供应商寻求支持。”

我注意到原始 xyz.dll 是代码签名的,因此我还使用 signtool 使用临时证书对编译的非调试 xyz.dll 进行了签名,但这没有帮助。根据 [MSDN] ( http://msdn.microsoft.com/en-us/windows/hardware/gg463040.aspx ) 建议使用代码签名,但不是强制性的。

后来我意识到,当我获得由有效证书签名的非调试库 xyz.dll 时,它可以工作。

我的问题:有什么方法可以让 Windows 7 绕过 dll 的签名验证?每次生成一个有效的证书并签署一个库对于开发/调试目的来说似乎非常麻烦。有什么简单的出路吗?

4

2 回答 2

2

要禁用 AppInit_DLL 的代码签名强制执行,请使用以下键:

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows]
"RequireSignedAppInit_DLLs"=dword:00000000
于 2013-04-10T11:57:39.320 回答
1

windows 验证数字签名的原因是 xyz.dll 是使用 /integritycheck 链接器选项编译的。当我在删除此标志后构建 dll 时,应用程序会加载它而不验证数字签名。

请参阅http://msdn.microsoft.com/en-us/library/dn195769.aspx

于 2013-04-12T05:24:59.857 回答