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

2024-08-06 11:00:29 浏览数 (2)

概述

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

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

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

Zephir

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

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

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

应用

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

机密案例代码

代码语言:javascript复制
git clone https://github.com/Tinywan/zephir-lang-php-extension.git

目录结构

代码语言:javascript复制
  .
  ├── zephirencrypt                   -- 加密扩展库目录
  │   ├── Auth
  │   │   └── License.zep         -- 权限认证
  │   ├── Common
  │   │   └── AbstractModule.zep -- 模块抽象类
  │   └── Module                  -- 业务模块目录
  │       └── LiveModule.zep            
  ├── config.json                 -- 编译扩展配置文件
  └── ext                         -- 编译生成的.so文件

授权许可证License.zep

代码语言:javascript复制
/**
 * @desc 授权许可证
 * @author Tinywan(ShaoBo Wan)
 * @date 2024/6/16 20:14
 */
namespace ZephirEncryptAuth;

class License
{
    /**
     * @desc 授权认证
     * @author Tinywan(ShaoBo Wan)
     */
    public static function check(string service_uuid, string auth_license, int uid = 0, int rand = 0)
    {
        var private_key = "tinywan2024";
        var expire_time = substr(auth_license, 0, 10);
        var current_time = time();
        var sequest_hash_value = substr(auth_license, -32);
        var res_hash_value = md5(service_uuid . "-" . expire_time . "-" . rand . "-" . uid . "-" . private_key);

        if expire_time < current_time {
            return -1;
        }

        if sequest_hash_value != res_hash_value {
            return 0;
        }
        return 1;
    }
}

业务模块抽象类AbstractModule.zep

代码语言:javascript复制
/**
 * @desc 抽象业务模块
 * @author Tinywan(ShaoBo Wan)
 * @date 2024/6/16 20:14
 */
namespace ZephirEncryptCommon;
use ZephirEncryptAuthLicense;

abstract class AbstractModule
{
    protected service_uuid;

    protected auth_license;

    /** 1 true , 0 false */
    public auth_status = 0;

    /**
    * @desc 构架函数
    * @author Tinywan(ShaoBo Wan)
    */
    public function __construct(string service_uuid, string auth_license)
    {
        let this->service_uuid = service_uuid;
        let this->auth_license = auth_license;
        var checkRes = License::check(this->service_uuid, this->auth_license);
        if checkRes == -1 {
            let this->auth_status = -1;
        }

        if checkRes == 0 {
            let this->auth_status = 0;
        }

        if checkRes == 1 {
            let this->auth_status = 1;
        }
    }

    /** 获取权限状态 */
    abstract public function getAuthStatus();
}

直播业务模块LiveModule.zep

代码语言:javascript复制
/**
 * @desc 直播业务模块
 * @author Tinywan(ShaoBo Wan)
 * @date 2024/6/16 20:14
 */
namespace ZephirEncryptModule;
use ZephirEncryptCommonAbstractModule;

class LiveModule extends AbstractModule
{
    /**
     * @desc 构架函数
     * @author Tinywan(ShaoBo Wan)
     */
    final public function __construct(string service_uuid, string auth_license)
    {
        parent::__construct(service_uuid, auth_license);
    }

    /**
    * @desc 获取权限状态
    * @author Tinywan(ShaoBo Wan)
    */
    public function getAuthStatus()
    {
        return $this->auth_status;
    }

    /**
     * @desc 业务测试
     * @author Tinywan(ShaoBo Wan)
     */
    public function start()
    {
        var res = [];
        if this->auth_status != 1 {
            let res = ["code":this->auth_status, "msg":"no permission to access"];
            return json_encode(res);
        }
        echo "直播开始成功..............";
        echo "这里开始写你的业务代码.....";
        echo "这里开始写你的业务代码.....";
        echo "这里开始写你的业务代码.....";
    }
}

编译并生成扩展

代码语言:javascript复制
cd zephir-lang-php-extension/

# 进入加密扩展库目录
cd zephirencrypt

编译并生成扩展

代码语言:javascript复制
zephir build

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

代码语言:javascript复制
zephir-lang-php-extension/zephirencrypt# zephir build
 Cleaning old kernel files...
 Copying new kernel files...
 Preparing for PHP compilation...
 Preparing configuration file...
 Compiling...
 Zephir version has changed, use "zephir fullclean" to perform a full clean of the project
 Installing...

 Extension installed.
 Add "extension=zephirencrypt.so" to your php.ini

 ! [NOTE] Don't forget to restart your web server

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

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

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

测试

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

代码语言:javascript复制
php -m


[PHP Modules]
apcu
....
zephir_parser
zephirencrypt
...
[Zend Modules]

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

如何使用

新建测试文件zephir.php

代码语言:javascript复制
<?php
/**
 * @desc zephir.php 描述信息
 * @author Tinywan(ShaoBo Wan)
 * @date 2024/8/5 22:51
 */
declare(strict_types=1);

$serviceUuid = "13c7c8e1-3ac2-41a6-95dc-ff954b431bbf";
$authLicense = "1728869954-0-0-eabfb0fb52c429d4fa037585f7afd512";

$liveModule = new ZephirEncryptModuleLiveModule($serviceUuid, $authLicense);
print_r($liveModule);

$res = $liveModule->start();
var_dump($res);

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

代码语言:javascript复制
ZephirEncryptModuleLiveModule Object
(
    [service_uuid:protected] => 13c7c8e1-3ac2-41a6-95dc-ff954b431bbf
    [auth_license:protected] => 1528869954-0-0-eabfb0fb52c429d4fa037585f7afd512
    [auth_status] => -1
)

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

代码语言:javascript复制
$authLicense = "1788689954-0-0-eabfb0fb52c429d4fa037585f7afd512";

预期结果相同

代码语言:javascript复制
ZephirEncryptModuleLiveModule Object
(
    [service_uuid:protected] => 13c7c8e1-3ac2-41a6-95dc-ff954b431bbf
    [auth_license:protected] => 1788689954-0-0-eabfb0fb52c429d4fa037585f7afd512
    [auth_status] => 0
)

正确的授权码

代码语言:javascript复制
ZephirEncryptModuleLiveModule Object
(
    [service_uuid:protected] => 13c7c8e1-3ac2-41a6-95dc-ff954b431bbf
    [auth_license:protected] => 178909089954-0-0-eabfb0fb52c429d4fa037585f7afd512
    [auth_status] => 1
)
string(42) "直播开始成功............."
string(42) "这里开始写你的业务代码...."
string(42) "这里开始写你的业务代码...."
string(42) "这里开始写你的业务代码...."

0 人点赞