国产成人精品亚洲777人妖,欧美日韩精品一区视频,最新亚洲国产,国产乱码精品一区二区亚洲

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

實(shí)現(xiàn)PHP的編譯執(zhí)行分離(separating compilation and execution)

瀏覽:18日期:2024-02-17 13:43:48

剛剛在PHP群內(nèi)和大家聊天,應(yīng)承了大家要寫(xiě)一個(gè)關(guān)于如何實(shí)現(xiàn)PHP源碼加密的文章,借著這會(huì)QA在冒煙的機(jī)會(huì),就這個(gè)問(wèn)題,我寫(xiě)點(diǎn)思路。

我以前的文章介紹過(guò),ZE(Zend engine)執(zhí)行一個(gè)PHP腳本會(huì)經(jīng)歷編譯->執(zhí)行,只不過(guò)它每次執(zhí)行都會(huì)去重新編譯PHP文件。并沒(méi)有實(shí)現(xiàn)編譯和執(zhí)行分離。

在ZE的編譯和執(zhí)行階段,有倆個(gè)重要的函數(shù):

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負(fù)責(zé)將要執(zhí)行的腳本文件編譯成由ZE的基本指令序列構(gòu)成的op codes,然后將op codes交由zend_execute執(zhí)行,從而得到我們腳本的結(jié)果。

所以,我們完全可以通過(guò)修改默認(rèn)的zend_complie_file和zend_execute來(lái)實(shí)現(xiàn),PHP的執(zhí)行和編譯分離,進(jìn)一步,我們還可以再這個(gè)基礎(chǔ)上實(shí)現(xiàn),對(duì)我們腳本的加密和解密。

我們通過(guò)一個(gè)PHP擴(kuò)展模塊來(lái)實(shí)現(xiàn)這個(gè)功能,首先,我們需要在模塊初始化的時(shí)候:

PHP_MINIT_FUNCTION(sample){ old_compile_file = zend_compile_file//保存現(xiàn)場(chǎng) old_execute = zend_execute; zend_compile_file = my_compile_file; //截獲 zend_execute = my_execute; return SUCCESS;}

在我們的my_compile_file中,判斷我們的文件是否是編譯過(guò)的文件,假設(shè)后綴名是*.ze。

static zend_op_array *my_compile_file(zend_file_handle *file_handle, int type TSRMLS_DC){ if(strstr(file_handle->filename, '.ze') != NULL){//是編譯過(guò)的文件。 直接返回文件內(nèi)容. } zend_op_array *op_array;

op_array = old_compile_file (file_handle, type TSRMLS_CC); //調(diào)用默認(rèn)的compile,截獲輸出 if(op_array){ 保存op_array; } return op_array;}

這樣,我們就實(shí)現(xiàn)了,對(duì)已經(jīng)編譯文件的支持,和對(duì)文件編譯的支持。

然后,需要編寫(xiě)我們的執(zhí)行函數(shù):

static void my_execute(zend_op_array *op_array TSRMLS_DC){ old_execute(op_array TSRMLS_DC); //簡(jiǎn)單交由默認(rèn)執(zhí)行函數(shù)執(zhí)行。}

也許你要問(wèn)為什么要包裝以后的執(zhí)行函數(shù),呵呵,我只是為了說(shuō)明,一種方式,就是可以截獲這個(gè)東東而已。有什么用?就看讀者你有什么要求能通過(guò)這個(gè)方式實(shí)現(xiàn)了: )。

寫(xiě)到這里,你也許就明白了,如果想要對(duì)文件加密,那么就定義個(gè)加密文件類型,比如*.zec,然后在my_compile_file中,判斷文件類型,如果是加密文件,那么就執(zhí)行解密,嘿嘿,簡(jiǎn)單吧?

至于怎么加密,那就要問(wèn)你自己了,你想用什么方式,但是,記住,要可逆的哦~~^_^。

標(biāo)簽: PHP
主站蜘蛛池模板: 阿拉善右旗| 福安市| 冀州市| 益阳市| 易门县| 色达县| 邹平县| 潜山县| 丹江口市| 健康| 屯昌县| 视频| 拉萨市| 喀喇沁旗| 苍梧县| 定远县| 格尔木市| 洛浦县| 蒙阴县| 巴青县| 盐山县| 平邑县| 漳州市| 忻城县| 德格县| 吉木萨尔县| 龙门县| 都江堰市| 汽车| 延津县| 高台县| 扎兰屯市| 津南区| 乌恰县| 诸城市| 长乐市| 黄平县| 恩施市| 会东县| 乌兰浩特市| 乡宁县|