ホームページ php教程 PHP开发 Zend エンジンを変更して PHP ソース コード暗号化を実装する原則と実践

Zend エンジンを変更して PHP ソース コード暗号化を実装する原則と実践

Dec 14, 2016 am 11:46 AM

1. 基本原則
PHP がソース ファイルを読み取るためのインターフェイスをインターセプトすることを検討します。最初は、Apache と PHP の間のインターフェイスを扱うことを考えました。Apache の src/modules/php4/mod_php4.c (これは、PHP が静的に Apache にコンパイルして install するファイルです) を参照し、send_php() でファイル ポインタがインターセプトされます。関数内では一時ファイルの方法を使用しており、復号化後にファイルポインタが置き換えられます。この方法はテストされ、実行可能であることが証明されています。ただし、2 つのファイル操作を使用する必要があるため、非効率的であり、DSO には使用できません。 Shuangyuan Nursing Home
そこで、PHP の読み取りファイルをインターセプトしてキャッシュにロードするプロセスを再検討したところ、zend-scanner.c が Zend エンジンでこれを実行していることがわかりました。このファイルの変更を開始します。照明プロジェクト

2. 実装方法

暗号化モジュールとして libmcrypt を使用し、現在 DES メソッド ECB モード暗号化を使用しています。

以下はファイル暗号化のソース コードです:

C++ コード
/* ecb.c-- - -----ここをカット----------*/
/* php ソース コード バージョン 0.99 ベータ版の暗号化
暗号化には libmcrypt を使用していますコードを
最初にインストールしてください
コマンドラインをコンパイルしてください:
gcc -O6 -lmcrypt -lm -o encryptphp ecb.c
GNU copyleft、wangsu 、 miweicong によって設計されました */

#define MCRYPT_BACKWARDS_COMPATIBLE 1

#define PHP_CACHESIZE >
#include < math.h > ; sys/types.h >
#include < fcntl.h >


main(int argc, char** argv) i ,j,inputfilesize,filelength;
charファイル名[12];
int readfd;
void *block_buffer;

int decode=0;

int realbufsize=0;
struct stat *filestat;

if(argc == 3) {
strcpy(password,argv[1]); ;
} else if(argc == 4 && !strcmp(argv[1],"-d")){
strcpy(filename,argv[3]); = 1;
printf("デコードモードに入ります...n");
printf("使用法: encryptphp [-d] パスワードファイル名");
}

keysize= mcrypt_get_key_size (DES);
key=calloc(1, mcrypt_get_key_size(DES));

gen_key_sha1( key, NULL, 0, keysize, パスワード, strlen(password));

td=init_mcrypt_ecb(DES, key, keysize);


if((readfd=open(filename,O_RDONLY,S_IRUSR|S_IWUSR|S_IRGRP))==-1){
printf("致命的: ファイルを開けて読み取ることができません")
exit(3);

filestat=malloc(sizeof(stat));

fstat(readfd,filestat);
inputfilesize=filestat- >st_size;
filelength=inputfilesize; inputfilesize =((int)(floor(inputfilesize/PHP_CACHESIZE))+1)*PHP_CACHESIZE;

if((file_buffer=malloc(inputfilesize))==NULL){
printf("致命的: ファイル バッファーを malloc できません。 n ");

exit(2);

}
if((block_buffer=malloc(PHP_CACHESIZE))==NULL){
printf("致命的: 暗号化ブロックバッファ.n を malloc できません");

exit(2) ) ;

}

j=0;

while(realbufsize=read (readfd,block_buffer, PHP_CACHESIZE)){
if(!decode){
if(realbufsize< PHP_CACHESIZE); ( i=realbufsize;i< PHP_CACHESIZE;i++){
((char *)block_buffer)[i]=' ';

}

}

mcrypt_ecb (td, block_buffer, PHP_CACHESIZE)

} else {
mdecrypt_ecb (td, block_buffer , realbufsize);
memcpy(file_buffer+j*PHP_CACHESIZE,block_buffer,PHP_CACHESIZE);
}

close(readfd);

if((ifp=fopen(filename,"wb")); = NULL){
printf("致命的: ファイル アクセス エラー。n");
exit(3)
fwrite ( file_buffer, inputfilesize, 1, ifp); ;
free(filestat);
fclose(ifp);

return 0;

}
/*--- ecb.c の終わり- ------------------------*/
ECB モードはブロック長が決められたブロック暗号化であるため、ここにはいくつかの null 文字が埋められます。国際展示会

次に、php コード内の Zend/zend-scanner.c を次のように変更します:

(私の php バージョンは 4.01pl2、SUNsparc/solaris 2.7、gcc 2.95;)

ファイルの前に追加します:

#define MCRYPT_BACKWARDS_COMPATIBLE 1
#include < mcrypt.h >

次に、3510行目あたりのYY_INPUTの定義をコメントアウトします。

