有没有人知道Perl的优秀代码选择器?在将其发布给客户之前,我会被要求查看阻止代码的选项。我知道封闭式代码仍然可以进行逆向工程,但这不是我们主要关注的问题。
有些客户正在对我们提供给他们的源代码进行微小的更改,当出现问题并且我们必须修复它时,或者当我们发布的修补程序与他们已更改的内容不兼容时,它会给我们带来噩梦。因此,目的只是为了使它们很难对代码进行自己的更改(无论如何它们都不应该这样做。)
答案 0 :(得分:31)
我之前一直走在这条路上,当你不得不处理“混淆”的代码时,这是一个绝对的噩梦,因为当你(开发人员)无法在客户端的服务器上调试问题时,它会大大增加成本阅读代码。你结束了“反混淆器”,将“真实代码”复制到客户端的服务器或任何其他一些问题,这些问题只是一个真正的维护麻烦。
我知道你来自哪里,但听起来管理层有问题,他们希望你实施一个选定的解决方案,而不是弄清楚正确的解决方案是什么。
在这种情况下,听起来它确实是许可或合同问题。让他们拥有代码开源,但让它成为许可证的一部分,他们提交的任何更改都必须返回给您并获得批准。当您推出补丁时,检查所有代码的md5总和,如果它与预期不符,它们将违反许可证并将相应收费(并且它应该是一个远远高得多的速率)。 (我记得有一家公司让我们拥有代码开源,但明确表示如果我们改变了什么,我们已经“购买”了25,000美元的代码,他们不再负责任何错误修复或升级,除非我们买了一个新许可证。)
答案 1 :(得分:15)
别。只是不要。
将其写入合同(或者如果必须,修改合同),您不对他们对软件所做的更改负责。如果他们正在编写你的代码然后期望你修复它,你就会遇到通过模糊代码无法解决的客户端问题。如果你对它进行模糊处理并遇到实际问题,那么在错误报告中让他们准确报告行号等是好运。
答案 2 :(得分:8)
请不要那样做。如果您不希望人们更改您的Perl代码,请将其置于适当的许可证下并执行该许可证。如果人们在许可时更改了您的代码并表示他们不应该这样做,那么当您的更新不再适用于他们的安装时,这不是您的问题。
有关详细信息,请参阅perlfaq3's answer to "How Can I hide the source for my Perl programs?。
答案 3 :(得分:5)
看起来您的主要问题是客户修改代码然后使您难以支持它。我建议你在他们寻求支持的时候要求他们的文件的校验和(md5,sha等),同样在修补时检查文件的校验和。例如,您可以要求客户端提供所提供程序的输出,该程序通过其安装和校验和所有文件。
最终他们拥有代码,因此他们可以做任何他们想做的事情。您可以做的最好的事情是强制执行许可证并确保您只支持未修改的代码。
答案 4 :(得分:4)
在这种情况下,混淆是错误的方法。
当您将代码发布到客户端时,您应该保留发送它们的代码的副本(在磁盘上或最好在版本控制中作为标记/分支)。
然后,如果您的客户进行更改,您可以将他们的代码与您发送的代码进行比较,并轻松发现更改。毕竟,如果他们觉得需要进行更改,那么某处存在问题,您应该在主代码库中修复它。
答案 5 :(得分:4)
将程序转换为二进制文件的另一种方法是PAR-Packer上的免费CPAN工具。甚至有代码混淆的过滤器,尽管正如其他人所说,这可能比它的价值更麻烦。
答案 6 :(得分:4)
我同意之前的建议。
但是,如果您真的想要,可以查看PAR和/或Filter::Crypto CPAN模块。您也可以一起使用它们。
当我们将产品运送到光学媒体上时,我使用后者(Filter :: Crypto)作为一种非常轻量级的“保护”形式。它不会“保护”您,但它会阻止90%想要修改源文件的人。
答案 7 :(得分:3)
这不是一个严肃的建议,但请看一下Acme::Buffy。
它至少会照亮你的一天!
答案 8 :(得分:2)
混淆的替代方法是使用ActiveState's Perl Dev Kit之类的东西将脚本转换为二进制文件。
答案 9 :(得分:2)
有几个人已经说过:不要。
考虑到Perl解释器的性质,它几乎是隐含的,在Perl获取它之前,你做的任何混淆Perl的操作都必须是可撤消的,这意味着你需要保留de-obfuscation脚本/二进制文件口译员(以及您的客户)可以找到它的地方:)
修复真正的问题:校验和和/或适当措辞的许可证。并支持员工训练说'你改变了吗?我们正在援引我们许可证的第34b条,在我们触摸它之前,这将是$ X,000 ....
另外,请阅读why-should-i-use-obfuscation以获得更一般的答案。
答案 10 :(得分:2)
我正在运行Windows O / S并使用IndigoSTAR的perl2exe。生成的.EXE文件不太可能在现场更改。
正如其他人所说,“我如何模糊它”是错误的问题。 “如何阻止客户更改代码”是正确的。
答案 11 :(得分:2)
校验和和合同的想法有助于防止您描述的“问题”,但如果您的成本是推出升级和错误修复的难度,那么您的客户如何进行无法通过的更改综合测试套件?如果他们能够进行这些更改(或至少进行一次表达他们希望代码执行操作的更改),为什么不简单地让他们轻松/自动地打开支持票并上传补丁?客户总是正确关于客户想要什么(他们可能不知道如何以“正确的方式”做到这一点,但这就是他们付钱给你的原因。)
想要一个混淆器的一个更好的理由是大规模市场桌面部署,而你没有每个客户都有常设合同。在这种情况下,喜欢 PAR - 将加密/混淆逻辑打包成编译二进制文件的任何东西都是可行的。
答案 12 :(得分:1)
我会在他们自己的分支上邀请他们进入我的SVN树,这样他们就可以提供更改,我可以看到它们并将他们的更改集成到我的开发树中。
不要打它,拥抱它。
答案 13 :(得分:1)
正如奥维德所说,这是一个契约性的社会问题。如果他们更改了代码,则会使保修失效。收取很多费用来解决这个问题,但同时给他们一个可以建议改变的渠道。另外,如果可以的话,看看他们想要改变什么并做出配置的一部分。他们有他们想做的事情,在你满足之前,他们会继续试图绕过你。
在Mastering Perl中,我谈了一下如何打败奸夫。即使您执行诸如制作无意义变量名称之类的内容,B::Deparse和B::Deobfuscate等模块以及Perl::Tidy等Perl工具也会让知识和动机变得非常容易。获得你的消息来源的人。您不必担心无法知晓和无动机,因为他们无论如何都不知道如何处理代码。
当我与经理讨论此事时,我们会进行正常的成本效益分析。你可以>>做各种各样的事情,但是它的成本并不比你获得的好处少。
祝你好运,答案 14 :(得分:0)
另一个不严肃的建议是使用Acme::Bleach,它会使你的代码非常干净; - )