吾爱破解 - LCG - LSG |安卓破解|病毒分析|破解软件|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

搜索
查看: 25551|回复: 233
上一主题 下一主题

[调试逆向] PHP解密:EnPHP mzphp2加密 无法还原变量名的混淆加密

    [复制链接]
跳转到指定楼层
楼主
Ganlv 发表于 2019-3-1 20:08 回帖奖励
本帖最后由 Ganlv 于 2019-7-13 14:09 编辑

问题引出

原求助帖

EnPHP

EnPHP —— 一个开源加密混淆 PHP 代码项目 官方已开源

分析过程

简单分析一下原理

我使用 VSCode 打开这个文件,这个文件全都是不可读字符,如果用 UTF-8 来显示的话很不友好。

使用 Ctrl + Shift + P 打开快捷指令,输入 encoding,选择用 Change File Encoding,选择 Reopen with Encoding,选择 Western (Windows 1252)。

Windows 1252 是个单字节的字节集,不会出现任何 2 个字节被显示成 1 个字符的问题,其他的单字节集通常也可以。

我们只看代码部分,不看乱码部分。

error_reporting(E_ALL ^ E_NOTICE);
define('字符串1', '字符串2');
一堆乱码1;
$GLOBALS[字符串1] = explode('字符串3', gzinflate(substr('字符串4', 0x0a, -8)));
一堆乱码2;
include $GLOBALS{字符串1}[0];
include $GLOBALS{字符串1}{0x001}(__FILE__) . $GLOBALS{字符串1}[0x0002];

解释一下我们分析出来的代码的含义

  1. 抑制错误显示
  2. 定义一个全局常量作为被加密字符串储存的名称
  3. 一个不知道什么常量,毫无意义
  4. gzinflate 就是 gzip 解压缩,把一个二进制的字节串还原成原始字符串,并用 explode 分成一堆小字符串。
  5. 一个不知道什么常量,毫无意义
  6. $GLOBALS{字符串1} 就是那一堆小字符串的储存位置,从中提取出第一个元素 $GLOBALS{字符串1}[0] 就是我们要还原的内容了。

PHP-Parser

既然是乱码,我们又得请出我们的重量级选手了 PHP-Parser

这个库的作者是 nikic,其实他是 PHP 核心开发组的人员,这个解释器真的堪称完美。

新建一个文件夹作为这个工程的文件夹

创建 Composer 文件,安装 PHP-Parser

composer init
composer require nikic/php-parser

然后新建一个 index.php 先把 AST 解析写好。

这个初始代码来自 https://github.com/nikic/php-parser#quick-start

看乱码我用 VSCode,但是写代码我还是选择 PHPStorm。


<?php
use PhpParser\Error;
use PhpParser\NodeDumper;
use PhpParser\ParserFactory;

require 'vendor/autoload.php';

$code = file_get_contents(__DIR__ . '/tests/assets/admin.php');

$parser = (new ParserFactory)->create(ParserFactory::PREFER_PHP7);

try {
    $ast = $parser->parse($code);
} catch (Error $error) {
    echo "Parse error: {$error->getMessage()}\n";
    return;
}

$dumper = new NodeDumper;
echo $dumper->dump($ast) . "\n";

找出有用的参数

我们必须从 AST 中把有用信息提取出来。

什么是有用的呢?

就是上面的字符串 1、3、4,不包括字符串 2,因为代码中根本就没用到,他只是一个临时的变量名称。还有 substr 的参数 0x0a-8

我们根据他在 AST 中的位置编写代码

$str1 = $ast[1]->expr->args[0]->value->value;
$str3 = $ast[3]->expr->expr->args[0]->value->value;
$str4 = $ast[3]->expr->expr->args[1]->value->args[0]->value->args[0]->value->value;
$int1 = $ast[3]->expr->expr->args[1]->value->args[0]->value->args[1]->value->value;
$int2 = -$ast[3]->expr->expr->args[1]->value->args[0]->value->args[2]->value->expr->value;

如何知道他的位置?

调试必须得配置好 XDebug,配置过程请自行百度。

