Linux 解密混淆的perl脚本
我的服务器上出现了一些垃圾邮件问题,在发现并删除了一些Perl和PHP脚本后,我开始检查它们的真正功能,尽管我是一名高级PHP程序员,但我对Perl几乎没有经验,这里有谁能帮我处理一下脚本: (这是一行很长的代码,脚本名为list.pl)Linux 解密混淆的perl脚本,linux,perl,security,spam,Linux,Perl,Security,Spam,我的服务器上出现了一些垃圾邮件问题,在发现并删除了一些Perl和PHP脚本后,我开始检查它们的真正功能,尽管我是一名高级PHP程序员,但我对Perl几乎没有经验,这里有谁能帮我处理一下脚本: (这是一行很长的代码,脚本名为list.pl) 脚本的开头是: $??s:;s:s;;$?::s;(.*); ]="&\%[=.*.,-))'-,-#-*.).<.'.+-<-~-#,~-.-,.+,~-{-,.<'`.{'`'<-<--):)++,+#,-.{).
脚本的开头是:
$??s:;s:s;;$?::s;(.*); ]="&\%[=.*.,-))'-,-#-*.).<.'.+-<-~-#,~-.-,.+,~-{-,.<'`.{'`'<-<--):)++,+#,-.{).+,,~+{+,,<)..})<.{.)-,.+.,.)-#):)++,+#,-.{).+,,~+{+,,<)..})<*{.}'`'<-<--):)++,+#,-.{).+:,+,+,',~+*+~+~+{+<+,)..})<'`'<.{'`'<'<-}.<)'+'.:*}.*.'-|-<.+):)~*{)~)|)++,+#,-.{).+:,+,+,',~+*+~+~+{+<+,)..})
要求模块使其(稍微)可读。替换
s;(.*);$_;看使用print
获取代码。替换s;(.*);$_;看再次使用要获取的有效负载的前半部分中的打印,这是解密代码。有效负载的后半部分是要解密的代码,但我不能再进一步了,因为正如您所看到的,解密代码正在envvar或cookie中寻找密钥(因此,大概只有脚本的创建者可以控制或解码它),而我没有该密钥。这实际上是相当聪明的做法。对于那些对细节感兴趣的人来说。。。第一部分,当解缠结看起来像这样时:
$? ? s/;s/s;;$?/ :
s/(.*)/...lots of punctuation.../;
行开头的$?
是预定义的变量,它无疑只起到混淆作用。它将是未定义的,因为此时可能没有子错误
后面的问号是三元运算符的开始
CONDITION ? IF_TRUE : IF_FALSE
这也只是为了混淆。返回true的表达式是替换正则表达式,其中斜杠分隔符已替换为冒号s:pattern:replacement:
。上面,我放回了斜杠。另一个将要执行的表达式也是一个替换正则表达式,尽管它非常长。分隔符是分号
此替换使用相当多的标点符号替换*
中的*
(默认输入和模式搜索空间),标点符号代表大部分代码。由于*
匹配任何字符串,即使是空字符串,它将被简单地插入到$\u
中,并且无论出于何种目的,都与简单地将字符串分配给$\u
相同,这就是我所做的:
$_ = q;]="&\%[=.*.,-))'-,-# .......;;
以下行是一个和另一个替换。(我插入注释以指出分隔符)
下一个换人是魔术发生的地方。它也是一个带有模糊分隔符的替换,但有三个:请参见
s在这种情况下不起任何作用,因为它只允许通配符
匹配换行符<但是,code>ee
表示对表达式求值两次
为了看我在评估什么,我进行了音译并打印了结果。我怀疑我在这一行的某个地方有一些字符被破坏了,因为有一些细微的错误,但下面是简短的(清理过的)版本:
长正则表达式再次成为数据容器,并将数据插入要作为代码计算的$\uu
s/(..)/chr(hex($1))/eg代码>开始变得相当清晰。它基本上是一次从$\uu
读取两个字符,并将其从十六进制转换为相应的字符
最后一行的下一行&e\u echr(\$)代码>让我困惑了一段时间,但它是一个子程序,定义在这个经过评估的代码的某个地方,因为霍布斯能够很好地解码。美元符号的前缀是反斜杠,这意味着它是对$\uucode>的引用:即子程序可以更改全局变量
经过多次求值后,$\uu
将通过此子例程运行,然后最后一次求值$\u
中包含的任何内容。大概这次是在执行代码。正如霍布斯所说,需要一个密钥,它来自脚本运行所在机器的环境%ENV
。我们没有。在我看来像是普通的Perl。。。您确定此脚本不是经过商业许可的故意混淆的脚本吗?我们不是来帮助你违反许可协议的。我很想知道这是否有什么作用,但我真的不想在工作中运行它。这让我想起了一个即使是相当有经验的Perl程序员也会面对这样的垃圾而畏缩。它做什么并不重要;这是一个可怕的代码。@MarcB那真是鬼鬼祟祟的,不是吗?如果可以的话,请说清楚,如果它看起来是“商业的”@JonathanLeffler,用来从我的服务器发送垃圾邮件,请不要告诉我结果。我很想知道它是否与其他服务器连接,是的,这很可怕,就像我说的,我对PHP代码进行了模糊处理。我在代码中尝试了这一点(当我用Perl-c list.pl
检查时,Perl说这是可以的);DeParse不想和我有任何关系——或者可能是它抱怨的代码。(Perl-MO=DeParse list.pl
和一些小的变体。错误是在(eval 1)调用的未定义的子例程&B::DeParse::compile)第24行。检查失败--呼叫队列中止。
)@JonathanLeffler那是因为Deparse的拼写是Deparse,而不是Deparse。谢谢-我没有注意到这一点,真是个白痴。Deparse的输出并不容易理解,尽管有些正则表达式更为清晰。一位同事指出,如果代码仍在运行,人们可以执行cat/proc//env
,并可能发现什么加密密钥是(通过E_-key
或HTTP_-COOKIE
)。@编码者-这个脚本在你的服务器根目录下可见吗?如果你想进一步研究这个问题,也许你想放一个新脚本来捕获密钥。我会说它非常聪明,如果不是很有帮助的话。-)看起来很像Mirai,一个乌克兰perl特洛伊木马,在小型网络设备中漫游。非常感谢你花时间做这一切。
$_ = q;]="&\%[=.*.,-))'-,-# .......;;
y; -"[%-.:<-@]-`{-}#~\$\\;{\$()*.0-9\;\\_rs}&a-h;;
#^ ^ ^ ^
#1 2 3
s;(.*);$_;see;
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;