病毒分析师教你如何对JS样本进行分析并手动去除混淆

桂林seo半杯酒博客

伴随着软件安全技术的不断发展,PE类病毒的查杀-免杀对抗技术不断的升级,样本通过常规途径大规模传播的可能性越来越低,Wanncry的火爆得益于永恒之蓝远程执行漏洞的出现。而脚本类样本由于混淆手法多变,体积小(大部分脚本类样本为下载器,下载PE样本并执行)便于传播,呈现出占比上升的趋势。

分析

对之前捕获的一枚JS样本进行分析,因为是脚本类样本,用Notepad打开混淆过的原始代码。

P1-ObfuscateerCode

手动去除混淆

乍一看,没有什么思路,但有两条明显特征,一是大量随机长度的字符串作为变量名,二是函数主体部分存在大量数组和字符串拼接,且数组中最终项对应于之前的随机变量,推测其混淆方式是以字符串分割为基础,以数组选项为变形。要想明白这段代码的中心思想,只能迅速数组和变量替换,['e', ebylx, 'u', 'f'][1]查找ebylx = "va",即:['e', ebylx, 'u', 'f'][1]->"va"。

P2-ManuallyReplacementForTest

手动替换后能明显看到js的语句"var inkezs3 = new Enumerator(ybdetof5"

Py脚本辅助分析

如果是代码不是很短,手动替换效率会比较低下,对混淆代码仔细分析,字符串分割后数组变形的过程有一定的规律性,这里考虑编写一个py脚本去除混淆,程序主要使用正则表达式进行匹配和转换,程序主要分为以下几个部分:

0x2.2.1对随机变量和核心代码行进行区分存储

varLineDict = {}

CodeLineList = []

writeList = []

for line in myJslog:

if 'var' in line and '= "' inline: #var xnisd ="open";

key =re.match('[var]{3}s*([a-z0-9A-Z_]{1,})s*=s*(".{1,}"$)',line)

if(key != None):

varLineDict[key.group(1)]= key.group(2)

else:

CodeLineList.append(line)

0x2.2.2替换数组结构: ['e', ebylx, 'u', 'f'][1] --->ebylx

for Line12_split in re.findall('([[^[]]+][d])',line): index =int(re.match('[(.*)][(.*)]',Line12_split).group(2))

repstr =re.match('[(.*)][(.*)]',Line12_split).group(1).split(',')[index]

replaceTemp =re.compile('([[^[]]+][d])')

line =replaceTemp.sub(repstr,line,count=1)

0x2.2.3替换变量为对应的值: ebylx --->"va"

for varline in varLineDict:

if varline in line:

vartemp =re.compile(varline)

line =vartemp.sub(varLineDict[varline],line)

0x2.2.4替换" + "为空格

plus =re.compile(r'"[sS]{0,3}+[sS]{0,3}"')

line = plus.sub('',line)

0x2.3解析结果

P3-PyParse2Result

经过py脚本一系列的解密剩下的程序就很容易被识别了,当然也可以做进一步的优化,但对于简单样本分析已经足够了,从结果能清楚的看到此样本是一个Js下载者,从http://xxx.uio下载文件保存到临时目录,下载完成后通过cmd命令执行。

对解密后的样本分析,一般判断有"GET","http://xxx","runcmd.exe " 和"GetTempName"时可视为下载者。

vs调试

本以为静态分析基本可以满足要求,上次参加北京市某比赛时碰到一段求key的js解密代码,简单分析后认为p即需要的答案,奈何一时半会拿不到p的值,思虑良久,最后通过调试(不是是od附加w.exe,是vs直接调试js)获取了p的值。虽然主办方的wp是编写简单py脚本进行处理,但是调试依然提供了极大便利性。

P4-VSDebug

Virus-or-Tool ?

此样本的分析难点在于去除混淆,结合动静态分析,修改此样本为下载壁纸的小工具,增强对病毒的认知。

经过调试找到Get及http所处混淆代码行。

P4-Get_HttpLine

变量ovfowqi至kredak之间拼接为恶意样本地址,现修改此网址为壁纸地址,并修改保存地址为c:RandName.jpg,进行下载。

P5-DownWallpaper

P6-DownWallpaperDebug

P7-URLCheck

可见病毒并不是绝对的,只是连接的网址及下载文件不同,样本性质便已发生变化,促使我们分析样本时关注通用特征的基础上关注特例(此样本的网址及下载文件)及多手段联合(监控恶意连接,恶意流量等)分析。