Zephir编写C动态扩展库将PHP源代码编译加密

时间:2024-10-22 07:25:15

概述

PHP源代码编译加密通常是出于保护知识产权、防止源代码泄露和被非法修改的目的。加密PHP源代码可以使用先进的加密工具如Zend Guard或ionCube、使用代码混淆技术、或开发自定义编译扩展。

最关键的是,在加密的同时,确保服务器有相应的解密扩展来执行代码,否则加密代码将无法运行。换言之,加密和执行是一个密不可分的过程。本章节我们将主要展开讨论使用Zephir语言编写动态扩展库进行代码加密。

Zephir 使用PHP编译器将源代码编译成二进制文件,这样可以隐藏代码逻辑和实现细节。可以把通用业务类,都编译成二进制拓展,对外只提供.so文件,也就不需要加密代码了。

Zephir

Zephir是一个开源的高级语言(区别于汇编等机器语言),它的设计是为了减轻PHP原生扩展的创建难度和可维护性,另外还带来了强类型与内存安全的支持。

Zephir是一门定位于大多数想通过编写和编译能够被PHP执行的代码的PHPer需求的语言。它是一种动态和静态类型结合的语言,对于PHP来说,它的一些功能可能会感觉时曾相识。

Zephir 入门教程请看这里 【使用Zephir语言给PHP编写C语言扩展】

应用

本章节使用个人仓库 /Tinywan/zephir-lang-php-extension 进行简单实现一个业务代码的认证授权加密代码。

机密案例代码

git clone https:///Tinywan/

目录结构

  1.   .
  2.   ├── zephirencrypt                   -- 加密扩展库目录
  3.   │   ├── Auth
  4.   │   │   └──          -- 权限认证
  5.   │   ├── Common
  6.   │   │   └──  -- 模块抽象类
  7.   │   └── Module                  -- 业务模块目录
  8.   │       └──             
  9.   ├──                  -- 编译扩展配置文件
  10.   └── ext                         -- 编译生成的.so文件

授权许可证

  1. /**
  2.  * @desc 授权许可证
  3.  * @author Tinywan(ShaoBo Wan)
  4.  * @date 2024/6/16 20:14
  5.  */
  6. namespace ZephirEncrypt\Auth;
  7. class License
  8. {
  9.     /**
  10.      * @desc 授权认证
  11.      * @author Tinywan(ShaoBo Wan)
  12.      */
  13.     public static function check(string service_uuid, string auth_license, int uid = 0, int rand = 0)
  14.     {
  15.         var private_key = "tinywan2024";
  16.         var expire_time = substr(auth_license, 010);
  17.         var current_time = time();
  18.         var sequest_hash_value = substr(auth_license, -32);
  19.         var res_hash_value = md5(service_uuid . "-" . expire_time . "-" . rand . "-" . uid . "-" . private_key);
  20.         if expire_time < current_time {
  21.             return -1;
  22.         }
  23.         if sequest_hash_value != res_hash_value {
  24.             return 0;
  25.         }
  26.         return 1;
  27.     }
  28. }

业务模块抽象类

  1. /**
  2.  * @desc 抽象业务模块
  3.  * @author Tinywan(ShaoBo Wan)
  4.  * @date 2024/6/16 20:14
  5.  */
  6. namespace ZephirEncrypt\Common;
  7. use ZephirEncrypt\Auth\License;
  8. abstract class AbstractModule
  9. {
  10.     protected service_uuid;
  11.     protected auth_license;
  12.     /** 1 true , 0 false */
  13.     public auth_status = 0;
  14.     /**
  15.     * @desc 构架函数
  16.     * @author Tinywan(ShaoBo Wan)
  17.     */
  18.     public function __construct(string service_uuid, string auth_license)
  19.     {
  20.         let this->service_uuid = service_uuid;
  21.         let this->auth_license = auth_license;
  22.         var checkRes = License::check(this->service_uuid, this->auth_license);
  23.         if checkRes == -1 {
  24.             let this->auth_status = -1;
  25.         }
  26.         if checkRes == 0 {
  27.             let this->auth_status = 0;
  28.         }
  29.         if checkRes == 1 {
  30.             let this->auth_status = 1;
  31.         }
  32.     }
  33.     /** 获取权限状态 */
  34.     abstract public function getAuthStatus();
  35. }

