专业IT网络知识平台,分享IT百科知识、生活百科知识解答!

易企推科技
易企推科技

如何解密php代码,php解密教程

来源:小易整编  作者:小易  发布时间:2023-03-02 11:10
摘要:如何解密php代码,php解密教程 0x01环境准备在之前的尝试中,我们发现,SourceGuardian对加解密环境要求十分严格,加解密环境必须一致。并且,ubuntu18的LIBC版本不适配SourceGuardian加密程序,会导致报...

php.ini路径为:

/etc/php/7.4/apache2/php.ini /etc/php/7.4/cli/php.ini

接下来需要安装解密和调试PHP文件所需的扩展vld。

vld是PECL(PHP 扩展和应用仓库)的一个PHP扩展,现在最新版本是 0.17.2 (2021-11-30),它的作用是:显示转储PHP脚本(opcode)的内部表示。

简单来说就是,可以查看PHP程序的opcode。

访问网站http://pecl.php.net/get/vld-0.17.0.tgz进行下载,解压。

在之前的测试中发现,官方版本的vld扩展在对sg11加密文件进行调试时,并不会显示完整的opcode。

于是我们需要下载补丁,对vld进行魔改。

补丁地址:https://github.com/clouds-flight/php7-vld-sg11-patch

将vld_patch.c 和srm_oparray_patch.c拷贝到vld扩展源码目录下。

在命令行中执行:

patch -p0 < vld_patch.c patch -p0 < srm_oparray_patch.c phpize ./configure make && make install

安装完成后,会显示扩展安装后的路径,正常应该是PHP的扩展目录。

如何解密php代码,php解密教程

同样,需要在php.ini中,加入extension=vld.so。

以上,前期环境准备全部完成。

Ubuntu 20.04.1PHP    7.4.3 apt install libjpeg62-devapt install php7.4-dev SourceGuardian 13 Evaluation for Linux GUI ixed.7.4.lin vld    0.17.0

0x02 加密解密

2.1 加密

加密的流程还是比较简单的。

双击打开加密程序,输入注册时的账号密码进行授权。

点击 File -> New -> add,添加一个需要加密的PHP文件,之后选择一个加密后文件的保存目录即可。

加密后的文件有明显的特征,例如:sg_load。

并且,文件可以正常运行。

2.2 解密

之前说过,目前互联网上没有自动化的解密工具,大部分解密都是人工解密,导致价格很高。

并且也没有一篇完整的解密相关的文档,大部分都是引流。

具体原因,应该是解密流程过于复杂。

解密,就用到了上面提到的vld扩展,我们需要根据opcode,人工还原代码。

命令如下:

php -dvld.active=1 -dvld.execute=0 test.php

其中:

dvld.active=1表示启用vld扩展,dvld.execute=0表示不执行PHP文件。

这两个参数加在一起,就表示只显示opcode。

运行结果很长,我们把它分成三部分来看。

✍️首先是第一部分:

line     #* E I O op                           fetch          ext  return  operands -------------------------------------------------------------------------------------   2     0  E >   INIT_FCALL                                               'error_reporting'         1        SEND_VAL                                                 0         2        DO_FCALL                                                  28     3        INIT_FCALL                                               'unserialize'         4        FETCH_R                      global                ~1    '_POST'         5        FETCH_DIM_R                                        ~2     ~1,url         6        SEND_VAL                                                  ~2         7        DO_FCALL                                          31     8      > RETURN                                                    1

先看列名,我们主要关注的是line、op和operands。

line表示当前对应的是哪一行php语句。

op则是opcode。

而operands是具体描述。

举个栗子?,例如前三行。

INIT_FCALL 准备了执行函数时所需要的上下文数据。

DO_FCALL 负责执行函数。

SEND_VAL表示函数调用时传递值作为参数。

综合以上信息,可知:

error_reporting(0);

并且在文件的第二行。

而分析第一部分内容,不难得出以下代码?

<?phperror_reporting(0); class Welcome {    function gogogo() {}}...unserialize($_POST['url']); ?>

之后,继续分析下一部分内容:

这部分内容为gogogo函数。

具体opcode的功能解释,可参考OPCODE的功能列表http://dezend.qiling.org/985.html

文中不再赘述了哦~

需要注意的是compiled vars,里面表明了所用到的变量名。

标号0是函数传入的参数,$url。

而标号12的指令含义是条件跳转,也可以理解为if,而它一直持续到了最后。

也就是说明,这其中的代码都在if的花括号里面。

而1-11则是if的条件。

分析结果如下:

<?php error_reporting(0); class Welcome {    function gogogo($url) {        if(!pg_match("/file|ftp/i", $url) && pg_match("/^\w+:\/\/127\.0\.0\.1/i", $url)) {            $ch=curl_init($url);            curl_setopt($ch, CURLOPT_HEADER, 0);            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);            $result=curl_exec($ch);            curl_close($ch);            echo ($result);        }    }}unserialize($_POST['url']);?>

现在,继续分析最后一部分内容。

这一部分的主要内容是Class中的__wakeup和__destruct两个函数。

内容很少,其中__wakeup是直接进行了赋值操作。

__destruct则是进行了一个简单的判断,判断url是否存在。

