PHP有代码混淆器吗? [关闭]
Posted
技术标签:
【中文标题】PHP有代码混淆器吗? [关闭]【英文标题】:Is there a code obfuscator for PHP? [closed] 【发布时间】:2010-09-18 23:09:21 【问题描述】:有没有人为 php 使用过好的混淆器?我尝试了一些,但它们不适用于非常大的项目。例如,它们无法处理包含在一个文件中并在另一个文件中使用的变量。
或者您还有什么其他技巧可以阻止代码的传播?
【问题讨论】:
您确定需要吗? @StevenA.Lowe:小心取笑 PHP。 :-) 又一个非常好的、建设性的编程相关问题以完美的问答格式被关闭为非建设性的。堆栈溢出的耻辱...... 这是堆栈溢出。唯一比不应该关闭的封闭问题更多产的是,当一些可怜的懒汉来到这里寻求帮助时,用户会发火。 如果您认为不应该关闭,请投票重新开放。 【参考方案1】:你可以试试PHP protect,它是一个免费的 PHP 混淆器来混淆你的 PHP 代码。
它非常好,易于使用且免费。 编辑:此服务不再存在。
至于其他人在这里写的关于不使用混淆的内容,因为它可以被破坏等等: 我只有一件事要回答他们 - 不要锁你的房门,因为任何人都可以打开你的锁。 情况正是如此,混淆并不是为了防止 100% 的代码被盗。它只需要使它成为一项耗时的任务,因此支付原始编码器的费用会更便宜。希望这会有所帮助。
【讨论】:
+1 指出混淆是为了让它变得更难,而不是不可能。 请注意,加密你的源代码而不是混淆它并不意味着它不可能解密,它真的很难做到。 试过了,但不喜欢。它只会更改变量名,不会删除 cmets.. @Schwern,不要锁门,然后聘请 Columbo 和一位非常优秀的律师来保护自己;) @David Newcomb - 只要锁上门,谁愿意花钱请一位真正优秀的律师?【参考方案2】:人们会为您提供混淆器,但再多的混淆也无法阻止他人获取您的代码。没有。如果您的计算机可以运行它,或者如果它可以播放电影和音乐,则用户可以使用它。即使将其编译为机器代码也只会使工作变得更加困难。如果你使用混淆器,你只是在自欺欺人。更糟糕的是,您还禁止您的用户修复错误或进行修改。
音乐和电影公司尚未完全接受这一点,他们仍在 DRM 上花费数百万美元。
在 PHP 和 Perl 等解释型语言中,这是微不足道的。 Perl 曾经有很多代码混淆器,然后我们意识到您可以轻松地反编译它们。
perl -MO=Deparse some_program
PHP 有 DeZender 和 Show My Code 之类的东西。
我的建议?写许可证并请律师。唯一的其他选择是不提供代码,而是运行托管服务。
另请参阅perlfaq entry on the subject。
【讨论】:
我基本同意你的观点,但 OP 要求的是产品推荐,而不是关于开源优点的讲座。 与开源无关,开源就是把代码混搭起来,不只是能看到。现实情况是,在用户机器上运行的任何代码或数据最终都是透明的,无论您如何编译、混淆或加密它,句号。 OP 需要了解这一点。 @JamShady:混淆并不意味着您不能修复错误或进行修改。如果您愚蠢地混淆源代码,将原始代码扔掉,并坚持维护混淆后的结果,是的,您将无能为力。好的混淆器坚持你保留你的代码和到混淆结果的映射;您可以调试/修改您的原始代码,向您的客户发送混淆的补丁,甚至通过使用地图将混淆的投诉转换回可读的投诉来诊断他的问题。他没有地图,所以这很安全。 问题:如何,回答:你不应该 = 没有帮助 @cmc 我相信很多人会直接回答这个问题,所以我采取不同的策略不会有任何损失。询问专家的一半意义在于,他们知道您何时提出了错误的问题来解决真正的问题。这是“5个为什么”的应用。 en.wikipedia.org/wiki/5_Whys 真正的问题/问题是“我如何阻止人们阅读/窃取我的 PHP 代码”。答案是,如果您发布了您不能发布的代码,但您可能会浪费大量时间和金钱来尝试并获得错误的安全感。这不是比混淆器列表更有帮助吗?【参考方案3】:没有什么是完美的。如果您只是想阻止非程序员,那么这是我编写的一个小脚本,您可以使用:
<?php
$infile=$_SERVER['argv'][1];
$outfile=$_SERVER['argv'][2];
if (!$infile || !$outfile)
die("Usage: php $_SERVER['argv'][0] <input file> <output file>\n");
echo "Processing $infile to $outfile\n";
$data="ob_end_clean();?>";
$data.=php_strip_whitespace($infile);
// compress data
$data=gzcompress($data,9);
// encode in base64
$data=base64_encode($data);
// generate output text
$out='<?ob_start();$a=\''.$data.'\';eval(gzuncompress(base64_decode($a)));$v=ob_get_contents();ob_end_clean();?>';
// write output text
file_put_contents($outfile,$out);
【讨论】:
真棒?每个页面都带有获取源的完整解决方案:运行“gzuncompress(base64_decode($a))”。是的,这将阻止非程序员。但是原始源代码将阻止非程序员,谁需要为此编码?唯一会看到这个打算对其进行逆向工程的人是 PHP 程序员。 大多数时候,非程序员尝试通过在源代码中搜索他们想要更改的一些字符串,我也在寻找这样的解决方案,它只会阻止非程序员更改源代码,例如域名、数据库名、用户等 这对我来说是一个非常有帮助的答案。我只对阻止用户在记事本中轻松打开我的“database.php”并查看我的数据库用户名和密码感兴趣。【参考方案4】:我不确定您是否可以将解释语言的混淆标记为毫无意义(我无法在 Schwern 的帖子中添加评论,所以这里有一个新条目)。
我认为假设您知道有人想要混淆代码的所有可能场景,并且您假设任何人实际上都愿意竭尽全力查看代码一旦被混淆,这有点短视。考虑我目前的情况:
我在一家咨询公司工作,该公司正在开发一个大型且相当复杂的基于 PHP 的网站。该项目将托管在托管其他咨询公司开发的其他站点的客户服务器上。从技术上讲,我们编写的任何代码都归客户所有,因此我们无法获得许可。但是,任何其他有权访问服务器的咨询公司(竞争对手)都可以复制我们的代码,而无需先获得客户的许可。因此,我们有一个真正的混淆理由 - 让竞争对手理解我们的代码所需的努力比从头开始创建我们的工作副本的努力更多。
【讨论】:
【参考方案5】:请参阅我们的SD Thicket PHP Obfuscator,了解可以很好地处理任意大型页面集的混淆器。它主要通过加扰标识符名称来操作。对于中型到大型应用程序,这会使代码极难理解,而这正是整个目的。
它不会在“eval(decode(encodedprogramcode))”方案上浪费任何精力,很多 PHP“混淆器”都会这样做[这些是“编码器”,而不是“混淆器” s],因为任何 clod 都可以找到该调用并自己执行 eval-decode 并获取解码后的代码。
它使用语言精确的解析器来处理 PHP;它会告诉您您的程序是否在语法上无效。更重要的是,它准确地了解整个语言;它不会丢失或混淆,也不会破坏您的代码(如果您“不正确地”混淆会发生什么,例如,无法正确识别代码的公共 API)。
是的,它在页面上对标识符进行相同的混淆;如果不这样做,结果将不起作用。
【讨论】:
据我所知,这是一个只能在 Windows 下运行的 EXE?至少 eval 是一个 .exe 文件... eval 文件是一个基于 .exe 的安装程序。复杂的事实是,安装的产品通常从 .cmd 脚本运行,因为它下面有一种并行编程语言,但你永远不会看到它。它主要设计为 Windows 产品;然而,如果你用 Wine 将它安装在 Linux 上,它会运行与它一起安装的 .sh 脚本,就好像它是一个本地 Linux 工具一样。如果您使用 GUI 部分(可选,大多数人希望在生产构建过程中将其作为脚本运行),它在 Windows 上使用本机 Java,在 Linux 上使用本机 Java。 Thicket 是否需要附加到托管空间?如果是,如何将其安装在共享主机上? @StephenAdelakun:Thicket 不需要对服务器进行任何更改。下载并查看文档。 Thicket 是 200 美元,根据他们的网站,我认为与免费的遮蔽程序相比没有任何优势,值得这笔费用。我是一名独立的软件工程师,负担不起这种开支。【参考方案6】:我见过的最好的是Zend Guard。
【讨论】:
SD PHP 混淆器同样出色,成本约为 1/5。 @SalmanPK 原因应该很明显? @SalmanPK 它需要网络托管空间的插件。 Zend Guard 可能也是如此。不知道哪个是最主流的。无论如何,问题在于它会减少您的潜在受众。 SD 的 PHP 混淆器将全部转换为小写。如果您使用的是框架,那将是一个问题。 @JamesPoulson:尚不清楚您的评论是否指向 SD PHP 混淆器。需要明确的是,它不需要任何附加到网络托管空间。【参考方案7】:试试这个:http://www.pipsomania.com/best_php_obfuscator.do
最近我用Java写了它来混淆我的PHP项目,因为我在网上没有找到任何好的和兼容的现成的,我决定将它作为saas放在网上,让大家免费使用它。它不会更改不同脚本之间的变量名称以获得最大的兼容性,但可以很好地混淆它们,使用随机逻辑,每条指令也是如此。字符串...一切。我相信它比这个错误的codeeclipse要好得多,这是用PHP编写的并且非常慢:)
【讨论】:
看起来不错...但它安全吗?我的意思是,其他人可以轻松解密吗? 我可以向您保证,目前没有人可以对被此混淆器混淆的代码进行去混淆处理。 [需要引用] - 自制加密是通过默默无闻的安全性,这根本不是安全性。 "我可以向你保证,目前没有人可以对代码进行反混淆" 即使是 PHP?如果 PHP 可以做到,那么其他人也可以。查看您网站上的示例代码,您将在某个地方有一个 eval 语句将代码转储出去,将其更改为 echo,您的代码将被显示。 警告:此方法可以简单地解码回原始变量名称,请参阅:lombokcyber.com/en/detools/decode-pipsomania【参考方案8】:Thicket™ Obfuscator for PHP
PHP Obfuscator 工具会扰乱 PHP 源代码,使其难以理解或进行逆向工程(示例)。这为必须托管在网站上或发送给客户的源代码知识产权提供了重要的保护。它是 SD 源代码混淆器系列的成员。
【讨论】:
TrueBug.com 无法访问。我知道我在 3 年多后发表评论,但是如果有的话,你能帮忙提供新的 trueBug 网址吗? @StephenAdelakun 你只需要 TrueBug 吗?使用这个:TruBug PHP Obfuscator. 抱歉,链接失效。还是我错过了什么? @StephenAdelakun 我刚刚检查过,它有效。 @StephenAdelakun 为什么只有那个?:(
反正那是死软件。现在有更好更棒的吧?【参考方案9】:
使用 SourceGuardian 很好,因为它带有酷炫且易于使用的 GUI。
但请注意:
注意其-相当有趣-的许可条款。
每台机器只能运行 1 个 - 到目前为止这是可以接受的 如果你想在另一台机器上运行命令行界面,比如你的网络服务器,你需要另一个许可证(是的,这很有趣,我也能听到你在笑)。【讨论】:
这对我来说似乎很正常! 2 台机器 = 2 个许可证!通常人们所做的是在一台机器上对其进行编码,然后将其上传到其他机器。 @davidnewcomb 你似乎没有明白这一点。您通常在发布之前在您的开发机器上加密代码。如果您需要在线进行,命令行界面还需要额外的许可证,这显然是不对的。您倾向于将命令行界面放在 Web 服务器上,而不是放在本地机器上。 TL;DR 良好的保护,愚蠢的许可条款。 应该是每个用户 1 个许可证,而不是每台机器。 @beppe9000 完全同意!【参考方案10】:混淆只会为您的程序添加另一层潜在的错误和安全漏洞。请不要这样做。
编写混淆软件的那种人通常看起来很粗略而且不熟练。
如果您的代码“很棒”,破解者将竭尽全力传播它,无论它是否被混淆。如果没有人知道/关心您的代码,他们可能也不会。
【讨论】:
非熟练?基于什么证据?我写它们。在进行全面概括之前,请查看我的简历。 semanticdesigns.com/Company/People/idbaxter @Ira:我的说法仍然成立。大多数混淆代码可以在几分钟内被破解。我的具体意思是,大多数 这样做的人都是不熟练的,而不是所有。首先想到的是 Ioncube,当然,它发布了一个漏洞:osvdb.org/show/osvdb/41708。再说一次,您可能会将其部分归咎于 PHP 晦涩难懂的安全要求。 混淆,如果使用可靠的工具完成,不会改变程序的可靠性。二进制编译是一种极端的混淆,但我猜你相信 Zend 的 PHP 引擎是可靠的。 (不应该计算使用不良工具进行的混淆或编译)。 任何脑残的人都知道 php 在现实世界的企业软件市场中挣扎(读作“不存在”),因为它在 asp.net 上并没有被混淆。我厌倦了思想软弱的传道者说别的话。 (是的,这就是故意的无知)开源已经出现太久了,并且被尝试过并且发现过于频繁地想要有任何其他的结论:爱好?开源。工作?加密。只有傻瓜/白痴/生活在泡沫中/有钱的人才能永远有不同的想法。 该评论对我来说几乎无法理解,但它似乎暗示出售开源软件或基于开源软件构建的软件是没有意义的。如果您没有注意到,Java 是“企业”、开源的,并且与 .NET 一样成功。我的公司赚了数百万美元,我们从来不用混淆。问问自己:如果您不能支持/改进软件(即:您刚刚破解了别人的软件并转售),那么销售软件有什么好处?以上是关于PHP有代码混淆器吗? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章