见上面的答案:在源代码级别的混淆比模糊处理更有效?,特别是“用一种不容易解压缩的语言(如C/C++)对其进行编码”
我想写一个新的应用程序,将出售500美元的每个许可证,所以我想防止反编译。
应该避免C#,还是应该使用混淆器来防止这种事情发生?
发布于 2013-02-01 21:31:02
C#程序集包含c++程序集不包含的元数据,这些元数据可以帮助反编译。C#也可以编译成一种中间语言,它比C++S的机器代码输出更好地映射到原始源代码。混淆器可以提供帮助,但你不能阻止逆向工程,你只能让它变得更难。
实际上,没有人希望你的代码是免费的。公司希望获得合法的许可;他们不想为了获得免费的许可而侵入你的代码的麻烦(或合法曝光)。以500美元的许可证,你不太可能是针对普通消费者,所以只有那些谁会有兴趣侵入你的软件将是那些人谁没有在你的目标市场。
因此,要采取明智的预防措施,比如制定许可计划、安装代码、打电话或任何最新的保护软件的方法,并集中精力添加新功能,使软件更好、更有吸引力,选择能为您提供最佳效率的语言。
注意:如果你不是偶尔被黑客剽窃,你的软件是不够重要的。在这一点上,你很可能会雇佣一个人来发布接受通知,并致力于更好的技术解决方案。
发布于 2013-02-01 21:39:19
从根本上说,任何可执行程序都可以拆卸和检查。逆向工程师能够轻松地重新创建原始源代码取决于可执行文件中存在多少关于原始源代码的信息或元数据。逆向工程师能发现原始变量名、函数、数据结构等吗?编译器本质上是“压缩”源代码,将其转换为更易于机器执行的格式,例如由中间运行时处理的本机代码或字节代码。但是一般来说,压缩是有损的,这意味着很多关于原始源代码的信息根本就没有了。但是,某些编译器输出比其他编译器的输出更具损耗性。
C和C++通常直接编译成本机代码。但是,C标准和C++标准都没有描述编译器创建的二进制可执行文件的布局。例如,优化C++编译器可以自由地做许多事情来提高性能,包括优化某些变量声明或删除整个函数和类。二进制可执行文件中几乎不需要包含有关原始C++代码的信息。反向工程师仍然能够拆卸它,但是从程序集中收集任何C或C++代码将是一种猜测和解释的行为。
然而,C#编译为CIL (公共中间语言)。通常,从读取CIL中可以收集到更多关于原始源代码的信息,比如面向对象的概念(包括类结构),而不是从从C++编译器生成的高度优化的C++机器代码。
发布于 2013-02-02 05:01:29
不一定要避免C#。我为PreEmptive解决方案在他们的Dotfuscator团队工作,尽管这是一个相当公正的答案。(没有一个插头:)
C#本质上更容易分解成源代码,因为它包含元数据,而且大多数C#代码必须遵守一组称为“可验证代码”的规则。反编译器利用对这些规则的遵守以及附加的元数据,使反编译比等效的C++反编译要好得多。要深入了解IL是很困难的,但是代码中的每个类最终都会有元数据。这就是.Net如何防止您为使用您编写的程序集/API而发布头文件或符号文件的方式。对于可验证的代码位,这基本上意味着您只能使用.Net运行时可以验证是否“安全”的代码。运行时的静态分析能力有限,因此可以验证的代码很多是“安全和正确的”,但不能由运行时进行验证。反编译者利用这组规则。
如果您要在C#中发布产品并具有您想要保护的IP,则基本上必须使用混淆产品。在类似的语言/运行时(如Java )中,情况也是一样的。用于.Net的混淆产品做了许多事情:
goto的循环并重新排序)FooBar )转换为a)根据您使用的混淆器,这些方法可以使它成为所有意图和目的的代码是一个巨大的“黑匣子”,而不深入IL和手去混淆它(非常耗时)。
C++的优点是混淆问题几乎没有那么重要。因为没有元数据,所以反编译器的难度要大得多。然而,仍然有大量的黑客可以读取x86程序集。C++应用程序通常会被破解。(好) C++混淆器也很难找到。这是因为他们很难混淆和分解一样困难。.Net有一组规则,混淆器用于读取代码和混淆代码。C++没有这些规则。
所以,总之
另外还有一个注意事项。生成可验证代码的C#混淆器基本上为您提供了一个应用程序,只要它们有足够的.Net新版本,它就会在任何地方运行。不产生可验证代码的C#混淆器通常在任何地方都能工作,但它们不能保证工作。微软可能会在下一个版本的.Net中提出一些JIT优化,这将打破您无法验证的模糊代码。C++代码本身并不是“无处不在”运行的,但它通常会运行。模糊的C++代码可能在任何你想要的地方都能工作,但它不能保证。编写正确和线程安全的C++已经够困难的了,更不用担心混淆器会把它搞砸了。
https://softwareengineering.stackexchange.com/questions/185602
复制相似问题