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代码执行的结果:
7 | $content = ob_get_contents(); |
不过需要强调的时,如果在ob_start中通过eval函数执行的代码中存在exit或其他退出php执行的代码会导致当前解密的代码也会退出,不会继续进行解密。因此,我们进行代码替换时不能替换成exit,而是要替换成echo。同时最后一次的代码里可能也会有exit等函数,所以每一轮来在代码执行前保存一份,因为如果最终解密的代码中存在exit也会退出解密流程。由于解密后的代码也可能存在eval、preg_replace关键字,如何判断什么时候解密完成也是个问题:我采用上面处理exit的方法,即保存两份代码,一份是最后没有eval/preg_replace的代码,一份是没有关键字前的代码。
解密程序如下:
3 | $content = file_get_contents( 'encode.php' ); |
5 | $content = str_replace( '<?php' , '' ,trim($content)); |
6 | $content = str_replace( '?>' , '' ,$content); |
7 | $content_temp = $content; |
9 | function decode($content) |
12 | for ($i=0;$i<$max_level;$i++) |
14 | $index_eval = strripos($content, "eval" ); |
15 | $index_preg = strripos($content, "preg_replace" ); |
16 | if ($index_eval === false && $index_preg === false ) |
18 | file_put_contents( 'result1.php' ,$content); |
19 | file_put_contents( 'result.php' ,$content_temp); |
22 | elseif($index_eval!== false ) |
25 | $content_temp = $content; |
26 | file_put_contents( 'result.php' ,$content_temp); |
27 | $content = substr_replace($content, 'echo' ,$index_eval,strlen( 'eval' )); |
31 | $content = ob_get_contents(); |
33 | file_put_contents( 'result1.php' ,$content); |
36 | elseif($index_preg!== false ) |
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, ',""' ); |
45 | $content = substr_replace($content, '' ,$index_temp,strlen( ',""' )); |
50 | $content = ob_get_contents(); |
52 | file_put_contents( 'result1.php' ,$content); |
转载请注明:jinglingshu的博客 » 简单php代码解密与解密代码实现