实现PHP的编译执行分离(separatingcompilation and execution)


·        作者Laruence(   )

·        本文地址http://www.laruence.com/2008/08/14/250.html

·        转载请注明出处

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

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

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

2.        

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

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

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

1.        PHP_MINIT_FUNCTION(sample)

2.       {

3.           old_compile_file = zend_compile_file;  //保存现场

4.           old_execute = zend_execute;

5.        

6.           zend_compile_file = my_compile_file; //截获

7.           zend_execute = my_execute;

8.           return SUCCESS;

9.       }

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

1.           static zend_op_array *my_compile_file(zend_file_handle *file_handle, int type TSRMLS_DC)

2.       {

3.           if(strstr(file_handle->filename, ".ze") != NULL){//是编译过的文件。

4.                直接返回文件内容.

5.           }

6.          zend_op_array *op_array;

7.        

8.          op_array = old_compile_file (file_handle, type TSRMLS_CC); //调用默认的compile,截获输出

9.        

10.       if(op_array){

11.           保存op_array;

12.       }

13.        return op_array;

14.    }

这样,我们就实现了,对已经编译文件的支持,和对文件编译的支持。
然后,需要编写我们的执行函数:

1.       static void my_execute(zend_op_array *op_array TSRMLS_DC)

2.       {

3.           old_execute(op_array TSRMLS_DC); //简单交由默认执行函数执行。

4.       }

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值