如何解密出被混淆的PowerShell脚本?

栏目: 编程工具 · 发布时间: 7年前

内容简介:最近在分析样本时,遇到了不少使用PowerShell脚本的病毒程序,这些脚本基本都是经过混淆处理过的,给分析过程带来了一些麻烦。我们知道PowerShell是微软推出的一款强大的命令行脚本环境,连微(ju)软(ying)这样低调的公司都将其以“Power”冠名,足见其强大之处。但凡事都有两面性,PowerShell能够为用户管理Windows系统带来便捷,也同样可以为黑客大开方便之门,沦为黑客违法行为的工具。而PowerShell灵活的语言特性又使其能够轻易的被混淆处理,混淆过的PowerShell脚本不

*本文作者:aWe18s,本文属 FreeBuf 原创奖励计划,未经许可禁止转载。

前言

最近在分析样本时,遇到了不少使用PowerShell脚本的病毒程序,这些脚本基本都是经过混淆处理过的,给分析过程带来了一些麻烦。

我们知道PowerShell是微软推出的一款强大的命令行脚本环境,连微(ju)软(ying)这样低调的公司都将其以“Power”冠名,足见其强大之处。但凡事都有两面性,PowerShell能够为用户管理Windows系统带来便捷,也同样可以为黑客大开方便之门,沦为黑客违法行为的工具。而PowerShell灵活的语言特性又使其能够轻易的被混淆处理,混淆过的PowerShell脚本不仅使得基于特征码的杀软很难查杀,也给病毒分析工作增加了难度。

本文基于笔者在分析PowerShell病毒过程中的经验,总结了解密被混淆过的PowerShell脚本的一些方法。

0×01 PowerShell代码混淆方法

想要去混淆,首先要了解有哪些混淆的方法。在17年的黑帽大会上,有人专门对此做过 演讲

主要包括:转义符(反引号)、简写与通配符*、脚本块、字符串处理、编码、自构造关键字替换等,这里不做详细介绍。

0×02 如何实现去混淆?

先看一个被混淆过的PowerShell脚本:

如何解密出被混淆的PowerShell脚本?

如何解密出被混淆的PowerShell脚本?

中间都是被混淆的代码,已经面目全非,所以只看头尾。可以发现混淆后其实只有一行代码,是一条 IEX 命令。查看微软对 IEX 的解释:

如何解密出被混淆的PowerShell脚本?

IEX 用于将字符串作为命令执行,当去掉 IEX 后,执行后就会显示原本的字符串。

观察整段程序,其格式可以提取为: IEX( -jOiN(‘aaa’).SplIT( 'LzX>hGp!' ) |%{ ([chaR] ([CONVErT]::TOiNT16( ([StrIng]$_),16) ))} )) ,括号中的代码其实就是对字符串 ‘aaa’ 进行处理,将其还原成原本要执行的代码,处理完后调用 IEX 执行。

因此我们可以类比脱壳的思想,即 无论程序怎样加壳,最终执行后都会把原本的代码吐出来 ,PowerShell也是如此, 无论怎样混淆,最终都会执行它原本的代码

将脚本开头的 IEX 去掉,并将执行结果输出到文件1.ps1中:

如何解密出被混淆的PowerShell脚本?

打开1.ps1,可以看到去混淆后的PowerShell代码:

如何解密出被混淆的PowerShell脚本?

有时 IEX 不一定在开头,也可能在结尾,如下:

如何解密出被混淆的PowerShell脚本?

如何解密出被混淆的PowerShell脚本?

这其实也是一行代码,其格式可以提取为: “aaa” | Invoke-Expression 。也是将字符串当作命令执行,去混淆时只需删除结尾的 | Invoke-Expression 即可。

有时也会有找不到 IEX 的情况,如下:

如何解密出被混淆的PowerShell脚本?

如何解密出被混淆的PowerShell脚本?

可以看到这也是一行代码,但首尾都找不到 IEX ,这种情况如何处理呢?观察这行代码,可以将其提取为: &(“aaa”)(“bbb”)& 是PowerShell的操作符,调用 & 可以将字符串或变量当作命令执行。所以这里的 &( $psHOme[4]+$pshOme[34]+'x') 其实是一个命令。

这是什么命令呢?首先看下 $psHOme 表示什么:

如何解密出被混淆的PowerShell脚本?

可以看到它其实就是系统中PowerShell的路径。那么 $psHOme[4]$pshOme[34] 就应该分别是这个路径字符串中的一个字符:

如何解密出被混淆的PowerShell脚本?

连起来正好是 “iex”

如何解密出被混淆的PowerShell脚本?

所以 &( $psHOme[4]+$pshOme[34]+'x') 其实等同于 IEX 命令,我们把它从脚本前面去掉,然后执行,可以看到去混淆后的代码:

如何解密出被混淆的PowerShell脚本?

前面都能够通过去掉头尾的 IEX 实现去混淆,但有时去掉后不一定就是可读的代码,如下:

如何解密出被混淆的PowerShell脚本?

如何解密出被混淆的PowerShell脚本?

去掉末尾的 | Invoke-Expression 后,解密出的代码如下,并不可读:

如何解密出被混淆的PowerShell脚本?

如何解密出被混淆的PowerShell脚本?

观察这段代码,发现依然只有一行代码,且开头是一个 IEX 。我们继续前面的方法进行解密,经过6次解密后,在代码的头尾都找不到 IEX 了。

如何解密出被混淆的PowerShell脚本?

如何解密出被混淆的PowerShell脚本?

这时的脚本已经是可读的了。

0×03总结

PowerShell去混淆与程序脱壳其实是一个道理,即 无论怎样混淆,最终都会执行它原本的代码 ,遵循这个原则就一定能将被混淆的代码解密出来。

此外,PowerShell语法多样且非常灵活,本文也仅仅是基于笔者自身经验做了一些总结,难免有偏差遗漏之处,欢迎指正补充。

*本文作者:aWe18s,本文属 FreeBuf 原创奖励计划,未经许可禁止转载。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Eric Meyer on CSS

Eric Meyer on CSS

Eric Meyer / New Riders Press / 2002-7-8 / USD 55.00

There are several other books on the market that serve as in-depth technical guides or reference books for CSS. None, however, take a more hands-on approach and use practical examples to teach readers......一起来看看 《Eric Meyer on CSS》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具