使用 yakpro-po 实现 Laravel 项目代码混淆加密
背景
防止商用软件实现逻辑泄露。
工具介绍
yakpro-po 由原生PHP开发,所以安装的时候,保证环境能执行PHP命令。
安装 yakpro-po 步骤
找一个可用目录,这里按项目推荐目录为准:/user/local
cd /usr/local通过 git 拉取 yakpro-po 代码
git clone https://github.com/pk-fr/yakpro-po.git到 yakpro-po 目录,还需要安装 PHP-Parser
cd yakpro-po && git clone https://github.com/nikic/PHP-Parser.git保证 yakpro-po 有可执行权限
chmod a+x yakpro-po.php为方便使用,建立软连接到 bin 目录
cd /usr/local/bin ln -s /usr/local/yakpro-po/yakpro-po.php yakpro-po安装完毕,查看下是否正常
yakpro-po –helpyakpro-po –help Info: Using [/usr/local/yakpro-po/yakpro-po.cnf] Config File... Info: yakpro-po version = 2.0.13使用方式
提供了多种方式混淆代码,因为本次是针对 Laravel 项目代码混淆,所以采用
yakpro-po source_filename -o target_filename
实践
Laravel 项目直接上面的命令,不带任何选项,混淆后的代码根本跑不起来,因为默认混淆了类名、命令空间、变量等等,所以要手动添加选项来指定混淆选项。
建议使用的选项:
yakpro-po my_app -o obfuscate_my_app --no-obfuscate-function-name --no-obfuscate-class_constant-name --no-obfuscate-class-name --no-obfuscate-interface-name --no-obfuscate-trait-name --no-obfuscate-property-name --no-obfuscate-method-name --no-obfuscate-namespace-name --no-obfuscate-label-name这里混淆了:
淆变量名 混淆常量名 混淆 if 语句 淆循环语句 淆字符串文字 随机播放语句 单行输出
混淆前后对比




需要注意的点:不要混淆 模板代码
- 先把模板目录拷贝出来,混淆之后,再还原回去。
- 混淆模板代码会用 echo 输出,造成模板标记直接当成字符串输出。后果就是页面输出类似 @if() 这类的效果。

其它 PHP 框架混淆
理论上 yakpro 适用所有 PHP 项目,多数项目是在成熟的PHP框架下开发,不同框架,有不同的约束,比如 Laravel 会有一些约定的配置常量,就不能混淆常量,不然代码不能正常运行。
所以当混淆后,代码跑不起来时,就需要根据实际情况,调整混淆选项了。
附录:可用混淆选项
--no-strip-indentation 多行输出
--strip-indentation 单行输出
--no-shuffle-statements 不打乱语句
--shuffle-statements 随机播放语句
--no-obfuscate-string-literal 不混淆字符串文字
--obfuscate-string-literal 混淆字符串文字
--no-obfuscate-loop-statement 不混淆循环语句
--obfuscate-loop-statement 混淆循环语句
--no-obfuscate-if-statement 不混淆 if 语句
--obfuscate-if-statement 混淆 if 语句
--no-obfuscate-constant-name 不混淆常量名
--obfuscate-constant-name 混淆常量名
--no-obfuscate-variable-name 不混淆变量名
--obfuscate-variable-name 混淆变量名
--no-obfuscate-function-name 不混淆函数名
--obfuscate-function-name 混淆函数名
--no-obfuscate-class_constant-name 不混淆类常量名
--obfuscate-class_constant-name 混淆类常量名
--no-obfuscate-class-name 不混淆类名
--obfuscate-class-name 混淆类名
--no-obfuscate-interface-name 不混淆接口名称
--obfuscate-interface-name 混淆接口名称
--no-obfuscate-trait-name 不混淆特征名称
--obfuscate-trait-name 混淆特征名称
--no-obfuscate-property-name 不混淆属性名称
--obfuscate-property-name 混淆属性名称
--no-obfuscate-method-name 不混淆方法名
--obfuscate-method-name 混淆方法名称
--no-obfuscate-namespace-name 不混淆命名空间名称
--obfuscate-namespace-name 混淆命名空间名称
--no-obfuscate-label-name 不混淆标签名称
--obfuscate-label-name 混淆标签名称
本作品采用《CC 协议》,转载必须注明作者和本文链接
关于 LearnKu
php还混淆啥呢,所有代码写到一个文件里 压缩成1行不就完了么
如果是goto的话其实完全没有可靠性,用php-parser推断一下就出来了,之前微擎写的 微擎2c goto加密,用parser 直接解。。。。。
roger that
本身代码压缩minify可以理解因为可以增加执行性能 加密的话 我想了下得很商业或者要求很高的特别部门用得到
大多数情况下混淆已经够用了,我更加关注的是混淆了之后有没有办法还原,如果有办法还原意义就不大
请教一下大佬两个问题: 可以只加密部分文件夹吗? 加密后的结果如下图,要怎么使用呢,我单独部署加密的文件报错了