实现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中,判断文件类型,如果是加密文件,那么就执行解密,;),嘿嘿,简答吧?

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

时间: 2024-08-02 14:32:00

实现PHP的编译执行分离(separating compilation and execution)的相关文章

JNI之——在cmd命令行下编译执行C/C++源文件

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/46604269 一直用java来敲代码,java配置好jre路径之后.在cmd下编译执行.非常方便. 刚好要给一个舍友改下C程序,想到可不能够像java一样在环境变量里配置好C的编译路径呢? 于是上网搜了一下,得到例如以下结果: 一.假设装有VC,那就简单了,由于VC带有C的编译器,能够将此路径设置进环境变量. Windows系统下编译连接源码方法: cl -GX test.c -

SQL Server 预编译执行SQLs

问题描述: MVC5项目,利用执行sql的方式获取数据,但是在利用预编译执行的时候报错了,字段XXXwhich was not supplied. 其实就是这个参数传了个null导致的.在传参数之前做个判断,如果为null就赋值为空串即可. if (string.IsNullOrEmpty(name)) { name = string.Empty; } String sql = "select a.Id,a.UserName,a.TrueName,ISNULL(b.OTM, '0') as Fl

java内存动态编译执行

1.package org.jui.core.dynamic; public class DynaCompTest { public static void main(String[] args) throws Exception { String fullName = "DynaClass"; StringBuilder src = new StringBuilder(); src.append("public class DynaClass {\n"); src

C语言编译执行的简易流程

C语言的编译执行过程大致分为三个部分: 编译->链接->执行 编译:生成目标代码,目标代码是在目标机器上运行的代码. 连接:将目标代码与C函数库相连接,并将源程序所用的库代码与目标代码合并,并形成最终可执行的二进制机器代码(程序). 执行:在特定的机器环境下运行C程序. 如下图: 常见文件的拓展名 .c是C语言源文件,在编写代码的时候创建 .o是目标文件,在编译成功的时候产生 .out是可执行文件,在链接成功的时候产生 常用命令行指令 编译:cc  –c  xxx.c 链接:cc  xxx.o

c语言编译执行过程

<h4>认识C编译执行过程</h4>认识C编译执行过程,是C学习的开端.简单说C语言从编码编译到执行要经历一下过程: C源代码编译---->形成目标代码,目标代码是在目标机器上运行的代码.连接---->将目标代码与C函数库相连接,并将源程序所用的库代码与目标代码合并,并形成最终可执行的二进制机器代码(程序).执行----->在特定的机器环境下运行C程序. 如果用一个图 来表示: <a href="http://www.emacsvi.com/wp-

editplus编译执行java的配置方法

参考地址:http://jingyan.baidu.com/article/d2b1d10267dfe35c7e37d487.html 先要将JAVA的运行环境安装并且调试好. 首先,从菜单"工具(Tools)"->"配置用户工具..."进入用户工具设置. 在类别里展开"工具"树形菜单->"用户工具",选择"组和工具项目"中的"Group 1", 点击面板右边的"组

TeamCity编译执行selenium上传窗口脚本缺陷

TeamCity编译selenium脚本,对于上传窗口处理只支持sendKeys的使用,不支持模拟人为按下Enter键和使用autoIt等操作,即使本地调试通过的脚本,提交编译执行后,也是报错,原因是teamCity编译执行脚本的过程中,只是后台启动相应浏览器的driver,没有真实打开一个浏览器导致的.发现这个缺陷还得从编写上传课件测试用例脚本说起. 一个上传课程测试用例,功能测试是,填写课程的基本信息后,上传课程的图片,如图1,图片上传成功后,系统会提示“图片上传成功”,然后点击[选择]按钮

C程序编译执行过程

C程序编译执行过程 认识C编译执行过程,是C学习的开端. 简单说C语言从编码编译到执行要经历一下过程: C源代码 编译---->形成目标代码,目标代码是在目标机器上运行的代码. 连接---->将目标代码与C函数库相连接,并将源程序所用的库代码与目标代码合并,并形成最终可执行的二进制机器代码(程序). 执行----->在特定的机器环境下运行C程序. 如果用一个图 来表示: 以上过程仅仅是个大概,详细的过程相当复杂,下面这篇文章写得很详细,从中受益很多: 原文来自:http://www.vc

前端必备:FastStoneCapture 和 Licecap &amp;&amp;&amp; c++ 编译执行

前端必备:FastStoneCapture 和 Licecap FastStoneCapture这个软件非常小,只有2M多,并且其功能很强大,包括截图,录制视频,量尺,取色等等,对于前端工程师绝对是必备神器. 在百度搜索可以直接下载,非常方便,但是试用期为30天.当然,在各种网盘上都有这类中文破解软件,推荐 搜百度盘 下载使用. 如果在搜百度盘无法下载,可以在 CSDN 下载. 第一个图标:自动捕捉活动窗口.快捷键:Alt+PrtSc. 第二个图标:捕捉窗口,我们可以再选择区域.快捷键:Shif