2012-03-06 109 views
14

我的服务器上有一些垃圾邮件问题,并找到并删除一些Perl和PHP脚本后,我下来检查他们真的做什么,虽然我是一个高级PHP程序员,我有一点经验Perl中,任何人都可以给我一个手的剧本在这里:解密混淆perl脚本

http://pastebin.com/MKiN8ifp

(这是一个代码长行,脚本被称为list.pl)


脚本的开始是:

$??s:;s:s;;$?::s;(.*); ]="&\%[=.*.,-))'-,-#-*.).<.'.+-<-~-#,~-.-,.+,~-{-,.<'`.{'`'<-<--):)++,+#,-.{).+,,~+{+,,<)..})<.{.)-,.+.,.)-#):)++,+#,-.{).+,,~+{+,,<)..})<*{.}'`'<-<--):)++,+#,-.{).+:,+,+,',~+*+~+~+{+<+,)..})<'`'<.{'`'<'<-}.<)'+'.:*}.*.'-|-<.+):)~*{)~)|)++,+#,-.{).+:,+,+,',~+*+~+~+{+<+,)..}) 

它仍然具有珍贵的一些非标点字符,直到最后一刻:

0-9\;\\_rs}&a-h;;s;(.*);$_;see; 
+2

看起来像普通的Perl对我来说......你确定这个脚本不是商业授权的故意模糊的脚本吗?我们不是为了帮助您违反许可协议。 – 2012-03-06 20:51:28

+0

我很想知道这是否有用,但我并不想在工作中运行它。它让我想起了[这些]其中一个(http://www.cpan.org/misc/japh) – MattLBeck 2012-03-06 20:53:08

+2

即使是一个经验丰富的Perl程序员也会面对这样的垃圾。它的作用并不重要;这是可怕的代码。 – 2012-03-06 20:55:59

回答

25

更换s;(.*);$_;see;print得到this。在有效载荷的前半部分再次替换s;(.*);$_;see;print以获得this,这是解密代码。有效载荷的后半部分是要解密的代码,但我无法继续深究,因为如您所见,解密代码正在寻找envvar或cookie中的密钥(以便只有脚本的创建者可以控制它或解码它,据推测),而我没有那个关键。这实际上巧妙地完成了。

+3

和'严格'符合! – mob 2012-03-06 21:40:20

+1

一位同事指出,如果代码仍在运行,可以执行'cat/proc//env'并可能找出加密密钥是什么(通过'E_KEY'或'HTTP_COOKIE')。 – CanSpice 2012-03-06 22:17:12

+1

@编码器 - 这个脚本在您的服务器根目录下可见吗?如果你想进一步追求这一点,也许你想在它的位置放置一个新的脚本来捕捉关键。 – mob 2012-03-06 22:19:34

6

B::Deparse模块,使之(多一点)可读。

+0

我试过在代码上(当我用'perl -c list.pl'查看时,Perl说没问题); DeParse不想和我有任何关系 - 或者它可能是它所抱怨的代码。 ('perl -MO = DeParse list.pl'和一些小的变体,错误是'未定义的子程序和B :: DeParse :: compile在(eval 1)行24调用。 CHECK失败 - 调用队列中止。 – 2012-03-06 21:19:37

+2

@JonathanLeffler这是因为Deparse拼写错误,而不是DeParse。 – hobbs 2012-03-06 21:23:51

+1

谢谢 - 我是一个白痴没有发现。尽管一些正则表达式更加清晰,但是已经被忽略的输出结果并不容易理解。 – 2012-03-06 21:50:34

17

对于那些有兴趣在细节问题......第一部分,当去纠结这个样子的:

$? ? s/;s/s;;$?/ : 
     s/(.*)/...lots of punctuation.../; 

$?在该行的开头是预先定义的变量containing the child error,这毫无疑问,它只是作为迷惑。这将是未定义的,因为此时可能没有孩子错误。

的问号下面是一个三元运算符

CONDITION ? IF_TRUE : IF_FALSE 

里面还添加只是混淆的开始。返回true的表达式是一个替换正则表达式,其中/斜杠分隔符已被替换为冒号s:pattern:replacement:。上面,我已经把斜杠。另一个表达式,即将执行的表达式也是一个替换正则表达式,尽管它是一个非常长的表达式。分隔符是分号。

此替换替换$_中的.* - 默认输入和模式搜索空间 - 具有相当大量的标点字符,代表大部分代码。由于.*任何字符串,甚至是空字符串相匹配,则只会插入到了$_,是所有意图和目的相同,只是字符串分配给$_,这是我做的:

$_ = q;]="&\%[=.*.,-))'-,-# .......;; 

以下行是transliteration和另一个替代。(I插入评论指出定界符)

y; -"[%-.:<[email protected]]-`{-}#~\$\\;{\$()*.0-9\;\\_rs}&a-h;; 
#^      ^  ^  ^
#1      2      3 

(1,2,3是分隔符,2和3之间的分号转义)

的它的基本要点是,各种字符和范围-"(空格到双引号),以及看起来像字符类别(范围)[%-.:<[email protected]],但不是,被音译成更清晰的字符,例如大括号,货币符号,括号,0-9

s;(.*);$_;see; 

下一个替代是神奇在哪里发生。它也是一个用混淆分隔符的替换,但有三个modiferssees在这种情况下不做任何事情,因为它只允许通配符.匹配换行符。然而,ee意味着评估表达两次。

为了看到我正在评估的内容,我进行了音译并打印了结果。我怀疑我某处沿线有一些字符损坏,因为有细微的错误,但这里的短(清理)版本:

s;(.*);73756220656e6372797074696f6e5f6 .....;; # very long line of alphanumerics 
s;(..);chr(hex($1));eg; 
s;(.*);$_;see; 
s;(.*);704b652318371910023c761a3618265 .....;; # another long line 
s;(..);chr(hex($1));eg; 
&e_echr(\$_); 
s;(.*);$_;see; 

长的正则表达式是再一次的数据容器,以及将数据插入$_被评估为代码。

s/(..)/chr(hex($1))/eg;开始看起来相当清晰。它基本上是从$_中读取两个字符并将其从十六进制转换为相应的字符。

倒数第二行&e_echr(\$_);难倒了我一段时间,但它是一个子程序,在这个评估代码的某处定义,因为hobbs如此恰当地能够解码。美元符号以反斜杠作为前缀,表示它是对$_的引用:即,该子程序可以改变全局变量。

相当多的评估后,$_通过这个子程序,之后无论是包含在$_评估最后一次运行。推测这次执行代码。正如hobbs所说,需要一个密钥,该密钥取自脚本运行机器的环境%ENV。我们没有。

+2

感谢您花时间做这一切。 – hobbs 2012-03-13 05:14:17

+1

不客气。这是一个有趣的项目。 – TLP 2012-03-13 06:40:58