保护我的代码免受逆向工程

时间:2009-02-25 05:38:36

标签: c# obfuscation reverse-engineering

正如类似问题herehere中所讨论的,我想保护我的代码免受逆向工程的影响。

我的情况与Simucal在他的(优秀)答案中所描述的here

  

基本上,它归结为什么   你唯一的机会   针对源窃取的目标就是你   有一些非常具体,很难   工程师,与你有关的算法   域名,为您提供支持   竞争。这只是关于   只有时间才具有成本效益   试图对一个小的逆向工程   部分申请。

我确实有这种情况。一种难以设计的算法,对我们的特定领域而言是优雅且有价值的。

经过数月的微调和开发后,最终结果非常紧凑(大约100行代码)并且优雅。我想保护代码的这一特定部分免受逆向工程的影响,或至少使其合理困难。

该场景是一个用C#编写的富客户端应用程序,我必须部署这部分代码 - 我无法从Web服务执行它。

我认为,由于性能原因(以及跨边界问题),提取代码并在非托管本机二进制文件中重写它不是一种选择。

最初我想做简单的混淆,但考虑到代码的小,我认为这不会提供太多保护。

理想情况下,我想保护我的整个应用程序,但有两个主要问题似乎使普通的混淆器和第三方打包器难以使用:

  1. 该应用程序提供了一个插件接口,因此不应对某些程序集(和接口/类)进行模糊处理和打包

  2. 我们仍希望能够在收到错误报告时获得真正的堆栈跟踪 - 这可能是我对映射混淆到真实代码的过程。

  3. 将这些问题放在一边(尽管我也很感激这方面的任何意见),保护我的一小部分代码免受逆向工程的好方法是什么?我并不担心任何人改变或破解代码,但又想让它难以理解和反向工程。

8 个答案:

答案 0 :(得分:3)

除了混淆之外,它几乎一文不值,甚至微软(ScottGu等)基本上都说具有适当意图和能力的人将对应用程序进行逆向工程,而在.NET中,基本防御是许可和IP而不是试图通过默默无闻或其他一些防止逆向工程来保护你的代码。

这是为什么他们发布BCL来源而不是将其保密的原因的一部分。

答案 1 :(得分:3)

你应该对完整的代码进行模糊处理,因为它很难达到那个小小的有价值的部分。代码越小,理解它就越容易。大多数混淆器不应该混淆公共接口,因为那里有许多混淆的库。

但是我认为你应该说服用户没有特别的技巧而不是试图隐藏它。引用Kaiser Soze的话说,“魔鬼曾经拉过的最大伎俩就是说服世界他不存在”。

当然,您可以随时为您的发明申请专利并合法保护自己。

答案 2 :(得分:3)

无法做到。如果您的代码可以运行,那么它可以被读取和反向工程。你所能做的只是让它变得更难一点,相信我,它只会是一个 little 更难。你可能不喜欢这个事实,但是大多数破解者在破解方面要比其他人更难以破解。保护代码的工作量通常是不值得的,特别是如果它对付费客户不利。见证DRM令人惊叹的不成功。

我的建议是不要担心。如果您的算法真的很新颖,请寻求专利(尽管Bilski的决定稍微有点难度,除非您将其与特定的硬件实现联系起来)。依赖商业机密也是无用的,除非您只将软件分发给签署合同的人,以确保他们不允许不受约束的访问。然后,你必须有办法对此进行监管。你把二进制文件放到互联网上或者在没有合同的情况下分发它们的那一刻,我相信你将被视为失去商业秘密状态。

依赖许可也充满了危险 - 您可能认为您可以在许可证中插入禁止逆向工程的条款,但世界上许多司法管辖区明确禁止这些条款。无论如何,无论谁对大部分破解负责的俄罗斯暴徒都不太可能遵守上述规定。

为什么不专注于让您的产品做到最好?目标是保持领先于人群,而不是完全锁定他们。作为第一个在竞争激烈的团队中提供并始终拥有最佳产品的企业,将远远超过在无用保护方面浪费大量精力(IMNSHO)。

这只是我的意见。我可能错了。我以前错了,你只需要问我的妻子: - )

答案 3 :(得分:2)

一种选择是使用许可证密钥和/或硬件指纹在运行时解密敏感代码并将其作为IL发送;这将使静态逆向工程工具(例如Reflector)不可见

还检测是否存在调试器并拒绝在调试模式下运行,除非可能在非常有限的情况下(例如在您的计算机上)

请注意,这将使调试变得非常困难,对其他人来说几乎不可能(如果这是一个不是问题的最终用户应用程序,但如果它是其他开发人员构建的库或框架,那就是问题)

另请注意,将物理内存副本复制到磁盘并在内存转储上使用脱机工具会显示您的解密算法,因此很容易失败 - 但是比大多数人麻烦的麻烦要多得多

整个事情是对你的困难与少数坏苹果的威慑与盗窃/瘟疫造成的潜在损失之间的权衡取舍

祝你好运,让我们知道你的决定!

答案 4 :(得分:2)

如果您的代码非常敏感,请将其放在无人可以使用的位置。

E.G。为人们提供客户端或网页,以访问一些公开您功能的服务。

该服务可以位于外部防火墙后面,并与内部防火墙后面的后端服务器通信,敏感代码将在此处运行。

如需额外措施,请对该代码进行模糊处理。

这需要在获取代码之前妥协几层安全性。

答案 5 :(得分:1)

您可以在C#或CIL级别对其进行模糊处理,但实际上不可能的是IL编译器设计以创建可以实际执行的最有效的机器代码。

因此,要对算法进行反向工程,请获取机器代码并在其上运行标准反汇编工具。通过系统跟踪标准输入API调用到标准输出API调用来跟踪数据。

面对它,如果有人想要它,他们就可以拥有它。

可以难以随便弄明白。例如,我想查看Java应用程序管理的某些数据库中的内容。事实证明,Java反编译非常混乱,充满了奇怪的函数,类和命名空间都有相同的名称,故意试图隐藏真正发生的事情。

可以修复我正在使用的反编译器,以便将所有内容重命名为A_namespace而不是A,然后函数流将直接弹出到Eclipse调用跟踪图。

相反,我只是举起手来继续实际工作,而不是重写反编译器。

所以,你可以把它隐藏起来随便感兴趣的人,当然。

答案 6 :(得分:0)

大多数混淆器允许您指定要防止哪些方法/类被混淆。例如,SmartAssembly允许您使用属性标记方法或类,而其他允许您选择UI中的方法以从流程中排除。你应该能够对这个过程进行非常精细的控制,这样你就可以吃蛋糕了。

如果使用反射,则会遇到问题。

答案 7 :(得分:-2)

我听到有关Spices.Net Obfuscator的好评。它应该能够大大增加获得算法所需的时间。