因为这个文件字节很大,我截取了一段放下面,文件头部都是这样,调试了一下,没搞出来
看看能不能还原,或者是哪种混淆,之前没见过这种混淆
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";
其他站看到的代码案例,这样也可以加密前后对比,更好解!
加密前:
<?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));
}
}
1
Felldeadbird 199 天前
可以把代码丢给 AI 去还原处理。
|
2
Aura23022 OP @Felldeadbird 试过了 他说它不能够帮我还原
|
3
cbasil 199 天前
这个 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 代码通过复杂的方式定义了一些常量和变量,然后执行了一些逻辑检查和字符串处理。具体细节需要根据这些字符串的处理方式进一步解码和解释。总体来说,这段代码的核心逻辑是使用混淆技术来隐藏其真正意图。 |
5
han3sui 199 天前
试试贴图能成功不
[![pktALan.png]( https://s21.ax1x.com/2024/06/07/pktALan.png)]( https://imgse.com/i/pktALan) |
7
lilililili2020 199 天前
// 定义一个常量,如果尚未定义
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|<", ... /* 长字符串,包含一系列定义或操作的描述 */); |
10
hadesy 199 天前
最好给完整的代码
|
11
b821025551b 199 天前
哈哈哈哈,我用 google 在某破解论坛找到了思路和答案,但是在这里一发网址就被 ban ,你自己搜一下就有
|
12
php01 199 天前
来个大佬解答下
|
13
kk2syc 199 天前
可以还原,很老的一种混淆了
|
14
LLaMA2 199 天前
这种代码用 idea 一顿 debug,在 idea 中看堆栈,一会就好了
|
15
iminto 199 天前 via Android
|
18
Aura23022 OP @b821025551b 关键词或者作者
|
21
LLaMA2 199 天前
|
23
LLaMA2 199 天前
phpstorm 打开你的工程,打开你的 login.php,
运行前编辑配置,选择你的 login.php 文件, 在 login.php 的第二行头下断, 点击 debug 跑起来,有什么问题? 我这里缺少工程的 require_once(../../class/method.php) |
25
LLaMA2 199 天前
第一次调试可能在调试边栏提示安装 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>"] |
26
b821025551b 199 天前
base64: aHR0cHM6Ly93d3cuNTJwb2ppZS5jbi90aHJlYWQtMTgzMDAwMS0xLTEuaHRtbA==
|
28
jinliming2 198 天前 via iPhone
@iminto 有没有可能,第一步用脚本从后往前把代码里的常量全部替换成字面量,比如 __LINE__ 啥的,再格式化?
|
29
LLaMA2 198 天前
<?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."; } } ?> |
32
LLaMA2 198 天前
使用 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 格式,然后输出。 |