混淆与非托管程序集

时间:2012-05-17 14:45:45

标签: .net encryption obfuscation .net-assembly

我最近参加了一个演示文稿,其中有人表示可以破解.NET混淆代码。他建议,获得真正安全性的更好方法是加密混淆的程序集,或者更好地将您的知识产权置于非托管程序集中。非托管程序集路径的明显缺点是,程序集将是特定于平台的。您可以通过以上两种方法看到任何优点或缺点。

4 个答案:

答案 0 :(得分:4)

您对此级别代码安全性的动机是什么?

如果您的代码本身就具有足够的IP价值,那么您可能应该考虑不将其分发,而是将其隐藏在某种SaaS产品之后。混淆正是它所说的,它不是加密,并且由于运行时必须能够读取代码来运行它,因此它不可避免地具有可读性。即使是非托管DLL也可以被反编译,如果只是汇编代码,那么你的IP在那里并不完全安全。

顺便说一句,非托管代码的明显缺点不是你说的,恕我直言,而是你在从托管语言转变为非托管语言时所牺牲的一切。

答案 1 :(得分:3)

两种型号都有优点和缺点。但这些主要取决于您的具体threat model,我建议您从这里开始。哪些人群对您的产品构成安全威胁,这些威胁是什么?

一般而言,使用托管代码的优势在于加快产品上市速度,但它更容易受到某些攻击和IP盗窃的影响。使用本机代码的优势在于它不易受某些攻击,但上市速度较慢。这些是非常通用的优点和缺点,应根据您的威胁模型进行调整。

编辑回答你的评论。如果您确实需要保护IP,我会(在通用情况下)寻找本机代码可执行文件而不是加密的混淆程序集。本机代码比加密的混淆托管代码更难破解,加密和混淆的额外复杂性将为您的产品增加大量的设计和测试。

再次编辑,指出还有另一种选择:您可以使用像MPress这样的包装工具。这不具有混淆和/或加密的性能和复杂性含义,但仍然提供合理的保护以防止非专业的破解者盗窃IP。如果你看一下带有Reflector的压缩.NET程序集,你只能看到一个Main调用。

答案 2 :(得分:1)

第三个选项是加密可执行文件。我最熟悉的选项是将加密代码放在一个包装器中,如果存在加密狗,它只能解密它。

Dongles和加密在理论上更强大,因为在解密可执行文件之前,人们甚至无法开始在程序中徘徊。也就是说,每次程序运行时都必须对其进行解密,因此您所要做的就是运行程序并从内存中提取清晰的代码。但是,对于无法访问您的某个加密狗的人来说,这个选项是不可用的,这样您就有机会判断您愿意将加密狗发送给谁。

缺点是成本支持麻烦。软件无法以电子方式交付,因为现在有一个客户需要的物理硬件。有些国家可能有关于导入或导出加密狗的规则,因为它们是加密设备。一些管理程序系统不支持USB直通,虽然一些加密狗制造商仍提供并行端口加密狗,但现在计算机硬件并不一定带有并行端口。如果客户需要在虚拟服务器上运行您的软件,您可能会发现自己处于紧张状态。而且他们很容易打破。您的客户打破他们。

答案 3 :(得分:0)

与机器代码相比,.NET代码结构化程度更高,转换灵活性也更低。因此,保护​​.NET代码的一个技术挑战是充分扰乱代码(使用混淆,加密或其他技术),但不破坏.NET运行时强加的可验证性。

尽管如此,您仍然可以采取一些措施来保护.NET代码(除了已经提到的技术):

  • 应用反拆卸技巧,使代码难以正确拆解
  • 加密代码中使用的字符串文字
  • 将函数和数据符号重命名为无意义的名称
  • 故意损坏文件级别的某些代码,但仅在运行时修复
  • 校验和重要的逻辑,以防止篡改
  • 在图层中应用保护(例如,校验和并修复混淆代码等) 保护逻辑)因此整体上更难打败保护

当然,手工完成这些操作既困难又容易出错。但是有一些商业的专业级工具可以用来自动化这种保护。