PHP混淆加密+递归加密文件

背景:因为我们要做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;
        }
        */

    }
}
?>

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值