
最近把客户的一个 ThinkPHP 后台交付出去,部署到他们自己的服务器第二天,源码就被扒成 zip 在群里转了好几手。客户反过来问我们:”你们这个系统能不能做到源码离开我手就失控?”——这就是我们这两年一直在啃的 PHP 源码保护问题。
客户的现实麻烦:交付即失控
做 PHP 项目这么多年,源码泄露这事几乎每个商业客户都撞过:商业算法被人抄走、付费模块被二次分发、SaaS 授权被随意复制。早几年市面上的传统方案都有同一个门槛——必须往服务器上装 C 扩展,运维一听就皱眉头,虚拟主机、共享空间、内网隔离环境根本装不了,最后大家都不了了之。
能不能做到既加密、又不用装任何 C 扩展?这就是我们从 2023 年初开始动手做”大牙加密”的最初动机。
走了一条不一样的路:自己写虚拟机

传统加密器大多用字符串混淆、变量重命名这种”皮毛”招数,反编译工具一过就把原样还原回来。我们选了一条不一样的路:直接给 PHP 写了个自研字节码虚拟机。
具体做法是两步:第一步,把客户的 PHP 源码用 nikic/php-parser 拆成 AST,再用我们自己写的一堆 NodeVisitor 把源码编译成自定义字节码——这一步同时把变量名、方法名、控制流全部打乱重写。第二步,再用一个纯 PHP 写的栈式解释器去执行这些字节码,运行时完全不依赖 OPcache、不依赖 Zend、不依赖任何 C 扩展。
这套架构的最大好处是:加密后的文件丢到任何一台装了 PHP 的机器上就能直接跑。我们用 PHP 官方仓库的 100 多个真实脚本做了回归测试,覆盖 yield 生成器、匿名函数、Trait 静态属性到 Filament 这种重 use 框架的复杂写法,两年里从 50 多个失败用例一路修到现在的全量通过。
上线之后客户怎么用

产品形态我们故意做得很轻。客户登录 dyjm.ttmm.vip,点”开始加密”,把待加密的 PHP 文件拖进去就完事,单文件 1MB 内、一次最多 30 个。免费账号就能用基础加密;开 VIP 后能解锁 6 项进阶设置——核心混淆引擎三种模式、授权域名绑定(支持通配符)、服务器 IP 锁定、文件名锁定、物理目录锁定、AST 调优。
这些进阶项里客户最爱用的是域名/IP 锁定——客户说”代码我可以加密着给你跑,但必须绑死在 www.abc.com 这个域名下、服务器 IP 不能换”。这正好是虚拟化字节码最擅长的事,我们在解释器启动时做一道运行时校验就行,源码里压根不存在绕过点。
写到这里也得说句大实话:现在没有什么是 100% 安全的
这两年我们越来越确信一件事——加密是抬高门槛,不是绝对保险。
前几年大家还在比”反编译工具能不能还原字节码”,AI 时代一来规则就变了。逆向的人只要把加密后的产物丢给能看 AST、能推理语义的模型,配合几轮人机对话,再花哨的控制流打乱、变量重命名,都可能被猜出大致意图。所以我们也不再追求”绝对防逆向”,而把加密定位成给商业产品争取时间窗——配合域名/IP 锁定、运行时间限制,让破解者即便逆向出大致逻辑,要做成可二次分发的产品也得再花一两个月,够我们发下一个版本了。
加密要做,但别迷信。在 AI 普及的今天,加密已经从”保险箱”变成了”防盗门”:保险箱指望小偷打不开,防盗门指望小偷嫌麻烦去翻下一家。两者差很远。
—
两年下来,这个项目从一行代码到一套完整产品,每一行都是在客户的真实需求里抠出来的。如果你也碰到 PHP 源码交付的难题,不妨先上去免费试一把基础加密看看效果——但记得,加密只是防盗门,不是保险箱。
作者:九午科技 · 技术人员








