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

正如在这里和这里的类似问题中所讨论的,我想保护我的代码免受逆向工程。

我的情况就像Simucal在他的(优秀)答案中描述的那样:

基本上,它归结为唯一的机会是你有一个非常具体的,难以设计的,与你的领域相关的算法,让你在竞争中占据优势。 这是尝试对应用程序的一小部分进行逆向工程的唯一时间。

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

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

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

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

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

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

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

  2. 我们仍然希望能够在接收错误报告时获得真正的堆栈跟踪 – 这可能是我对映射模糊到真实代码的结果。

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

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

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

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

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

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

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

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

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

你为什么不专注于使你的产品最好? 目标是保持领先于人群,而不是完全锁定它们。 在竞争激烈的团队中率先交付并始终拥有最好的产品将确保您的繁荣远远超过浪费大量无用保护(IMNSHO)的努力。

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

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

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

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

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

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

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

如果您的代码非常敏感,请将其放在无人能够访问的位置。

EG为人们提供客户端或网页,以访问一些公开您function的服务。

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

为了额外的措施,混淆该代码。

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

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

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

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

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

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

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

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

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

但是,如果使用reflection,则会遇到问题。

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