前言
php是一种解释型脚本语言.
与编译型语言不同,php源代码不是直接翻译成机器语言.而是翻译成中间代码(OPCODE) ,再由解释器(ZEND引擎)对中间代码进行解释运行 .
在php源代码的保护在原理可以分为3大类.
- 源代码混淆(编码)
- OPCODE混淆(编码)
- 修改解释引擎(虚拟机)
在部署上可以分为2大类.
- 无扩展
- 有扩展
下面分析下各种加密方案的实现方法
PHP 加密方案分析
无扩展方案
源代码混淆
无扩展的加密在一些小开发者比较常见。
这种源代码保护方式侵入性小,无需对服务器做额外的配置,兼容性较强。
这种情况混淆后的源代码还原非常简单,可完全还原出源代码。 有时连注释都会保留 (x 我觉得这种混淆都不能称之为加密
基本流程 压缩代码->混淆变量函数类名->使用简单函数和方法进行编码加密 例:base64 异或
【点击查看资料】或私信回复“资料”获取
手工解密
看到这种的php不要慌 这种处理后的文件 解密流程的变量和函数名使用了大量的非打印字符 按照正常的流程就可以
ctrl+alt+l 快捷键 格式化代码 (这里使用的PhpStorm 其他IDE 格式化遇到特殊符号可能出问题 这里提前调整好了文件编码)
这里有一个php的特性 php中的base64遇到非base64表中字符会直接忽略 不会影响解码
注: PHP7 遇到空字符可能会抛出error 可以使用php5.6执行 (这里有一个兼容性问题 )
遇到这种加密最简单的方法就是找文件中最后一步执行的函数 直接把内容打印出来
这种编码方法最后一步肯定要使用eval执行还原后的php代码 所以打印最后一个函数基本上php代码就会全部出来 (x 前面操作一大顿毫无卵用
注: 有保护方案也使用了call_user_func或call_user_func_array间接调用eval
成功还原源代码 <?php phpinfo();?>
自动化通用解密
PHP提供了强大的扩展功能 可以直接通过编写php扩展hook eval相关函数 获取执行的源代码
HOOK php zend引擎的 zend_compile_string zend_include_or_eval 函数达到目的
这里演示的是 hook zend_compile_string 函数
/* $Id$ */
#include "php.h"
#include "ext/standard/info.h"
static zend_op_array* (*old_compile