将PHP文件转换为二进制

26

能否将PHP文件转换为二进制文件并部署到Web服务器上?


什么意思转换为二进制?PHP是一种解释性语言,这意味着它是逐行读取和执行的(大致上如此)。 它不像C语言一样编译成二进制文件,你只需要把文件放在网页目录中,并允许用户访问它; 当然,Web服务器必须运行PHP。 - Anthony
10
您希望将源代码加密并以可执行文件形式分发,以防止别人窃取并修改代码以进行再利用,对吗? - Salman A
1
你能不能更好地提问呢?我真的不知道你想做什么。 - Scott Evernden
1
@Hulk:如果你的目标是 @Salman A 所说的,你应该使用 Zend Guard(http://www.zend.com/en/products/guard/)。 - JCasso
5个回答

24

由于PHP是一种(相对)可移植的语言,将PHP源代码编译成字节码而不是二进制代码更可取。为此,有一个实验性项目称为bcompiler


还有 Roadsend,他们在放弃 Scheme 后使用了 phpc 的部分内容。(我认为) - Tim Post
phc的安装有些麻烦,而roadsend似乎比通过php解释器运行文件要慢一些。 - Brendan Long
1
一旦您使用pecl命令行工具将bcompiler安装到PHP中,您可以使用bencoder作为脚本来编码一个文件或整个目录(及其子目录)的所有PHP文件,并将所有未编码的文件复制到新目录中。在这种情况下,您可能会发现您不需要IonCube。但这仍然是实验性的,请测试所有功能是否仍然正常工作。 - Volomike

14

几个月前,我搜索了一下(php代码保护或脚本保护),我的结果是:

我提供一些描述,但建议你自己搜索并原谅我。

要小心搜索,因为你可能会遇到php压缩器,而压缩器只是关于gzip和其他http传输压缩机制。

php脚本保护工具最重要的问题有:

  1. PHP运行时性能速度降低多少?

  2. 我们需要在php服务器上安装额外环境或工具吗?

  3. 易于操作

你可以在此处找到整个描述和比较:http://www.seocompany.ca/software/free-encryption-software.html

混淆器

你会在网上找到很多混淆器,但不能保证你的代码能够工作。

即使我找到了一个用Visual C++和MSVS混淆php代码的方法,因为我也有asp.net经验,我试过了,但没有成功。

转换器和锁定器

  • ion保护程序 (http://www.ioncube.com/):不免费,但我听说它很有名

  • phc (php编译器):免费的,曾经是一个不错的选择,但"Brendan Long"说了实话,因为phc的安装方式很痛苦。不过结果很神奇,而且有像ion这样的著名名称。

  • php locker:我试过并测试了一下。它在编译代码时出错,而且只适用于低于php5的版本。绝对不免费,而且如果你想破解它,那么对于考虑使用ccr-acks的人来说,几乎是不可能找到php锁定器的。

  • Zend Guard: Zend Guard是一种完美的保护工具,但比phc或ion更难使用,因为您需要在服务器上安装Zend运行时环境(ZRE),而Zend Guard绝对不免费。但如果您是Zend粉丝(zend框架+zend IDE+Zend Guard),您应该知道Zend Guard与zend IDE兼容,并且代码阻塞过程将变得非常容易。我不是Zend粉丝,因为zend框架和zend guard都会明显降低运行速度。我喜欢php快速的运行速度。

  • php -> C/C++编译(是可能的)(最佳性能全球通用):这并不是很出名,因此如果没有人谈论它,那很正常。

  • Facebook Hiphop:这个工具由Facebook使用,用于将php文件编译为c ++ / c以获得更好的性能,但最终我们会得到无法阅读的编译代码。我记不清了,但我认为它需要对Linux或Microsoft Visual C ++中的PHP重新编译机制有很好的熟悉。(但请勿相信我的虚弱记忆,请谷歌一下)(学习有关PHP重新编译方式的内容,请参考php_manual.chm的最新版本)

  • 最后,我使用正则表达式制作了一个简单的php混淆器,它适用于php 5.3和我的复杂脚本,因此我开始使用OpenSSL和不同的加密机制,并对php安全开发进行了审查。

    祝您成功。


    听起来像是一个 XY 问题的答案 - Peyman Mohamadpour

    5
    这个做法可行,但是有些过时。你可以通过使用zend引擎来创建自己的自定义扩展,并将dll文件添加到php目录下的ext位置。之后,您就可以将自己的php脚本作为php函数调用。请注意,php仅限于服务器端,因此除非从服务器复制并交出,否则没有人可以获取您的脚本。
    首先下载您所使用版本的php源代码库 [windows.php.net],其中包含了您需要的zend文件。
    步骤1:创建新项目并在Visual C++下选择“常规”,然后选择空项目选项。设定名称并单击确定。例如我的项目名为Project1。
    步骤2:在解决方案名称上右键单击选择属性。在“项目默认值/配置类型”下选择动态库(.dll),确保您正在更改Debug配置,而未使用Release。
    步骤3:在VC++目录下添加以下内容: Include libraries: C:\php-7.1.8-src\Zend C:\php-7.1.8-src\win32 C:\php-7.1.8-src\TSRM C:\php-7.1.8-src\main C:\php-7.1.8-src
    Libraries: C:\php-7.1.8\dev
    步骤4:在预处理器定义中添加ZEND_DEBUG=0;ZTS=1;ZEND_WIN32;PHP_WIN32
    步骤5:在链接器输入中添加php7ts.lib。这需要与您所使用的php版本的lib文件匹配。
    保存你的解决方案属性设置之后,就可以添加一个代码文件了。在源文件夹中右键单击,选择添加代码。我将其命名为Project1.cpp。您还需要将config.w32.h.in重命名为config.w32.h并将其复制到所需目录。
    注意:这些步骤可能不适用于最新版本的php和Visual Studio。
    // this needs to match the compiler version that php was compiled with
    #define _CRT_SECURE_NO_WARNINGS
    #define PHP_COMPILER_ID "VC14"
    
    #pragma once
    /* You must include config.w32.h first */
    #include "win32/config.w32.h"
    
    #include "php.h"
    
    ZEND_FUNCTION(ReturnString);
    
    zend_function_entry Project1_functions[] =
    {
        ZEND_FE(ReturnString, NULL)
        {
            NULL, NULL, NULL
        }
    };
    
    zend_module_entry Project1_module_entry =
    {
        STANDARD_MODULE_HEADER,
        "Project1 Module",
        Project1_functions,
        NULL, NULL, NULL, NULL, NULL,
        NO_VERSION_YET, STANDARD_MODULE_PROPERTIES
    };
    
    ZEND_GET_MODULE(Project1)
    
    ZEND_FUNCTION(ReturnString)
    {
        zval* value;
    
        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &value) == FAILURE)
        {
            RETURN_FALSE;
        }
    
        convert_to_string(value);
    
        RETURN_STRING(Z_STRVAL_P(value), true);
    }
    

    按F7进行编译,它应该会创建 Project1\Debug\Project1.dll。将 Project1 复制到您的 ext 目录 C:\php-7.1.8\ext,并在 php.ini 中添加 extension=Project1.dll,然后就可以使用了。如果不起作用,请仔细检查属性以确保没有遗漏任何内容。
    The script is quite simple:
    
    <?php
    echo ReturnString("The Returning String");
    ?>
    

    在 PHP 中有一个缓存字节码的设置,因此请检查您的 php.ini 文件底部的 [opcache] 设置。 - developer68

    3
    如果Web服务器是基于Linux的,您可以创建一个类似.deb.rpm的软件包(取决于Linux发行版),并轻松分发/部署它。
    敬礼, Dawid。

    3
    这不是一个坏答案。这个问题似乎在问“如何将PHP文件转换为可分发的程序”。 - Brendan Long
    3
    将 PHP 文件转换为二进制文件并非将 PHP 文件转换为可分发的程序相同。 - Emre Yazici
    2
    显然问题并不是很清楚。但似乎他需要一种类似于servlet的方法。 - JCasso

    1

    这取决于你所说的“二进制”是什么意思。

    如果你想编译(或者只是混淆)你的PHP代码以防止别人修改,那么可以使用字节码编译器。其中一个例子是Zend的工具,还有其他的工具。(我更喜欢Zend的工具,因为他们是PHP背后的主要公司,并且完全针对所有版本的PHP进行QA测试)。

    如果你想将你的PHP代码编译并链接到PHP运行时中,然后部署它(就像C\C++一样),那么不行。也许从理论上讲这是可能的,但会很混乱。(不切实际或可行,而且我认为没有人尝试过组合任何东西,输出也将与特定架构绑定)。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接