通过PublicKeyToken防止外部程序集注入

时间:2012-11-14 02:12:19

标签: c# .net-4.0 assemblies code-injection

我正在使用以下代码:

AppDomain.CurrentDomain.AssemblyLoad += (sender, args) =>
{
    var token = args.LoadedAssembly.GetName().GetPublicKeyToken();

    if (!IsValidToken(token))
    {
        Process.GetCurrentProcess().Kill();
    }
};

其中IsValidToken()将正在加载的程序集的公钥标记与我的应用程序中硬编码的授权公钥标记列表作为字节数组进行比较。

这是防止代码注入攻击的良好安全措施吗?此外,鉴于我稍后将使用NetReactor模糊我的应用程序,这是否必要?我试图阻止任何“窥探”我的应用程序,不仅来自Snoop工具,而且来自任何外部不受欢迎的来源。

2 个答案:

答案 0 :(得分:3)

乍看之下,我会说“不,这还不够”。

原因:

  • CreateRemoteThread攻击是直接的win32调用,没有托管代码跟踪会使这样的探测器跳闸

  • 我认为可以在注入的dll中创建另一个AppDomain,从而完全绕过此检查。然后可以执行AppDomain的代码,可能(我必须考虑通过)通过AppDomain

  • 回调“主”AppDomain.DoCallback
  • Process.Kill是丢弃应用程序的一种可怕方式,虽然它是一种不可捕获的方式 - 也就是说,任何附加的人都无法阻止它(它使用Win32 { {1}}引擎盖下

我必须破坏我的“Injecterator”线束来测试这些陈述,所以 - 如果我能记住我把那些代码放在哪里......

无论这些是什么 - 你绝对想要混淆这个集会的地狱,特别是如果你计划在内部存储敏感位(事实上,我反对存储 ANY 敏感如果你可以提供帮助,那么程序集内的信息) - 你的预防方法绝对不会阻止像Reflector,ILSpy,dotPeek等任何反汇编程序。

答案 1 :(得分:2)

如果在运行时生成完整键(可能来自多个部分键),也会更安全。这可以用于静态检查二进制文件的密钥。