今朝、友人から PHP ファイルを読むのを手伝ってほしいと頼まれました。文字化けが発生し、文字を変更すると操作が停止してしまいました。
ファイルには 1 行しかなく、以下は内容の一部です:
途中の文字エンコーディングの束を省略し、最終的な内容は
2Kx9yHSQyO/D+5+fnPf+v/BSrlfeg=')));return;?>5e813...32位MD5....3f6
ZendStudio+Xdebug を使用して追跡しました。そして、この種の 1 行の圧縮コードの場合、デバッグはまったく役に立たないことがわかりました。どこから始めるべきかという出発点はありません。
長い間取り組んでもまだ動作しないので、手動で解決した方が良いかもしれません。
ざっと見た後、変数名をいくつかの特殊文字に置き換え、エディターで開き、いくつかの繰り返しキーワードを置き換えただけで、大まかなアイデアが得られます。
カスタム関数も使用されています。この関数は「蜖棁ㄔ┄蓣」というファイルの先頭に用意されています。
function 蜖棁ㄔ┄蕷($A,$B="") { $A=base64_decode($A); if(empty($A)) return ""; if($B==""){return ~$A;} else { $D=strlen($A);$B=str_pad($B,$D,$B);$str=$A^$B;return $str; } }
いくつかの単純な置換の後、各フィールドに何が格納されているかがわかります
まず、eval 関数から始まり、次に 2 つの復号化関数が続き、関数名が配列に格納されます。
<?php $arr['B']='base64_decode'; $arr['G']='gzuncompress'; //调用的时候可以这样用 eval($arr['G']($arr['B']('一大堆乱码')))
と同様に、変更後に実行できないキーコードが表示されます:
$A=file_get_contents('origin.php'); @substr($A,-32)==md5(substr(substr($A,0,-32).'另外一个<span style="font-family: Arial, Helvetica, sans-serif;">32位MD5</span>',6))||die();
コメントアウトして次のコードの実行を続けます:
別の評価、復号中...
復号のため出力されたファイルは文字化けしており、コピー&ペーストで直接使用することはできません。バイナリでファイルに書き込んでから、置換、復号化を経て、ファイルに書き込む必要があります。合計 5 回の復号化の後、ソースファイルが最終的に取得されます。
最後に、それを整理してファイルを修正するための正規表現を記述し、ファイルを直接非アクティブ化しました。
<?php $B='base64_decode'; $G='gzuncompress'; function A($A,$B="") { $A=base64_decode($A); if(empty($A)) return ""; if($B==""){return ~$A;} else { $D=strlen($A);$B=str_pad($B,$D,$B);$str=$A^$B;return $str; } } $s=file_get_contents('origin.php'); //第1次匹配 preg_match('/\]\(\'(.+?)\'\)/',$s,$r1); $s=$G($B($r1[1])); //第2次匹配 preg_match('/\]\(\'(.+?)\'\)/',$s,$r2); $s=A($B($r2[1])); //第3次匹配 preg_match('/\]\(\'(.+?)\'\)/',$s,$r3); $s=($B($r3[1])); //第4次匹配 preg_match('/\]\(\'(e.+?)\'\)/',$s,$r4); $s=$G($B($r4[1])); //第5次匹配 preg_match('/\]\(\'(e.+?)\'\)/',$s,$r5); $s=(A($B($r5[1]))); file_put_contents('code.php',$s); echo 'Done!';
関連コード: http://download.csdn.net/detail/sbdx/8616319
上記は、暗号化された PHP ファイルに遭遇し、関連する側面を含むデコード プロセスを書き留める方法を紹介したもので、PHP チュートリアルに興味のある友人に役立つことを願っています。