首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >程序源码保护攻防对抗录

程序源码保护攻防对抗录

作者头像
Al1ex
发布于 2024-12-06 04:09:44
发布于 2024-12-06 04:09:44
11400
代码可运行
举报
文章被收录于专栏:网络安全攻防网络安全攻防
运行总次数:0
代码可运行

基本介绍

PHP语言作为脚本语言的一种,由于不需要进行编译所以通常PHP程序的分发都是直接发布源代码,这对于一些开源软件而言并没有什么问题,因为它本来就希望有更多的人阅读代码并希望有更多的人参与进来,但是对于商业代码来说这却是一个不太好的消息,不管是从商业秘密还是从对公司产权的保护来说却是一个问题,从而引出了对PHP代码的加密和解密的议题。Discuz论坛程序在开源之前要运行是必须安装Zend Optimizer, Zend官方的代码加密软件是Zend Guard,它可以用来加密和混淆PHP代码,这样分发出去的代码就可以避免直接分发源代码,但是加密后的代码在运行时还需要一个解密的模块来运行加密后的程序,这就需要运行Zend Guard加密后的代码时安装Zend Optimizer(PHP5.2之前的版本)或者安装Zend Guard Loader(PHP5.3版本)扩展才能运行

加密方式

PHP源代码的保护在原理可以分为以下几个大类:

源码混淆处理

PHP混淆处理主要通过修改源代码中的变量名、方法名、类名或者引入冗余代码(花指令、乱序指令等)的方式来增加代码的复杂性和阅读难度,同时通过修改和重组代码的结合和语法使其变得难以理解和分析,也有不少通过编码处理、进制转换来增加代码阅读的复杂性,从而达到保护源代码的目的,下面是几个简单的源码混淆测试示例:

PHP威盾混淆

这里我们给出一个PHP威盾混淆处理示例,网上给出的威盾的混淆特征如下所示,其实这里的特征是可以按需进行更改的,尤其是这里的urldecode的字符串里面只要有变量所需字符就行,例如:base64_decode

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$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如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php
phpinfo();
?>

威盾混淆的实现代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?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文件内容如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?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后门文件我们其实在应急响应中也偶尔会遇到,下面我们对上面处理过的文件进行逆向分析,首先我们对上面的代码进行一个格式化处理:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?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';
    }

}

混淆处理结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?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类似于基于时间戳的机制,只对自上次模糊处理以来发生变化的文件进行重新模糊处理 许多配置选项让您可以完全控制项目中的模糊内容 简易混淆示例如下所示:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?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';
    }

}

混淆操作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
php yakpro-po.php info.php -o info2.php

混淆结果如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php
    phpinfo();
?>

处理文件:encode.php

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?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文件内容如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php /*Protected by Al1ex*/
eval(gzinflate(base64_decode('4+UqyCjIzEvL19C0VrC3AwA='))); 
?>

B、逆向反解

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?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));  
?>
PHP Eval变异

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?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);

?>

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?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直接将处理的源代码打印输出即可:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?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));
?>

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

phpjiami处理

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php
    phpinfo();
?>

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

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

执行效果如下所示:

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文件,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
; 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

下面是一个配置示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
; 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开始加密项目:

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?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';
    }

}

处理后的文件如下所示:

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扩展加密的大体流程示意图:

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?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';
    }

}

加密处理:

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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Zend •2004072203

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

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

文末小结

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

推 荐 阅 读