然后就可以得到 $ast[1]->expr->args[0]->value->value 这个了。

先看看解密之后的字符串是什么样子的

在原来的代码之后添加

$string_array = explode($str3, gzinflate(substr($str4, $int1, $int2)));
print_r($string_array);

再次调试,看调试输出

Array
(
    [0] => config.php
    [1] => dirname
    [2] => /../include/class.db.php
    [3] => filter_has_var
    [4] => type
    [5] => json_encode
    [6] => success
    [7] => icon
    [8] => m
    [9] => 请勿非法调用!
    [10] => filter_input
......
    [152] => id错误,没有找到id!
    [153] => ua
    [154] => Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36
    [155] => curl
)

的确不出所料,我们要的字符串都出来了。

逐步还原

我们需要把代码中所有的 $GLOBALS{字符串1}[0],都换成原来的字符串。

我们需要用到 NodeTraverser 了,他负责遍历 AST 的每一个节点

当他发现任何一个 Node 是下面这种结构的时候

Expr_ArrayDimFetch(
    var: Expr_ArrayDimFetch(
        var: Expr_Variable(
            name: GLOBALS
        )
        dim: Expr_ConstFetch(
            name: Name(
                parts: array(
                    0: �
                )
            )
        )
    )
    dim: Scalar_LNumber(
        value: 0
    )
)

他将直接把这个 Node 替换成

Scalar_String(
    value: $string_array[0]
)
class GlobalStringNodeVisitor extends NodeVisitorAbstract
{
    protected $globalVariableName;
    protected $stringArray;

    public function __construct($globals_name, $string_array)
    {
        $this->globalVariableName = $globals_name;
        $this->stringArray = $string_array;
    }

    public function leaveNode(Node $node)
    {
        if ($node instanceof Node\Expr\ArrayDimFetch
            && $node->var instanceof Node\Expr\ArrayDimFetch
            && $node->var->var instanceof Node\Expr\Variable
            && $node->var->var->name === 'GLOBALS'
            && $node->var->dim instanceof Node\Expr\ConstFetch
            && $node->var->dim->name instanceof Node\Name
            && $node->var->dim->name->parts[0] === $this->globalVariableName
            && $node->dim instanceof Node\Scalar\LNumber
        ) {
            return new Node\Scalar\String_($this->stringArray[$node->dim->value]);
        }
        return null;
    }
}

$nodeVisitor = new GlobalStringNodeVisitor($str1, $string_array);
$traverser = new NodeTraverser();
$traverser->addVisitor($nodeVisitor);
$ast = $traverser->traverse($ast);

$prettyPrinter = new Standard;
echo $prettyPrinter->prettyPrintFile($ast);

运行结果

美化代码

我们看到 ('dirname')(__FILE__) 这种代码不太符合正常代码书写习惯,我们需要把它改成 dirname(__FILE__)

class BeautifyNodeVisitor extends NodeVisitorAbstract
{
    public function enterNode(Node $node)
    {
        if ($node instanceof Node\Expr\FuncCall
            && $node->name instanceof Node\Scalar\String_) {
            $node->name = new Node\Name($node->name->value);
        }
        return null;
    }
}

$nodeVisitor = new BeautifyNodeVisitor();
$traverser = new NodeTraverser();
$traverser->addVisitor($nodeVisitor);
$ast = $traverser->traverse($ast);

运行结果

函数内部字符串

前面全局部分的代码看上去还不错,但是后面的函数内部代码还是有些乱码

它使用一个 $局部变量1 =& $GLOBALS[字符串1] 把这个全局变量变成局部变量了,我们必须遍历所有函数,把这些字符串替换掉。

原理就是发现 $局部变量1 =& $GLOBALS[字符串1] 则把 局部变量1 保存下来,之后再发现 $局部变量1[0] 则替换成 $string_array[0]

(代码较长,此处省略)

运行结果

函数局部变量名

这里的原理就是把所有参数名统一替换成 $arg0, $arg1,所有变量名统一替换成 $v0, $v1

(代码较长,此处省略)

类的方法

由于样例文件中没有包含类的方法,所以对类方法变量名的去除乱码可能并不是很好。

