11

我正在使用以下代码:

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

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

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

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

4

2 回答 2

3

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

原因:

  • CreateRemoteThread攻击是直接的 win32 调用,没有托管代码跟踪会像这样触发检测器

  • 我认为可以AppDomain在注入的 dll 中创建另一个,从而完全绕过此检查。然后可以从那里执行代码AppDomain,可能(我必须仔细考虑)通过回调调用“main AppDomainAppDomain.DoCallback

  • Process.Kill删除应用程序是一种可怕的方式,尽管它是一种不可捕获的方式 - 也就是说,任何连接的人都无法阻止它(它TerminateProcess在引擎盖下使用 Win32)

我必须打破我的“注入器”工具来测试这些语句,如果我能记得我把代码放在哪里......

不管这些——你绝对想把这个程序集弄糊涂,特别是如果你打算在里面存储敏感位(事实上,如果你能提供帮助,我反对在程序集中存储任何敏感信息) - 你的预防方法绝对不会阻止任何反汇编程序,如 Reflector、ILSpy、dotPeek 等。

于 2013-03-05T00:55:17.087 回答
2

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

于 2013-03-08T21:49:56.300 回答