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