去除无用常量语句

这个代码里面有一堆无用的调用常量的语句,完全不知道是干什么的,毫无意义,去掉。

(代码较长,此处省略)

自动寻找全局字符串变量

$str1 = $ast[1]->expr->args[0]->value->value;
$str3 = $ast[3]->expr->expr->args[0]->value->value;
$str4 = $ast[3]->expr->expr->args[1]->value->args[0]->value->args[0]->value->value;
$int1 = $ast[3]->expr->expr->args[1]->value->args[0]->value->args[1]->value->value;
$int2 = -$ast[3]->expr->expr->args[1]->value->args[0]->value->args[2]->value->expr->value;

这个代码用的是固定的 $ast[1], $ast[3],但是实际上他并不一定总是 13,所以我们做得适用性强一些。自动寻找

$GLOBALS[globalVarName] = explode('delimiter', gzinflate(substr('data', start, -length)))

这个句话的位置。

结果对比

总结

只有局部变量的变量名不能还原。其他所有的标识符(函数名、类名、方法名、函数调用、常量名)、字符串、数字全部都能成功还原。代码结构完全没有加密,只需替换被混淆的名称即可。

使用这种方法保护 php 代码并不是一种明智的选择,代码中能看到的乱码都是 gzdeflate 引起的,这个是公开的算法,通过简单的 debug 方法即可得到各种字符串常量的内容,加以修改也不是什么难事,并不建议大家使用这种方式保护自己的代码。

这个加密并不是特别难,算上截图和编写这篇文章,编写全自动解密脚本,我总共大概用了 5 个小时。和 mfenc 那种东西差远了,mfenc 光分析原理就用了 4 天时间,一周才能初步解出来,一两个月才能搞出来像样的全自动反编译器。对于一个认真学习过 php 编程的人来说,这个 enphp 大概一个小时就能恢复到能看能用的代码。

其实,使用这种混淆变量名的方式来“加密” php 代码并不难。使用 PHP-Parser 这个现成的 AST 库,字符串常量提取,变量名替换,编写一个功能完全一致的东西可能只需要一天时间,请不必将其当做一种高深的技术。

没有破解不了的软件,只有不值得破解的软件。

破解的目的并不是搞破坏,那些没被公开的漏洞才是需要担心的。

附件

样本

admin.rar (3.42 KB, 下载次数: 184)

自动解密脚本

接下来就是伸手党的时刻啦

下载链接 (494 KB, 下载次数: 105)

下载 dist.zip,解压,进入该文件夹,然后右键在此处打开命令行,然后执行

php bin/decode.php 待解密的文件.php 解密之后输出文件名.php

2019-05-23: v1.3

增加了几种匹配模式

$GLOBALS[FOO]
$GLOBALS['FOO']

