问题引出
原求助帖

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];解释一下我们分析出来的代码的含义
- 抑制错误显示
- 定义一个全局常量作为被加密字符串储存的名称
- 一个不知道什么常量,毫无意义
- gzinflate 就是 gzip 解压缩,把一个二进制的字节串还原成原始字符串,并用 explode 分成一堆小字符串。
- 一个不知道什么常量,毫无意义
- $GLOBALS{字符串1} 就是那一堆小字符串的储存位置,从中提取出第一个元素 $GLOBALS{字符串1}[0] 就是我们要还原的内容了。
PHP-Parser
既然是乱码,我们又得请出我们的重量级选手了 PHP-Parser
这个库的作者是 nikic,其实他是 PHP 核心开发组的人员,这个解释器真的堪称完美。
新建一个文件夹作为这个工程的文件夹
创建 Composer 文件,安装 PHP-Parser
composer initcomposer require nikic/php-parser然后新建一个 index.php 先把 AST 解析写好。
这个初始代码来自 https://github.com/nikic/php-parser#quick-start
看乱码我用 VSCode,但是写代码我还是选择 PHPStorm。
|