年代在开展,在PHP平台上开发的开发者越来越多。“全国熙熙,皆为利来;全国攘攘,皆为利往”,许多开发者运用PHP开发他们的商业产品,并将其进行二次分发。惋惜由于PHP的机制受限,开发者们只能分发源代码,这对他们的版权维护极为晦气,导致PHP界出现出了不少加密产品。笔者最近想了想,在这儿对这些加密产品进行逐项介绍,以飨各位读者。
假如你没有任何技能布景,笔者引荐你直接拉到本文最后来选择一款合适你的加密。
壳”加密”
这一类“加密”包含:
无扩展加密:phpjiami、zhaoyuanma的免费版别等
有扩展的加密:php-beast、php_screw、screw_plus、ZoeeyGuard、tonyenc等市面上简直一切的开源PHP加密扩展。
把它们称为“加密”算是看重,它们真的真的只能被称为“自解压压缩包”,像是PHP界的WinRAR,或许是UPX、ASPack。笔者写到这儿时暂时停顿了一下,笔者以为把这种“加密”和UPX这些壳混为一谈是对UPX的凌辱。由于任何一个较为了解PHP的人,都能够在一天之内写出这种等级的加密,而不需求任何额定的常识。
这一类自解压压缩包的一起思路是:
加密:直接加密整个PHP文件,不对原始PHP逻辑作出改动。无扩展的加密将给用户一个运转时环境(“壳”)和加密后的数据,有扩展的加密将直接取得加密后的数据,并要求用户在运用时装置对应的扩展。
解密:壳或扩展先承认环境有没有被调试的危险,假使没有,就直接在内存中解密出整个PHP文件,并运用eval或相似方法直接运转。
以下是笔者写的一个简化的代码示例:
$code = file_get_contents('待加密的PHP');
$code = base64_encode(openssl_encrypt($code, 'aes-128-cbc', '密钥', false, 'IV'));
echo ";
信任读到这儿的各位都能意识到,对这一类“壳加密”来说,是有全能的“解密”计划的。不需求知道数据的加密算法究竟是什么,由于实在代码在履行时总会被解密出来,各位只需求知道PHP究竟履行了什么,从这儿拿出代码。
不管是eval、assert、preg_replace('//e'),仍是这类PHP加密扩展,想要动态履行代码就必须经过zend_compile_string这一个函数。只需求编写一个dll/so,给zend_compile_string挂上“钩子”,就能直接拿到完好的代码。笔者觉得具体讲这种加密是糟蹋本文空间,给出几篇文章作为参阅:
https://www.leavesongs.com/PENETRATION/unobfuscated-phpjiami.html
http://blog.evalbug.com/2019/09/21/phpdecode_01/
也有一些网站能够在线解密,例如国外的UnPHP:https://www.unphp.net/
而假如你不会C,或许不想从PHP底层来破解,也有不少的伸手党战略,像是这篇针对phpjiami / zym的破解计划 https://www.52pojie.cn/thread-693641-1-1.html,可从中了解这些壳的根本运转方法。
有扩展加密中,php_screw因加密方法太弱,简略被已知明文进犯(举例:大部分PHP文件的最初均为)推测出密钥。其他的加密就都需求手动逆向,过于费事,直接运用通用计划来反而是更简略的破解方法。
别的,还有一部分加密供给了一些附加功用。例如phpjiami供给的防SQL注入和拜访操控功用。
假如真的信任SQL注入能靠这些“加密”来防护,那也不免too young too simple。这些防SQL注入没有任何用途,经过关键字过滤反而简略阻拦正常的用户输入。信任它们,还不如在网站前面加一层360网站卫兵、百度云加快。正确的防SQL注入的方法应当是在用户输入处运用mysqli_real_escape_string,或许运用PDO的预处理查询,或许运用各类ORM结构。
混杂加密
这一类加密才刚刚上了加密的道。
在国内用的最多的是EnPHP,开源的有php-obfusactor。当然,还有一种更强壮的开源加密yakpro-po,笔者猜想,微擎的混杂算法便是根据这个来修正的。它们的根本原理是:
移除代码内的变量,将其替换为乱码或l1O0组合成的变量名。由于只改动变量名,大部分情况下并不会对代码的逻辑产生影响。
对PHP代码自身的明文字符串,像是变量名、函数名这些进行替换。
必定程度上改动代码原始逻辑。
这一类加密的开发门槛就相对高些了,需求了解关于笼统语法树(AST)的操作。
代码混杂关于一般的防破解来说强度是满足的,Google 在 Android 上即默许供给了 ProGuard 这一明文符号混杂东西,在PHP上相同,假如变量名、函数名等被混杂,的确能够添加破解难度,对应的东西是php-obfusactor。不过,这对一般的逆向造不成什么影响,批量替换变量名就能够处理了。EnPHP和yakpro-po相对会费事一些。
EnPHP的特征是,将一切的函数名都提取到一个常量池,在必定程度上修正了变量名,不过不改动代码逻辑。
这种加密完成难度不高,只需了解对php-parser的操作即可写出来。笔者顺手花了十分钟写了一个,共享给我们:
use PhpParserLexer;
use PhpParserNode;
use PhpParserNodeExpr;
use PhpParserNodeTraverser;
use PhpParserNodeVisitorNameResolver;
use PhpParserNodeVisitorAbstract;
use PhpParserParser;
use PhpParserParserFactory;
[1] [2] [3] [4] 黑客接单网