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

这段代码是 PHP 混淆吗?

  •  
  •   Aura23022 · 161 天前 · 3199 次点击
    这是一个创建于 161 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    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 条附言  ·  160 天前

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

    加密前:

    <?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 条附言  ·  160 天前
    加密后:
    ~~~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 条附言  ·  160 天前
    字节超了,拼接上面那段,完整版下方链接有效期一个月
    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  
       161 天前
    可以把代码丢给 AI 去还原处理。
    Aura23022
        2
    Aura23022  
    OP
       161 天前
    @Felldeadbird 试过了 他说它不能够帮我还原
    cbasil
        3
    cbasil  
       161 天前
    这个 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
        5
    han3sui  
       161 天前
    mmr
        6
    mmr  
       161 天前
    @Livid #3 疑似 AI
    lilililili2020
        7
    lilililili2020  
       161 天前
    // 定义一个常量,如果尚未定义
    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  
       161 天前
    @mmr 这种问题估计也只有 AI 能回答了吧,感觉没必要举报
    mmr
        9
    mmr  
       161 天前   ❤️ 1
    @Ashore but 他的回答全是废话……但凡有点用……
    hadesy
        10
    hadesy  
       161 天前
    最好给完整的代码
    b821025551b
        11
    b821025551b  
       161 天前
    哈哈哈哈,我用 google 在某破解论坛找到了思路和答案,但是在这里一发网址就被 ban ,你自己搜一下就有
    php01
        12
    php01  
       160 天前
    来个大佬解答下
    kk2syc
        13
    kk2syc  
       160 天前
    可以还原,很老的一种混淆了
    LLaMA2
        14
    LLaMA2  
       160 天前
    这种代码用 idea 一顿 debug,在 idea 中看堆栈,一会就好了
    iminto
        15
    iminto  
       160 天前 via Android
    @LLaMA2 debug 不了的。

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

    f.ws59.cn/f/easptv5cju5
    Aura23022
        22
    Aura23022  
    OP
       160 天前
    @LLaMA2 现在试试
    LLaMA2
        23
    LLaMA2  
       160 天前
    phpstorm 打开你的工程,打开你的 login.php,

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

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

    我这里缺少工程的 require_once(../../class/method.php)
    Aura23022
        24
    Aura23022  
    OP
       160 天前
    @LLaMA2 感谢佬,那我尝试一下,我之前用 vscode 调试的,感谢佬!!!!
    LLaMA2
        25
    LLaMA2  
       160 天前
    第一次调试可能在调试边栏提示安装 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  
       160 天前
    base64: aHR0cHM6Ly93d3cuNTJwb2ppZS5jbi90aHJlYWQtMTgzMDAwMS0xLTEuaHRtbA==
    kk2syc
        27
    kk2syc  
       160 天前
    @Aura23022 文件发来看看
    jinliming2
        28
    jinliming2  
       160 天前 via iPhone
    @iminto 有没有可能,第一步用脚本从后往前把代码里的常量全部替换成字面量,比如 __LINE__ 啥的,再格式化?
    LLaMA2
        29
    LLaMA2  
       160 天前
    <?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
       160 天前
    @kk2syc 上面增加附言,就是案例,加密前后可以对比
    Aura23022
        31
    Aura23022  
    OP
       160 天前
    @LLaMA2 相当可以了,我昨晚尝试借助 ai 都没还原这么好,上面贴了一个案例,可以分析一下
    LLaMA2
        32
    LLaMA2  
       160 天前
    使用 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
       160 天前
    @LLaMA2 github copilot 的还原度是现在这几个 ai 中还原度最高的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5396 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 08:02 · PVG 16:02 · LAX 00:02 · JFK 03:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.