编译环境: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.
这只用在构建 PHP 之前完成一次。我使用的PHP-SDK目录是d:\php-sdk,可以根据需要随意调整位置。因此,我使用路径D:\php-sdk\phpdev\vc14\x64\php-7.4.27-src作为 PHP 7.4.27 的 Visual C++ 64 位版本的参考路径。
cd d:\php-sdk
phpsdk-vc15-x64.bat
phpsdk_buildtree phpdev
会根据phpsdk_buildtree当前使用的 VC++ 版本创建路径,结束后会在D:\php-sdk\下生成“phpdev\vc15\x64”目录结构$> 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目录中进入“D:\php-sdk\phpdev\vc15\x64\pecl\beast”目录修改php-beast代码。
// $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);
}
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-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"
修改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是一种解释型脚本语言。与编译型语言不同,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