C#模糊处理中字符串加密的安全性

C#模糊处理中字符串加密的安全性,c#,encryption,obfuscation,C#,Encryption,Obfuscation,免责声明:我非常清楚,如果有专门的逆向工程师,客户端程序永远不会安全 主要是出于个人好奇心,我一直在学习C#应用程序的“模糊”技术。似乎一种流行的技术是“字符串加密”,它似乎是对软件中的字符串常量进行加密,然后解密以供以后使用。这使得它们不能正确地出现在像Reflector这样的反编译器中(如果这是错误的,请纠正我) 如果这是真的,并且您在Reflector中只看到字符串的加密版本,那么需要做什么(即,有多困难)来解决这个问题并获得解密的字符串?显然,这必须是可能的,否则应用程序将无法做到这一点

免责声明:我非常清楚,如果有专门的逆向工程师,客户端程序永远不会安全

主要是出于个人好奇心,我一直在学习C#应用程序的“模糊”技术。似乎一种流行的技术是“字符串加密”,它似乎是对软件中的字符串常量进行加密,然后解密以供以后使用。这使得它们不能正确地出现在像Reflector这样的反编译器中(如果这是错误的,请纠正我)


如果这是真的,并且您在Reflector中只看到字符串的加密版本,那么需要做什么(即,有多困难)来解决这个问题并获得解密的字符串?显然,这必须是可能的,否则应用程序将无法做到这一点,但它到底有多大的威慑作用?

需要多少时间手动理解 取决于一般混淆级别,
也就是说,如果有一个方法可以像那样调用decrypt…

对于编译和所有可能的操作,我没有任何C#fuscator方面的经验,但是我所研究的Java fuscator(Stringer、Allatori、Zelix Klassmaster、JFuscator)非常糟糕。通常,我可以在一两天后对加密算法进行反向工程,然后我可以对受同一模糊器版本保护的所有应用程序进行除臭,而其他版本通常只需要稍加调整

请注意,这是为了纯粹的静态分析,找出算法并编写一个脚本,在不执行任何代码的情况下对其进行解密。如果您的目标是快速解密,那么简单地执行解密函数就容易多了。好的混淆器有一个调用上下文检查,所以您不能直接进行,但是查找和编辑检查很简单。这可能只需要几分钟就可以完成


显然,有一些方法可以使逆向工程变得更加困难,但实际上并没有做到。

如果应用程序中有加密字符串,那么应用程序中也嵌入了解密密钥


因此,一个有适度决心的人可以使用调试器逐步通过解密代码来检索密钥,然后轻击手腕即可解密应用程序中的所有其他字符串。

我最近才了解secureString类。我相信这不是一个完整的解决方案,但结合其他技术,它可能会有所帮助

初始化实例或修改值时,SecureString实例的值将自动加密。 请注意,SecureString没有检查、比较或转换SecureString值的成员。缺少这样的成员有助于保护实例的价值不受意外或恶意暴露的影响


你已经有了反编译器。只需查找解密函数,其中大部分是简单的字符串异或。。即使没有解密函数,也很容易反转。Salamander应该完成字符串解密。