编译环境:Win10 64位系统
, VS2017
, vc15
, phpsrc@7.3.9
或 phpsrc@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.
下载源码、准备编译环境
- 下载并安装编译环境
通过phpinfo查看要编译的PHP版本和对应的编译器,我要编译的PHP 7.3和PHP 7.4版本对应的编译器是Visual Studio Enterprise 2017 (version 15.0),下载地址 - 下载,解压PHP-SDK工具包
https://github.com/Microsoft/php-sdk-binary-tools - 下载PHP源码
https://windows.php.net/downloads/releases/archives/找到对应的要编译的源代码,比如我的对应的就是php-7.4.27-src.zip - 下载扩展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 位版本的参考路径。
- 设置 PHP SDK,创建一个目录d:\php-sdk,将下载的php-sdk工具包解压到该目录下并重命名文件夹名为php-sdk
- 打开cmd命令窗口,进入php-sdk目录
cd d:\php-sdk
- 调用启动脚本,按需执行对应的批处理脚本,
phpsdk-vc15-x64.bat
- 运行命令
phpsdk_buildtree phpdev
会根据phpsdk_buildtree当前使用的 VC++ 版本创建路径,结束后会在D:\php-sdk\下生成“phpdev\vc15\x64”目录结构 - 将下载的PHP源码解压提取到D:\php-sdk\phpdev\vc14\x64\目录下
- 将下载的php-beast源码解压提取到D:\php-sdk\phpdev\vc14\x64\pecl目录下,并重命名文件夹名为beast
- 下载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-beast文件
进入“D:\php-sdk\phpdev\vc15\x64\pecl\beast”目录修改php-beast代码。
- 添加“win95nt.h”,作者的源代码包中没有提供这个头文件。下载地址
- 修改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 mode","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 != "yes"){
AC_DEFINE('BEAST_EXECUTE_NORMAL_SCRIPT', 0, 'disable execute normal PHP script mode');
}else{
AC_DEFINE('BEAST_EXECUTE_NORMAL_SCRIPT', 1, 'enable execute normal PHP script mode');
}
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配置文件更改加密秘钥
header.c
文件修改encrypt_file_header_sign[] 【仅仅是增加解密难度】,主要目的是不让别人能够识别出加密手段是beastaes_algo_handler.c
文件修改key[]数组 【仅仅是增加解密难度】,目的是不让别人直接可解密des_algo_handler.c
文件修改key[8]数组 【仅仅是增加解密难度]】,目的是不让别人直接可解密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

配置服务器扩展
编译成功后,找到 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.js
为 cscript /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