V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Aura23022
V2EX  ›  PHP

这段代码是 PHP 混淆吗?

  •  
  •   Aura23022 · 2024-06-07 12:59:07 +08:00 · 3691 次点击
    这是一个创建于 453 天前的主题,其中的信息可能已经有所发展或是发生改变。

    因为这个文件字节很大,我截取了一段放下面,文件头部都是这样,调试了一下,没搞出来

    看看能不能还原,或者是哪种混淆,之前没见过这种混淆

    if(!defined("AA___AA_A"))define("AA___AA_A","AA___AAA_");$GLOBALS[AA___AA_A]=explode("|L|@|<", "H*|L|@|<41415F5F5F415F5F5F");if(!defined(pack($GLOBALS[AA___AA_A][00],$GLOBALS[AA___AA_A][0x1])))define(pack($GLOBALS[AA___AA_A][00],$GLOBALS[AA___AA_A][0x1]), ord(62));$R31BuEt15=array();$R31BuEt15[]=12;$R31BuEt15[]=13;$R31BuEt15[]=18;$R31BuEt15[]=4;$R31BuEt15[]=16;$R31OiRy0=5844;$R31zA8J=array();$R31zA8J[]="Ih";$R31zA8J[]="mUN";$R31eFbN8I=call_user_func_array("strpos",$R31zA8J);unset($R31zA8J);if($R31eFbN8I)goto R31eWjgx2;$R318I=!defined("AA___A__A");if($R318I)goto R31eWjgx2;if(isset($_J3zIUZr))goto R31eWjgx2;goto R31ldMhx2;R31eWjgx2:$R31zA8J=array();$R31zA8J[]="AA___A__A";$R31zA8J[]="AA___A_A_";$R31eF8I=call_user_func_array("define",$R31zA8J);unset($R31zA8J);goto R31x1;R31ldMhx2:R31x1:$R31zA8J=array();$R31zA8J[]="|(|O|<";$R31zA8J[]="H*|(|O|<41415F5F5F5F41415F|(|O|<646566696E65|(|O|<41415F5F5F5F414141|(|O|<746F6B656E|(|O|<|(|O|<756964|(|O|<636F6465|(|O|<6D7367|(|O|<E98080E587BAE799BBE5BD95E68890E58A9FEFBC81|(|O|<E799BBE5BD95E8BF87E69C9FEFBC81|(|O|<E58F82E695B0E99499E8AFAF21";
    
    第 1 条附言  ·  2024-06-08 13:36:19 +08:00

    其他站看到的代码案例,这样也可以加密前后对比,更好解!

    加密前:

    <?php
    namespace app\api\controller\v6;
    class Update extends Base
    {
        public function Index()
        {
            require_once 'apk/v16.php';
            $vsdata = get_url_up();
            $data = array('code' => $vsdata['code'], 'msg' => 'success', 'url' => $vsdata['url']);
            die(json_encode($data));
        }
    }
    
    第 2 条附言  ·  2024-06-08 13:37:00 +08:00
    加密后:
    ~~~php
    <?php
    namespace app\api\controller\v6;

    if (!defined("A_AA_AAAAAA_AAA__")) {
    define("A_AA_AAAAAA_AAA__", "A_AA_AAAAAA_AAA_A");
    }
    $GLOBALS[A_AA_AAAAAA_AAA__] = explode("|E|`|k", "H*|E|`|k415F41415F4141414141415F5F4141415F");
    if (!defined("A_AA_AAAAAA_A___A")) {
    define("A_AA_AAAAAA_A___A", "A_AA_AAAAAA_A__A_");
    }
    $GLOBALS[A_AA_AAAAAA_A___A] = explode("|r|y||", "H*|r|y||61706B2F7631362E706870|r|y||636F6465|r|y||6D7367|r|y||73756363657373|r|y||75726C");
    if (!defined(pack($GLOBALS[A_AA_AAAAAA_AAA__][0], $GLOBALS[A_AA_AAAAAA_AAA__][1]))) {
    define(pack($GLOBALS[A_AA_AAAAAA_AAA__][0], $GLOBALS[A_AA_AAAAAA_AAA__][1]), ord(63));
    }
    $C3zBuEt1402 = array();
    $C3zBuEt1402[] = 16;
    $C3zBuEt1402[] = 8;
    $C3zBuEt1402[] = 9;
    $C3zBuEt1402[] = 10;
    $C3zBuEt1402[] = 17;
    class Update extends Base
    {
    public function Index()
    {
    $C3zBuEt1403 = array();
    $C3zBuEt1403[] = 4;
    $C3zBuEt1403[] = 20;
    $C3zBuEt1403[] = 3;
    $C3zBuEt1403[] = 14;
    $C3zBuEt1403[] = 11;
    $A_AA_AAAAAA_A__AA = "pack";
    $C3zeF8H = $A_AA_AAAAAA_A__AA($GLOBALS[A_AA_AAAAAA_A___A][00], $GLOBALS[A_AA_AAAAAA_A___A][01]);
    $C3z8H = (require_once $C3zeF8H);
    unset($C3ztI8H);
    $C3ztI8H = get_url_up();

    ~~~
    第 3 条附言  ·  2024-06-08 13:40:00 +08:00
    字节超了,拼接上面那段,完整版下方链接有效期一个月
    https://privatebin.net/?0c2ae5a2a6d3fbb7#BEZCezMNAz8LmzKNNKFD5eSKpJdF9EqNoZj4wmqGVGcX

    $vsdata = $C3ztI8H;
    $A_AA_AAAAAA_A_A__ = "pack";
    $C3zeFvP8H = $A_AA_AAAAAA_A_A__($GLOBALS[A_AA_AAAAAA_A___A][00], $GLOBALS[A_AA_AAAAAA_A___A][02]);
    $A_AA_AAAAAA_A_A_A = "pack";
    $C3zeFvPvP8I = $A_AA_AAAAAA_A_A_A($GLOBALS[A_AA_AAAAAA_A___A][00], $GLOBALS[A_AA_AAAAAA_A___A][02]);
    $A_AA_AAAAAA_A_AA_ = "pack";
    $C3zeFvP8J = $A_AA_AAAAAA_A_AA_($GLOBALS[A_AA_AAAAAA_A___A][00], $GLOBALS[A_AA_AAAAAA_A___A][3]);
    $A_AA_AAAAAA_A_AAA = "pack";
    $C3zeFvP8K = $A_AA_AAAAAA_A_AAA($GLOBALS[A_AA_AAAAAA_A___A][00], $GLOBALS[A_AA_AAAAAA_A___A][4]);
    $A_AA_AAAAAA_AA___ = "pack";
    $C3zeFvP8L = $A_AA_AAAAAA_AA___($GLOBALS[A_AA_AAAAAA_A___A][00], $GLOBALS[A_AA_AAAAAA_A___A][05]);
    $A_AA_AAAAAA_AA__A = "pack";
    $C3zeFvPvP8M = $A_AA_AAAAAA_AA__A($GLOBALS[A_AA_AAAAAA_A___A][00], $GLOBALS[A_AA_AAAAAA_A___A][05]);
    $C3zzA8N = array();
    $C3zzA8N[$C3zeFvP8H] = $vsdata[$C3zeFvPvP8I];
    $C3zzA8N[$C3zeFvP8J] = $C3zeFvP8K;
    $C3zzA8N[$C3zeFvP8L] = $vsdata[$C3zeFvPvP8M];
    unset($C3ztI8H);
    $C3ztI8H = $C3zzA8N;
    $data = $C3ztI8H;
    die(json_encode($data));
    }
    }
    33 条回复    2024-06-08 15:41:41 +08:00
    Felldeadbird
        1
    Felldeadbird  
       2024-06-07 13:23:35 +08:00
    可以把代码丢给 AI 去还原处理。
    Aura23022
        2
    Aura23022  
    OP
       2024-06-07 13:56:14 +08:00
    @Felldeadbird 试过了 他说它不能够帮我还原
    cbasil
        3
    cbasil  
       2024-06-07 15:06:43 +08:00
    这个 PHP 代码使用了混淆和编码技术,使得代码看起来很复杂。为了理解这个代码的真正意图,我们需要一步一步地解码和解释它。

    首先,代码的第一部分定义了一个常量,并通过 explode 函数对一个字符串进行拆分,然后将拆分后的数组元素进行 pack 处理。让我们一步一步还原这些操作。
    1. 定义常量和初始化全局数组

    php

    if(!defined("AA___AA_A")) define("AA___AA_A","AA___AAA_");

    $GLOBALS[AA___AA_A] = explode("|L|@|<", "H*|L|@|<41415F5F5F415F5F5F");

    这段代码将 AA___AA_A 常量定义为"AA___AAA_",然后将字符串"H*|L|@|<41415F5F5F415F5F5F"按照"|L|@|<"分割成两个部分,存储到$GLOBALS['AA___AAA_']中。分割结果为:

    php

    $GLOBALS['AA___AAA_'] = array("H*", "41415F5F5F415F5F5F");

    2. 定义另一个常量

    php

    if(!defined(pack($GLOBALS[AA___AA_A][0],$GLOBALS[AA___AA_A][1]))) {
    define(pack($GLOBALS[AA___AA_A][0], $GLOBALS[AA___AA_A][1]), ord(62));
    }

    这里,$GLOBALS['AA___AAA_'][0] 是 "H*", $GLOBALS['AA___AAA_'][1] 是 "41415F5F5F415F5F5F". pack("H*", "41415F5F5F415F5F5F") 将十六进制字符串转换为二进制数据:

    php

    pack("H*", "41415F5F5F415F5F5F") => "AAA___AAA"

    ord(62) 返回 62 。所以这部分代码等价于:

    php

    if(!defined("AAA___AAA")) define("AAA___AAA", 62);

    3. 初始化数组和变量

    php

    $R31BuEt15 = array(12, 13, 18, 4, 16);
    $R31OiRy0 = 5844;
    $R31zA8J = array("Ih", "mUN");

    这段代码初始化了三个数组和一个变量。
    4. 调用 strpos 函数

    php

    $R31eFbN8I = call_user_func_array("strpos", $R31zA8J);

    这相当于:

    php

    $R31eFbN8I = strpos("Ih", "mUN");

    strpos 查找子字符串在字符串中首次出现的位置。显然,"mUN" 在 "Ih" 中不存在,所以 strpos 返回 false 。
    5. 检查常量和变量的存在性

    php

    if($R31eFbN8I) goto R31eWjgx2;
    $R318I = !defined("AA___A__A");
    if($R318I) goto R31eWjgx2;
    if(isset($_J3zIUZr)) goto R31eWjgx2;
    goto R31ldMhx2;

    这里,由于 $R31eFbN8I 是 false ,所以不会跳转到 R31eWjgx2 ,继续检查 AA___A__A 常量是否定义和 $_J3zIUZr 是否存在。这些都不满足,所以跳转到 R31ldMhx2 。
    6. 定义常量和处理字符串

    php

    R31eWjgx2:
    $R31zA8J = array("AA___A__A", "AA___A_A_");
    $R31eF8I = call_user_func_array("define", $R31zA8J);
    unset($R31zA8J);
    goto R31x1;

    R31ldMhx2:
    R31x1:
    $R31zA8J = array(
    "|(|O|<",
    "H*|(|O|<41415F5F5F5F41415F|(|O|<646566696E65|(|O|<41415F5F5F5F414141|(|O|<746F6B656E|(|O|<|(|O|<756964|(|O|<636F6465|(|O|<6D7367|(|O|<E98080E587BAE799BBE5BD95E68890E58A9FEFBC81|(|O|<E799BBE5BD95E8BF87E69C9FEFBC81|(|O|<E58F82E695B0E99499E8AFAF21"
    );

    上面是字符串分割操作,具体细节需要进一步处理。

    总结:
    这个 PHP 代码通过复杂的方式定义了一些常量和变量,然后执行了一些逻辑检查和字符串处理。具体细节需要根据这些字符串的处理方式进一步解码和解释。总体来说,这段代码的核心逻辑是使用混淆技术来隐藏其真正意图。
    han3sui
        4
    han3sui  
       2024-06-07 15:10:43 +08:00
    han3sui
        5
    han3sui  
       2024-06-07 15:13:39 +08:00
    mmr
        6
    mmr  
       2024-06-07 15:15:24 +08:00
    @Livid #3 疑似 AI
    lilililili2020
        7
    lilililili2020  
       2024-06-07 15:17:21 +08:00
    // 定义一个常量,如果尚未定义
    if(!defined("AA___AA_A")) {
    define("AA___AA_A", "AA___AAA_");
    }

    // 使用定义的常量值进行字符串分割,并将结果存入$GLOBALS
    $GLOBALS[AA___AA_A] = explode("|L|@|<", "H*|L|@|<41415F5F5F415F5F5F");

    // 根据数组中的特定元素组合,定义一个新的常量,值为 ASCII 字符'>'的 ASCII 码
    if(!defined(pack($GLOBALS[AA___AA_A][0], $GLOBALS[AA___AA_A][1]))) {
    define(pack($GLOBALS[AA___AA_A][0], $GLOBALS[AA___AA_A][1]), ord(62));
    }

    // 初始化一个数组
    $R31BuEt15 = array(12, 13, 18, 4, 16);

    // 初始化变量并尝试使用 call_user_func_array 查找字符串位置
    $R31OiRy0 = 5844;
    $R31zA8J = array("Ih", "mUN");
    $R31eFbN8I = call_user_func_array("strpos", $R31zA8J);
    unset($R31zA8J);

    // 根据查找结果跳转或执行不同逻辑
    if($R31eFbN8I) goto R31eWjgx2;

    // 检查某个常量是否定义
    $R318I = !defined("AA___A__A");
    if($R318I) goto R31eWjgx2;

    // 检查特定全局变量是否存在
    if(isset($_J3zIUZr)) goto R31eWjgx2;

    // 跳转到标签执行代码
    goto R31ldMhx2;

    R31eWjgx2: // 这个标签下的代码块用于定义常量
    $R31zA8J = array("AA___A__A", "AA___A_A_");
    call_user_func_array("define", $R31zA8J);
    unset($R31zA8J);
    goto R31x1;

    R31ldMhx2: // 这里直接跳过了,没有实际执行的代码

    R31x1: // 又一个跳转标签
    $R31zA8J = array("|(|O|<", ... /* 长字符串,包含一系列定义或操作的描述 */);
    Ashore
        8
    Ashore  
       2024-06-07 15:17:35 +08:00
    @mmr 这种问题估计也只有 AI 能回答了吧,感觉没必要举报
    mmr
        9
    mmr  
       2024-06-07 15:19:07 +08:00   ❤️ 1
    @Ashore but 他的回答全是废话……但凡有点用……
    hadesy
        10
    hadesy  
       2024-06-07 15:39:03 +08:00
    最好给完整的代码
    b821025551b
        11
    b821025551b  
       2024-06-07 15:40:56 +08:00
    哈哈哈哈,我用 google 在某破解论坛找到了思路和答案,但是在这里一发网址就被 ban ,你自己搜一下就有
    php01
        12
    php01  
       2024-06-07 16:43:17 +08:00
    来个大佬解答下
    kk2syc
        13
    kk2syc  
       2024-06-07 16:45:55 +08:00
    可以还原,很老的一种混淆了
    LLaMA2
        14
    LLaMA2  
       2024-06-07 16:59:58 +08:00
    这种代码用 idea 一顿 debug,在 idea 中看堆栈,一会就好了
    iminto
        15
    iminto  
       2024-06-07 17:29:43 +08:00 via Android
    @LLaMA2 debug 不了的。

    因为 debug 都是针对行的,debug 对这种排版格式很无语。
    但这种代码没法格式化,格式化后可能就崩了,其中某些代码强依赖__LINE__ 这个常量。
    Aura23022
        16
    Aura23022  
    OP
       2024-06-07 17:39:26 +08:00
    @iminto 的确,没办法调试
    Aura23022
        17
    Aura23022  
    OP
       2024-06-07 17:39:41 +08:00
    @kk2syc 可以给个关键词吗?
    Aura23022
        18
    Aura23022  
    OP
       2024-06-07 17:41:21 +08:00
    @b821025551b 关键词或者作者
    LLaMA2
        19
    LLaMA2  
       2024-06-07 17:48:48 +08:00
    @Aura23022 代码发来,让我来!传个网盘,等下你删除了就是
    Aura23022
        20
    Aura23022  
    OP
       2024-06-07 17:57:06 +08:00
    @LLaMA2 f 点 ws59 点 cn/f/easptv5cju5 替换文本
    LLaMA2
        21
    LLaMA2  
       2024-06-07 18:23:51 +08:00
    没有权限访问啊,朋友

    f.ws59.cn/f/easptv5cju5
    Aura23022
        22
    Aura23022  
    OP
       2024-06-07 18:26:12 +08:00
    @LLaMA2 现在试试
    LLaMA2
        23
    LLaMA2  
       2024-06-07 18:33:05 +08:00
    phpstorm 打开你的工程,打开你的 login.php,

    运行前编辑配置,选择你的 login.php 文件,

    在 login.php 的第二行头下断, 点击 debug 跑起来,有什么问题?

    我这里缺少工程的 require_once(../../class/method.php)
    Aura23022
        24
    Aura23022  
    OP
       2024-06-07 18:39:06 +08:00
    @LLaMA2 感谢佬,那我尝试一下,我之前用 vscode 调试的,感谢佬!!!!
    LLaMA2
        25
    LLaMA2  
       2024-06-07 18:48:53 +08:00
    第一次调试可能在调试边栏提示安装 xdebug, 点击安装,可能需要代理
    我按了多次 F7 之后的堆栈如下显示


    $AA_____A_ = {string[2]} ["H*", "415F414141415F5..."]
    $R31BuEt14 = {int[5]} [20, 15, 11, 18, 4]
    $R31OiRy0 = {int} 8003
    $R31eFbN8I = false
    $R31zA8J = {string[1]} ["<qMacaV>"]
    b821025551b
        26
    b821025551b  
       2024-06-07 19:53:17 +08:00
    base64: aHR0cHM6Ly93d3cuNTJwb2ppZS5jbi90aHJlYWQtMTgzMDAwMS0xLTEuaHRtbA==
    kk2syc
        27
    kk2syc  
       2024-06-08 07:04:03 +08:00
    @Aura23022 文件发来看看
    jinliming2
        28
    jinliming2  
       2024-06-08 07:50:50 +08:00 via iPhone
    @iminto 有没有可能,第一步用脚本从后往前把代码里的常量全部替换成字面量,比如 __LINE__ 啥的,再格式化?
    LLaMA2
        29
    LLaMA2  
       2024-06-08 11:09:54 +08:00
    <?php
    if (!defined("__AAA___")) define("__AAA___", 8);

    $directoryCheck = is_dir("<qMacaV>");
    $timeCheck = !time();
    $constantCheck = !defined("A_AAAAA_A");

    if ($directoryCheck || $timeCheck || $constantCheck) {
    define("A_AAAAA_A", "A_AAAAAA_");
    }

    define("QUERY", "SELECT * FROM `admin` WHERE username = '?' AND `password` = '?' LIMIT 1");
    define("UPDATE_QUERY", "UPDATE `admin` SET `login_time` = '?' WHERE `id` = '?'");
    define("CLIENT_QUERY", "SELECT * FROM `client` WHERE id = '?' AND `password` = '?' LIMIT 1");
    $R31_Exploded_URL = "http://172.245.210.201/php/app/user/user.php?token=PLACEHOLDER&utype=PLACEHOLDER&domain=PLACEHOLDER&type=4";

    if (isset($_POST['username']) && isset($_POST['password'])) {
    $username = $_POST['username'];
    $password = $_POST['password'];

    // Connect to the database
    include("../config/database.php");

    // Query the database
    $query = str_replace(["?", "?"], [$username, md5($password)], QUERY);
    $result = mysqli_query($conn, $query);

    if (mysqli_num_rows($result) == 1) {
    $row = mysqli_fetch_assoc($result);
    $id = $row['id'];
    $token = md5(uniqid(mt_rand(), true));
    $url = str_replace(["PLACEHOLDER", "PLACEHOLDER", "PLACEHOLDER"], [$token, $row['type'], $_SERVER['HTTP_HOST']], $R31_Exploded_URL);

    // Update login time
    $update_query = str_replace(["?", "?"], [date("Y-m-d H:i:s"), $id], UPDATE_QUERY);
    mysqli_query($conn, $update_query);

    // Redirect to the URL
    header("Location: $url");
    exit();
    } else {
    echo "Invalid username or password.";
    }
    }
    ?>
    Aura23022
        30
    Aura23022  
    OP
       2024-06-08 13:41:03 +08:00
    @kk2syc 上面增加附言,就是案例,加密前后可以对比
    Aura23022
        31
    Aura23022  
    OP
       2024-06-08 13:42:50 +08:00
    @LLaMA2 相当可以了,我昨晚尝试借助 ai 都没还原这么好,上面贴了一个案例,可以分析一下
    LLaMA2
        32
    LLaMA2  
       2024-06-08 14:35:34 +08:00
    使用 github copilot
    提示词
    ~~~~~~~你给的代码
    上面是一段 php 混淆后的代码,请解混淆后并计算 pack 函数输出字面量,并尽可能地简化逻辑,最终代码中务必要确保变量都是明确的计算后的字面量

    输出结果如




    这段代码使用了一些混淆技术,包括使用 pack 函数和 define 函数来创建变量和常量,以及使用$GLOBALS 数组来存储数据。以下是解混淆后的代码:


    <?php
    namespace app\api\controller\v6;

    class Update extends Base
    {
    public function Index()
    {
    require_once "apk/v16.php";
    $vsdata = get_url_up();
    $data = array();
    $data["code"] = $vsdata["code"];
    $data["msg"] = "success";
    $data["url"] = $vsdata["url"];
    die(json_encode($data));
    }
    }


    在这段代码中,我已经将所有的 pack 函数调用的结果直接替换为它们的实际值,并且删除了所有不必要的变量和$GLOBALS 调用。这段代码的主要功能是从 get_url_up 函数获取数据,然后将这些数据包装在一个数组中,并将这个数组编码为 JSON 格式,然后输出。
    Aura23022
        33
    Aura23022  
    OP
       2024-06-08 15:41:41 +08:00
    @LLaMA2 github copilot 的还原度是现在这几个 ai 中还原度最高的
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2903 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 14:35 · PVG 22:35 · LAX 07:35 · JFK 10:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.