关于混淆:Perl代码是否有很好的混淆器?

关于混淆:Perl代码是否有很好的混淆器?

Is there a good obfuscater for Perl code?

有谁知道Perl的代码混淆器好吗? 我被要求在将代码发布给客户端之前研究混淆代码的选项。 我知道混淆的代码仍然可以进行反向工程,但这不是我们的主要关注点。

一些客户正在对我们提供给他们的源代码进行微小的更改,这在发生问题并必须对其进行修复时,或者在发布与他们所做的更改不兼容的补丁程序时,给我们带来噩梦。 因此,这样做的目的只是为了使他们很难对自己的代码进行更改(无论如何,他们都不应该这样做)。


我以前走过这条路,当您必须处理"混淆的"代码时,这绝对是一场噩梦,因为当您(开发人员)无法阅读代码时,尝试调试客户端服务器上的问题会极大地增加成本。 。最后,您会遇到"反混淆器",将"真实代码"复制到客户端的服务器或其他许多问题,而这些问题都变得非常麻烦。

我了解您的来历,但这听起来像是管理层有问题,他们正在寻求您实施选定的解决方案,而不是找出正确的解决方案。

在这种情况下,听起来确实是许可或合同问题。让我们将代码开源,但将其提交给许可证,将他们提交的任何更改都归还给您并获得批准。当您推出补丁程序时,请检查所有代码的md5总和,如果与预期的不符,则表明它们违反了许可证,因此将相应地收费(费用应该高得多)。 (我记得有一家公司让我们将代码开源,但明确表示,如果我们进行了任何更改,我们都将以25,000美元的价格"购买"该代码,并且除非我们购买了某个代码,否则它们将不再负责任何错误修复或升级。新许可证)。


别。只是不要。

将其写到合同中(或根据需要修改合同),您不对它们对软件所做的更改负责。如果他们发现了您的代码然后期望您对其进行修复,那么您遇到的客户问题将无法通过混淆代码来解决。并且,如果对它们进行了混淆处理,并且遇到了实际问题,那么请他们在错误报告中准确地报告行号等是好运。


请不要那样做。如果您不希望人们更改您的Perl代码,则将其置于适当的许可证下并强制执行该许可证。如果有人在您许可时更改了您的代码,说他们不应该这样做,那么当您的更新不再可用于其安装时,这不是您的问题。

有关更多详细信息,请参见perlfaq3对"如何隐藏我的Perl程序的源?"的回答。


看来您的主要问题是客户端修改了代码,从而使您难以支持它。我建议您在寻求支持时要求文件的校验和(md5,sha等),并在打补丁时同样检查文件的校验和。例如,您可以要求客户端提供所提供程序的输出,该程序将通过其安装并校验所有文件。

最终,他们有了代码,因此他们可以为所欲为。您能做的最好的事情就是执行许可证,并确保仅支持未修改的代码。


我同意以前的建议。

但是,如果您确实愿意,可以查看PAR和/或Filter :: Crypto CPAN模块。您也可以一起使用它们。

当我们在光学介质上运送产品时,我将后者(Filter :: Crypto)用作一种非常轻量级的"保护"形式。它不会"保护"您,但会阻止90%的人想要修改您的源文件。


将程序转换为二进制文件的另一种方法是在CPAN上使用免费的PAR-Packer工具。甚至还有用于代码混淆的过滤器,尽管正如其他人所说的那样,这可能比其价值更大。


在这种情况下,混淆是错误的方法。

将代码发布给客户端时,应保留发送代码的副本(在磁盘上,或者最好在版本控件中作为标记/分支)。

然后,如果您的客户进行了更改,您可以将其拥有的代码与您发送给他们的代码进行比较,并轻松发现更改。毕竟,如果他们觉得有必要进行更改,则某个地方存在问题,您应该在主代码库中进行修复。


这不是一个认真的建议,但是请看一下Acme :: Buffy。

至少会照亮您的一天!


校验和和合同的想法有助于防止您描述的"问题",但是如果您付出的代价是难以进行升级和错误修复,那么您的客户如何进行未通过全面测试套件的更改?如果他们能够进行这些更改(或者至少进行一次更改以表示他们想要代码执行的操作),为什么不简单/轻松地使他们打开支持记录并上传补丁程序呢?客户总是对客户想要的东西是正确的(他们可能不知道如何"正确地"做到这一点,但这就是他们向您付款的原因。)

想要混淆器的一个更好的理由是在大众市场台式机部署中,在这种部署中,您并不是每个客户都拥有固定的合同。在那种情况下,诸如PAR之类的东西-将加密/混淆逻辑打包到编译的二进制文件中的任何方法都是可行的。


我正在运行Windows O / S,并使用IndigoSTAR的perl2exe。生成的.EXE文件不太可能在现场更改。

正如其他人所说,"如何混淆"是错误的问题。正确的方法是"如何阻止客户更改代码"。


正如几个人已经说过的:不。

考虑到Perl解释器的性质,这几乎是隐性的,在Perl接触到Perl之前,对Perl进行混淆的任何操作都必须是不可撤消的,这意味着您需要将反混淆脚本/二进制文件留在解释器附近(因此您的客户)可以找到它:)

解决实际的问题:校验和和/或措辞适当的许可证。并且支持人员受过训练,说"您更改了吗?我们正在调用许可证的第34b条,在我们触摸该条之前,该费用为$ X,000。...

另外,请阅读为什么我应该混淆,以获得更一般的答案。


混淆的替代方法是使用ActiveState的Perl Dev Kit等工具将脚本转换为二进制文件。


正如Ovid所说,这是一个契约性的社会问题。如果他们更改密码,则保修无效。向他们收费很多,以解决此问题,但同时,给他们一个渠道,让他们可以提出更改建议。另外,请查看他们想要更改的内容,并在可能的情况下进行配置。他们有自己想做的事情,直到您满意为止,他们将继续努力绕过您。

在精通Perl中,我谈到了击败混淆器。即使您进行诸如胡说八道的变量名称之类的工作,诸如B :: Deparse和B :: Deobfuscate之类的模块,以及诸如Perl :: Tidy之类的Perl工具,也使知识渊博且有上进心的人很容易获得您的来源。您不必担心无法理解和缺乏动力,因为他们仍然不知道如何处理代码。

当我与经理讨论此事时,我们会进行常规的成本收益分析。您可以做各种各样的事情,但是花费不多于获得的收益。

祝好运,


我只是邀请他们进入他们自己分支上的SVN树中,以便他们可以提供更改,并且我可以看到它们并将其更改集成到我的开发树中。

不要吵架,要拥抱它。


另一个不严重的建议是使用Acme :: Bleach,它将使您的代码非常干净;-)


推荐阅读