PHPのコンパイルと実行の分離の実装(コンパイルと実行の分離)
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

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









ファイルのサイズを取得するには、Java の File.length() 関数を使用します。ファイル操作を扱うとき、ファイル サイズは非常に一般的な要件です。Java では、ファイルのサイズを取得するための非常に便利な方法、つまり length( ) File クラスのメソッド。この記事では、このメソッドを使用してファイルのサイズを取得する方法と、対応するコード例を紹介します。まず、サイズを取得したいファイルを表す File オブジェクトを作成する必要があります。 File オブジェクトを作成する方法は次のとおりです: Filef

オープン ソースの詳細については、次のサイトを参照してください。 51CTO Honmeng 開発者コミュニティ https://ost.51cto.com 実行環境 DAYU200:4.0.10.16SDK: 4.0.10.15IDE: 4.0.600 1. アプリケーションを作成するには、[ファイル] をクリックします。 >新しいファイル ->プロジェクトの作成。テンプレートを選択します: [OpenHarmony] EmptyAbility: プロジェクト名 shici、アプリケーション パッケージ名 com.nut.shici、およびアプリケーションの保存場所 XXX (中国語、特殊文字、スペースは含まれません) を入力します。 CompileSDK10、モデル: ステージ。デバイス

PHP BLOB をファイルに変換する方法: 1. PHP サンプル ファイルを作成します; 2. 「function blobToFile(blob) {return new File([blob], 'screenshot.png', { type: 'image/jpeg' })」を通じて} 」メソッドを使用して、Blob をファイルに変換できます。

Java の File.renameTo() 関数を使用してファイルの名前を変更する Java プログラミングでは、ファイルの名前を変更する必要がよくあります。 Java には、ファイル操作を処理するための File クラスが用意されており、その renameTo() 関数でファイルの名前を簡単に変更できます。この記事では、Java の File.renameTo() 関数を使用してファイルの名前を変更する方法と、対応するコード例を紹介します。 File.renameTo() 関数は、File クラスのメソッドです。

ファイルの親パスを取得するには、Java の File.getParent() 関数を使用します Java プログラミングでは、ファイルやフォルダーを操作する必要がよくあります。場合によっては、ファイルの親パス、つまりファイルが存在するフォルダーのパスを取得する必要があることがあります。 Java の File クラスには、ファイルまたはフォルダーの親パスを取得する getParent() メソッドが用意されています。 File クラスは、ファイルとフォルダーを Java で抽象表現したもので、ファイルとフォルダーを操作するための一連のメソッドを提供します。その中で、手に入れてください

ファイルの親ディレクトリを取得するには、Java の File.getParentFile() 関数を使用します Java プログラミングでは、ファイルやフォルダーを操作する必要がよくあります。ファイルの親ディレクトリを取得する必要がある場合は、Java が提供する File.getParentFile() 関数を使用できます。この記事では、この関数の使用方法とコード例を説明します。 Java の File クラスは、ファイルやフォルダーを操作するために使用される主なクラスです。ファイルのプロパティを取得および操作するための多くのメソッドを提供します

タイトル: Array.Sort 関数を使用して C# で配列を並べ替える例 本文: C# では、配列は一般的に使用されるデータ構造であり、多くの場合、配列を並べ替える必要があります。 C# には Array クラスが用意されており、このクラスには配列を簡単に並べ替えるための Sort メソッドがあります。この記事では、C# で Array.Sort 関数を使用して配列を並べ替える方法を示し、具体的なコード例を示します。まず、Array.Sort 関数の基本的な使用法を理解する必要があります。 Array.So

executeupdateとexecuteの違い: 1. 目的と戻り値、2. パラメータ、3. 実行時間、4. 例外処理、5. パフォーマンスに関する考慮事項、6. データベース対話。詳細な紹介: 1. 目的と戻り値: 「executeUpdate()」メソッドは主に、INSERT、UPDATE、DELETE 操作などのデータを変更する SQL ステートメントを実行するために使用されます。xecute() メソッドはより一般的で、次の目的で使用できます。データのクエリやデータの変更など、あらゆるタイプの SQL ステートメントを実行します。
