php源代码保护——PHP加密方案分析&解密还原
moboyou 2025-06-25 17:20 26 浏览
前言
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_string)(zval *source_string, char *filename TSRMLS_DC);
static zend_op_array* evalhook_compile_string(zval *source_string, char *filename TSRMLS_DC)
{
if(strstr(filename, "eval()'d code")) {
printf("\n------eval-------\n%s\n------eval-------\n",Z_STRVAL_P(source_string));
}
return old_compile_string(source_string, filename TSRMLS_CC);
}
PHP_MINIT_FUNCTION(evalhook)
{
return SUCCESS;
}
PHP_MSHUTDOWN_FUNCTION(evalhook)
{
return SUCCESS;
}
PHP_RINIT_FUNCTION(evalhook)
{
old_compile_string = zend_compile_string;
zend_compile_string = evalhook_compile_string;
return SUCCESS;
}
PHP_RSHUTDOWN_FUNCTION(evalhook)
{
zend_compile_string = old_compile_string;
return SUCCESS;
}
PHP_MINFO_FUNCTION(evalhook)
{
php_info_print_table_start();
php_info_print_table_row(2, "eval hooking", "enabled");
php_info_print_table_end();
}
zend_function_entry evalhook_functions[] = {
ZEND_FE_END
};
zend_module_entry evalhook_module_entry = {
STANDARD_MODULE_HEADER,
"evalhook",
evalhook_functions,
PHP_MINIT(evalhook),
PHP_MSHUTDOWN(evalhook),
PHP_RINIT(evalhook),
PHP_RSHUTDOWN(evalhook),
PHP_MINFO(evalhook),
"0.0.1-dev",
STANDARD_MODULE_PROPERTIES
};
ZEND_GET_MODULE(evalhook)
成功还原源代码
PHP扩展方案
源代码混淆
使用php扩展的代码混淆和无扩展代码混淆比较相似,只不过是把代码还原过程从php代码转到了php扩展。
同样是使用aes des 异或等加密方法直接加密php代码,HOOK翻译php的函数在翻译PHP文件前对文件进行解密操作。这种方案也可以完全还原出源代码。在无其他混淆和压缩时甚至还会保留注释。
手工解密
这里以beast为例.
首先在php的扩展目录下找到beast.so
beast的加密方案会把加密key编译进扩展中. 我们只需要寻找key就可以完成解密
beast由于是开源项目.有现成的符号表和源码这使得反编译寻找key变得非常简单.
但这样有点太简单了. 所以这里演示的是在没有源码的情况下使用IDA分析解密流程.
首先在导入表找到zend_compile_file
这个函数会将php文件翻译成opcode
因此大部分php加密扩展都需要hook这个函数达到拦截php文件载入和替换php文件的功能
继续跟入
发现有两个函数
一般在这种php加密扩展设计时会对这个函数有两次操作:
一个是在启动时hook 这个函数,一个是在停止时恢复这个函数。
继续跟入启动hook
显然文件处理逻辑在cgi_compile_file内
跟踪文件句柄
decrypt_file函数的参数存在文件句柄 所以这个函数应该就是文件解密函数
根据代码可以看出beast 加密文件的结构
| encrypt_file_header_sign 文件头标记(不固定 可修改)| reallen文件长度 int 4字节 | expire 到期时间 int 4字节| entype 加密方式 int 4字节| 加密后文件|
分析文件头发现该文件加密方式为 02
跟入beast_get_encrypt_algo
2对应的是 aes_handler_ops
使用了AES 128 ECB加密模式
直接提取key参数内容
长度刚好16位
到这一步就成功拿到了加密秘钥
使用拿到的KEY就可以解密PHP文件
自动化通用解密
编写php扩展 HOOK zend_compile_file函数
beast的加密不会对php文件做额外的操作 解密文件与加密前原文件完全一致
php注释和原格式都会保留
注意: 这里扩展加载顺序问题 建议直接修改php源码
Zendzend_language_scanner.c
ZEND_API zend_op_array *compile_file
opcode
php会将源代码翻译成类似汇编的二进制中间操作码再交给zend引擎执行。
之前的介绍的都是编译之前对php源代码的直接操作。这里是对opcode的操作,跳过翻译过程,直接把现成的opcode交给zend引擎执行(不同版本PHP引擎编译出的opcode可能会有兼容性问题)。
这种php代码防护方法 只能hook zend_execute 拿到opcode。 不可能直接得到原本的源码,只能通过反编译尽可能的还原源代码。
大部分商业php保护方案都使用这种可靠的方案为基础 _ZendGuard(zend) _SourceGuardian(SG) IonCube (IC) Swoole Compiler
上面的方案有的还对zend引擎进行了魔改,使翻译出的opcode只能在修改后的引擎执行,进一步增强了安全性。
还原代码
hook zend_execute 拿到opcode
使用对应版本的php操作码反推php代码
太菜了不会反编译)
私信回复“资料”获取以下:
1、200多本网络安全系列电子书
2、全套工具包
3、100份src源码技术文档
4、网络安全基础入门、Linux、web安全、攻防方面的视频
6、 网络安全学习路线
7、ctf夺旗赛解析
附录
PHP扩展编译
docker run -it --rm -v /mnt/hgfs/tmpssd/php-eval-hook/:/ext/ php:5.6 /bin/bash
apt-get update
apt install libtool
phpize
phpize 生成Makefile
./configure --enable-evalhook
配置编译选项 启用扩展
最后执行make 编译扩展
编译好的扩展会放在./modules/ 目录下
使用扩展
php -d extension=扩展位置 -f 文件
可以重复使用-d extension 加载多个扩展
总结
在选用PHP源码保护方案时 尽量选择opcode或虚拟机方案
源代码混淆类只能对源代码获取和阅读增加一点困难 在加密扩展可被攻击者获取到时并不能起到保护作用
相关推荐
- iis部署php项目(iis发布php)
-
1.启动iis服务器最后点击确定就完成了2.打开iis点击进入即可3.创建网站进入添加网站。添加注意事项如图所示!启动、浏览、重启、停止网站这个如图所示。需要说明的是只要修改了配置就必须重启下网站4...
- Win10安装Apache和PHP(apache安装php模块)
-
说明:虽然PHPStudy之类的软件给我们提供了方便的集成环境,但是其使用的是非线程安全的PHP版本(NotThreadSafe,NTS),某些功能不可以使用。所以,我们还需要自己再安装一个Apa...
- 两个php框架在一个网站上开发好吗
-
框架就是通过提供一个开发Web程序的基本架构,PHP开发框架把PHPWeb程序开发摆到了流水线上。换句话说,PHP开发框架有助于促进快速软件开发(RAD),这节约了你的时间,有助于创建更为稳定的程序,...
- Ubuntu linux 上的 Nginx 和 Php 安装
-
教程-在UbuntuLinux上安装Nginx1.安装Nginx服务器和所需的包。apt-getupdatebrapt-getinstallnginx2.在Nginx配置文件...
- 网站开发初级(3) 之 PHP运行环境搭建
-
这篇文章主要是讲windows下php环境的搭建这里我们用的是phpstudy,作为入门学者足够了,解压安装就能用了,适当配置下基本能应付我们的开发要求下载地址:http://rj.baidu.co...
- 真实案例:优化用老PHP7.4的网站让其速度提高4倍
-
我让反应迟钝的PHP应用程序性能提升了4倍,而且我甚至没有改动任何源代码。没有重构,没有重写,只是进行了一系列精心规划的配置调整和部署优化。这篇文章将详细告诉你我是如何做到的。如果你的PHP应用程序运...
- mac下快速搭建本地php开发环境(macbook开发php)
-
本教程主要是告诉大家,怎么快速的在mac下搭建php+mysql服务。一、安装CommandLineTools苹果系统下很多开发工具是基于CommandLineTools,所以安装它是首先。...
- php手把手教你做网站(二十)vue+tp6简单案例(demo)
-
很多时候搭建好了环境,但是不知道怎么入手去开发。下面我们通过简单案例说明如何快速入门开发模块:例1:开发helloworld模块搭建好环境,新建项目以后,进入项目所在文件夹,依次进入src/compo...
- Windows安装phpstudy(windows安装docker desktop)
-
说明:phpstudy是一个PHP+MySQL+Apache的集成环境,可以减少单独部署各个所需软件的麻烦,以及更加方便地切换版本。phpenv、wamp等软件的作用一样。由于环境的不同,安装过程中可...
- 服务器安装PHP网站的运行环境(php的服务器app)
-
首先要确认的是你的服务器的系统,Windows、或者linux系统。要想在Windows系统里运行php网站,可以选择iis或者Apache,如果你单独的去安装,可能会花很多时间去配置这个软件直接问题...
- 折腾群晖NAS:使用群晖web功能搭建个人博客「 小白玩NAS系列」
-
大家好,今天分享给大家如何利用群晖自带的web功能,来搭建一个属于自己的个人网站或者博客。搭建群晖web环境1、首先进入套件中心,下载webstation,群晖自带的web环境,安装会提示安装PHP...
- 黑客搭建钓鱼平台,手把手教你如何钓鱼?
-
跨站脚本攻击XSS:通过HTML注入篡改了网页,插入了恶意的脚本,从而用户浏览网页时,控制用户浏览器的一种攻击那么,我们搭建一个XSS钓鱼平台吧,注意:这个平台仅用于学习和测试,小伙伴们不要动有坏心思...
- PHP 环境 搭建教程(php环境搭建apache)
-
PHP是一种编程语言,很多网站都用PHP语言编写,我们有时候需要测试一个网站,就需要PHP环境才能运行,又要安装Apache、又要安装MySQL……真的非常麻烦。其实我们可以使用PHP集成...
- php手把手教你做网站(六)IIS创建站点注意事项
-
站点名称:随便填写;应用程序池:创建站点的时候会自动生成对应的,默认就好;物理路径:选择站点所在目录;类型:本地一定是http,网上可能会有https;IP地址:默认端口默认,如果是别的端口,网址访问...
- 分享PHP网站开发过程中的一些经验
-
现在的网站建设语言有几种,分别是ASP.NET,PHP,JSP这三种最为常见,这三种语言做出来的网站各有各的特点,asp属于最成熟的建站模式,jsp一般使用在大型网站系统上,对于php是目前比较流行的...
- 一周热门
- 最近发表
- 标签列表
-
- 外键约束 oracle (36)
- oracle的row number (32)
- 唯一索引 oracle (34)
- oracle in 表变量 (28)
- oracle导出dmp导出 (28)
- oracle两个表 (20)
- oracle 数据库 字符集 (20)
- matlab化简多项式 (20)
- 多线程的创建方式 (29)
- 多线程 python (30)
- java多线程并发处理 (32)
- 宏程序代码一览表 (35)
- c++需要学多久 (25)
- css class选择器用法 (25)
- css样式引入 (30)
- css教程文字移动 (33)
- php简单源码 (36)
- php个人中心源码 (25)
- php小说爬取源码 (23)
- 云电脑app源码 (22)
- html画折线图 (24)
- docker好玩的应用 (28)
- linux有没有pe工具 (34)
- mysql数据库源码 (21)
- php开源万能表单系统源码 (21)