直播业务模块

  1. /**
  2.  * @desc 直播业务模块
  3.  * @author Tinywan(ShaoBo Wan)
  4.  * @date 2024/6/16 20:14
  5.  */
  6. namespace ZephirEncrypt\Module;
  7. use ZephirEncrypt\Common\AbstractModule;
  8. class LiveModule extends AbstractModule
  9. {
  10.     /**
  11.      * @desc 构架函数
  12.      * @author Tinywan(ShaoBo Wan)
  13.      */
  14.     final public function __construct(string service_uuid, string auth_license)
  15.     {
  16.         parent::__construct(service_uuid, auth_license);
  17.     }
  18.     /**
  19.     * @desc 获取权限状态
  20.     * @author Tinywan(ShaoBo Wan)
  21.     */
  22.     public function getAuthStatus()
  23.     {
  24.         return $this->auth_status;
  25.     }
  26.     /**
  27.      * @desc 业务测试
  28.      * @author Tinywan(ShaoBo Wan)
  29.      */
  30.     public function start()
  31.     {
  32.         var res = [];
  33.         if this->auth_status != 1 {
  34.             let res = ["code":this->auth_status"msg":"no permission to access"];
  35.             return json_encode(res);
  36.         }
  37.         echo "直播开始成功..............";
  38.         echo "这里开始写你的业务代码.....";
  39.         echo "这里开始写你的业务代码.....";
  40.         echo "这里开始写你的业务代码.....";
  41.     }
  42. }

编译并生成扩展

  1. cd zephir-lang-php-extension/
  2. # 进入加密扩展库目录
  3. cd zephirencrypt

编译并生成扩展

zephir build

如果一切顺利,您将在输出的末尾看到以下消息:

  1. zephir-lang-php-extension/zephirencrypt# zephir build
  2.  Cleaning old kernel files...
  3.  Copying new kernel files...
  4.  Preparing for PHP compilation...
  5.  Preparing configuration file...
  6.  Compiling...
  7.  Zephir version has changed, use "zephir fullclean" to perform a full clean of the project
  8.  Installing...
  9.  Extension installed.
  10.  Add "extension=" to your 
  11.  ! [NOTE] Don't forget to restart your web server

在上面的步骤中,您可能需要提供root密码才能安装扩展。

最后,必须将扩展添加到才能由PHP加载。这是通过添加初始化指令:extension=来实现的。

注意:您也可以在命令行中使用-d extension=加载它,但它只会为单个请求加载,因此每次您想要在CLI中测试扩展时都需要包含它。将指令添加到将确保从那时起为每个请求加载它。

测试

现在扩展已添加到您的  中,请执行以下命令检查扩展是否正确加载:

  1. php -m
  2. [PHP Modules]
  3. apcu
  4. ....
  5. zephir_parser
  6. zephirencrypt
  7. ...
  8. [Zend Modules]

扩展名zephirencrypt应该是表明扩展名已正确加载。

如何使用

新建测试文件

  1. <?php
  2. /**
  3.  * @desc  描述信息
  4.  * @author Tinywan(ShaoBo Wan)
  5.  * @date 2024/8/5 22:51
  6.  */
  7. declare(strict_types=1);
  8. $serviceUuid "13c7c8e1-3ac2-41a6-95dc-ff954b431bbf";
  9. $authLicense "1728869954-0-0-eabfb0fb52c429d4fa037585f7afd512";
  10. $liveModule new \ZephirEncrypt\Module\LiveModule($serviceUuid$authLicense);
  11. print_r($liveModule);
  12. $res $liveModule->start();
  13. var_dump($res);

以上授权码时间为1528869954 ,即:2018-06-13 14:05:54,预期结果是该授权码已过期,执行代码预期结果

  1. ZephirEncrypt\Module\LiveModule Object
  2. (
  3.     [service_uuid:protected] => 13c7c8e1-3ac2-41a6-95dc-ff954b431bbf
  4.     [auth_license:protected] => 1528869954-0-0-eabfb0fb52c429d4fa037585f7afd512
  5.     [auth_status=> -1
  6. )

可以看到此时授权码状态是-1表示授权码过期。尝试授权码为未来某一天1788689954 ,即:2026-09-06 18:19:14

$authLicense "1788689954-0-0-eabfb0fb52c429d4fa037585f7afd512";

预期结果相同

  1. ZephirEncrypt\Module\LiveModule Object
  2. (
  3.     [service_uuid:protected] => 13c7c8e1-3ac2-41a6-95dc-ff954b431bbf
  4.     [auth_license:protected] => 1788689954-0-0-eabfb0fb52c429d4fa037585f7afd512
  5.     [auth_status=> 0
  6. )

正确的授权码

  1. ZephirEncrypt\Module\LiveModule Object
  2. (
  3.     [service_uuid:protected] => 13c7c8e1-3ac2-41a6-95dc-ff954b431bbf
  4.     [auth_license:protected] => 178909089954-0-0-eabfb0fb52c429d4fa037585f7afd512
  5.     [auth_status=> 1
  6. )
  7. string(42"直播开始成功............."
  8. string(42"这里开始写你的业务代码...."
  9. string(42"这里开始写你的业务代码...."
  10. string(42"这里开始写你的业务代码...."