常见 PHP 源码保护与还原
一、前言 近期在工作中遇到了一些使用php开发的应用,而这些应用都使用了不同的源码保护方案对自身代码进行了加密处理,某些应用的加密强度甚至比较高,导致工作还没开始可能就得宣告结束。 为了解决遇到的这个问题,针对市面上一些常见的保护方案进行了研究,并且成功将这些较为常见的保护完成了代码还原,接下来将对这几种常见的保护与还原方法进行介绍。 二、无扩展加密 这种程度的加密,只是对代码本身做了压缩与编码,处理完之后本身就是一个正常可运行的文件,依托于php的变量与函数可以使用绝大部分字符(除了一些特字符),导致这种方式处理之后的文件内容几乎全是不可见字符,只有零星一些明显被编码后的字符串以及极个别函数符号可见。 由于加密强度不高,所以我们可以通过强行阅读处理后的文件来还原出解码方式从而获取原始代码,下面使用两种市面上常用的加密来做例子演示如何进行逆向还原。 2.1 phpjm.net 工具地址:http://www.phpjm.net/ 使用这种方式处理后的文件,只能运行在 php < 7的版本上,而且处理后的文件代码量较少,我们甚至可以直接通过手工的方式来对其进行还原,下面是一段代码被处理之后的情况: 可以看到基本上全是不可见字符+编码后的字符串,其中可以注意到有一个明文可见的符号 base64_decode,所以也能确定那一堆可见字符就是一堆base64编码(低版本php在遇到非码表内的字符会进行忽略从而完成正常解析,而高版本php>=7会抛出异常,这也就是为什么这种处理后的代码只能跑在低版本php上),那么直接对代码进行一下格式化,然后尝试对其还原,格式化后的代码如下所示: <?php /* ������������Ϣ�����DZ�php�ļ������ߣ����Ա��ļ�����������Ϣֻ���ṩ�˶Ա�php�ļ����ܡ������Ҫ��PHP�ļ����м��ܣ��밴������Ϣ��ϵ�� Warning: do not modify this file, otherwise may cause the program to run. QQ: 1833596 Website: http://www.phpjm.net/ Copyright (c) 2012-2024 phpjm.net All Rights Reserved. */ if (!defined("EBCCDDCDEF")) { define("EBCCDDCDEF", __FILE__); global $�,$��,$���,$����,$����,$������,$�������,$��������,$���������,$����������,$�����������,$�����������,$�������������,$��������������,$���������������,$���������������; function ��($��,$���="") { global $�,$��,$���,$����,$����,$������,$�������,$��������,$���������,$����������,$�����������,$�����������,$�������������,$��������������,$���������������,$���������������; if(empty($���)) { return base64_decode($��); } else { return ��($�����������($��,$���,$���($���))); } } $���=��("c3RycmV2�"); $�����������=��("c3RydHI=�"); $����=��("LXLhbA==�","ZpomPWJL"); $����=��("A3p1bmNvbXByAXNz�","ZTQA"); $������=��("nmFzZTn0X2R�ln29kZQ==�","YhJpAn"); $����������=��("SHJlZ19yZXBsYWNl�","chtS"); $���������������=��("ZzdlNWM5Yjd�iMDRhNjLlNT�JhMDm0LGVkM�zlhMjM5YjYz�Z2U=�","LomFgvZ"); function ����(&$����) { global $�,$��,$���,$����,$����,$������,$�������,$��������,$���������,$����������,$�����������,$�����������,$�������������,$��������������,$���������������,$���������������; $����������������=��("Okll�","ZGfMkO"); @$����������($���������������,$����....