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

我正在使用以下代码:

AppDomain.CurrentDomain.AssemblyLoad += (sender, args) => { var token = args.LoadedAssembly.GetName().GetPublicKeyToken(); if (!IsValidToken(token)) { Process.GetCurrentProcess().Kill(); } }; 

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

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

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

原因:

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

  • 我认为可以在注入的dll中创建另一个AppDomain ,从而完全绕过这个检查。 然后可以从该AppDomain执行代码,可能(我必须考虑通过)通过AppDomain.DoCallback回调到“主” AppDomain.DoCallback

  • Process.Kill是一种丢弃应用程序的可怕方式,虽然它是一种不可捕获的方式 – 也就是说,任何附加的人都无法阻止它(它使用Win32 TerminateProcess

我不得不淘汰我的“Injecterator”线束来测试这些陈述 – 如果我能记住我把那些代码放在哪里……

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

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