次に、 yy_get_next_buffer() 関数を 5150 行目あたりに変更します。
void *tempbuf;
char debugstr[255];
int x,y; という定義を追加します。 ;
FILE *fp;
次に、文
YY_INPUT((&yy_current_buffer->yy_ch_buf[number_to_move]),
yy_n_chars, num_to_read ); をコメントアウトします。
次のように変更します:

tempbuf=malloc(num_to_read);
if((yy_n_chars=fread(tempbuf,1,num_to_read,yyin))!=0){
/*decode*/

#define パスワード "PHPphp111222"

#デバッグ 0

keysize=mcrypt_get_key_size(DES);
key=calloc(1, mcrypt_get_key_size(DES));
gen_key_sha1( キー、NULL、0、キーサイズ、パスワード、strlen(パスワード)); 、キー、キーサイズ);

mdecrypt_ecb(td, tempbuf, yy_n_chars);

if(debug){
fp=fopen("/tmp/ logs","wb");
fwrite("nstartn",7,1,fp);
fwrite(tempbuf,1,yy_n_chars,fp);
fwrite("nenditn",7,1,fp);
fclose (fp);
}
}
free(tempbuf);

次に、libtool に慣れていないため、静的メソッドを選択し、- を追加しました。 mcrypt を使用すると、Makefile ケーブル トレイを手動で変更する必要がなくなります

3. テストと結果

php と apache をコンパイルした後、ecb.c によってコンパイルされた encryptphp を使用して、1K 未満のいくつかのファイルを暗号化しました。 10K+ および 40K+ では、40K サイズのファイルを処理するときにエラーが発生しますが、その他のファイルは正常です。プラスチックの床

これは、ブロックの ECB 暗号化方式により、固定長ブロックを使用する必要があると判断されるためです。 したがって、8192 バイトを読み取る zend のキャッシュ処理方式を考慮して、どのストリーム暗号化方式を使用できるかについてアドバイスをお願いします。毎回。 (他のプラットフォームでは、zend によって毎回読み取られるブロック長が異なる場合があります)

その他の関連コンテンツについては、PHP 中国語 Web サイト (www.php.cn) にご注意ください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

PHP 実装フレームワーク: Zend Framework 入門チュートリアル PHP 実装フレームワーク: Zend Framework 入門チュートリアル Jun 19, 2023 am 08:09 AM

PHP 実装フレームワーク: ZendFramework 入門チュートリアル ZendFramework は、PHP によって開発されたオープン ソースの Web サイト フレームワークであり、現在 ZendTechnologies によって保守されています。ZendFramework は、MVC デザイン パターンを採用し、Web2.0 アプリケーションと Web サーブの実装に役立つ一連の再利用可能なコード ライブラリを提供します。 。 ZendFramework は PHP 開発者に非常に人気があり、尊敬されており、幅広い機能を備えています。

Zend Framework でのアクセス許可制御に ACL (アクセス コントロール リスト) を使用する方法 Zend Framework でのアクセス許可制御に ACL (アクセス コントロール リスト) を使用する方法 Jul 29, 2023 am 09:24 AM

Zend Framework でのアクセス許可制御に ACL (AccessControlList) を使用する方法 はじめに: Web アプリケーションでは、アクセス許可制御は重要な機能です。これにより、ユーザーはアクセスを許可されたページと機能にのみアクセスできるようになり、不正アクセスが防止されます。 Zend フレームワークは、ACL (AccessControlList) コンポーネントを使用してアクセス許可制御を実装する便利な方法を提供します。この記事では、Zend Framework で ACL を使用する方法を紹介します。

Redmi G Pro 2024 氷冷却と暴力的なエンジンを備えた 3 月 4 日に会いましょう PC バージョンのサポート Redmi G Pro 2024 氷冷却と暴力的なエンジンを備えた 3 月 4 日に会いましょう PC バージョンのサポート Mar 02, 2024 pm 12:19 PM

Redmiは本日、新しいRedmi GPro 2024が3月4日に正式にリリースされることを正式に発表しました。つまり、来週にはこのエキサイティングな新製品がリリースされることになります。 RedmiGPro2024は、eスポーツのフラッグシップとして完全デビューし、携帯電話業界の能力をノートブックビジネスに深く統合し、210Wのスーパーパフォーマンスリリースを提示し、Redmiパフォーマンスが新たな最高値に達します。 i9-14900HX プロセッサーと RTX4060 グラフィックス カードを搭載し、e スポーツとクリエーションを完璧に組み合わせ、二重の進化を実現します。この観点から見ると、この新製品の性能は再び向上しており、実際の効果は興味深いものです。公式ウォームアップでは、新しいRedmi G Pro 2024には暴力的なエンジンのPCバージョンが搭載されていると述べられました。携帯電話技術の強化、3 つの主要な要因が牽引

