这段代码是 PHP 混淆吗?

19 天前
 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";
2614 次点击
所在节点    PHP
33 条回复
Felldeadbird
19 天前
可以把代码丢给 AI 去还原处理。
Aura23022
19 天前
@Felldeadbird 试过了 他说它不能够帮我还原
cbasil
19 天前
这个 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
19 天前
han3sui
19 天前
mmr
19 天前
@Livid #3 疑似 AI
lilililili2020
19 天前
// 定义一个常量,如果尚未定义
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
19 天前
@mmr 这种问题估计也只有 AI 能回答了吧,感觉没必要举报
mmr
19 天前
@Ashore but 他的回答全是废话……但凡有点用……
hadesy
19 天前
最好给完整的代码
b821025551b
19 天前
哈哈哈哈,我用 google 在某破解论坛找到了思路和答案,但是在这里一发网址就被 ban ,你自己搜一下就有
php01
19 天前
来个大佬解答下
kk2syc
19 天前
可以还原,很老的一种混淆了
LLaMA2
19 天前
这种代码用 idea 一顿 debug,在 idea 中看堆栈,一会就好了
iminto
19 天前
@LLaMA2 debug 不了的。

因为 debug 都是针对行的,debug 对这种排版格式很无语。
但这种代码没法格式化,格式化后可能就崩了,其中某些代码强依赖__LINE__ 这个常量。
Aura23022
19 天前
@iminto 的确,没办法调试
Aura23022
19 天前
@kk2syc 可以给个关键词吗?
Aura23022
19 天前
@b821025551b 关键词或者作者
LLaMA2
19 天前
@Aura23022 代码发来,让我来!传个网盘,等下你删除了就是
Aura23022
19 天前
@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