最新消息:

简单php代码解密与解密代码实现

PHP admin 4306浏览 0评论

php代码解密的方法可以参考:解析php混淆加密解密的手段,如 phpjm,phpdp神盾,php威盾

今天遇到了一个简单地加密php代码,是通过多次迭代eval、preg_replace /e、eval(gzinflate(base64_decode来实现的,手工解密的话可以参考上面文章的第一种加密方法的办法,即将eval替换成exit、preg_replace /e的第二个参数作为exit函数的参数,然后一层层采用相同的办法解密即可。

最终手工一层层解密,大约解了差不多20层才将php的源代码还原,很费时间。手动解密完成后,想简单写个工具来实现,最终找到文章:《php使用N层加密eval gzinflate str_rot13 base64 破解方法汇总》,和该文章中不一样的是我遇到的代码每一层使用的方式是不同的,需要综合考虑,但是可以借鉴该文章中的方法,即采用如下代码来获取每一层php代码执行的结果:

ob_start();
eval($code);
$a = ob_get_clean(); 
或
ob_start();
eval($code);
$content = ob_get_contents();
ob_end_clean();

不过需要强调的时,如果在ob_start中通过eval函数执行的代码中存在exit或其他退出php执行的代码会导致当前解密的代码也会退出,不会继续进行解密。因此,我们进行代码替换时不能替换成exit,而是要替换成echo。同时最后一次的代码里可能也会有exit等函数,所以每一轮来在代码执行前保存一份,因为如果最终解密的代码中存在exit也会退出解密流程。由于解密后的代码也可能存在eval、preg_replace关键字,如何判断什么时候解密完成也是个问题:我采用上面处理exit的方法,即保存两份代码,一份是最后没有eval/preg_replace的代码,一份是没有关键字前的代码。

解密程序如下:

<?php
//读取加密的文件内容
$content = file_get_contents('encode.php');
//去掉php标签
$content = str_replace('<?php','',trim($content));
$content = str_replace('?>','',$content);
$content_temp = $content;

function decode($content)
{
	$max_level = 300;
	for($i=0;$i<$max_level;$i++)
	{
		$index_eval = strripos($content,"eval");
		$index_preg = strripos($content,"preg_replace");
		if($index_eval === false && $index_preg === false)
		{
			file_put_contents('result1.php',$content);
			file_put_contents('result.php',$content_temp);	
			return;
		}
		elseif($index_eval!==false)
		{
			//替换eval
			$content_temp = $content;
			file_put_contents('result.php',$content_temp);
			$content = substr_replace($content,'echo',$index_eval,strlen('eval'));
			//执行获取新内容
			ob_start();
			eval($content);
			$content = ob_get_contents();
			ob_end_clean();
			file_put_contents('result1.php',$content);	

		}
		elseif($index_preg!==false)
		{
			//替换preg
			$content_temp = $content;
			file_put_contents('result.php',$content_temp);	
			$content = substr_replace($content,'echo(',$index_preg,strlen('preg_replace("/.*/e",'));
			$index_temp = strripos($content,',""');
			if($index_temp)
			{
				$content = substr_replace($content,'',$index_temp,strlen(',""'));
			}
			//执行获取新内容
			ob_start();
			eval($content);
			$content = ob_get_contents();
			ob_end_clean();
			file_put_contents('result1.php',$content);	
		}
		else
		{
			echo "error";
			return;
		}
	}
}
decode($content);
?>

本文隐藏内容 登陆 后才可以浏览

本文隐藏内容 登陆 后才可以浏览

 

转载请注明:jinglingshu的博客 » 简单php代码解密与解密代码实现

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

网友最新评论 (3)

  1. php中ob_get_contents();ob_end_clean();ob_start();用法详解 参考:http://www.jbxue.com/article/9864.html
    admin11年前 (2014-11-01)回复
  2. 可否提供一下原文件?学习下
    哈哈10年前 (2015-07-21)回复
  3. 不错。。。。。。
    kat9年前 (2016-04-05)回复