遇到个加密的PHP文件,把decode过程写下来

本文详细描述了解决PHP文件乱码问题的方法,包括使用正则表达式匹配和解密函数逐层解析文件内容,最终通过多次替换和解密操作还原原始文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


早上有朋友让我帮忙看一个PHP文件,里面都是乱码,改动任何一个字符就会中止运行。

文件只有一行,以下是部分内容:

中间省略一堆字符编码,最后的内容是

2Kx9yHSQyO/D+5+fnPf+v/BSrlfeg=')));return;?>5e813...32位MD5....3f6


一开始使用ZendStudio+Xdebug跟踪了一遍,发现对于这种压缩在一行的代码,调试根本无力啊!断点都无从下起。

搞了半天还是没效果,干脆手工解决吧。

简单的看了一下,只是把变量名用一些比较特殊的字符替代,用编辑器打开,把几个重复出现的关键字替换一下,就能看出大概了。

其中还用到了一个自定义函数,这段函数已经在文件开头提供了,就是“蜖棁ㄔ┄蕷”。

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();

注释掉后继续执行后面的代码:


又是一个eval,在解密……

由于解密出来的文件有乱码,不能直接用Copy&Paste,必须以二进制写入一个文件,再经过一些替换、解密,再写入一个文件……总共经过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.youkuaiyun.com/detail/sbdx/8616319

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值