背景:因为我们要做saas私有化部署,所以考虑将部署在第三方机器上的代码进行加密
途径:网上找了一个PHP混淆加密sdk(enphp),此加密脚本也是用PHP写的
漏洞:有加密就有解密,漏洞肯定是存在的,比如我看出来的:
这个加密方式会将int类型的数字转换为16进制,那么同理,解密也是将16进制转换为10进制。
官方sdk地址:enphp_opensource: 一个开源加密混淆 PHP 代码项目
使用方式:可以点进链接看使用说明。其实很简单,传个参数就行。
更改sdk:因为sdk代码只能加密某个目录下的所有PHP文件,所以我要将sdk代码改为递归加密。话不多说,直接更改sdk里的code_test.php文件。
<?php
error_reporting(E_ERROR);
include './func_v2.php';
$_SERVER['starttime'] = microtime(1);
$starttime = explode(' ', $_SERVER['starttime']);
$_SERVER['time'] = $starttime[1];
ob_implicit_flush(1);
$dir = __DIR__ . '/code_test/';
list_file($dir);
/**
* 这个函数是我加的
*
* 递归遍历文件夹加密
*
* @param $date
*/
function list_file($date){
//加密目录下的文件
en_php($date);
//读取文件夹
$temp = scandir($date);
//遍历文件夹
foreach($temp as $v){
$a = $date . $v . '/';
//如果是文件夹则执行
if(is_dir($a)){
//判断是否为系统隐藏的文件.和.. 如果是则跳过否则就继续往下走,防止无限循环再这里。
if($v=='.' || $v=='..'){
continue;
}
//因为是文件夹所以再次调用自己这个函数,把这个文件夹下的文件遍历出来
list_file($a);
}
}
}
/**
* 将sdk的代码封装为函数 方便使用
*
* 对某个目录下的PHP文件进行加密
*
* @param $dir
*/
function en_php($dir)
{
$files = glob($dir . '*.php');
$gen_count = 0;
chdir($dir);
foreach ($files as $file) {
echo "\r\n", str_repeat("===", 5), "\r\n\r\n";
$target_file = $file;
$target_file = str_replace('/code_test/', '/encoded/', $target_file);
if (!is_dir($target_file)) {
mkdir(substr($target_file, 0, strripos($target_file, '/')), 0777, true);
}
$options = array(
//混淆方法名 1=字母混淆 2=乱码混淆
'ob_function' => 2,
//混淆函数产生变量最大长度
'ob_function_length' => 3,
//混淆函数调用 1=混淆 0=不混淆 或者 array('eval', 'strpos') 为混淆指定方法
'ob_call' => 1,
//随机插入乱码
'insert_mess' => 0,
//混淆函数调用变量产生模式 1=字母混淆 2=乱码混淆
'encode_call' => 2,
//混淆class
'ob_class' => 0,
//混淆变量 方法参数 1=字母混淆 2=乱码混淆
'encode_var' => 2,
//混淆变量最大长度
'encode_var_length' => 5,
//混淆字符串常量 1=字母混淆 2=乱码混淆
'encode_str' => 2,
//混淆字符串常量变量最大长度
'encode_str_length' => 3,
// 混淆html 1=混淆 0=不混淆
'encode_html' => 2,
// 混淆数字 1=混淆为0x00a 0=不混淆
'encode_number' => 1,
// 混淆的字符串 以 gzencode 形式压缩 1=压缩 0=不压缩
'encode_gz' => 1,
// 加换行(增加可阅读性)
'new_line' => 0,
// 移除注释 1=移除 0=保留
'remove_comment' => 1,
// debug
'debug' => 1,
// 重复加密次数,加密次数越多反编译可能性越小,但性能会成倍降低
'deep' => 1,
// PHP 版本
'php' => 7,
);
// encode target
enphp_file($file, $target_file, $options);
log::info('encoded', $target_file);
$old_output = $output = array();
// run encoded & old script
exec('php -d error_reporting=0 "' . $target_file . '"', $output);
exec('php -d error_reporting=0 "' . $file . '"', $old_output);
$output = implode("\n", $output);
$old_output = implode("\n", $old_output);
$old_output = strtr($old_output, [realpath($file) => realpath($target_file)]);
// compare result
if ($old_output == $output) {
log::info('SUCCESS_TEST');
} else {
log::info('FAILURE_TEST');
echo str_repeat('===', 5);
echo "\r\nold=", trim($old_output), "\r\n";
echo str_repeat('===', 5);
echo "\r\nnew=", trim($output), "\r\n";
break;
}
//
/*
// php 5
log::info('exec5', $target_file, $file);
$options['php'] = 5;
enphp_file($file, $target_file, $options);
exec('php5_path "' . $target_file . '"', $output);
exec('php5_path "' . $file . '"', $old_output);
if ($old_output == $output) {
log::info('SUCCESS_PHP5');
} else {
log::info('FAILURE_PHP5');
echo "\r\n", trim(implode("\r\n", $output)), "\r\n";
break;
}
*/
}
}
?>