代码混淆对安全性的影响有多大?

5
使用RedGate的Reflector,您可以轻松获取应用程序的完整源代码。但为了降低算法被发现的机会,有简繁混淆器来减少这种可能性。
我的问题是:
- 简繁混淆器的效果如何? - 在隐藏您的算法方面,C++没有.NET库还是混淆的.NET程序更安全? - 是否有其他方法使.NET源代码更加安全?

1
你认为为什么有人会对你的应用程序进行反混淆? - zerkms
混淆不会使应用程序的黑客攻击过程显著变得更加困难,它只会使整体代码结构更难理解。 - zerkms
这也很重要。我不想让我的算法被盗取。 - seeker
1
嗯,这不是绝对新的,但我认为我的程序会很有用,这就是为什么我想要保护它。 - seeker
所有可以自动混淆的内容都能够自动反混淆,而且市场上有针对每个平台的工具来完成这项任务。如果你不希望他人查看你的代码,可以采取不同的方法。例如,将敏感逻辑隐藏在 Web 服务后面,让客户端应用程序使用该服务。 - Steven
显示剩余3条评论
5个回答

4
如果您想要确保某些内容的安全性,可以选择使用C++。因为在.NET世界中有一个名为de4dot的强大反混淆器(请参见此处:https://github.com/0xd4d/de4dot),它可以反混淆市场上大多数混淆器生成的代码,即使是那些它没有显式了解的混淆器也可以。但是,这只会提高难度,因为即使在C++世界中,也有强大的工具可供使用(IDA:http://www.hex-rays.com/products/ida/index.shtml)。
还有其他解决方案,例如混合代码程序集,其中您可以将要隐藏的部分放在本地代码中,其余部分则放在托管代码中。请参见此处以了解更多信息:Mixed (Native and Managed) Assemblies

谢谢大家。我想我会尝试使用混合程序集。顺便问一下,那是 .NET 4.5 的特性吗? - seeker
@seeker:使用非托管程序集一直是.NET的一个特性。上面的链接描述了如何将非托管程序集引入托管世界。您是否愿意在非托管C++或C中重新编写算法?将其引入.NET将具有与您在问题中担心的相同影响。 - Dominic Zukiewicz

2
在获取源代码方面,使用没有 .net 库的 c++ 程序还是 .net 模糊化程序更安全?当然是没有 .net 的 c++ 程序。
即使是 .net 或 .java 模糊化程序也很容易被反编译。有一些专业的模糊化工具可以防止代码被重新编译,但这会稍微降低黑客攻击的速度。
你是否听说过“有关闭合必有开启”的说法?即使是用汇编语言编写的程序也无法避免这个规律。
通常初学者程序员会担心自己的代码被窃取。我建议先创建一个值得他人窃取(而不是你自己)的软件部分。

软件部分已经创建完成。 - seeker
为什么?IDA Pro/Hex-Rays可以很好地将本机二进制文件反向转换为C/C++,而无需使用.NET。 - ta.speot.is
IDA Pro会在您的应用程序分支结构上绘制一个小流程图,多么善良啊 :-) - Dominic Zukiewicz
IDA Pro并不是一款简单的软件。使用免费的应用程序来反编译.NET或Java应用程序更加容易获得。 - user529543

2
因为.NET被设计成自我描述的,使用混淆器只会阻碍其进展。虽然反编译器的可读性会降低,但任何理解MSIL的人都会有更好的机会。即使是C++应用程序也会在某个阶段被反编译,因为程序最终会在内存中逐步执行。C++应用程序需要更长的时间来理解,但如果黑客知道汇编语言(如果他们正在反编译您的应用程序以获取算法访问权限,则可能会这样做),那么这只是时间问题。
混淆实际上是要在合理的时间范围内尽可能地增加难度,而不是使其变得不可能。加密也是同样的道理。加密并不是不可能被破解,只是需要很长时间,以至于70-80年后上下文可能已经没有任何用处。
除了这里介绍的选项之外,我还想到了两种选择:
- 在远程位置托管算法 - 在硬件组件中托管算法 - 非常昂贵
如果您有可用的网络连接,第一种选择可能更合适。处理是在单独的服务器上完成的,并且算法不会暴露给公众。这就是现在激活代码的工作方式。某种类型的序列代码被生成,使用公钥加密进行加密,并发送到将解密和验证数据的源。响应也被加密并发送回来。
此外,数字签名您的应用程序及其依赖项也会有所帮助,因为黑客无法轻易地插入组件。如果他们尝试在您的旧组件中使用DLL(以模拟对服务的调用并返回“成功”),则您的代码将在使用DLL之前检查数字签名。
因此,总结一下,混淆将减慢过程但不会阻止它。我能想到的唯一方法是在安全位置托管该算法并向其发送请求。是的,存在托管方案、DoS等问题,但您的算法得到了保护,这就是您想要的。

0
尝试一些类似于this的东西。然而,它只会混淆字符串。要混淆函数调用、变量和其他元素,请寻找商业产品和服务来实现这个目的。

0
混淆器的效果如何?
我发现ConfuserExnameconstantscontrol flow保护非常有效,使.NET代码难以阅读。
  • 使用Unicode进行Name protection可以将类/方法等名称转换为不可读的Unicode。
  • constants protection对常量字符串(如调试日志字符串)进行编码,这为黑客猜测代码正在做什么提供了极好的提示。
  • control flow将您的代码混淆成许多switch-case。
请参见下面的示例,其中包含经过ConfuserEx处理的C#代码:

enter image description here

在隐藏算法方面,哪种更安全:没有.NET库的C++还是混淆的.NET程序?
如果.NET程序集没有被混淆,那就像是把源代码送给别人一样。
比较混淆的.NET和本地x86/x64代码,我认为它们的阅读难度大致相同。本地x86代码可以使用IDA-Pro等软件反汇编成相当易读的C代码。此外,有些人能够快速阅读和理解x86语言。
还有其他方法可以使.NET源代码更加安全吗?
有这个Microsoft .NET Native(仍处于早期阶段,有限制),它将C#代码编译成本地x86/x64代码。这实际上并不是一种保护,只是让人们阅读x86代码变得更慢。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接