这段代码是 PHP 混淆吗?

2024-06-07 12:59:07 +08:00
 Aura23022

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

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

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";
3698 次点击
所在节点    PHP
33 条回复
Felldeadbird
2024-06-07 13:23:35 +08:00
可以把代码丢给 AI 去还原处理。
Aura23022
2024-06-07 13:56:14 +08:00
@Felldeadbird 试过了 他说它不能够帮我还原
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
2024-06-07 15:10:43 +08:00
han3sui
2024-06-07 15:13:39 +08:00
mmr
2024-06-07 15:15:24 +08:00
@Livid #3 疑似 AI
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
2024-06-07 15:17:35 +08:00
@mmr 这种问题估计也只有 AI 能回答了吧,感觉没必要举报
mmr
2024-06-07 15:19:07 +08:00
@Ashore but 他的回答全是废话……但凡有点用……
hadesy
2024-06-07 15:39:03 +08:00
最好给完整的代码
b821025551b
2024-06-07 15:40:56 +08:00
哈哈哈哈,我用 google 在某破解论坛找到了思路和答案,但是在这里一发网址就被 ban ,你自己搜一下就有
php01
2024-06-07 16:43:17 +08:00
来个大佬解答下
kk2syc
2024-06-07 16:45:55 +08:00
可以还原,很老的一种混淆了
LLaMA2
2024-06-07 16:59:58 +08:00
这种代码用 idea 一顿 debug,在 idea 中看堆栈,一会就好了
iminto
2024-06-07 17:29:43 +08:00
@LLaMA2 debug 不了的。

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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1047659

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX