【PHP安全】php程序源码保护技术

news/2025/3/11 3:25:31/文章来源:https://www.cnblogs.com/o-O-oO/p/18622543
一、基本介绍二、加密方式2.1 源码混淆处理2.1.1 PHP 威盾混淆2.1.2 php-obfuscator2.2 YAK Pro混淆处理2.3 源码外壳加密2.3.1 PHP Eval加密2.3.2 PHP Eval变异2.3.3  phpjiami处理2.4 源码扩展加密2.4.1 php-beast2.4.2 Zend Guard文末小结

一、基本介绍

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进行解码处理:

2.1.2 php-obfuscator

PHP Obfuscator是一个用Python构建的命令行工具,使用YAK Pro和PHP-Parser php库对PHP源代码文件进行模糊处理,该工具旨在通过使他人更难理解或逆向工程您的代码来保护您的PHP项目的知识产权,该工具可用于模糊处理单个文件、多个文件或整个项目目录,项目地址如下所示:

https://github.com/mnestorov/php-obfuscator

源代码示例;

<?phpnamespace 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';}}

混淆处理结果:

<?phpnamespace 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、反向解密
这个还没得想好怎么解....,先挖个坑,后续来填

2.2 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类似于基于时间戳的机制,只对自上次模糊处理以来发生变化的文件进行重新模糊处理
    

许多配置选项让您可以完全控制项目中的模糊内容

简易混淆示例如下所示:

<?phpnamespace 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"; } }

2.3 源码外壳加密

PHP源码外壳加密说白了就是使用PHP代码对PHP代码进行加密处理,自己给自己套了一层外壳,随后在执行的时候再进行自解密,其特点就是独立加密程序统一对明文代码进行加密处理,其中比较常见的加密保护方式是phpjiami,下面是我们常见的几种源码外壳加密方式,这里做一个简单的介绍:

2.3.1 PHP Eval加密

PHP EVal加密方式实际上说它是加密有点过于勉强了,此类处理方式只是将源代码文件内容提取之后进行gzdeflate+Base64编码处理后得到的结果,这里的gzdeflate函数是用于对数据进行压缩的函数,该算法是无损数据压缩的一种标准方法,通常用于HTTP协议中的gzip编码、PNG图像文件等场景,在源代码保护中也可以起到关键作用,随后对处理后的结果再进行一次base64编码处理得到最后的处理结果,下面是整个流程的简易示例:

✅A、正向生成

源码文件:info.php

<?phpphpinfo();
?>

处理文件:encode.php

