检查EXE上的数字签名
本文关键字:数字签名 EXE 检查 | 更新日期: 2023-09-27 18:06:57
我的。net exe是使用signtool签名的。使用这段代码,我可以验证证书本身的有效性:
var cert = X509Certificate.CreateFromSignedFile("application.exe");
var cert2 = new X509Certificate2(cert.Handle);
bool valid = cert2.Verify();
但是,这只检查证书本身,而不检查EXE的签名。因此,如果EXE被篡改,此方法不会检测到它。
如何查看签名?
您需要从wintrust.dll
调用(p/Invoke) WinVerifyTrust()
函数。(据我所知)在托管。net中没有其他选择。
你可以在这里找到这个方法的文档。
已经有人在SO上问过这个问题了。它没有被接受,但它应该是正确的(我只是滚动了一下)。看一看你也可以看看这个指南,但是它们的作用是一样的
我搜索了github,发现Azure Microsoft c#代码使用PowerShell对象来检查有效的Authenticode签名。
/// <summary>
/// Check for Authenticode Signature
/// </summary>
/// <param name="providedFilePath"></param>
/// <returns></returns>
private bool VerifyAuthenticodeSignature(string providedFilePath)
{
bool isSigned = true;
string fileName = Path.GetFileName(providedFilePath);
string calculatedFullPath = Path.GetFullPath(providedFilePath);
if (File.Exists(calculatedFullPath))
{
Log.LogMessage(string.Format("Verifying file '{0}'", calculatedFullPath));
using (PowerShell ps = PowerShell.Create())
{
ps.AddCommand("Get-AuthenticodeSignature", true);
ps.AddParameter("FilePath", calculatedFullPath);
var cmdLetResults = ps.Invoke();
foreach (PSObject result in cmdLetResults)
{
Signature s = (Signature)result.BaseObject;
isSigned = s.Status.Equals(SignatureStatus.Valid);
if (isSigned == false)
{
ErrorList.Add(string.Format("!!!AuthenticodeSignature status is '{0}' for file '{1}' !!!", s.Status.ToString(), calculatedFullPath));
}
else
{
Log.LogMessage(string.Format("!!!AuthenticodeSignature status is '{0}' for file '{1}' !!!", s.Status.ToString(), calculatedFullPath));
}
break;
}
}
}
else
{
ErrorList.Add(string.Format("File '{0}' does not exist. Unable to verify AuthenticodeSignature", calculatedFullPath));
isSigned = false;
}
return isSigned;
}
要验证签名的。exe文件的完整性,我们可以使用StrongNameSignatureVerificationEx方法:
[DllImport("mscoree.dll", CharSet = CharSet.Unicode)]
public static extern bool StrongNameSignatureVerificationEx(
string wszFilePath, bool fForceVerification, ref bool pfWasVerified);
var assembly = Assembly.GetExecutingAssembly();
bool pfWasVerified = false;
if (!StrongNameSignatureVerificationEx(assembly.Location, true, ref pfWasVerified))
{
// it's a patched .exe file!
}
但这还不够。可以删除签名,然后再次应用/重新创建它!(有很多工具可以做到这一点)在这种情况下,您需要将签名的公钥存储在某处(作为资源),然后将其与新的/当前的公钥进行比较。更多信息在这里