一、基本介绍
二、加密方式
2.1 源码混淆处理
2.1.1 PHP 威盾混淆
一、基本介绍
PHP语言作为脚本语言的一种,由于不需要进行编译所以通常PHP程序的分发都是直接发布源代码,这对于一些开源软件而言并没有什么问题,因为它本来就希望有更多的人阅读代码并希望有更多的人参与进来,但是对于商业代码来说这却是一个不太好的消息,不管是从商业秘密还是从对公司产权的保护来说却是一个问题,从而引出了对PHP代码的加密和解密的议题。
Discuz论坛程序在开源之前要运行是必须安装Zend Optimizer, Zend官方的代码加密软件是Zend Guard,它可以用来加密和混淆PHP代码,这样分发出去的代码就可以避免直接分发源代码,但是加密后的代码在运行时还需要一个解密的模块来运行加密后的程序,这就需要运行Zend Guard加密后的代码时安装Zend Optimizer(PHP5.2之前的版本)或者安装Zend Guard Loader(PHP5.3版本)扩展才能运行
二、加密方式
PHP源代码的保护在原理可以分为以下几个大类:
2.1 源码混淆处理
PHP混淆处理主要通过修改源代码中的变量名、方法名、类名或者引入冗余代码(花指令、乱序指令等)的方式来增加代码的复杂性和阅读难度,同时通过修改和重组代码的结合和语法使其变得难以理解和分析,也有不少通过编码处理、进制转换来增加代码阅读的复杂性,从而达到保护源代码的目的,下面是几个简单的源码混淆测试示例:
2.1.1 PHP威盾混淆
这里我们给出一个PHP威盾混淆处理示例,网上给出的威盾的混淆特征如下所示,其实这里的特征是可以按需进行更改的,尤其是这里的urldecode的字符串里面只要有变量所需字符就行,例如:base64_decode
$OOO0O0O00=__FILE__;$OOO000000=urldecode('%74%68%36%73%62%65%68%71%6c%61%34%63%6f%5f%73%61%64%66%70%6e%72')
A、正向加密
程序源码文件info.php
如下所示:
<?php
phpinfo();
?>
威盾混淆的实现代码:
encode.php
:
<?php
//返回随机字符串
function RandAbc($length=""){
$str="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
return str_shuffle($str);
}
$filename='info.php'; //要加密的PHP原始文件名
$T_k1=RandAbc(); //随机密匙1
$T_k2=RandAbc(); //随机密匙2
$vstr=file_get_contents($filename); //获取要加密的文件文本内容
//进行base64编码处理
$v1=base64_encode($vstr);
$c=strtr($v1,$T_k1,$T_k2); //根据密匙替换对应字符
$c=$T_k1.$T_k2.$c;
$q1="O00O0O";
$q2="O0O000";
$q3="O0OO00";
$q4="OO0O00";
$q5="OO0000";
$q6="O00OO0";
$s='$'.$q6.'=urldecode("%6E1%7A%62%2F%6D%615%5C%76%740%6928%2D%70%78%75%71%79%2A6%6C%72%6B%64%679%5F%65%68%63%73%77%6F4%2B%6637%6A");$'.$q1.'=$'.$q6.'{3}.$'.$q6.'{6}.$'.$q6.'{33}.$'.$q6.'{30};$'.$q3.'=$'.$q6.'{33}.$'.$q6.'{10}.$'.$q6.'{24}.$'.$q6.'{10}.$'.$q6.'{24};$'.$q4.'=$'.$q3.'{0}.$'.$q6.'{18}.$'.$q6.'{3}.$'.$q3.'{0}.$'.$q3.'{1}.$'.$q6.'{24};$'.$q5.'=$'.$q6.'{7}.$'.$q6.'{13};$'.$q1.'.=$'.$q6.'{22}.$'.$q6.'{36}.$'.$q6.'{29}.$'.$q6.'{26}.$'.$q6.'{30}.$'.$q6.'{32}.$'.$q6.'{35}.$'.$q6.'{26}.$'.$q6.'{30};eval($'.$q1.'("'.base64_encode('$'.$q2.'="'.$c.'";eval(\'?>\'.$'.$q1.'($'.$q3.'($'.$q4.'($'.$q2.',$'.$q5.'*2),$'.$q4.'($'.$q2.',$'.$q5.',$'.$q5.'),$'.$q4.'($'.$q2.',0,$'.$q5.'))));').'"));';
$s='<?php
'.$s.'
?>';
echo $s;
//生成加密后的PHP文件
$fp1=fopen('enc.php','w');
fwrite($fp1,$s);
?>
随后再浏览器中访问encode.php
随后生成的enc.php
文件内容如下所示:
<?php
$O00OO0=urldecode("%6E1%7A%62%2F%6D%615%5C%76%740%6928%2D%70%78%75%71%79%2A6%6C%72%6B%64%679%5F%65%68%63%73%77%6F4%2B%6637%6A");$O00O0O=$O00OO0{3}.$O00OO0{6}.$O00OO0{33}.$O00OO0{30};$O0OO00=$O00OO0{33}.$O00OO0{10}.$O00OO0{24}.$O00OO0{10}.$O00OO0{24};$OO0O00=$O0OO00{0}.$O00OO0{18}.$O00OO0{3}.$O0OO00{0}.$O0OO00{1}.$O00OO0{24};$OO0000=$O00OO0{7}.$O00OO0{13};$O00O0O.=$O00OO0{22}.$O00OO0{36}.$O00OO0{29}.$O00OO0{26}.$O00OO0{30}.$O00OO0{32}.$O00OO0{35}.$O00OO0{26}.$O00OO0{30};eval($O00O0O("JE8wTzAwMD0iZkN5U3RJdU9GbWl6alJjcERrWEd2eHdhc1ZZVWhxV2xBbk5NYlBKRUtvWkJlUWdITHJkVE5ISk1nUkxyZkd6anBkWFRQeFZ1aUJEQWJvSWh3dlpZc2xxVW1hZVdDdGtFS25RY0ZTT3lhUDlEQWNzcUhsRXRYdVlMa0c4dEN5YnFIcDgrIjtldmFsKCc/PicuJE8wME8wTygkTzBPTzAwKCRPTzBPMDAoJE8wTzAwMCwkT08wMDAwKjIpLCRPTzBPMDAoJE8wTzAwMCwkT08wMDAwLCRPTzAwMDApLCRPTzBPMDAoJE8wTzAwMCwwLCRPTzAwMDApKSkpOw=="));
?>
程序执行效果如下所示,环境无需任何扩展:
B、逆向反解
关于上面格式的PHP后门文件我们其实在应急响应中也偶尔会遇到,下面我们对上面处理过的文件进行逆向分析,首先我们对上面的代码进行一个格式化处理:
<?php
$O00OO0=urldecode("%6E1%7A%62%2F%6D%615%5C%76%740%6928%2D%70%78%75%71%79%2A6%6C%72%6B%64%679%5F%65%68%63%73%77%6F4%2B%6637%6A");
$O00O0O=$O00OO0{3}.$O00OO0{6}.$O00OO0{33}.$O00OO0{30};$O0OO00=$O00OO0{33}.$O00OO0{10}.$O00OO0{24}.$O00OO0{10}.$O00OO0{24};$OO0O00=$O0OO00{0}.$O00OO0{18}.$O00OO0{3}.$O0OO00{0}.$O0OO00{1}.$O00OO0{24};$OO0000=$O00OO0{7}.$O00OO0{13};$O00O0O.=$O00OO0{22}.$O00OO0{36}.$O00OO0{29}.$O00OO0{26}.$O00OO0{30}.$O00OO0{32}.$O00OO0{35}.$O00OO0{26}.$O00OO0{30};
eval($O00O0O("JE8wTzAwMD0iZkN5U3RJdU9GbWl6alJjcERrWEd2eHdhc1ZZVWhxV2xBbk5NYlBKRUtvWkJlUWdITHJkVE5ISk1nUkxyZkd6anBkWFRQeFZ1aUJEQWJvSWh3dlpZc2xxVW1hZVdDdGtFS25RY0ZTT3lhUDlEQWNzcUhsRXRYdVlMa0c4dEN5YnFIcDgrIjtldmFsKCc/PicuJE8wME8wTygkTzBPTzAwKCRPTzBPMDAoJE8wTzAwMCwkT08wMDAwKjIpLCRPTzBPMDAoJE8wTzAwMCwkT08wMDAwLCRPTzAwMDApLCRPTzBPMDAoJE8wTzAwMCwwLCRPTzAwMDApKSkpOw=="));
?>
可以看到这里又是通过eval来执行代码,所以我们想到的第一个点就是看一下这里的eval之前到底做了什么操作,随后我们这里更改代码直接打印一次
随后浏览器中访问可以看到这里是进行了一次bse64解码处理:
随后我们直接更改代码将最终耀执行的内容通过echo打印输出出来:
输出结果如下所示,可以看到这里还是有加密的片段
随后我们继续上面的步骤-再将eval变echo,这里需要一个htmlspecialchars将其转移输出,不然PHP代码直接就解析执行了
随后在浏览器中访问即可完成解码,这里如果有更深层次的嵌套则需要继续向下替换eval为echo进行解码处理:
PHP Obfuscator是一个用Python构建的命令行工具,使用YAK Pro和PHP-Parser php库对PHP源代码文件进行模糊处理,该工具旨在通过使他人更难理解或逆向工程您的代码来保护您的PHP项目的知识产权,该工具可用于模糊处理单个文件、多个文件或整个项目目录,项目地址如下所示:
https://github.com/mnestorov/php-obfuscator
源代码示例;
<?php
namespace App;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
class User extends Authenticatable
{
use Notifiable;
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'username', 'email', 'password', 'background_color', 'text_color'
];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password', 'remember_token',
];
public function links()
{
return $this->hasMany(Link::class);
}
public function visits()
{
return $this->hasManyThrough(Visit::class, Link::class);
}
public function getRouteKeyName() {
return 'username';
}
}
混淆处理结果:
<?php
namespace App; use Illuminate\Contracts\Auth\MustVerifyEmail; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; class User extends Authenticatable { use Notifiable; protected $fillable = array("\165\163\145\162\x6e\141\155\x65", "\x65\x6d\x61\x69\x6c", "\x70\x61\163\x73\167\157\162\x64", "\x62\x61\143\x6b\147\x72\x6f\x75\156\144\137\x63\157\154\157\x72", "\164\145\x78\x74\x5f\143\157\x6c\x6f\162"); protected $hidden = array("\160\141\163\x73\167\x6f\x72\144", "\x72\145\x6d\145\155\142\x65\x72\137\164\157\x6b\145\156"); public function links() { return $this->hasMany(Link::class); } public function visits() { return $this->hasManyThrough(Visit::class, Link::class); } public function getRouteKeyName() { return "\x75\163\145\162\x6e\x61\x6d\145"; } }
B、反向解密
这个还没得想好怎么解....,先挖个坑,后续来填
YAK Pro混淆处理
YAK Pro - PHP混淆器的主要混淆功能:
删除所有注释、缩进并生成单行程序文件
通过用if goto语句替换if、else、elseif、for、while、do while来混淆它们
模糊字符串文字
为以下项目排列名称:
Variables, Functions, Constants.
Classes, Interfaces, Traits.
Properties, Methods
Namespaces
lable
打乱声明
递归模糊项目的目录
Makefile类似于基于时间戳的机制,只对自上次模糊处理以来发生变化的文件进行重新模糊处理
许多配置选项让您可以完全控制项目中的模糊内容
简易混淆示例如下所示:
<?php
namespace App;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
class User extends Authenticatable
{
use Notifiable;
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'username', 'email', 'password', 'background_color', 'text_color'
];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password', 'remember_token',
];
public function links()
{
return $this->hasMany(Link::class);
}
public function visits()
{
return $this->hasManyThrough(Visit::class, Link::class);
}
public function getRouteKeyName() {
return 'username';
}
}
混淆操作:
php yakpro-po.php info.php -o info2.php
图片
混淆结果如下所示:
<?php
/* __________________________________________________
| Obfuscated by YAK Pro - Php Obfuscator 2.0.14 |
| on 2024-07-15 17:00:24 |
| GitHub: https://github.com/pk-fr/yakpro-po |
|__________________________________________________|
*/
namespace BilHD; use Pvedw\ZK4QX\skEzK\sseMN; use pveDW\nMsON\SkEZk\oTByu as MgSTA; use pVeDw\aiaU5\t0Jzh; class OtBYU extends MGsta { use T0jZh; protected $hOTld = array("\165\x73\x65\162\x6e\141\x6d\x65", "\x65\155\141\x69\x6c", "\x70\141\163\163\167\x6f\x72\x64", "\142\x61\143\x6b\147\162\157\165\156\x64\137\143\x6f\x6c\157\162", "\164\145\170\164\137\x63\157\x6c\157\x72"); protected $mLM2b = array("\160\x61\x73\x73\167\157\162\x64", "\162\x65\x6d\145\155\142\x65\162\x5f\164\157\153\x65\x6e"); public function f4eRs() { return $this->wFfzk(Link::class); } public function jsh4P() { return $this->Zel1y(AgJAF::class, Link::class); } public function EmmNB() { return "\x75\163\x65\162\156\141\x6d\145"; } }
图片
源码外壳加密
PHP源码外壳加密说白了就是使用PHP代码对PHP代码进行加密处理,自己给自己套了一层外壳,随后在执行的时候再进行自解密,其特点就是独立加密程序统一对明文代码进行加密处理,其中比较常见的加密保护方式是phpjiami,下面是我们常见的几种源码外壳加密方式,这里做一个简单的介绍:
PHP Eval加密
PHP EVal加密方式实际上说它是加密有点过于勉强了,此类处理方式只是将源代码文件内容提取之后进行gzdeflate+Base64编码处理后得到的结果,这里的gzdeflate函数是用于对数据进行压缩的函数,该算法是无损数据压缩的一种标准方法,通常用于HTTP协议中的gzip编码、PNG图像文件等场景,在源代码保护中也可以起到关键作用,随后对处理后的结果再进行一次base64编码处理得到最后的处理结果,下面是整个流程的简易示例:
A、正向生成
源码文件:info.php
处理文件:encode.php
100) { // 移除PHP文件注释和空白 $contents = php_strip_whitespace($filename); // 移除PHP头部和尾部标识 $headerPos = strpos($contents,''); // 获取文件内容
$contents = substr($contents,$headerPos+5,$footerPos-$headerPos);
// 对问进行编码处理,先gzdeflate压缩,后base64编码
$encode = base64_encode(gzdeflate($contents));
// 编码内容重组成一个完整的PHP文件内容
$encode = '<?php'." /*Protected by Al1ex*/\neval(gzinflate(base64_decode('".$encode."'))); \n?>";
//写入PHP文件
return file_put_contents($filencode,$encode);
}
}
return false;
}
//源代码文件(同一WEB路径下)
$filename='info.php';
//存储处理后的文件
$filencode='enc.php';
//调用函数进行编码处理
encode_file_contents($filename,$filencode);
?>
在浏览器中访问执行PHP编码处理脚本:
图片
编码处理后的enc.php文件内容如下所示:
图片
B、逆向反解
关于源代码程序的保护其实也可以用于躲避查杀软件的查杀,如果我们在平时的应急响应中遇到上述文本特征格式的PHP文件时我们也可以对其进行解密,直接使用echo来替换eval打印出要执行的源代码文件即可
图片
PHP Eval变异
PHP Eval变异是在上面的基础之上进行ASCII偏移+Gzip压缩+Base64编码处理,其中关于偏移的位数可以自行定义,同时在我们构造的脚本中PHP程序源代码可以自行定义,下面是一个简单的实现示例演示过程:
A、正向生成
在这里我们首先演示一下PHP Eval变异的编码处理:
file_put_contents("a.php",$content);
?>
执行之后输出的处理后的源码文件内容如下所示:
图片
随后浏览器里面访问a.php可以看到正常解析
图片
B、反向解密
在这里我们可以直接将上面的eval更改未echo直接将处理的源代码打印输出即可:
从下面的执行效果我们可以看到源代码内容:
图片
phpjiami处理
PHP加密(PhpJiaMi.Com)采用了强大的安全技术手段(外壳)对PHP源码进行混淆变异(源码),系统安全防修改、防劫持、防破解(扩展),三重保护,更加安全,下面我们通过也给简易的示例来进行简单的介绍说明:
A、加密处理
初始源文件代码如下所示:
使用在线加密工具的推荐设置进行加密混淆处理:
图片
加密后的代码文件如下所示:
图片
执行效果如下所示:
图片
B、反向解密
关于PhpJiaMi的逆向分析由于分析篇幅会过程,所以等后面找时间用一个新的篇幅来进行详细介绍
源码扩展加密
PHP扩展机制允许开发者使用C语言编写PHP扩展,而且这些扩展可以直接与PHP的核心功能集成,PHP扩展加密正是通过使用第三方扩展组件来进行加密操作的,对于PHP环境来说需要安装第三方组件(DLL、SO)文件方可使用
php-beast
PHP-Beast是一种用于保护PHP源代码的工具,它可以加密和混淆PHP源代码以防止未经授权的访问者读取或修改代码,通过使用PHP-Beast,开发人员可以更好地保护其知识产权,防止代码被盗用或篡改,这种类型的源代码保护工具通常会使用加密算法将PHP代码转换为不可读的形式并提供解密机制以便在运行时将其恢复为原始PHP代码。此外它还可能包括其他技术,例如:代码混淆和反调试功能以增强对源代码的保护,下面我们进行一个简单的演示:
A、正向加密
在安装部署完php-beast后我们可以使用tools目录下的encode_files.php来加密你的项目,使用encode_files.php之前先修改tools目录下的configure.ini文件,如下:
; source path
src_path = ""
; destination path
dst_path = ""
; expire time
expire = ""
; encrypt type (selection: DES, AES, BASE64)
encrypt_type = "DES"
参数说明:
src_path:要加密项目的路径
dst_path:是保存加密后项目的路径
expire:是设置项目可使用的时间(expire的格式是:YYYY-mm-dd HH:ii:ss)
encrypt_type:是加密的方式,选择项有DES、AES、BASE64
下面是一个配置示例:
; source path
src_path = "D:\Application\phpstudy_pro\WWW\test\"
; destination path
dst_path = "D:\Application\phpstudy_pro\WWW\encrypt\"
; expire time
expire = "2024-10-01 00:00:00"
; encrypt type
encrypt_type = "AES"
修改完configure.ini文件后就可以使用命令php encodes_files.php开始加密项目:
图片
处理之前的文件源码如下所示:
hasMany(Link::class); } public function visits() { return $this->hasManyThrough(Visit::class, Link::class); } public function getRouteKeyName() { return 'username'; } } 处理后的文件如下所示: 图片 B、反向解密 关于php-beate的解密从上面的配置可以很明显的看到,这里使用的加密方式有DES、AES、BASE64,其中DES、AES如果项目方使用项目中默认的Key那么将极为容易的被解密,其中AES模块具体的Key值可以在aes_algo_handler.c文件中查看 图片 DES模块可以在des_algo_handler.c文件查看: 图片 Zend Guard Zend Guard是一个用于PHP的代码保护工具,它主要用于保护源代码、许可证管理以及加密和混淆PHP脚本,以下是关于Zend Guard的一些主要特点和功能: 代码加密:Zend Guard可以将PHP源代码加密,使其在未经授权的情况下不可读,这有助于保护开发者的知识产权,它使用强大的加密算法对PHP代码进行转换以确保在运行时只能被授权用户解密和执行 代码混淆:通过混淆代码Zend Guard可以使源代码更加难以理解,增加逆向工程的难度,混淆技术包括重命名变量、函数和类名等,以降低代码的可读性 许可证管理:提供了许可证管理功能,允许开发者对软件的使用进行限制以防止非法复制和使用,这种功能包括限制并发用户数、过期时间、授权等 兼容性:Zend Guard支持多种PHP版本并且可以与各种Web服务器和操作系统一起使用,确保代码在不同环境中的可用性 反调试功能:Zend Guard包括防止调试和逆向工程的技术,增强代码的安全性,它可以检测调试器并采取相应措施来防止代码被分析和修改 下图时PHP Zend Guard扩展加密的大体流程示意图: 图片 部署完环境后进行加密处理即可,处理前的源文件示例如下所示: hasMany(Link::class); } public function visits() { return $this->hasManyThrough(Visit::class, Link::class); } public function getRouteKeyName() { return 'username'; } } 加密处理: 图片 加密处理之后的文件如下所示: 图片 B、逆向解密 这里我们以通达OA为例进行简易演示,我们安装部署OA系统之后打开其webroot目录下的PHP文件时会看到一系列的加密内容,例如: 图片 根据文件头可以知晓这里使用的是Zend Guard扩展加密: Zend •2004072203 随后我们使用SeayDZend解密工具进行解码: 图片 解密之后的源代码文件内容如下所示: 图片 #文末小结 本篇文章我们主要从PHP源代码保护需求出发对现有的几种较为典型的PHP源代码安全保护方式进行了介绍,同时对几种较为脆弱的源代码保护方式进行了逆向反解,其中源代码扩展加密方式安全性较高也较为推荐,同时这里也比较推荐PHP的opcode对源代码进行加密混淆处理,关于PHP源代码的混淆和加密其实再PHP木马免杀中也有极好的用途,尤其是针对PHP大马程序,关于部分PHP源代码保护的加密算法的逆向分析解码和PHP源代码保护在木马免杀中的使用在后续的文章中将进行分篇介绍 >原创 七芒星实验室 标签:攻防,PHP,加密,混淆,代码,php,源码,源代码,对抗 From: https://www.cnblogs.com/o-O-oO/p/18361560