使用 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 –help
yakpro-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 协议》,转载必须注明作者和本文链接
推荐文章: