使用 yakpro-po 实现 Laravel 项目代码混淆加密

背景

防止商用软件实现逻辑泄露。

工具介绍

yakpro-po 由原生PHP开发,所以安装的时候,保证环境能执行PHP命令。

安装 yakpro-po 步骤

  1. 找一个可用目录,这里按项目推荐目录为准:/user/local

    cd /usr/local
  2. 通过 git 拉取 yakpro-po 代码

    git clone https://github.com/pk-fr/yakpro-po.git
  3. 到 yakpro-po 目录,还需要安装 PHP-Parser

    cd yakpro-po && git clone https://github.com/nikic/PHP-Parser.git
  4. 保证 yakpro-po 有可执行权限

    chmod a+x yakpro-po.php
  5. 为方便使用,建立软连接到 bin 目录

    cd /usr/local/bin
    ln -s /usr/local/yakpro-po/yakpro-po.php yakpro-po
  6. 安装完毕,查看下是否正常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 语句
    淆循环语句
    淆字符串文字
    随机播放语句
    单行输出

混淆前后对比

Laravel 项目 yakpro-po PHP代码混淆实践

Laravel 项目 yakpro-po PHP代码混淆实践

Laravel 项目 yakpro-po PHP代码混淆实践

Laravel 项目 yakpro-po PHP代码混淆实践

需要注意的点:不要混淆 模板代码

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

使用 yakpro-po 实现 Laravel 项目代码混淆加密

其它 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 协议》,转载必须注明作者和本文链接
莫等闲,白了少年头,空悲切
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 6

php还混淆啥呢,所有代码写到一个文件里 压缩成1行不就完了么

2年前 评论
bigbug-gg (楼主) 2年前
陈先生

如果是goto的话其实完全没有可靠性,用php-parser推断一下就出来了,之前微擎写的 微擎2c goto加密,用parser 直接解。。。。。

2年前 评论
bigbug-gg (楼主) 2年前

roger that

本身代码压缩minify可以理解因为可以增加执行性能 加密的话 我想了下得很商业或者要求很高的特别部门用得到

2年前 评论

大多数情况下混淆已经够用了,我更加关注的是混淆了之后有没有办法还原,如果有办法还原意义就不大

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
未填写
文章
39
粉丝
13
喜欢
75
收藏
67
排名:294
访问:3.2 万
私信
所有博文
社区赞助商