前回の記事 PHP 暗号化ファイルの実践的な復元 で、PHP 暗号化方式の欠点を発見したと述べたので、この記事を書きました。
背景分析
ご存知のとおり、PHP はスクリプト言語であり、主にコンパイルではなく解釈を使用します。そのため、コンパイル言語 (C、C#、C++) と比較して、exedll を直接生成する機能がありません。したがって、従来の暗号化方式は使用できません。
つまり、PHP には通常、難読化と暗号化という 2 つの暗号化方法があります。
難読化は厳密な意味では暗号化ではありません。この種のコードは変数の名前にピンインの略語を使用するコードに似ていますが、さらに努力しているようです。これは私たちの議論の範囲を超えています。
暗号化は 2 つの方法で実行されます。1 つは拡張機能 (ローダー) を使用する方法です。 もう一つは延長なしです。
まず、拡張なしの暗号化方式について説明します。この暗号化方法は、その復号化プロセスが公開されており、既知の PHP 関数を使用する必要があるため、非常に頭を使いません。暗号化されたコードは通常、次のようになります。
<?phpeval(base64_decode("cGhwaW5mbygpOw=="));
非常に複雑に見えるコードでも、
は上記のバリエーションにすぎません。この復号化フォームは、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__ . '/before.php'; $newPath = __DIR__ . '/after.php'; $result = beast_encode_file($path, $newPath, 0, BEAST_ENCRYPT_TYPE_DES); var_dump($result);
//before.php <?php print 'http://wx-app.com.cn/' . PHP_EOL;
7. 次の php test.php を実行し、その後 php after.php を実行します。
以下のスクリーンショットをご覧ください:
概要
1. 破られないパスワードはありません。私たちにできることは、クラッキング時間を増やすことだけです。解読時間が人の寿命より長ければ、この暗号化方法は間違いなく成功します。
2. 暗号化されたプログラムの場合、クラッカーが作成者の思考を理解して推測する必要があるのと同様に、作成者もクラッカーの手法と手段を理解する必要があります。この方法でのみ、クラックがより困難なプログラムを作成できます。
3. 暗号化と比較すると、PHP ソースコードの「暗号化」には難読化の方が適していると思います。
4. PHP コードを暗号化して公開したい場合は、料金を値上げしてソース コードを直接提供するのが最善の方法です。