C# 加密.net程序集/反调试技术

C# 加密.net程序集/反调试技术,c#,.net,debugging,encryption,obfuscation,C#,.net,Debugging,Encryption,Obfuscation,我正在寻找一种加密.net程序集(exe、dll)或应用反调试技术的方法。我知道程序集不包含本机字节码,而是CIL码,可以轻松地进行反编译。老实说,我对.NET还很陌生。我有web开发人员的背景,C#只是一种爱好,所以我不需要加密我的可执行文件,但我想知道像dotfuscator这样的解决方案是如何工作的。 我还知道,为了执行这些文件,必须在内存中解密这些文件,但对于包含本机代码的程序集也是如此 我不想讨论加密.NET可执行文件是否有用。我只是对应用加密或反调试技术(例如控制流混淆)的理论方法感

我正在寻找一种加密.net程序集(exe、dll)或应用反调试技术的方法。我知道程序集不包含本机字节码,而是CIL码,可以轻松地进行反编译。
老实说,我对.NET还很陌生。我有web开发人员的背景,C#只是一种爱好,所以我不需要加密我的可执行文件,但我想知道像dotfuscator这样的解决方案是如何工作的。
我还知道,为了执行这些文件,必须在内存中解密这些文件,但对于包含本机代码的程序集也是如此
我不想讨论加密.NET可执行文件是否有用。我只是对应用加密或反调试技术(例如控制流混淆)的理论方法感兴趣。 从下面的例子和相关问题可以看出,我的知识远远低于零。我是典型的应用程序编码员,如果代码编译并运行,我会很高兴,但我想深入挖掘

using System;
namespace HelloWorld
{
    class Hello 
    {
        static void Main() 
        {
            if(1 < 2) 
            {
                if(3 == 3)
                {
                    if ("a" != "b")
                    {
                        if(0 != 1)
                        {
                            Console.WriteLine("Hello World!");
                        }
                    }
                }
            }
            Console.ReadLine();
        }
    }
}
使用系统;
名称空间HelloWorld
{
同学们好
{
静态void Main()
{
如果(1<2)
{
如果(3==3)
{
如果(“a”!=“b”)
{
如果(0!=1)
{
控制台。WriteLine(“你好,世界!”);
}
}
}
}
Console.ReadLine();
}
}
}
无用条件是否可以标记为控制流混淆?

请分享您的建议、任何有趣的链接或书籍推荐。

有一些商业工具可以帮助您混淆代码。另一个选项是使用将MSIL编译为本机代码


我认为并希望在版本中构建时,您的自定义“控制流模糊处理”能够得到优化。

模糊处理代码会适得其反,因为它会使开发人员的代码更加复杂,通常会转化为更加模糊的错误。开发人员应该努力做到的关键是干净易懂的代码,这通常会转化为更少的bug和更好的可维护性。我想,重要的一点是,这不是“加密”,你要问的是混淆。您可以尝试将代码作为dll进行“加密”,然后进行汇编。加载解密后的数据,有效地在应用程序中部署加密垃圾;然而,要使这项工作至少有成功的希望,您需要编写一个内部具有高熵的非托管包装器(c++应用程序),该包装器将解密托管代码并执行它。总的来说,延迟可能是一个值得怀疑的好处。我将看看ngen。另外,我不知道构建过程中的优化。今晚我将对此进行测试,并查看反编译代码。在Visual Studio中,您可以在项目设置中找到“优化代码”选项。这只是MSIL优化,不像JIT编译时那样多。但是您使用的if条件是基于常数的,这些常数很容易确定,因此它们将始终为真。因此,我的猜测是,它们将被优化,但检查总是好的。你是对的,条件得到了优化。