Windows编译PHP拓展php-beast

编译环境:Win10 64位系统 , VS2017 , vc15 , phpsrc@7.3.9phpsrc@7.4.27 , php-beast@2.7

Visual C++ 14.0 (Visual Studio 2015) for PHP 7.0 or PHP 7.1.
Visual C++ 15.0 (Visual Studio 2017) for PHP 7.2, PHP 7.3 or PHP 7.4.
Visual C++ 16.0 (Visual Studio 2019) for master.

PHP官方的Windows编译文档

下载源码、准备编译环境

  1. 下载并安装编译环境
    通过phpinfo查看要编译的PHP版本和对应的编译器,我要编译的PHP 7.3和PHP 7.4版本对应的编译器是Visual Studio Enterprise 2017 (version 15.0),下载地址
  2. 下载,解压PHP-SDK工具包
    https://github.com/Microsoft/php-sdk-binary-tools
  3. 下载PHP源码
    https://windows.php.net/downloads/releases/archives/找到对应的要编译的源代码,比如我的对应的就是php-7.4.27-src.zip
  4. 下载扩展php-beast
    https://github.com/liexusong/php-beast

设置目录

这只用在构建 PHP 之前完成一次。我使用的PHP-SDK目录是d:\php-sdk,可以根据需要随意调整位置。因此,我使用路径D:\php-sdk\phpdev\vc14\x64\php-7.4.27-src作为 PHP 7.4.27 的 Visual C++ 64 位版本的参考路径。

  1. 设置 PHP SDK,创建一个目录d:\php-sdk,将下载的php-sdk工具包解压到该目录下并重命名文件夹名为php-sdk
  2. 打开cmd命令窗口,进入php-sdk目录 cd d:\php-sdk
  3. 调用启动脚本,按需执行对应的批处理脚本, phpsdk-vc15-x64.bat
  4. 运行命令 phpsdk_buildtree phpdev 会根据phpsdk_buildtree当前使用的 VC++ 版本创建路径,结束后会在D:\php-sdk\下生成“phpdev\vc15\x64”目录结构
  5. 将下载的PHP源码解压提取到D:\php-sdk\phpdev\vc14\x64\目录下
  6. 将下载的php-beast源码解压提取到D:\php-sdk\phpdev\vc14\x64\pecl目录下,并重命名文件夹名为beast
  7. 下载PHP-SDK编译依赖组件,在命令行下运行 $> cd d:\php-sdk\phpdev\vc15\x64\php-7.4.27-src ,然后执行 $> phpsdk_deps --update 命令用来获取SDK的依赖包。(下载非常慢,请注意多次尝试。下载时安全软件可能会拦截,注意放行)无法自动更新,可以选择手工下载,从http://windows.php.net/downloads/php-sdk/deps/选择匹配的 VC++ 版本和架构目录下载打包的 deps,下载依赖包并解压放入deps目录中
PHP编译扩展设置目录

修改扩展php-beast文件

进入“D:\php-sdk\phpdev\vc15\x64\pecl\beast”目录修改php-beast代码。

  1. 添加“win95nt.h”,作者的源代码包中没有提供这个头文件。下载地址
  2. 修改config.w32代码,原作者提供的缺少一个配置项,导致无法使用“–enable-execute-normal-script=yes”配置项,没有这个配置项的话,模块默认会禁止执行未加密的php代码。修改config.w32文件内容如下:
// $Id$
// vim:ft=javascript

// If your extension references something external
ARG_WITH("beast", "for beast support", "yes,shared");


ARG_ENABLE("beast", "enable beast support", "yes,shared");

ARG_ENABLE("beast-debug", "enable beast debug mode", "no");

ARG_ENABLE("execute-normal-script", "Enable execute normal PHP script", "yes");

if (PHP_BEAST != "no") {
    if (PHP_BEAST_DEBUG != "no") {
        AC_DEFINE('BEAST_DEBUG_MODE', 1, 'Debug support in beast');
    }
    if (PHP_EXECUTE_NORMAL_SCRIPT != "no") {
        AC_DEFINE('BEAST_EXECUTE_NORMAL_SCRIPT', 1, [ ]);
    }

    EXTENSION("beast", "beast.c aes_algo_handler.c des_algo_handler.c base64_algo_handler.c beast_mm.c spinlock.c cache.c beast_log.c global_algo_modules.c header.c networkcards.c tmpfile_file_handler.c file_handler_switch.c shm.c", true);
}

修改php-beast配置文件更改加密秘钥

  1. header.c文件修改encrypt_file_header_sign[] 【仅仅是增加解密难度】,主要目的是不让别人能够识别出加密手段是beast
  2. aes_algo_handler.c文件修改key[]数组 【仅仅是增加解密难度】,目的是不让别人直接可解密
  3. des_algo_handler.c文件修改key[8]数组 【仅仅是增加解密难度]】,目的是不让别人直接可解密
  4. networkcards.c文件*allow_networkcards[]数组 【非必须】,目的是生成的扩展只能在指定服务器上使用

编译

$>cd php-7.4.27-src
$>buildconf
$>configure --help   #查找编译扩展关键字,确定配置参数
# 线程安全编译
$>configure --disable-all --enable-cli --without-beast --enable-execute-normal-script=yes --disable-beast=shared
# 非线程安全编译
$>configure --disable-zts --disable-all --enable-cli --without-beast --enable-execute-normal-script=yes --disable-beast=shared
$>nmake

重新编译脚本

$>nmake clean
$>buildconf --force
# 线程安全编译
$>configure --disable-all --enable-cli --without-beast --enable-execute-normal-script=yes --disable-beast=shared
# 非线程安全编译
$>configure --disable-zts --disable-all --enable-cli --without-beast --enable-execute-normal-script=yes --disable-beast=shared
$>nmake
编译php-beast成功

配置服务器扩展

编译成功后,找到 D:\php-sdk\phpdev\vc15\x64\php-7.4.27-src\x64\Release_TS\php_beast.dll文件,复制到服务器php扩展目录ext文件夹下。

更改服务器php.ini文件,在尾部添加如下内容。

[php-beast]
extension="D:\xampp\php\ext\php_beast.dll"
beast.cache_size = 10485760
beast.log_file = "D:\xampp\apache\logs\php-beast.log"
;beast.log_user = "user"
;beast.log_level = "debug"
;beast.enable = On

重启php,通过phpinfo查看扩展是否加载成功,查看扩展中是否有beast。

加密php项目源代码

修改 php-beast\tools 目录下的 configure.ini 文件

# 针对整个文件夹加密
d:\xampp\php\php.exe d:\php-sdk\phpdev\vc15\x64\pecl\beast\tools\encode_files.php

# 单个文件加密
d:\xampp\php\php.exe d:\php-sdk\phpdev\vc15\x64\pecl\beast\tools\encode_file.php --oldfile D:\xampp\htdocs\dashboard\phpinfo.php --newfile D:\xampp\htdocs\dashboard\phpinfo-beast.php --encrypt DES --expire "2025-08-29 23:59:59"

踩坑教训 — php7.3.9编译执行buildconf命令报错【输入错误: 没有文件扩展“.js”的脚本引擎。】

修改buildconf.bat文件
更改代码cscript /nologo win32/build/buildconf.jscscript /nologo /e:jscript win32/build/buildconf.js

buildconf之后再修改configure.bat文件
更改代码cscript /nologo configure.js %*cscript /nologo /e:jscript configure.js %*

PHP-beast加密原理及安全性

PHP是一种解释型脚本语言。与编译型语言不同,php源代码不是直接翻译成机器语言,而是翻译成中间代码(OPCODE) ,再由解释器(ZEND引擎)对中间代码进行解释运行。在php源代码的保护在原理可以分为3大类:源代码混淆(编码)、OPCODE混淆(编码)和修改解释引擎(虚拟机)。

PHP-beast使用aes、des等加密方法直接加密php代码,HOOK翻译php的函数在翻译PHP文件前对文件进行解密操作。PHP-beast加密采用的是有扩展的源代码解密,它会把加密key编译进扩展中。

PHP-beast安全性

由于PHP-beast的加密特性,它的安全性主要靠加密秘钥key、是否能获取扩展文件决定。由于PHP-beast是开源的,如果我们不修改加密秘钥key,将会很容易被别人破解,甚至网上都有专门的工具支持在线破解。

我们修改了加密秘钥key和header.c文件,那么安全性如何呢?这时加密的安全性,就靠是否能获得扩展文件,这个扩展文件相当于钥匙,别人拿到扩展文件也是可以破解的。就算修改了加密key,无非是增加破解的难度(其实这就可以阻挡一大部分非专业人士了,对于要求不高的用户都可以了)。

既要把代码交给客户,也要把扩展文件配置到客户的服务器上,这时还想要更高的安全性,我们就不得不采取其他方法了,opcode混淆或虚拟机方案,这也是当前大部分商业php保护软件( ZendGuard(zend) SourceGuardian(SG) IonCube (IC) Swoole Compiler)采用的方法。

转载请注明:半亩方塘 » Windows编译PHP拓展php-beast