基于php-parser的php代码反混淆

前言

php-parser 是一个使用 PHP 编写的开源项目,它的作用是把 PHP 代码解析成 AST(抽象语法树)

可以基于 php-parser 做静态分析、代码转换、代码格式化、Linter、甚至写一个 PHP 解释器都行

这个库也是学习编译原理、分析 PHP 代码结构的神器,作者是 PHP 社区大佬 nikic,也是 PHP 编译器的核心开发者

PHP-Parser 项目的开源地址 github.com/nikic/PHP-P...

php-parser包安装

php-parser 是使用 composer 进行管理的,composer 是 PHP 的依赖管理工具

就像 Node.js 下的 npm,Python 下的 pip,composer的下载地址在这里

在 windows 下安装在 C:\Users\Administrator\AppData\Local\ComposerSetup目录, bin 目录文件列表如下

composer 安装后自动将 bin 目录配置到环境变量中,当在终端中输入 composer 运行的时候,就执行到这里的 composer.bat

composer.bat 文件内容如下,最终执行的就是 php composer.phar

composer.phar 文件比较复杂,可以不需要关注,php 包管理的逻辑就是在这里实现的

当引用其他 php 包的时候,在当前项目的目录下运行命令,如 composer require nikic/php-parser 将会自动下载包文件

vendor 目录以及 composer.json、composer.lock 文件,是 composer 管理的文件,开发过程中不要动这部分文件

php-parser使用

php-parser 的核心逻辑有三个步骤,解析、遍历/修改、还原

1、解析由 PhpParser\Parser 处理,实现把 php 代码转换为一棵 AST 树

2、遍历/修改由 PhpParser\NodeTraverser + NodeVisitor 处理,自定义的修改可以继承 NodeVisitor 实现

3、还原由 PhpParser\PrettyPrinter\Standard 处理,将修改后的 AST 树输出至新的源码

这里演示的是一种基础的使用,当前的一个 php 文件,文件是基于编码加密以及 goto 混扰,文件源码如下

编码解密

基于 php-parser 编写的解密代码如下,构造一个 parser,并生成一个 ast 树,最后将其 pretty 输出到文件

php 复制代码
<?php
require 'vendor/autoload.php';

use PhpParser\PrettyPrinter;
use PhpParser\ParserFactory;

$code = file_get_contents('backup/functions.php');

$parserFactory = new ParserFactory();
$parser = $parserFactory->createForHostVersion();
$ast = $parser->parse($code);

$prettyPrinter = new PrettyPrinter\Standard;
$restoredCode = $prettyPrinter->prettyPrintFile($ast);
file_put_contents('functions.php', $restoredCode);

使用 php index.php 运行脚本,生成解密文件内容如下,这一步实现了代码的全部可读

不过从代码看,还存在大量的 goto 跳转,这对理解代码流程还是很困难,需要进行反混淆处理

php反混淆

github 有开源的反混淆工具,这里使用这个仓库的 github.com/simon816/PH...

PHPDeobfuscator 是基于 php-parser 的基础上实现的,并且PHPDeobfuscator 是可以实现一步直接将原始文件进行反混淆复原的

下载 PHPDeobfuscator 仓库后,基于代码在 phpstudy 中增加一个 web 服务, 在代码目录下执行 composer install 安装依赖包

也可以通过命令行直接运行,命令为 php index.php [-f filename] [-t] [-o] ,但是 o 参数并不是指输出到文件

这里以 web 方式运行,浏览器中打开 web 页面后,在文本框内输入原始的 php 代码,点击 Deobfuscate 按钮生成

生成后的代码流程是正确的,大量的 goto 混淆已经复原

但是输出的代码中的中文是以 \xe4\xba\x8c\xe6\xac\xa1\xe5\xbc\x80\xe5\x8f\x91 这种十六进制显示的

使用前面 编码解密 中的代码再跑一遍,就可以恢复中文显示了

从生成的最终代码看,还有少量的 goto,但是这些是原始代码中正确的逻辑,不影响对代码逻辑的理解

相关推荐
zhangfeng11334 小时前
PHP 语法检查命令 php -l “$file“ > /dev/null 2>&1;
开发语言·php
kybs19914 小时前
springboot视频推荐系统--附源码72953
java·spring boot·python·eclipse·asp.net·php·idea
计算机安禾5 小时前
【计算机网络】第6篇:虚拟局域网——基于标签的广播域划分及其安全边界
计算机网络·安全·php
zhangfeng11337 小时前
适合 5人以内小团队的Git 工作流 + Code Review + 自动化部署方案 FastAdmin +linunx服务器宝塔系统 外包项目 —
服务器·git·自动化·php·代码复审
zx28596340010 小时前
Laravel 7.x新特性全解析
php·laravel
zx28596340011 小时前
Laravel 4.x:颠覆PHP框架的10大革新特性
开发语言·php·laravel
xxjj998a12 小时前
PHP vs C#:核心差异全解析
开发语言·c#·php
吉吉6112 小时前
php反序列化基础知识前奏
android·php·反序列化
星光开发者13 小时前
基于springboot电动汽车租赁管理系统-计算机毕设 附源码 11217
javascript·spring boot·mysql·django·php·html5·express
xxjj998a14 小时前
PHP vs C++:性能与用途全解析
php·laravel