<?php
//定义编码处理功能函数
function encode_file_contents($filename,$filencode) {//获取文件类型$filetype=strtolower(substr(strrchr($filename,'.'),1));//如果是PHP文件且可写则进行压缩编码处理if(is_file($filename) && 'php'==$filetype && is_writable($filename)) {//提取文件内容$contents = file_get_contents($filename);//判断是否已经进行过编码处理,处理过的不再重复处理$pos = strpos($contents,'/*Protected by Al1ex*/');if(false === $pos || $pos>100) {// 移除PHP文件注释和空白$contents = php_strip_whitespace($filename);// 移除PHP头部和尾部标识$headerPos = strpos($contents,'<?php');$footerPos = strrpos($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文件内容如下所示:

<?php /*Protected by Al1ex*/
eval(gzinflate(base64_decode('4+UqyCjIzEvL19C0VrC3AwA='))); 
?>

✅B、逆向反解

关于源代码程序的保护其实也可以用于躲避查杀软件的查杀,如果我们在平时的应急响应中遇到上述文本特征格式的PHP文件时我们也可以对其进行解密,直接使用echo来替换eval打印出要执行的源代码文件即可

<?php
//已加密处理过后的PHP内容
$encode = "eval(gzinflate(base64_decode('4+UqyCjIzEvL19C0VrC3AwA=')));";
//调用函数进行解码处理
function decodephp($encode)
{$max_level = 300; //最大层数for ($i = 0; $i < $max_level; $i++) {ob_start();eval(str_replace('eval', 'echo', $encode));$encode = ob_get_clean();if (strpos($encode, 'eval(gzinflate(base64_decode') === false) {return $encode;}}
}
//htmlspecialchars格式化输出处理
echo htmlspecialchars(decodephp($encode));  
?>

2.3.2 PHP Eval变异

PHP Eval变异是在上面的基础之上进行ASCII偏移+Gzip压缩+Base64编码处理,其中关于偏移的位数可以自行定义,同时在我们构造的脚本中PHP程序源代码可以自行定义,下面是一个简单的实现示例演示过程:
✅ A、正向生成
在这里我们首先演示一下PHP Eval变异的编码处理:

<?php
// 逆向字符替换函数
function reverseCharReplace($string) {$result = '';for ($i = 0; $i < strlen($string); $i++) {$result .= chr(ord($string[$i]) + 1); // 将原来减 1 的操作反向为加 1}return $result;
}// 逆向 gzinflate 解压缩和 Base64 解码
function reverseGzinflateAndBase64($string) {$compressed = gzdeflate($string); // 先进行压缩$base64 = base64_encode($compressed); // 然后进行 Base64 编码return $base64;
}// 逆向生成代码
$encoded_string = "phpinfo();";   // 替换为需要生成的 PHP 代码字符串// 先进行字符替换逆向
$reversed_chars = reverseCharReplace($encoded_string);// 然后进行 gzinflate 解压缩和 Base64 编码逆向
$reversed_code = reverseGzinflateAndBase64($reversed_chars);$content="<?php
function sou(\$tmt) { 
\$tmt=gzinflate(base64_decode(\$tmt));
for(\$i=0;\$i<strlen(\$tmt);\$i++) {
\$tmt[\$i] = chr(ord(\$tmt[\$i])-1);
}
return \$tmt;
} eval(sou(".$reversed_code."));?>";file_put_contents("a.php",$content);?>

执行之后输出的处理后的源码文件内容如下所示:

<?php
function sou($tmt) { 
$tmt=gzinflate(base64_decode($tmt));
for($i=0;$i<strlen($tmt);$i++) {
$tmt[$i] = chr(ord($tmt[$i])-1);
}
return $tmt;
} eval(sou(K8wszMpPL9DUsgEA));?>

随后浏览器里面访问a.php可以看到正常解析

✅ B、反向解密
在这里我们可以直接将上面的eval更改未echo直接将处理的源代码打印输出即可:

<?php
function sou($tmt) { 
$tmt=gzinflate(base64_decode($tmt));
for($i=0;$i<strlen($tmt);$i++) {
$tmt[$i] = chr(ord($tmt[$i])-1);
}
return $tmt;
} echo(sou(K8wszMpPL9DUsgEA));
?>

从下面的执行效果我们可以看到源代码内容:

2.3.3 phpjiami处理

PHP加密(PhpJiaMi.Com)采用了强大的安全技术手段(外壳)对PHP源码进行混淆变异(源码),系统安全防修改、防劫持、防破解(扩展),三重保护,更加安全,下面我们通过也给简易的示例来进行简单的介绍说明:
✅ A、加密处理
初始源文件代码如下所示:

<?phpphpinfo();
?>

使用在线加密工具的推荐设置进行加密混淆处理:

加密后的代码文件如下所示:

执行效果如下所示:

✅ B、反向解密
关于PhpJiaMi的逆向分析由于分析篇幅会过程,所以等后面找时间用一个新的篇幅来进行详细介绍

2.4 源码扩展加密

PHP扩展机制允许开发者使用C语言编写PHP扩展,而且这些扩展可以直接与PHP的核心功能集成,PHP扩展加密正是通过使用第三方扩展组件来进行加密操作的,对于PHP环境来说需要安装第三方组件(DLL、SO)文件方可使用。

2.4.1 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开始加密项目:

处理之前的文件源码如下所示:

<?phpnamespace 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';}}

处理后的文件如下所示:

✅ B、反向解密

关于php-beate的解密从上面的配置可以很明显的看到,这里使用的加密方式有DES、AES、BASE64,其中DES、AES如果项目方使用项目中默认的Key那么将极为容易的被解密,其中AES模块具体的Key值可以在aes_algo_handler.c文件中查看

DES模块可以在des_algo_handler.c文件查看:

2.4.2 Zend Guard

Zend Guard是一个用于PHP的代码保护工具,它主要用于保护源代码、许可证管理以及加密和混淆PHP脚本。

以下是关于Zend Guard的一些主要特点和功能:

代码加密:Zend Guard可以将PHP源代码加密,使其在未经授权的情况下不可读,这有助于保护开发者的知识产权,它使用强大的加密算法对PHP代码进行转换以确保在运行时只能被授权用户解密和执行

代码混淆:通过混淆代码Zend Guard可以使源代码更加难以理解,增加逆向工程的难度,混淆技术包括重命名变量、函数和类名等,以降低代码的可读性

许可证管理:提供了许可证管理功能,允许开发者对软件的使用进行限制以防止非法复制和使用,这种功能包括限制并发用户数、过期时间、授权等

兼容性:Zend Guard支持多种PHP版本并且可以与各种Web服务器和操作系统一起使用,确保代码在不同环境中的可用性

反调试功能:Zend Guard包括防止调试和逆向工程的技术,增强代码的安全性,它可以检测调试器并采取相应措施来防止代码被分析和修改

下图时PHP Zend Guard扩展加密的大体流程示意图:

部署完环境后进行加密处理即可,处理前的源文件示例如下所示:

<?phpnamespace 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';}}

加密处理:

加密处理之后的文件如下所示:

✅ B、逆向解密
这里我们以通达OA为例进行简易演示,我们安装部署OA系统之后打开其webroot目录下的PHP文件时会看到一系列的加密内容,例如:

根据文件头可以知晓这里使用的是Zend Guard扩展加密:

Zend •2004072203

随后我们使用SeayDZend解密工具进行解码:

解密之后的源代码文件内容如下所示:

文末小结

本篇文章我们主要从PHP源代码保护需求出发对现有的几种较为典型的PHP源代码安全保护方式进行了介绍,同时对几种较为脆弱的源代码保护方式进行了逆向反解,其中源代码扩展加密方式安全性较高也较为推荐,同时这里也比较推荐PHP的opcode对源代码进行加密混淆处理,关于PHP源代码的混淆和加密其实再PHP木马免杀中也有极好的用途,尤其是针对PHP大马程序,关于部分PHP源代码保护的加密算法的逆向分析解码和PHP源代码保护在木马免杀中的使用在后续的文章中将进行分篇介绍

原创 七芒星实验室

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/856943.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[长期活动] 【4Z-API】每5楼抽取1位送10美金API额度,20%中奖机会!

​ 活动详情 活动时间: 长期有效 奖励内容: 每5楼抽取1位幸运用户,送价值10美金API额度 ** 参与方式** 登录 4Z API域名巧记:ZZZZAPI.com 4个Z然后API 简单好记:4Z= ZZZZAPI.com 每5个楼层将抽取1位幸运用户4Z-API优势稳定高速的API服务超值定价,性价比之选7x24小时技术支持…

CW信号的正交解调

1.CW信号CW可以叫做等幅电报,它通过电键控制发信机产生短信号"."(点)和长信号"--"(划),并利用其不同组合表示不同的字符,从而组成单词和句子。CW信号可以看作一种幅度调制信号,类似于幅移键控(2ASK信号)其携带的信息保存在其幅度中,通过改变载波…

团队作业3

团队作业3--需求改进&系统设计这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/CSGrade22-34这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/CSGrade22-34/homework/13233这个作业的目标 修改完善需求规格说明书、系统设计、Alpha任务分配计划、测试计…

Authz0:自动化授权测试工具

免责声明 本文提供的资源仅供学习,利⽤本文所提供的信息而造成的任何直接或者间接的后果及损失,均由使⽤者本⼈负责,本文及作者不为此承担任何责任,一旦造成后果请自行承担责任!简介 Authz0 是一款自动化授权测试工具。可以根据URL和角色与凭证识别未经授权的访问。URL和角…

戴尔T3680工作站 改造虚拟工作站,满足多人设计需求

在戴尔 T3680 工作站作为通过了 NVIDIA vWS兼容性认证的工作站,部署 Proxmox VE 和 DoraCloud,可以实现工作站虚拟化,满足多个用户设计需求。可以顺畅运行 SolidWorks、NX/UG 等大型CAD软件。满足企业 资源共享、信息安全、远程设计的业务需求。最近拿到一台 戴尔 T3680 工作…

HDU3746-Cyclic Nacklace

继续跟着邝斌飞刷KMP HDOJ3746 百度的时候发现题目英语弄错了,项链英文是Necklace,不是Nacklace读完之后我滴妈,上难度了呀 题意:就是给你个字符串a~z,,###:妈逼的不知道咋回事百度那个搜索不知道是不是总更新网页html一些东西,ADblock拦截又tm不好使了,还得重新拦截。…

天嵌通途xczu15eg学习笔记——基于iwip的TCP服务器性能测试(一)

学习记录——基于iwip的TCP服务器性能测试(一) 环境如下,Windows10,vivado2020.2 硬件部分设置如下:PS-PL之间的交互时钟,复位已关闭 Generate Output Products,Create HDL Wrapper,Export Hardware之后进入vitis开发环境 选择IwIP TCP Perf Server模版 打开Terminal中的…

PERIODNI

思路 哇, 看到这个就直接想到昨天学的经典应用 : 最大子矩形 好吧还是认真推一下 完蛋了是计数, 我们没救了 首先按照高度为优先级, 位置为键值建一颗小根笛卡尔树, 我们玩下样例找下性质 例如题目中给出的图片, 我们建成笛卡尔树就长这样其中每个点由 \(\{键值, 优先级\}\) 组…

2024-2025-1 20241421 《计算机基础与程序设计》第十三周学习总结

这个作业属于哪个课程 2024-2025-1-计算机基础与程序设计 这个作业要求在哪里 2024-2025-1计算机基础与程序设计第十三周作业 这个作业的目标 复习知识,巩固所学 作业正文 https://www.cnblogs.com/118qa/p/18622459 教材学习内容总结概念 结构体是一种用户自定义的数据类型,…

Shell脚本编程题(八道)

Linux操作系统期末编程题——Shell脚本编程题(八道) 第一题 1.编程实现从键盘获取一个整数,按下列情况输出对应结果: (1)当该数值为 6 或 7 时,输出“休息日(Rest Day)”。 (2)当该数值为 1 至 5 时,输出“工作日(Working Day)”。 (3)其他情况输出“输入错误(E…

构建全方位大健康零售帮助中心:提升服务与体验

在当今社会,随着人们健康意识的不断提升,大健康零售市场迎来了前所未有的发展机遇。然而,面对琳琅满目的健康产品、复杂的健康理念以及日益增长的消费者需求,如何提供一个高效、便捷、全面的帮助中心,成为了大健康零售企业亟待解决的问题。在此背景下,引入Helplook工具,…

高新技术企业知识管理新篇章:高效内部知识库建设

高新技术行业作为经济发展的重要引擎,其创新能力和发展速度直接关乎国家的整体竞争力。然而,在快速发展的背后,高新技术企业面临着知识管理不善、信息共享不畅等挑战。为了应对这些挑战,高效搭建内部知识库显得尤为重要。本文将以Helplook工具为例,探讨如何高效构建高新技…