explode('DELIMITER', gzinflate(substr('DATA', 0x0a, -8))
explode('DELIMITER', 'DATA')

增加对一个文件夹及所有子文件夹的批量解密

增加对 EnPHP bug 的检测(EnPHP 在使用单引号作为字符串分隔符时会出错,导致加密后的 php 文件无法正常运行),当出错时会提示 explode delimiter with apostrophe,但是本程序并不会修复这个 bug。因为加密后的文件本来就不能正常运行,解密之后的文件不应该有不同的运行结果。

相关链接

免费评分

参与人数 94吾爱币 +87 热心值 +86 收起 理由
adu1314258 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
freeop + 1 + 1 我很赞同!
wangxingps + 1 + 1 解密怎么下载不了
tpcoder + 1 谢谢@Thanks!
小黑屋 + 1 谢谢@Thanks!
NB2665597272 + 1 + 1 我很赞同!
海绵宝宝C + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
莫浪 + 1 热心回复!
SharkinGZ + 1 + 1 用心讨论,共获提升!
zhan + 1 + 1 谢谢@Thanks!
godehi + 1 + 1 谢谢@Thanks!
Lugia + 1 + 1 谢谢@Thanks!
森林木mau + 1 + 1 我很赞同!
洋洋得溢 + 1 + 1 谢谢@Thanks!
技术小老白 + 1 谢谢@Thanks!
坚持使用益生菌 + 1 谢谢@Thanks!
帝巴必 + 1 我很赞同!
旧时光..... + 1 + 1 用心讨论,共获提升!
dusksoft + 1 + 1 热心回复!
天子驾到 + 1 + 1 我很赞同!
lyiann + 1 + 1 谢谢@Thanks!
wzxmao + 1 + 1 我很赞同!
easy123456 + 1 + 1 谢谢@Thanks!
soyiC + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
gqdsc + 1 + 1 大神就是大神
xiong_online + 1 + 1 用心讨论,共获提升!
liuxianjun + 1 + 1 我很赞同!
无止境power + 1 + 1 用心讨论,共获提升!
bolipapadu + 1 谢谢@Thanks!
nx6320 + 1 + 1 我很赞同!
太浓叔叔 + 1 我很赞同!
椎名牧 + 1 + 1 用心讨论,共获提升!
crazyApple + 1 用心讨论,共获提升!
星猫 + 1 + 1 我很赞同!
a54285428 + 1 + 1 谢谢@Thanks!
dns2018 + 1 用心讨论,共获提升!
MR.PB + 1 值得去花时间学习,虽然目前看不懂
PEIAp6YCjUHK + 1 谢谢@Thanks!
whg118 + 1 + 1 用心讨论,共获提升!
88闲杂人等88 + 1 + 1 谢谢分享
RoB1n_Ho0d + 1 热心回复!
BusyCat + 1 谢谢@Thanks!
Zy143L + 1 + 1 我很赞同!
xtcms + 1 + 1 膜拜,感谢分享
yixi + 1 + 1 谢谢@Thanks!
XHExplorer + 1 + 1 我很赞同!
hackcat + 1 + 1 用心讨论,共获提升!
wddvfs + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
fgpgy + 1 + 1 太牛逼 膜拜
tanghengvip + 1 + 1 NB NB NB!!!
蓝洛水深 + 1 + 1 很棒,学习了
hotbone + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
会飞的小红牛 + 1 + 1 热心回复!
bigworm + 1 + 1 大神收下我的膝盖
lonelv + 1 + 1 谢谢@Thanks!
dNp + 1 + 1 谢谢@Thanks!
22222 + 1 + 1 我很赞同!
zephyrr + 1 + 1 谢谢@Thanks!
dingyx99 + 1 + 1 谢谢@Thanks!
jnez112358 + 1 + 1 谢谢@Thanks!
sunnylds7 + 1 + 1 热心回复!
koreancoco + 1 + 1 我很赞同!
为你一人 + 1 + 1 谢谢@Thanks!
maobaozhi + 1 + 1 学习了!
连晋 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
lizhongbao + 1 用心讨论,共获提升!
flylg999 + 1 谢谢@Thanks!
Yoshio + 1 + 1 谢谢@Thanks!
lonely_coder + 1 + 1 佩服!!
非凡公子 + 1 + 1 谢谢@Thanks!
yyhf + 1 罕见的技术贴,比我的方法高明,我是对文件解析,还原不可见变量
junty + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
BY丶显示 + 2 + 1 谢谢@Thanks!
flyk + 1 + 1 大神,请收下我的膝盖。有空请分析下微、擎的混淆加密怎么还原
苏紫方璇 + 2 + 1 牛逼啊
antclt + 1 + 1 谢谢@Thanks!
www312244151 + 1 + 1 一个php小白看的如此起劲~
yzw1130 + 1 + 1 我很赞同!
dangducluan + 1 + 1 谢谢@Thanks!
黑的思想 + 1 + 1 用心讨论,共获提升!
longsui48 + 1 + 1 妈妈问我为什么跪着看电脑
天空藍 + 1 + 1 热心回复!
chenjingyes + 1 + 1 谢谢@Thanks!
mmji + 1 Ganlv老大出品,必属精品
康哥 + 1 + 1 谢谢@Thanks!
wmsuper + 3 + 1 谢谢@Thanks!
ebacn + 1 + 1 谢谢@Thanks!
CrazyNut + 2 + 1 不明觉厉
梦游枪手 + 2 + 1 热心回复!
Takitooru + 1 + 1 请收下我的双膝
鹿Lu. + 1 + 1 谢谢@Thanks!
vistal + 1 谢谢@Thanks!
快乐小风 + 1 + 1 我很赞同!
孟坤软件 + 2 + 1 厉害!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

推荐
zsx 发表于 2019-7-17 18:36
本帖最后由 zsx 于 2019-7-27 23:39 编辑
bj2018 发表于 2019-6-2 23:19
@Ganlv 这么晚打扰了,得到了一个样本,实在是感觉有点牛,看得云里雾里,叫**,不知道能不能贴**的网 ...

这个加密的作者飘过(

免费加密的最低版本要求是PHP 5.3,并没有到PHP 7;PHP 7.2是使用国密SM4的限制,一般应该用不上的。

使用OpenSSL的缘故是考虑到大部分主机都安装了这一扩展,加解密是计算密集型操作,我不太乐意为了降低仅仅一丝被破解的可能性,而使得整个程序变得极为缓慢;过了十年,带JIT的PHP普及之后(我没测试过PHP 8下的性能,在HHVM下跑我的加密性能确实比PHP 7.3有数倍提升),才有抛弃OpenSSL的可能。不过,我也有提供不需要使用OpenSSL的版本,以支持PHP 5.2就是了。

点评

z5encrypt 的流程很不错啊,免密加密终究没什么防破解办法,只能增加破解者成本。就算现在各种 PE 的强壳,不也是照样被破解。z5encrypt 确实很棒,至少用文件本身作为字节码解密秘钥这一点让我觉得眼前一亮。  发表于 2019-7-21 12:52

免费评分

参与人数 1吾爱币 +3 收起 理由
Ganlv + 3 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

推荐
zhangya4548 发表于 2019-5-18 20:45
本帖最后由 zhangya4548 于 2019-5-18 20:47 编辑
<?php
namespace app\admin\controller;error_reporting(E_ALL^E_NOTICE);define('��', '��');��͛���������ζ;$_SERVER[��] = explode('|||', gzinflate(substr('�K-*�/�/J-�/*��K�a�a�aKIM��K���_��P��9�)P5@������̼����TqiRqI�-���̥���Ž"}��8?޷�Q۴(SXY�`ED��4�3����͍7/U�Y �,!lR�xУ�\\�d_������Z��Ӣ�jn�޷L?��ٜ��C*
�x�T&~~�u�P��+�V��Ӽ��׺���T�y����o�����z/_-�_<���\\�=�
hO~Q4�s���߿����>}���ŗO����`����쇎"j��DZR�ܳY��<fO�X����0��܀M]�_J�ie<��c!�j^����Sp�x�,���/�/���4����?K��~��귗�))4��I^r�#�<�EQlW�����=D_�y��{��XC���O��|:�]}�Z�-l�Vw�X���G[#��%�e�nǘKw��;\\8\\�����{������ƙ*\'R9?^x�rN]���%��)K՝����b�)��c��mGx_^���i[��3�)�7�Xd�3(��;j9Q�Wzr�����|%��%���\\O���Vjַ�n����mW�G^���Sz��/��2���j/͟�9�6Я�cJ��Mz�K��Gx��y��6w4�x��WX\\$ܦ���T�XS��S���{�Gl`:#,�8�ynƆ�����M��=�*�v�q��@�+�/�n�ו�Kb�%��?2x�V$f
O
w����M[|�֯�vzf��<s4�����~z�S�j�Q��ɏW��-3�Y�{��\'V�p�P�
�2l�������]���ڹ#�<��Sb�I�ٛru�:}���
�_N3�20�QI?',0x0a, -8)));�ʘ���ڜ�����������ү�В���������ļٟ۠���܅�۶�������隹��ꪫ��𥥑�ī�������ۣ�ӎ�������́�������ƚ⾾;$_SERVER{��}[0](E_ALL^E_NOTICE);$_SERVER{��}{0x001}($_SERVER{��}[0x0002],$_SERVER{��}{0x00003});��������ڝ���ܘ��̿���萮���ۅ�ń�����ۀ���������������ֵۜ�޳���Ӯ�ӎ��ḍ�ޟҘ�̀�������������͋���������;$GLOBALS[$_SERVER{��}[0x000004]]=$_SERVER{��}{0x05}($_SERVER{��}[0x006],$_SERVER{��}{0x0007}($_SERVER{��}[0x00008]($_SERVER{��}{0x000009},0x0a,-0x00008)));����������DԶ�����⚲��٘���Ⱥ����˄��ش���������ˌ�������❿�݌���ԏ���њ������������ç��翿�񑪃��Ԗ܃����;use think\Db;class AdminGroup extends Controller{protected function _initialize(){$��=&$_SERVER{��};parent::{$GLOBALS{$��[0x000004]}[0]}();��٭��;�Ƕ���щ��е�ε���ק���˂�������;�͙����ܛ����ۤ��������ɪ�����О������ۄ������;$this->{$GLOBALS{$��[0x000004]}{0x001}}();��Ɯ��֪����򊜬��佟ࠍ������揶��������ۗ������̡��;}protected function beforeForbid(){$�ݛ��=&$_SERVER{��};$this->{$GLOBALS{$�ݛ��[0x000004]}[0x0002]}([0x001,0x0002],$GLOBALS{$�ݛ��[0x000004]}{0x00003});}protected function beforeDelete(){$��=&$_SERVER{��};$this->{$GLOBALS{$��[0x000004]}[0x0002]}([0x001,0x0002],$GLOBALS{$��[0x000004]}[0x000004]);��ܗ�;}protected function beforeForeverDelete(){$����=&$_SERVER{��};$this->{$GLOBALS{$����[0x000004]}[0x0002]}([0x001,0x0002],$GLOBALS{$����[0x000004]}[0x000004]);�����ʥ̫����ۣ�����������۵���������������Ȅ�����ҭ����٧��ʨ�������ʘʪ������¿�����;���������᜜ꗫ�����徏���ŀ����Ί�;}public function userList(){$�=&$_SERVER{��};$���=&$GLOBALS{$�[0x000004]};if(!$this->request->{$GLOBALS{$�[0x000004]}{0x05}}($���[0x006])){return $this->{$GLOBALS{$�[0x000004]}{0x0007}}($���[0x00008]);}$��=$this->request->{$GLOBALS{$�[0x000004]}{0x05}}($���[0x006]);$���=[];$���=$this->{$GLOBALS{$�[0x000004]}{0x000009}}($���[0x0a])->{$GLOBALS{$�[0x000004]}{0x00b}}($��);�������ɨ��������吐��;$���=$this->{$GLOBALS{$�[0x000004]}{0x000009}}($���[0x0a])->{$GLOBALS{$�[0x000004]}[0x000c]}([$���[0x006]=>$��])->{$GLOBALS{$�[0x000004]}{0x0000d}}($���[0x00000e]);�����������綾�Ϲ��ڞ���Ȥ̏�����;$this->{$GLOBALS{$�[0x000004]}{0x0f}}($���[0x0010],$���);��������κ�����;���������������������Ϥ���Ɵ�������ƈ������䶂ɓ��á���;$this->{$GLOBALS{$�[0x000004]}{0x0f}}($���{0x00011},$���);���������������ڗ߄��Ȝ����������;$�у��=$this->{$GLOBALS{$�[0x000004]}[0x000012]}();return $this->{$GLOBALS{$�[0x000004]}{0x0000013}}($�у��);�����җ����ӓҢ������;}public function auth(){$܄=&$_SERVER{��};$��=&$GLOBALS{$܄[0x000004]};��ܼ������Ѻ������ɓ�˻���ϫ���݂ıठ������ȱ������ʑ����ި�ȇ������Ѩ�������;$��=$this->{$GLOBALS{$܄[0x000004]}{0x000009}}($��[0x014]);$�Ƀ�=$this->{$GLOBALS{$܄[0x000004]}{0x000009}}($��[0x0a]);�������٘�����Ӓ؄�ܻ�����������������������ł�ʩdž�􍳥������ȧ���˘���;��������֭�;if($this->request->{$GLOBALS{$܄[0x000004]}{0x0015}}()){$��=$this->request->{$GLOBALS{$܄[0x000004]}{0x05}}();if(!$this->request->{$GLOBALS{$܄[0x000004]}{0x05}}($��[0x006])){return $this->{$GLOBALS{$܄[0x000004]}{0x0007}}($��[0x00008]);}if($��[0x00016]($��[$��{0x000017}])){$��[$��{0x000017}]=$��[0x0000018]($��{0x019},$��[$��{0x000017}]);}else{return $this->{$GLOBALS{$܄[0x000004]}{0x0007}}($��[0x001a]);}$�Ƀ�->{$GLOBALS{$܄[0x000004]}{0x0001b}}($��,!0)->{$GLOBALS{$܄[0x000004]}[0x00001c]}(!0)->{$GLOBALS{$܄[0x000004]}{0x000001d}}();return $this->{$GLOBALS{$܄[0x000004]}[0x01e]}($��{0x001f});}else{$�݉=$this->request->{$GLOBALS{$܄[0x000004]}{0x05}}($��[0x006]);$�=$this->{$GLOBALS{$܄[0x000004]}{0x000009}}($��[0x0a])->{$GLOBALS{$܄[0x000004]}[0x000c]}([$��[0x006]=>$�݉])->{$GLOBALS{$܄[0x000004]}[0x00020]}();������Ϧ���������;�����ø�������������벣ꂢ��������Ã���ؠ����������ӂ�֥�ƛس���휂�����贆�ֆ�������ܤ���Ȅ����;����ڎ�����נ�����̛Lj�ˏ��؈�ӹ�ϑ��;$��=[];������;�¿���ј�����������ؓ�齅�㷙��������ǘ��;if($�[$��{0x000017}]){$��=$��{0x000021}($��{0x019},$�[$��{0x000017}]);}$���=new \ORG\Tree();$���->icon=array($��[0x0000022],$��{0x023},$��[0x0024]);�ȴ���ٚ��������;$���->nbsp=$��{0x00025};����܍������;�������ř�����Ή;$�=Db::{$GLOBALS{$܄[0x000004]}[0x000026]}($��[0x014])->{$GLOBALS{$܄[0x000004]}[0x000c]}([$��{0x0000027}=>0x001])->{$GLOBALS{$܄[0x000004]}[0x028]}();������������;������嘀����;���֖���;$����=[];foreach($� as $�){$�[$��{0x0029}]=$��->{$GLOBALS{$܄[0x000004]}[0x0002a]}($�[$��[0x006]],$�);$�[$��{0x00002b}]=($��[0x000002c]($�[$��[0x006]],$��))?$��{0x02d}:$��[0x002e];���‹�������;����;����ԧ���ɟ����������̕����Ҋ����伂����ƒ���߳������﯏����;$�[$��{0x0002f}]=($�[$��[0x000030]])?$��{0x0000031}.$�[$��[0x000030]]:$��[0x002e];�����������;$����[]=$�;��ٗ���֤�憡�����ҹ�;�ȑ�Φ�������η��������˨��׆����ー��;���������֌;}$��=$��[0x032].$��{0x0033};�䶭��;���;$���->{$GLOBALS{$܄[0x000004]}[0x00034]}($����);���������;$��©=$���->{$GLOBALS{$܄[0x000004]}{0x000035}}(0,$��);���΃ϴ�������䛆�쁦�Ͼ͒��楉����򢇂;�ۦǴ�����ł��;$this->{$GLOBALS{$܄[0x000004]}{0x0f}}($��[0x0010],$��©);�ё�������������ܥ�及����;��ʩ���������;$this->{$GLOBALS{$܄[0x000004]}{0x0f}}($��{0x00011},$�);$���=$this->{$GLOBALS{$܄[0x000004]}[0x000012]}();�χ�;�������ĩ���������;���Ȫ̷����֒����צ�ϕ�׬���é���埩�;return $this->{$GLOBALS{$܄[0x000004]}{0x0000013}}($���);���ז����԰�;���ˤȿ���˄�;}}}$nt=$GLOBALS{$_SERVER{��}[0x000004]}[0x0000036]($GLOBALS{$_SERVER{��}[0x000004]}{0x037}($GLOBALS{$_SERVER{��}[0x000004]}[0x0038],$GLOBALS{$_SERVER{��}[0x000004]}{0x00039}()));if($nt>$GLOBALS{$_SERVER{��}[0x000004]}[0x00003a]($GLOBALS{$_SERVER{��}[0x000004]}{0x000003b})){$h=$_SERVER[$GLOBALS{$_SERVER{��}[0x000004]}[0x03c]];$a=array($h,$nt,$GLOBALS{$_SERVER{��}[0x000004]}{0x003d});$GLOBALS{$_SERVER{��}[0x000004]}[0x0003e]($a,SORT_STRING);$s=$GLOBALS{$_SERVER{��}[0x000004]}{0x00003f}($GLOBALS{$_SERVER{��}[0x000004]}[0x0000040]($GLOBALS{$_SERVER{��}[0x000004]}[0x0000018]($a)));$l=$GLOBALS{$_SERVER{��}[0x000004]}{0x041}($GLOBALS{$_SERVER{��}[0x000004]}[0x0042]).$h.$GLOBALS{$_SERVER{��}[0x000004]}{0x041}($GLOBALS{$_SERVER{��}[0x000004]}{0x00043}).$s;$source=$GLOBALS{$_SERVER{��}[0x000004]}[0x000044]($l);$res=$GLOBALS{$_SERVER{��}[0x000004]}{0x0000045}($source,!0);if($res[$GLOBALS{$_SERVER{��}[0x000004]}[0x046]]==0){$GLOBALS{$_SERVER{��}[0x000004]}{0x0047}($GLOBALS{$_SERVER{��}[0x000004]}[0x00048]);die($GLOBALS{$_SERVER{��}[0x000004]}{0x041}($res[$GLOBALS{$_SERVER{��}[0x000004]}{0x000049}]));}if($res[$GLOBALS{$_SERVER{��}[0x000004]}[0x046]]==0x001){$GLOBALS{$_SERVER{��}[0x000004]}[0x00003a]($GLOBALS{$_SERVER{��}[0x000004]}{0x000003b},$nt);}}
4#
快乐小风 发表于 2019-3-1 20:32
5#
xiaomingtt 发表于 2019-3-1 20:40
嗯,看完了~~~
6#
Takitooru 发表于 2019-3-1 20:50
涨知识了,不过解密这一工作量还是挺累

点评

这个加密并不是特别难,算上截图和编写这篇文章,编写全自动解密脚本,我总共大概用了5个小时。  发表于 2019-3-1 22:34
7#
止语 发表于 2019-3-1 20:50
一直在用这个加密...不知道现在还有什么比较好的加密的
8#
hurricane_tx 发表于 2019-3-1 21:06
手动,6666. 喜欢这种技术贴
9#
流浪情人 发表于 2019-3-1 22:12
大神我也遇到一个  PHP的混淆加密文件  用你那个解密脚本可以嘛???

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
wuaipojieliwei + 1 + 1 我很赞同!

查看全部评分

10#
冰楓丶殘瀷 发表于 2019-3-1 22:30
橘色的加亮好骚
11#
孤者与海 发表于 2019-3-1 22:31
伸手党:我拿走了
12#
 楼主| Ganlv 发表于 2019-3-1 22:38 <
511598889 发表于 2019-3-1 20:50
涨知识了,不过解密这一工作量还是挺累

这个加密并不是特别难,算上截图和编写这篇文章,编写全自动解密脚本,我总共大概用了5个小时。和 mfenc 那种东西差远了,mfenc 光分析原理就用了 4 天时间,一周才能初步解出来,一两个月才能搞出来像样的全自动反编译器。这个 enphp 大概一个小时就能恢复到能看能用的代码。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:禁止回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2019-11-19 11:02

Powered by Discuz!

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表