飘易博客(作者:Flymorn)
订阅《飘易博客》RSS,第一时间查看最新文章!
飘易首页 | 留言本 | 关于我 | 订阅Feed

PHP加密混淆方案对比选型 & YAK Pro Php Obfuscator介绍

Author:飘易 Source:飘易
Category:PHP编程 PostTime:2026/3/26 11:22:25 UpdateTime:2026/3/28
正 文:

PHP本身是一种开源的开发语言,编写好的项目如果分发到客户服务器上,一般就是明文的可以直接查看的。如果你想对业务的核心代码进行加密混淆,业内其实有不少方案,但主要是2个方向:带扩展的和不带扩展的。

一、带扩展的一些方案

1、Swoole Compiler

特点:由 Swoole 官方团队开发,直接将 PHP 源码编译成 C++ 代码并生成二进制目标文件。

优势:

  • 非组件化:不依赖 Opcode,破解难度极高。

  • 性能优化:编译后的代码执行效率通常比原代码更高。

  • 功能强大:支持代码混淆、时间授权、指纹绑定。

  • 适用场景:高价值的商业软件、高性能要求的项目。

2、IonCube Encoder

特点:业界元老级方案,几乎是商业 PHP 程序的标配(如旧版的 WHMCS)。

优势:

  • 稳定性极佳:兼容性非常强,支持从 PHP 5 到 PHP 8.x 的所有版本。

  • 自研加密算法:使用复杂的层级加密和 Opcode 转换。

缺点:收费昂贵,且由于名气太大,市面上存在一些针对旧版本的“脱壳”工具(虽然新版本依然坚挺)。

Basic方案是199美元,不支持授权许可文件:

Licensing Features
Features to generate time expiring and IP/domain name restricted license files
(支持生成具有“到期时间限制”以及“IP/域名限制”的授权许可文件。)

Pro方案299美元,才支持上述功能。

https://www.ioncube.com/php_encoder.php?page=pricing 

3、SourceGuardian

SourceGuardian 是与 IonCube 齐名的“老大哥”级商业方案。不要使用旧版本,有破解版外流。

  • 极高的安全性:它不只是简单的混淆,而是将 PHP 源码编译成一种特殊的字节码(Bytecode)。没有扩展插件,很难还原出原始代码。

  • 灵活的授权机制(Licensing):SG 完美支持:

  • 到期锁定:设置代码在某个日期后失效。

  • IP/域名绑定:锁定代码只能在特定的服务器或网站运行。

  • 机器码绑定:锁定特定的硬件 ID(防止代码被拷贝到其他服务器)。

  • 支持 PHP 全版本:更新速度极快,目前已支持最新的 PHP 8.3 及以上版本。

  • 跨平台支持:支持 Windows, Linux, FreeBSD, macOS 等主流系统。

4、Zend Guard (已停产)

注意:曾经的行业标准,但 Zend 官方已停止维护(最高仅支持到 PHP 7.0)。目前不建议在新项目中使用。

5、PHP Screw / PHP Screw Plus

特点:一个开源的 PHP 加密扩展。如果你需要一定的保护,但不想支付高昂的商业授权费,可以考虑这些。

原理:利用 zlib 压缩和简单的位运算(如 XOR)对源码进行加密。

评价:属于“防君子不防小人”。因为它是开源的,如果黑客拿到了你的 php_screw.so 扩展文件,通过逆向工程很快就能找回密钥。

改进版:PHP Screw Plus 增强了对 MD5 校验和代码执行路径的保护。

6、Beast (PHP 扩展)

特点:由国内开发者开发的开源加密扩展。

优势:

  • 支持 AES、DES、RC4 等多种算法。

  • 可以禁用 eval、system 等危险函数。

  • 支持限制代码的有效期。

评价:配置相对简单,适合中小型项目的内部保护。


这些带扩展的方案有一个缺点,就是需要服务器上安装加载指定的加载器(loader.so)。如果服务器不能安装这个加载器,就无法使用这个方案。


二、免扩展的加密混淆方案

这种方案的本质是源码级混淆 + 自解密外壳。

1. 免扩展方案的原理

免扩展加密并不真正“改变”PHP 的底层运行方式,而是通过以下步骤重新包装你的代码:

  • 代码压缩与混淆:去掉注释、缩进,将变量名和函数名改为无意义的字符(如 $O00OO0)。

  • 编码/加密内容:将原始代码通过 base64、rot13 或对称加密算法(如 AES)转为乱码。

  • 构建自解密外壳(Stub):生成一段引导代码,在运行时动态调用 eval() 或 preg_replace('/.*/e', ...) 来还原并执行原始逻辑。

2. 主流免扩展方案

A. 商业混淆器(强度较高)

这类工具通常是收费软件,混淆逻辑非常复杂,难以通过简单的格式化还原:

  • EnPHP:国内非常出名的免扩展混淆工具。它会将逻辑打乱,并使用大量的变量名干扰,虽然不依赖扩展,但反混淆难度很大。目前貌似已无维护。

  • ZendGuard (Legacy):虽然它有扩展版,但也支持简单的混淆模式。

  • PHPProtect:老牌的源码混淆工具。

B. 开源/在线混淆工具(强度中等)

