【问题标题】:How to check dll Authenticode?如何检查dll Authenticode?
【发布时间】:2018-02-23 21:56:25
【问题描述】:

我有一个经过数字签名的 dll,当我的应用程序启动时,我想检查这个 dll 是否是“原始的”,特别是没有被假的替换。 如何检查 Authenticode 签名?

我从来没有做过这样的事情,我需要一些帮助才能开始。

更新

我想阻止某人用他们自己的 dll 替换并为这个 dll 提供他们自己的 api 方法,因此 myApp.exe 总是显示为正确许可。

我问过作者,他告诉我:

“您可以采取一些步骤来防止您提到的破解类型。例如,您可以在代码中的某处通过检查 Authenticode 签名是否仍然有效来验证 TurboActivate(TurboActivate 是代码签名的)。或者,如果您想要一个更简单的解决方案,您可以进行简单的 MD5 或 CRC 检查。这将防止 TurboActivate 被恶意版本“插入”替换。”

【问题讨论】:

  • 使用强命名程序集 - stackoverflow.com/questions/2354129/…
  • @auburg dll 不是我的,由另一位作者提供,所以我无权访问代码
  • Afaik .Net 会在您使用强命名签名库时自动执行此操作,方法是在引用中包含公钥。
  • @FacundoColidio 要记住的一件事是,你的程序也可以(感谢反编译器和其他有用工具的奇迹)也可以轻松修改 - 例如完全删除检查或将检查许可证的 IL 代码替换为始终返回 true 的函数。 (你可以认为这是最简单的破解形式)
  • 篡改原生 dll 比仅仅篡改程序以绕过 dll 的调用要困难得多,工作量也更大。在这种情况下检查本机 dll 有点毫无意义......就像用额外的铅带加固钢门,而它就设置在打开的窗户旁边。

标签: c# cryptography authenticode


【解决方案1】:

如果 dll 是您程序的常规引用,则会自动为您完成检查,如果被篡改,您的程序将无法启动。您不需要做任何额外的事情,这是正常启动和查找所有引用的程序集例程的一部分。


如果这个程序集在你程序中的某个时刻“在你背后”加载,你可以查看它并检查它的令牌:

var assembly = AppDomain.CurrentDomain.GetAssemblies().First(a => a.FullName.Contains("TurboActive"));
var token = assembly.GetName().GetPublicKeyToken();

// check if token is *their* valid token

【讨论】:

  • @FacundoColidio 您是否正在寻找类似证书固定但用于 dll 的东西?您可能想在您的问题中提供更多详细信息 - 根据您要执行的操作,简单地“检查”签名可能还不够。
  • @nvoigt 不幸的是我在你的代码的第一行:“序列不包含元素”,也许这是因为 dll 是动态加载的
  • 那么在你调用它的时候没有加载任何dll。您需要在加载 dll 后调用它(无论何时...我想知道它是如何工作的,加载了一个 dll,但您没有引用任何内容...听起来很可疑。
  • @nvoigt 原来 dll 不是 .Net 程序集
  • 啊,我刚刚读到它是一个原生 dll?那么这将不起作用。
猜你喜欢
  • 2023-03-16
  • 2023-03-28
  • 2012-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多