至此,分析结束。

但是,一直到最后,我们并没有发现类中定义变量的操作。

所以,还需要以下操作:

<?php include('./test.php'); $a = new Welcome(); $arr = get_defined_vars();#$func=get_defined_functions(); var_dump($arr['a']);#var_dump($func); ?>

结果如下:

object(Welcome)#1 (1) {  ["url":protected]=>  NULL}

所以,class中定义了protected类型的url变量。

复原代码如下:

<?phperror_reporting(0); class Welcome {    protected $url;    function gogogo($url) {        if(!pg_match("/file|ftp/i", $url) && pg_match("/^\w+:\/\/127\.0\.0\.1/i", $url)) {            $ch=curl_init($url);            curl_setopt($ch, CURLOPT_HEADER, 0);            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);            $result=curl_exec($ch);            curl_close($ch);            echo ($result);        }    }    function __wakeup() {        $this->url='http://127.0.0.1/index.php';    }    function __destruct() {        if(!empty($this->url)) {            $this->gogogo($this->url);        }    } } unserialize($_POST['url']); ?>

0x03 写在最后

文章中提到的样例,是最理想的状态。

如果在opcode不能明显看出具体调用的话,则可能需要:

include('./test.php'); $func=get_defined_functions();$arr = get_defined_vars();

这就需要更加细心,也更耗费时间和精力。

总的来说,vld魔改之后,对于解密sg11的帮助是很大的。

只要稍微看懂一点opcode,就可以大概复原出代码逻辑。

本文只是起到一个入门级的指引作用,作者本身对于opcode和sg11的原理并不是很了解。

之所以写这篇文章,也只是记录一下自己的学习流程。

文章所述,仅供参考,如有错误,欢迎指正。


本文地址:IT百科频道 https://www.hkm168.com/tags/906551_2.html,易企推百科一个免费的知识分享平台,本站部分文章来网络分享,本着互联网分享的精神,如有涉及到您的权益,请联系我们删除,谢谢!

共2页 1 2 当前是最后一页

IT百科
小编:小易整编
相关文章相关阅读
  • win7升级错误代码80072efe该怎么办win7升级错误代码80072efe解决...

    win7升级错误代码80072efe该怎么办win7升级错误代码80072efe解决方案

    win7客户在系统更新的过程中遇到了80072efe的报错,像这种状况要怎么办呢?你先清查网络问题,然后去微软官网下载代理,假如你用的是32位计算机就免费下载32位代理,安装下载完成后马上重启。假如再次出现升级不正确得话,你也就再去官方网站...

  • 修复:在 Xbox 应用上的 Halo Infinite(Campaign)安装错误...

    修复:在 Xbox 应用上的 Halo Infinite(Campaign)安装错误代码 0X80070032、0X80070424 或 0X80070005

    haloinfinite(campaign)是一款第一人称射击视频游戏,于2021年11月推出,可供单人和多用户使用。该游戏是halo系列的延续,适用于windows、xboxone和xbox系列的用户x|s。最近...

  • git怎么合并分支代码

    git怎么合并分支代码

    git合并分支代码的方法:1、使用“gitmerge”命令,该命令用来做分支合并,可以将其他分支中的内容合并到当前分支中。2、使用“gitrebase”命令,该命令用于改变当前的分支的基点,进而实现分支合并。本教程操作环境:Window...

  • PHP调用美联软通短信接口实现短信发送

    PHP调用美联软通短信接口实现短信发送

    随着人们生活水平的提高和科技的发展,短信已成为人们交流的主要方式之一,越来越多的企业开始通过短信平台来实现营销、提醒等功能。在这个过程中,短信接口的选择显得尤为重要。本文将介绍如何通过php调用美联软通短信接口实现短信发送。一、美联软通短信...

  • php怎么实现对字符串的排序

    php怎么实现对字符串的排序

    实现步骤:1、利用str_split()函数将字符串转为字符数组,语法“str_split(字符串)”;2、使用asort()或arsort()函数来对字符数组进行升序排序或降序排序,语法“asort(字符数组)”或“arsort(字符数组...

  • php文件gbk怎么转utf8

    php文件gbk怎么转utf8

    php文件gbk转utf8的方法:首先建立存放转换后文件的目录;然后建立对应的文件夹;最后通过“-execiconv-fgbk-tutf-8{}-outf8/...”方法转换php文件即可。本文操作环境:windows7系统...

  • 如何使用PHP中的字符串变量

    如何使用PHP中的字符串变量

    如何使用PHP中的字符串变量在PHP中,字符串变量是一种非常常见的数据类型,用于存储和操作文本数据。在本文中,我们将介绍如何使用PHP中的字符串变量,并提供一些具体的代码示例。字符串变量的声明和赋值在PHP中,要声明一个字符串变量,只需要使...

  • HTML代码如何格式化

    HTML代码如何格式化

    HTML代码可以通过sublime中的内置命令Reindent对代码格式化,还可以安装HTML-CSS-JSPrettify插件对代码格式化有时候我们将别人的代码复制过来的时候发现代码排列的非常杂乱无章,无法去阅读代码,今天就将和大家介绍...

  • 周排行
  • 月排行
  • 年排行

精彩推荐