适合简单的项目保护,防止被小白直接看懂逻辑。

  • PHP Obfuscator (yakpro-php):基于语法树(AST)的混淆器。它可以重命名变量、函数、类名,甚至可以打乱控制流(Control Flow Flattening)。

  • 在线加密平台:如 phpjiami.com 等。这类平台通常使用多层 eval 和 base64 嵌套。

警告:使用第三方在线平台有源码被对方泄露或植入后门的风险。

3. 这种免扩展方案真的安全吗?

直接给结论:防君子不防小人

由于 PHP 最终必须解析为 Opcode 才能运行,任何“免扩展”方案最终都会在内存中还原出原始的 PHP 代码。资深程序员可以通过以下手段破解:

  • Hook eval 函数:直接拦截解密后的字符串输出。

  • 使用 Xdebug:单步调试查看变量内容。

  • VLD 扩展:查看解密后生成的 Opcode。

4. 飘易的建议

如果为了保护核心算法:

  • 尽量说服客户使用支持扩展的环境,上 Swoole Compiler 或 IonCube;但即使是这种带扩展的方案,也不是百分百防破解,他只能增加破解的难度。

如果环境受限且必须加密:

  • 推荐使用 YAK Pro (YAK PHp Obfuscator)。它是开源的,安全可控,且基于语法树的混淆比简单的 base64+eval 要强得多。

配合手段:

  • 加入域名锁定逻辑(检查 $_SERVER['HTTP_HOST'])。

  • 加入时间锁逻辑(检查 time())。

即使代码被还原,这些硬编码在逻辑里的限制依然能起到一定作用。


三、 YAK Pro 开源方案安装、使用

1、YAK Pro - Php Obfuscator 简介

yakpro-po 官方的github库已下线。可以从以下的备份库下载:

从备份库下载:

https://git.conv.su/public_fork/yakpro-po 

国内:

https://gitee.com/hcx07/yakpro-po 

https://gitee.com/zilf/yakpro-po


也可以使用 yakpro-po 的在线工具:

https://www.php-obfuscator.com/?demo 

【注意】:

对于lumen、laravel这类框架类,混淆时,不能启用 Namespaces、Classes、Methods、Functions。


2、安装yakpro 及依赖 PHP-Parser

yakpro-po 2.0.4 依赖 PHP-Parser 4.x(4.19.5 是4.x分支里最新的一个版本

下载 PHP-Parser:https://github.com/nikic/PHP-Parser/releases 


在 yakpro-po-master 目录(yakpro-po.php所在文件夹)里创建 PHP-Parser 目录,放入 v4.19.5.zip 解压后的所有文件。

同时修改 PHP-Parser 下的 composer.json ,文件最后加入:

    "extra": {
        "branch-alias": {
            "dev-master": "4.19.5"
        }
    }

因为执行版本检测时,yakpro-po 会检查依赖的版本号,而 composer.json 里可能没有 extra 字段。

php yakpro-po.php --help


先修改默认配置文件:

yakpro-po.cnf

对于lumen、laravel框架,不混淆命令空间、类、类方法、函数:

$conf->obfuscate_function_name          = false;         // self explanatory
$conf->obfuscate_class_name             = false;         // self explanatory
$conf->obfuscate_method_name            = false;         // self explanatory
$conf->obfuscate_namespace_name         = false;         // self explanatory


windows下调用例子:

php yakpro-po.php source_directory -o target_directory

php yakpro-po.php source_filename -o target_filename


实际php例子:

php yakpro-po.php D:\WEB\www\local\y1.php -o D:\WEB\www\local\y1-o.php

y1.php 源码:

function store(Request $request)
{
    // 验证
    $validator = \Validator::make($request->all(), [
        'loc_type' => 'required',
    ],[],[
        'loc_type' => '服务器所在地',
    ]);
    if ($validator->fails()) {
        $error_text = implode(" ", $validator->errors()->all());
        return $this->sendErrorData($error_text);
    }
    // 检查
    if(empty($request->plat_code) or empty($request->plat_key)){
        return $this->sendErrorData("平台key 或 平台code 为空");
    }
    $config = \App\Models\AiConfig::find(1);
    // 参数
    $input = [
        "loc_type" => $request->input("loc_type"),
        "plat_code" => $request->input("plat_code"),
    ];  
    // 更新
    $res = \App\Models\AiConfig::where("id", 1)->update($input);    
    return $this->sendData($res);
}

加密混淆后的y1-o.php源码:

混淆后,只有一行代码,并且大量使用goto语句。


在实际使用中,yakpro方案只是整个加密验证逻辑中的一环,可以结合php动态化调用方法、16进制混淆、aes加密、gz压缩等等。


作者:飘易
来源:飘易
版权所有。转载时必须以链接形式注明作者和原始出处及本声明。
上一篇:阿里云OSS对象存储STS授权流程:前后端分离
下一篇:浏览器多标签场景:多账号同时登录网站系统如何防止串号?
0条评论 “PHP加密混淆方案对比选型 & YAK Pro Php Obfuscator介绍”
No Comment .
发表评论
名称(*必填)
邮件(选填)
网站(选填)

记住我,下次回复时不用重新输入个人信息
目 录
飘易搜索
最新文章
相关文章
随机文章
© 2007-2030 飘易博客 Www.Piaoyi.Org 版权所有 Sitemap