ホームページ  >  記事  >  バックエンド開発  >  暗号化された PHP ファイルに遭遇した場合は、復号化プロセスを書き留めてください。

暗号化された PHP ファイルに遭遇した場合は、復号化プロセスを書き留めてください。

WBOY
WBOYオリジナル
2016-08-08 09:25:34872ブラウズ


今朝、友人から 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[&#39;B&#39;]=&#39;base64_decode&#39;;
$arr[&#39;G&#39;]=&#39;gzuncompress&#39;;
//调用的时候可以这样用
eval($arr[&#39;G&#39;]($arr[&#39;B&#39;](&#39;一大堆乱码&#39;)))

と同様に、変更後に実行できないキーコードが表示されます:

	$A=file_get_contents(&#39;origin.php&#39;);
	@substr($A,-32)==md5(substr(substr($A,0,-32).&#39;另外一个<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 チュートリアルに興味のある友人に役立つことを願っています。

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