PHP源码加密 - 基于虚拟机原理的无扩展PHP代码混淆加密方案

442 阅读3分钟

早在2016年左右,我就开始使用各种PHP的加密手段保护我的源代码不被泄露,后来也购买了比较成熟的有扩展的加密工具,但是内心是渴望有一款无需安装扩展的加密产品的,可惜当时市面上的无扩展加密方案售价都高得离谱。

好了,我从2023年春节到2024年春节,整整一年时间的断断续续开发,完成了我现在要发布的产品《大牙PHP加密》,它采用了原生的虚拟化源码保护方案,无需安装任何扩展组件,可以对代码数据进行完全的混淆重构。

PHP代码加密 dyjm.ttmm.vip

image.png

它的核心是使用PHP再造了一个PHP的编译器和解释器,编译器将PHP代码编译为我自定义的汇编码,我写的PHP解释器又将这些汇编码执行,从而实现了大部分PHP的语法。这意味着,破解者如果想要破解大牙加密,就需要阅读虚拟机的执行流程,然后再跟着虚拟机的执行流程去逆向重写加密代码,这复杂度不亚于重写开发一套新的源代码。

我在这里贴出一点PHP虚拟机加密的执行原理,大家参考下,多多指教,我献丑了。

<?php
//原始PHP代码如下:
$a=11;
$b=22;
$c=33;
$d=44;
$a=$a+$b;
$c=$c*$d;
$a=$a-$c;
$d=$d/$a;
var_dump("原生的PHP执行结果:",$d); //输出结果为:float(-0.031007751937984496)
<?php
//实现一个可以进行加减乘除的PHP虚拟机
// 定义操作码,操作码是指虚拟机可以执行的指令,例如加、减、乘、除等。
define('CMD_ADD', 1);
define('CMD_SUB', 2);
define('CMD_MUL', 3);
define('CMD_DIV', 4);
define('CMD_VARDUMP', 5);


//定义寄存器 寄存器是指虚拟机用来存储数据的位置,存储计算结果、动态变量值等。
$registers = array(
    'AX' => 11,
    'BX' => 22,
    'CX' => 33,
    'DX' => 44
);

// 虚拟机核心,解释器函数,用来执行操作码的.
// 该函数使用switch语句根据操作码执行相应的操作。每个操作将寄存器中的值进行修改,以便在执行下一个操作时使用。
function run($instructions) {
    global $registers;

    foreach ($instructions as $instruction) {
        $opcode = $instruction[0]; //操作码
        $op1 = $instruction[1]; //操作数
        $op2 = $instruction[2]; //操作数

        switch ($opcode) {
            case CMD_ADD:
                $registers[$op1] += $registers[$op2];
                break;
            case CMD_SUB:
                $registers[$op1] -= $registers[$op2];
                break;
            case CMD_MUL:
                $registers[$op1] *= $registers[$op2];
                break;
            case CMD_DIV:
                $registers[$op1] /= $registers[$op2];
                break;
            case CMD_VARDUMP:
                var_dump("PHP虚拟机执行结果:",$registers[$op1]);
                break;
        }
    }
}


//编写汇编程序,将汇编程序转换为虚拟机指令
$instructions = array(
    array(CMD_ADD, 'AX', 'BX'), //首先将BX寄存器的值加到AX寄存器中
    array(CMD_MUL, 'CX', 'DX'), //然后将DX寄存器的值乘到CX寄存器中
    array(CMD_SUB, 'AX', 'CX'), //接下来,它将CX寄存器的值从AX寄存器中减去
    array(CMD_DIV, 'DX', 'AX'), //最后将AX寄存器的值除以DX寄存器的值并将结果存储在DX寄存器中
    array(CMD_VARDUMP, 'DX', ''),  //输出DX寄存器的值
);

run($instructions); //执行虚拟机 它应该是最终将输出:float(-0.031007751937984496)

虚拟机原理大致就是这样咯,写这个加密真的是个苦力活,我想,未来哪个老哥要逆向破解应该也会掉头发吧,反正我自己是不想逆向这样的加密的,嗯,我还实现了源代码运行时间限制,源代码绑定域名,源代码绑定服务器IP(是内网IP和外网IP都支持的哦),欢迎大家来交流使用。。

大牙PHP加密选项.jpg

在这里,我想起了我十多年前自学入门IT的时候,风筝师傅给我丢来了一个加密后的ASP脚本文件,当时我感叹,这字乱码都看不清读不懂,我能学会这个?嗯,网络上的一个领路人风筝师傅,谢谢。

好啦,有需要的加密的PHPer,可以可以来使用哦,大佬也给些建议呀。。