NVIDIA AI ゲームエンジンの実際のテスト: NPC とのリアルタイムチャット、中国語が流暢 NVIDIA AI ゲームエンジンの実際のテスト: NPC とのリアルタイムチャット、中国語が流暢 Mar 04, 2024 am 09:40 AM

『サイバーパンク2077』で黄学者が作った知性あるNPCはすでに中国語を話せる? Qubit を実際に体験して、NPC が中国語と英語で流暢に会話し、自然な表情と動き、口の形を一致させているのを目の当たりにする...目の前にスクリーンがなかったら、本当にその場にいるような気分になるでしょう。今年の CES 展示会で、Nvidia はインテリジェント エンジン Avatar Cloud Engine (ACE) を使用してゲームの NPC を「生きた」ものにし、大きな衝撃を与えました。 △CESに展示されるインテリジェントなNPCにはACEが採用されており、事前にスクリプトを用意することなく、ゲーム内のキャラクターが生き生きとした表情や体の動きを見せながら、プレイヤーとリアルな音声会話を行うことができます。デビュー当時はUbisoft、Tencent、NetEase、MiHoYoなどが存在しました。

超リアルな描写!アンリアル エンジン テクノロジーの専門家がグローバル イルミネーション システム Lumen について説明します 超リアルな描写!アンリアル エンジン テクノロジーの専門家がグローバル イルミネーション システム Lumen について説明します Apr 08, 2023 pm 10:21 PM

リアルタイム グローバル イルミネーション (リアルタイム GI) は、常にコンピュータ グラフィックスの聖杯でした。長年にわたり、業界はこの問題を解決するためにさまざまな方法を提案してきました。一般的な方法には、静的ジオメトリ、大まかなシーン表現、または大まかなプローブの追跡などの特定の仮定を利用して問題領域を制約すること、および 2 つの間の照明を補間することが含まれます。 Unreal Engine のグローバル イルミネーションおよび反射システム Lumen テクノロジーは、Krzysztof Narkowicz と Daniel Wright によって共同設立されました。目標は、均一な照明と焼き付けたような照明品質を実現できる、以前のものとは異なるソリューションを構築することでした。最近、SIGGRAPH 2022 でクシシュトフ・ナルコ氏が

エンジンの状況の変化: 3 気筒エンジンが 6 気筒と 8 気筒の優位性に挑戦 エンジンの状況の変化: 3 気筒エンジンが 6 気筒と 8 気筒の優位性に挑戦 Oct 08, 2023 pm 10:57 PM

10月8日のニュースによると、米国の自動車市場は水面下で変化を遂げており、これまで親しまれてきた6気筒や8気筒エンジンが徐々にその優位性を失い、3気筒エンジンが台頭しつつあるという。 10月8日のニュースは、米国の自動車市場が水面下で変化を遂げていることを示した。かつて愛された6気筒や8気筒エンジンは徐々にその優位性を失い、3気筒エンジンが台頭し始めているが、アメリカ人の多くの心の中には大排気量モデルが大好きで「アメリカンビッグV8」というイメージがある。常にアメリカ車の代名詞であり続けています。しかし、最近海外メディアが発表したデータによると、米国の自動車市場の状況は大きく変化しており、水面下での争いは激化している。 2019 年以前は、米国が

PHP Webテンプレートエンジンの使い方とFAQ PHP Webテンプレートエンジンの使い方とFAQ Jun 08, 2023 pm 12:23 PM

インターネット技術の継続的な発展に伴い、Web テンプレート エンジンは Web サイト開発に不可欠な部分になりました。 PHP Web ページ テンプレート エンジンは、一般的に使用される Web ページ テンプレート エンジンの 1 つです。この記事では、PHP Web テンプレート エンジンの使用方法とよくある質問への回答を紹介します。 1. PHP Web テンプレート エンジンとは何ですか? PHP Web テンプレート エンジンは、Web デザインをビジネス ロジックから分離するテクノロジーです。テンプレート エンジンを使用すると、Web ページの表示と論理処理を分離できるため、コードがクリーンで明確になり、保守が容易になります。 PHP Webテンプレートエンジンとオリジナル

SAS が Oracle データベースに接続する際のエンジンの問題を解決する SAS が Oracle データベースに接続する際のエンジンの問題を解決する Mar 08, 2024 am 10:12 AM

SAS が Oracle データベースに接続するときにエンジンの問題を解決するには、特定のコード例が必要です。SA​​S ソフトウェアをデータ分析に使用する場合、多くの場合、分析と処理のためのデータを取得するためにデータベースに接続する必要があります。その中でも、Oracle データベースへの接続は比較的一般的な操作です。ただし、Oracle データベースに接続するときにエンジンの問題が発生し、接続が失敗したり、正常に動作しなくなる場合があります。この記事では、SAS ソフトウェアで Oracle データベースに接続する際のエンジンの問題を解決する方法と、具体的なコードを紹介します。

See all articles