兑现PHP的编译执行分离(separating compilation and execution)
实现PHP的编译执行分离(separating compilation and execution)
刚刚在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中,判断文件类型,如果是加密文件,那么就执行解密,嘿嘿,简单吧?
至于怎么加密,那就要问你自己了,你想用什么方式,但是,记住,要可逆的哦~~^_^。
?
原文地址: http://www.wangchao.net.cn/bbsdetail_1887829.html

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Untuk mengetahui lebih lanjut tentang sumber terbuka, sila lawati: Komuniti Pembangun 51CTO Hongmeng https://ost.51cto.com Persekitaran berjalan DAYU200:4.0.10.16SDK: 4.0.10.15IDE: 4.0.600 1. Untuk membuat aplikasi, klik Fail- >newFile->CreateProgect. Pilih templat: [OpenHarmony] EmptyAbility: Isikan nama projek, shici, nama pakej aplikasi com.nut.shici dan lokasi storan aplikasi XXX (tiada bahasa Cina, aksara khas atau ruang). CompileSDK10, Model: Stage. Peranti

Gunakan fungsi File.length() Java untuk mendapatkan saiz fail Saiz fail adalah keperluan yang sangat biasa apabila berurusan dengan operasi fail Java menyediakan cara yang sangat mudah untuk mendapatkan saiz fail, iaitu, menggunakan panjang(. ) kaedah kelas Fail. Artikel ini akan memperkenalkan cara menggunakan kaedah ini untuk mendapatkan saiz fail dan memberikan contoh kod yang sepadan. Pertama, kita perlu mencipta objek Fail untuk mewakili fail yang kita ingin dapatkan saiznya. Berikut ialah cara membuat objek Fail: Filef

Cara menukar gumpalan php kepada fail: 1. Buat fail sampel php 2. Melalui "function blobToFile(blob) {return new File([blob], 'screenshot.png', { type: 'image/jpeg' }) } ” kaedah boleh digunakan untuk menukar Blob kepada Fail.

Gunakan fungsi File.renameTo() Java untuk menamakan semula fail Dalam pengaturcaraan Java, kita selalunya perlu menamakan semula fail. Java menyediakan kelas Fail untuk mengendalikan operasi fail, dan fungsi renameTo() boleh menamakan semula fail dengan mudah. Artikel ini akan memperkenalkan cara menggunakan fungsi File.renameTo() Java untuk menamakan semula fail dan menyediakan contoh kod yang sepadan. Fungsi File.renameTo() ialah kaedah kelas Fail.

Gunakan fungsi File.getParentFile() java untuk mendapatkan direktori induk fail Dalam pengaturcaraan Java, kita selalunya perlu mengendalikan fail dan folder. Apabila kita perlu mendapatkan direktori induk fail, kita boleh menggunakan fungsi File.getParentFile() yang disediakan oleh Java. Artikel ini menerangkan cara menggunakan fungsi ini dan menyediakan contoh kod. Kelas fail dalam Java ialah kelas utama yang digunakan untuk mengendalikan fail dan folder. Ia menyediakan banyak kaedah untuk mendapatkan dan memanipulasi sifat fail

Tajuk: Contoh menggunakan fungsi Array.Sort untuk mengisih tatasusunan dalam Teks C#: Dalam C#, tatasusunan ialah struktur data yang biasa digunakan dan operasi pengisihan tatasusunan selalunya diperlukan. C# menyediakan kelas Array, yang mempunyai kaedah Isih untuk menyusun tatasusunan dengan mudah. Artikel ini akan menunjukkan cara menggunakan fungsi Array.Sort dalam C# untuk mengisih tatasusunan dan memberikan contoh kod khusus. Pertama, kita perlu memahami penggunaan asas fungsi Array.Sort. Susunan.Jadi

Perbezaan antara executeupdate dan execute: 1. Tujuan dan nilai pulangan 2. Parameter 3. Masa pelaksanaan; Pengenalan terperinci: 1. Tujuan dan nilai pulangan Kaedah "executeUpdate()" digunakan terutamanya untuk melaksanakan pernyataan SQL yang mengubah suai data, seperti operasi INSERT, UPDATE atau DELETE Kaedah xecute() adalah lebih umum dan boleh digunakan untuk laksanakan sebarang jenis Pernyataan SQL, termasuk menanyakan data dan mengubah suai data, dsb.

Gunakan fungsi File.getParent() java untuk mendapatkan laluan induk fail Dalam pengaturcaraan Java, kita selalunya perlu mengendalikan fail dan folder. Kadangkala, kita perlu mendapatkan laluan induk bagi fail, iaitu laluan folder tempat fail itu berada. Kelas Fail Java menyediakan kaedah getParent() untuk mendapatkan laluan induk bagi fail atau folder. Kelas Fail ialah perwakilan abstrak Java bagi fail dan folder. Ia menyediakan satu siri kaedah untuk mengendalikan fail dan folder. Antaranya, dapatkan
