Case1,用 Procmon 确认个人密钥或证书丢失问题:
接上一篇【断点2: 执行到 CryptGenKey 之前】一节最后的内容。当我们尝试强行删除例程所需要的密钥或证书文件后,再次执行例程,得到控制台输出为 CryptAcquireContext failed: -2146893802。查询此错误代码得到如下解释:
CryptAcquireContext
失败并返回错误码 -2146893802
(或 0x80090016
)通常表示在尝试获取加密服务提供程序(CSP)上下文时发生了错误。这个错误码通常与加密相关的问题有关。常见的导致 CryptAcquireContext
返回此错误码的原因可能包括以下几种:
-
提供程序不可用: 指定的加密提供程序(pszProvider 参数)可能不存在或未正确安装。请确保指定的提供程序名称正确,并且已经正确安装。
-
访问权限问题: 可能缺少执行加密操作所需的访问权限。确保应用程序具有足够的权限来执行加密操作。
-
密钥容器问题:
pszContainer
参数指定了一个密钥容器的名称。如果指定的容器不存在或无法访问,也会导致此错误。确保指定的容器名称有效,并且应用程序有权访问它。 -
密钥存储问题: 与密钥容器相关的密钥存储可能损坏或不可用。这可能需要修复密钥存储或重新创建密钥容器。
-
其他加密配置问题: 还有其他可能的加密配置问题,例如证书、证书链、证书存储等方面的问题。
根据这个错误代码,虽然在网上很容易查询到常见的几种原因,但实际排查起来依然是难以入手。而直接用 Procmon 监视程序的详细事件记录却是非常简单直观的方法。观察实际的 Procmon 日志可以很容易发现程序先是直接访问当前用户目录下的 【663ed5f4fe50a280b70b3badd6c59de5_7914d52b-311e-450f-ad30-0ea710e89468】文件,返回的【Result】是 【NAME NOT FOUND】,意味着没有搜索到目标文件名。接着把精