• 实现PHP的编译执行分离(separating compilation and execution)


    转载自鸟哥博客:http://www.laruence.com/2008/08/14/250.html

    刚刚在PHP群内和大家聊天,应承了大家要写一个关于如何实现PHP源码加密的文章, 借着这会QA在冒烟的机会,就这个问题,我写点思路。
    我之前的文章介绍过, ZE(Zend engine) 执行一个PHP脚本会经历编译->执行, 只不过它每次执行都会去重新编译PHP文件。并没有实现编译和执行分离。
    在ZE的编译和执行阶段,有俩个重要的函数:

    ZEND_API zend_op_array *(*zend_compile_file)(zend_file_handle *file_handle, int type TSRMLS_DC);
    

     ZEND_API void (*zend_execute)(zend_op_array *op_array TSRMLS_DC);
    

     zend_compile_file负责将要执行的脚本文件编译成由ZE的基本指令序列构成的op codes , 然后将op codes交由zend_execute执行,从而得到我们脚本的结果。

    所以,我们完全可以通过修改默认的zend_complie_file和zend_execute来实现,PHP的执行和编译分离,进一步,我们还可以再这个基础上实现,对我们脚本的加密和解密。

    我们通过一个PHP扩展模块来实现这个功能, 首先,我们需要在模块初始化的时候:

     PHP_MINIT_FUNCTION(sample)
    {
        old_compile_file = zend_compile_file;  //保存现场
        old_execute = zend_execute;
     
        zend_compile_file = my_compile_file; //截获
        zend_execute = my_execute;
        return SUCCESS;
    }
    

      

    在我们的my_compile_file中,判断我们的文件是否是编译过的文件,假设后缀名是 *.ze

        static zend_op_array *my_compile_file(zend_file_handle *file_handle, int type TSRMLS_DC)
    {
        if(strstr(file_handle->filename, ".ze") != NULL){//是编译过的文件。
             直接返回文件内容.
        }
       zend_op_array *op_array;
     
       op_array = old_compile_file (file_handle, type TSRMLS_CC); //调用默认的compile,截获输出
     
       if(op_array){
           保存op_array;
       }
        return op_array;
    }
    

      这样,我们就实现了, 对已经编译文件的支持,和对文件编译的支持。

    然后,需要编写我们的执行函数:

    static void my_execute(zend_op_array *op_array TSRMLS_DC)
    {
        old_execute(op_array TSRMLS_DC); //简单交由默认执行函数执行。
    }
    

      

    也许你要问为什么要包装以后的执行函数, 呵呵,我只是为了说明,一种方式,就是可以截获这个东东而已。。 有什么用,就看读者你有什么要求能通过这个方式实现了 ;)

    恩,写到这里, 你也许就明白了, 如果想要对文件加密, 那么就定义个加密文件类型,比如 *.zec, 然后在my_compile_file中,判断文件类型,如果是加密文件,那么就执行解密,;),嘿嘿,简答吧?

    至于怎么加密,,,那就要问你自己了,你想用什么方式,,,但是,记住,要可逆的哦~~ ^_^。

  • 相关阅读:
    【新提醒】N820 N821 android 4.2 V1.1版
    Silk Icons —— 再来 700 个免费小图标
    解决基于BAE python+bottle开发上的一系列问题
    gae 已死,别整什么反向代理了,用sae吧,还有在线编辑工具
    MDCC为移动开发者服务:一看、一聊、一聚
    Testin_百度百科
    我们的开源项目-暨开源力量公开课年度庆典活动
    Kivy: Crossplatform Framework for NUI
    进京通行证_百度百科
    史丹·温斯坦称傲牛熊市的秘密_百度百科
  • 原文地址:https://www.cnblogs.com/zhenzhong/p/5865557.html
Copyright © 2020-2023  润新知