最新消息:

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

PHP admin 4321浏览 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代码执行的结果:

1ob_start();
2eval($code);
3$a = ob_get_clean();
4
5ob_start();
6eval($code);
7$content = ob_get_contents();
8ob_end_clean();

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

解密程序如下:

1<?php
2//读取加密的文件内容
3$content = file_get_contents('encode.php');
4//去掉php标签
5$content = str_replace('<?php','',trim($content));
6$content = str_replace('?>','',$content);
7$content_temp = $content;
8 
9function decode($content)
10{
11    $max_level = 300;
12    for($i=0;$i<$max_level;$i++)
13    {
14        $index_eval = strripos($content,"eval");
15        $index_preg = strripos($content,"preg_replace");
16        if($index_eval === false && $index_preg === false)
17        {
18            file_put_contents('result1.php',$content);
19            file_put_contents('result.php',$content_temp); 
20            return;
21        }
22        elseif($index_eval!==false)
23        {
24            //替换eval
25            $content_temp = $content;
26            file_put_contents('result.php',$content_temp);
27            $content = substr_replace($content,'echo',$index_eval,strlen('eval'));
28            //执行获取新内容
29            ob_start();
30            eval($content);
31            $content = ob_get_contents();
32            ob_end_clean();
33            file_put_contents('result1.php',$content); 
34 
35        }
36        elseif($index_preg!==false)
37        {
38            //替换preg
39            $content_temp = $content;
40            file_put_contents('result.php',$content_temp); 
41            $content = substr_replace($content,'echo(',$index_preg,strlen('preg_replace("/.*/e",'));
42            $index_temp = strripos($content,',""');
43            if($index_temp)
44            {
45                $content = substr_replace($content,'',$index_temp,strlen(',""'));
46            }
47            //执行获取新内容
48            ob_start();
49            eval($content);
50            $content = ob_get_contents();
51            ob_end_clean();
52            file_put_contents('result1.php',$content); 
53        }
54        else
55        {
56            echo "error";
57            return;
58        }
59    }
60}
61decode($content);
62?>

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

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

 

转载请注明: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)回复