横向移动之RDP&Desktop Session Hija

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-12-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 七芒星实验室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
PHP加密技术 附源码
PHP 加密后的代码能运行在 PHP 5+ 以上版本。 跨平台,Windows、CentOS、Ubuntu平台均能正常运行。 支持虚拟主机、VPS、独立服务器。 不需要安装任何额外扩展。 保持原有代码结构,不注入任何额外代码。 Web 服务器无需任何修改。 优秀、高效的不可逆加密混淆算法。 加密强度超高
码农编程进阶笔记
2021/07/20
1.8K0
PHP中给源代码加密的几种方法
虽说分享是一种美德,转发是一种境界,但我们有时候辛辛苦苦写一些程序代码只是为了卖点小钱,挣点辛苦费,也防止有些没有道德的人倒卖,所以我们不得不对我们的程序进行加密,以下我们来介绍一下如何通过 PHP
沈唁
2018/05/24
4.1K0
webshell 常见 Bypass waf 技巧总结
对于很多,和我一样刚刚入门,或者还在门边徘徊的小伙伴们,在渗透学习的过程中,总会遇到各种情况,例如 php 大马被 waf 拦截的时候,那么如何制作免杀 php webshell 呢,接下来就由我带各位小伙伴们一起踏上大马免杀之路,不喜勿喷。
信安之路
2018/08/08
2.5K0
webshell 常见 Bypass waf 技巧总结
#加密#如何利用PHP代码生成混淆加密PHP文件
虽说分享是传统的美德,但我们有时候辛辛苦苦写一些程序只是为了卖点小钱,挣点辛苦费,也防止有些没有道德的人倒卖,所以我们不得不对我们的程序进行加密 使用方法 首先,新建一个 index.php,然后把代
小俊是我
2018/06/26
4.2K0
一次freebuf溯源引发的木马后门分析
这篇文章是之前发在博客的, 我特么的=-=今天有事耽搁了,另外一篇文章的排版没出来,为了拿原创的邀请。再发一遍吧。。下面是正文... 最近Freebuf的某作者发布这篇文章真的是让人炸锅了,几
lonelyvaf
2018/06/07
1.1K0
PHP加密解密的解析
php做为一门当下非常流行的web语言,常常看到有人求解密php文件,想当年的asp也是一样。一些人不理解为什么要混淆(加密),甚至鄙视混淆(加密),在我看来混淆加密代码可以用来防一般的小人,会起到一定的保护作用。 加密的原因: 1. 保护代码,防止别人剽窃 2. 保护文件,防止别人发现/查杀(php木马 or 后门) 3. 剽窃了他人代码防止被发现 4. 其他商业或非商业目的 ---- 我一直都比较关注代码的加解密,从简单eval base64,gzcompress,gzinflate 到 威盾,Zend
神无月
2018/06/25
6.9K1
ctf近期总结
这几个月参加了几个ctf比赛,包括360杯,强网杯,cuit,这几次的比赛都给我很多帮助,现在做一点儿总结…
LoRexxar
2023/02/20
7570
ctf近期总结
hackme.inndy.tw的19道web题解(下)
目录 写在前面 ...... dafuq-manager 1 dafuq-manager 2. dafuq-manager 3. wordpress 1. webshell 写在前面 最近发现了一
安恒网络空间安全讲武堂
2018/02/23
3.4K0
hackme.inndy.tw的19道web题解(下)
【Re】JS 逆向实战:深入解析 JS 源码混淆案例
本博文所讨论的技术仅用于研究学习,旨在增强读者的信息安全意识,提高信息安全防护技能,严禁用于非法活动。任何个人、团体、组织不得用于非法目的,违法犯罪必将受到法律的严厉制裁。
sidiot
2024/08/11
4681
php代码混淆加密算法_java代码混淆加密
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/10
2.3K0
【愚公系列】2023年06月 攻防世界-Web(Web_php_wrong_nginx_config)
PHP代码混淆后门脚本是指在进行PHP代码混淆的过程中,植入恶意代码以实现后门的攻击手段。一旦植入成功,黑客可以通过特定的操作指令,绕过用户身份验证,进入系统内部,获取敏感信息,甚至控制整个系统。
愚公搬代码
2025/05/28
870
【愚公系列】2023年06月 攻防世界-Web(Web_php_wrong_nginx_config)
$O00OO0=urldecode微盾php解密
原文地址:https://www.uedbox.com/php-weidun-dec/
用户1088318
2025/05/21
920
PHP Web 木马扫描器
<?php /**************PHP Web木马扫描器************************/ /* [+] 版本: v1.0
用户1696846
2018/07/16
5.2K0
PHP加密解密的解析
php做为一门当下非常流行的web语言,常常看到有人求解密php文件,想当年的asp也是一样。一些人不理解为什么要混淆(加密),甚至鄙视混淆(加密),在我看来混淆加密代码可以用来防一般的小人,会起到一定的保护作用。
V站CEO-西顾
2018/06/09
8.4K1
PHP加密解密的解析
贵阳大数据及网络安全精英对抗赛-解题赛 WP
这网站打开一直重定向,使用request库指定allow_redirects=False或者使用httpx库都可以成功访问
yulate
2023/05/09
1.4K0
贵阳大数据及网络安全精英对抗赛-解题赛 WP
PHP常见过WAF webshell及最简单检测方法
在那篇文章中我突然想到一种检测webshell的方法,就是首先获取到当前文件中的所有变量(不明白的可以先去看下之前的文章),然后再根据正则库进行静态检测。
瓦都剋
2020/08/07
1.6K0
PHP常见过WAF webshell及最简单检测方法
【JS 逆向百例】反混淆入门,某鹏教育 JS 混淆还原
本文章中所有内容仅供学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除!
K哥爬虫
2021/11/30
7.8K0
【JS 逆向百例】反混淆入门,某鹏教育 JS 混淆还原
红蓝对抗——加密Webshell“冰蝎”攻防
演练中,第一代webshell管理工具“菜刀”的攻击流量特征明显,容易被安全设备检测到,攻击方越来越少使用,加密webshell正变得越来越流行,由于流量加密,传统的WAF、WebIDS设备难以检测,给威胁监控带来较大挑战。这其中最出名就是“冰蝎”,“冰蝎”是一款动态二进制加密网站管理客户端,演练中给防守方造成很大困扰,本文将对“冰蝎”的加密原理、流量特征、检测方案进行探讨。
tinyfisher
2019/11/20
3.8K0
红蓝对抗——加密Webshell“冰蝎”攻防
关于一次渗透引发的一个php木马的分析
说实话,回到家复习的效率真的很低很低,周末过了,差不多继续读书了。权当回家看看父母,不过也好,晚上完成了从小到大一直想做的一件事。以前看过一则帮妈妈洗脚的公益广告,也听说过有类似这样的家庭作业,不过乡镇的孩子估计没有这个家庭作业,我觉得现在也不会有。呵呵,育人和教书的概念差很多。言传身教,希望我的弟弟长大做的会比我好,,更希望影响的不止是我弟弟。 昨天在对一个网站进行渗透测试的时候,发现了一个大马,想对一个php大马进行改装收集回来用,发现了这个木马被加密。查看源代码是基于base64加gzinflate
lonelyvaf
2018/06/07
1.6K0
CTFshow元旦水友赛WP
用gmpy2.fib计算每一个值的斐波那契数,然后两组每个相同位置互相异或即可得到最终答案
故里[TRUE]
2024/01/20
1.4K0
CTFshow元旦水友赛WP
相关推荐
PHP加密技术 附源码
更多 >
交个朋友
加入HAI高性能应用服务器交流群
探索HAI应用新境界 共享实践心得
加入腾讯云技术交流站
洞悉AI新动向 Get大咖技术交流群
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验