PHPのコンパイルと実行分離の実装(コンパイルと実行の分離)
PHP グループの全員とチャットし、PHP ソース コードの暗号化を実装する方法について全員が記事を書くことに同意しました。今回の QA スモークを利用して、この問題に関するいくつかのアイデアを書き留めておきます。
ZE(Zendエンジン)はPHPスクリプトを実行する際、コンパイル→実行を経るのですが、実行のたびにPHPファイルを再コンパイルすることを前回の記事で紹介しました。コンパイルと実行は分離されていません。
ZE のコンパイルと実行フェーズには、2 つの重要な関数があります:
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 の基本命令シーケンスで構成される操作コードにコンパイルし、その操作コードを 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; //Intercept
?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) //デフォルトのコンパイルを呼び出し、出力をインターセプトします
?if(op_array) ){
?? //Save op_array;
?}
?return op_array;
}
このようにして、コンパイルされたファイルのサポートとファイルのコンパイルのサポートを実現しました。
次に、実行関数を記述する必要があります。
static void my_execute(zend_op_array *op_array TSRMLS_DC)
{
?old_execute(op_array TSRMLS_DC) //デフォルトの実行関数による単純な実行。
}
おそらく、将来の実行関数をパッケージ化する必要がある理由を尋ねたいと思います。笑、私は、これをインターセプトする 1 つの方法があることを説明したいだけです。何の役に立つの?この方法でどのような要件を実現できるかは読者次第です:)。
これを書くと、ファイルを暗号化したい場合は、*.zec などの暗号化ファイルの種類を定義し、my_compile_file でファイルの種類を決定し、暗号化ファイルの場合は実行することが理解できると思います。復号化、簡単ですか?
暗号化する方法については、どのような方法を使用するかを自問する必要がありますが、元に戻せる必要があることを覚えておいてください~~^_^。
元のアドレス: http://www.wangchao.net.cn/bbsdetail_1887829.html