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代码解密与解密代码实现