ホームページ  >  記事  >  バックエンド開発  >  汎用的な暗号化されたphpファイルの復元方法

汎用的な暗号化されたphpファイルの復元方法

高洛峰
高洛峰オリジナル
2016-10-20 14:15:221859ブラウズ

前回の記事 PHP 暗号化ファイルの実践的な復元 で、PHP 暗号化方式の欠点を発見したと述べたので、この記事を書きました。

背景分析

ご存知のとおり、PHP はスクリプト言語であり、主にコンパイルではなく解釈を使用します。そのため、コンパイル言語 (C、C#、C++) と比較して、exedll を直接生成する機能がありません。したがって、従来の暗号化方式は使用できません。

つまり、PHP には通常、難読化と暗号化という 2 つの暗号化方法があります。

難読化は厳密な意味では暗号化ではありません。この種のコードは変数の名前にピンインの略語を使用するコードに似ていますが、さらに努力しているようです。これは私たちの議論の範囲を超えています。

暗号化は 2 つの方法で実行されます。1 つは拡張機能 (ローダー) を使用する方法です。 もう一つは延長なしです。

まず、拡張なしの暗号化方式について説明します。この暗号化方法は、その復号化プロセスが公開されており、既知の PHP 関数を使用する必要があるため、非常に頭を使いません。暗号化されたコードは通常、次のようになります。

<?phpeval(base64_decode("cGhwaW5mbygpOw=="));

非常に複雑に見えるコードでも、

汎用的な暗号化されたphpファイルの復元方法

は上記のバリエーションにすぎません。この復号化フォームは、eval を見つけて echo に変更するだけで、一般に公開されると非常に簡単に解読されます。

他の拡張方法はより複雑です。ここでの拡張機能の機能は主にコードの復号と実行です。拡張機能以外の形式と比較して、拡張機能内に復号と実行コードが隠蔽されるため、クラッキングはより複雑になります。

ここでの拡張機能は大きく 2 つのタイプに分けられます: 1. 復号化実行機能を提供するもの。 2. zend_compile_file を直接上書きして、カスタム php ファイルを解析する機能を実装します。

最初の最も典型的な例は、前回の記事で説明した zoeeyguard で、主に zend_eval_string 関数を使用して PHP コードを実行します。

2 番目の代表者には、Zend Guard と Song Ge の php-beast が含まれます。

2つのクラッキングのアイデアは似ていると言えます。前回の記事のアイデアを優先して試してみてください。

もちろん、前の記事で問題が解決しなかったらどうするでしょうか?

この時点では、大きな殺人武器を使用する必要があります。

前の記事で zend_compile_file と zend_eval_string という 2 つの関数について話していることがわかります。賢い PHP の一部の人はすでにそれを考えています。アイデアは依然として eval を見つけて echo に変更することです。

実践例

何もせずにただ話すことはできません。例を見てみましょう:

今回は Brother Song の php-beast から始めます。 Brother Song のコードは非常に美しく書かれており、AES DES 復号化に時間がかかることを承知して、キャッシュを作成しました。

1. Linux 用の php ソース コード パッケージをダウンロードします (5.6 と 5.5 のいずれかを選択するのが最善です。7 はサポートされていません。ちなみに、7 には多くの変更があります。多くの点で互換性がありません。Zend Guard は 7 をサポートしていません)ここでは寄り道しました。)

2. ファイル Zendzend_lang_scanner.c 内の関数を見つけます: zend_op_array *compile_file(zend_file_handle *file_handle, int type TSRMLS_DC) その前に次のコードを追加します。 (コードは書かれています。ひどいです、文句を言わないでください):

ZEND_API zend_op_array *compile_file(zend_file_handle *file_handle, int type TSRMLS_DC)
{
    zend_lex_state original_lex_state;
    zend_op_array *op_array = (zend_op_array *) emalloc(sizeof(zend_op_array));
    zend_op_array *original_active_op_array = CG(active_op_array);
    zend_op_array *retval=NULL;
    int compiler_result;
    zend_bool compilation_successful=0;
    znode retval_znode;
    zend_bool original_in_compilation = CG(in_compilation);

    /** BEGIN **/
    //加在这里的含义就是每次php编译php源码的时候都把这份源码打印一份
    char *buf;
    size_t size;
    zend_stream_fixup(file_handle, &buf, &size);
    printf("\n#######\nFILE TYPE: %d  FILE NAME: %s CONTENT: %s\n#######\n", (*file_handle).type, (*file_handle).filename, buf);
    /** END **/

php フォルダー内で実行します:

//节省点时间
./configure --disable-ipv6 --disable-all
make
make install

4. すべてがうまくいけば、PHP は正常にインストールされています。

5. 2 つのテスト ファイルを作成します。関数は次のとおりです。test.php がそれを実行して、before.php を暗号化し、after.php を生成します。

//test.php
<?php
$path = __DIR__ . &#39;/before.php&#39;;
$newPath = __DIR__ . &#39;/after.php&#39;;
$result = beast_encode_file($path, $newPath, 0, BEAST_ENCRYPT_TYPE_DES);
var_dump($result);
//before.php
<?php
print &#39;http://wx-app.com.cn/&#39; . PHP_EOL;

7. 次の php test.php を実行し、その後 php after.php を実行します。

以下のスクリーンショットをご覧ください:

汎用的な暗号化されたphpファイルの復元方法

汎用的な暗号化されたphpファイルの復元方法

汎用的な暗号化されたphpファイルの復元方法

概要

1. 破られないパスワードはありません。私たちにできることは、クラッキング時間を増やすことだけです。解読時間が人の寿命より長ければ、この暗号化方法は間違いなく成功します。
2. 暗号化されたプログラムの場合、クラッカーが作成者の思考を理解して推測する必要があるのと同様に、作成者もクラッカーの手法と手段を理解する必要があります。この方法でのみ、クラックがより困難なプログラムを作成できます。
3. 暗号化と比較すると、PHP ソースコードの「暗号化」には難読化の方が適していると思います。
4. PHP コードを暗号化して公開したい場合は、料金を値上げしてソース コードを直接提供するのが最善の方法です。


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