我使用下面的代码:
AppDomain.CurrentDomain.AssemblyLoad += (sender, args) =>
{
var token = args.LoadedAssembly.GetName().GetPublicKeyToken();
if (!IsValidToken(token))
{
Process.GetCurrentProcess().Kill();
}
};
凡IsValidToken()
比较加载反对我作为字节数组应用硬编码授权的公钥标记列表组件的公钥标记。
这是一个很好的安全措施,以防止代码注入攻击? 此外,这是必要给出的事实,我会使用NetReactor后模糊处理我的申请? 我想,以防止任何“窥探”到我的应用程序,不仅从窥探工具来了,但是从任何外部不想要的来源也是如此。
刚刚从第一眼,我会说:“不,这是不够的”。
原因:
CreateRemoteThread
攻击直Win32调用,没有托管代码的痕迹会跳闸探测器像这样
我认为这将有可能创造另一个AppDomain
中注入DLL,从而完全绕过这个检查。 于是人们可以从执行代码AppDomain
,可能(我不得不通过考虑)调用返回到“主” AppDomain
通过AppDomain.DoCallback
Process.Kill
是放弃你的应用程序中的可怕的方式,虽然它是这样做的非捕获的方法-那就是,任何人连接将无法阻止它(它使用的Win32 TerminateProcess
引擎盖下)
我不得不出局我“Injecterator”线束测试这些报表,寿 - 如果我能记住的挫折感我把这些代码...
无论任何这些-你绝对会想混淆地狱出此集会,尤其是如果你打算在里面存储的敏感位(事实上,我反对的存储组件内的任何敏感信息,如果你能帮助它) - 您的预防方法绝对不会停止一样反光,ILSpy,dotPeek等任何反汇编程序
这也将是安全的,如果你生成完整的键在运行时(可能是从多个部分密钥)。 它解决静态检查你的二进制文件的密钥。