序:
这篇分析文章最初是发在看雪论坛fickle帐号上的,几天后从看雪论坛复制到自己的来,又增加了一些自己的心得体会。因此截图上会有看雪论坛的水印。
这个样本分析起来难度适中,由于现在刚刚进入安全领域学习半年有余,所以感觉有些分析的地方还不够成熟。
摘要:
本文分析了一个使用了GINA拦截技术的恶意代码样本。
样本来源:《恶意代码分析实战》样本Lab11-01.exe
环境和工具:
- Windows XP系统
- Vmware虚拟机
- PEiD
- 火绒剑
- Regshot
- IDA Pro
一、静态分析
1、查壳:
可以看到这个样本没有壳,并且是一个控制台程序。
2、提取字符串:
这里出现了GinaDLL、msgina32.dll、开机自启动的注册表项。
初步判断GINA拦截恶意代码,并且很可能通过修改注册表项随着系统启动自启动。
此外,这里还有很多函数名,先记着,一会儿细说。
###3、导入导出函数表:
导入函数中有提取资源节和文件操作的相关函数,说明这个程序有PE文件操作,所以我们看一下这个程序的PE文件有什么问题。
4、PE view查看PE文件:
果然有问题,我们在这个PE文件中发现了一个TGAD的陌生资源节,进去一看是一个完整的PE文件格式,也就是说,这个恶意代码的PE文件里嵌套了一个PE文件。
二、动态分析
这里我用的工具是火绒剑和Regshot。
首先用Regshot拍摄注册表状态。
然后双击运行恶意代码。
发现火绒键查看进程并没有明显变化。运行时可以看到有一个窗口一闪而过。
恶意代码在自己的目录下创建了msgina32.dll文件,感觉和之前提到的提取资源节的操作有关,先留个疑点。
注册表拍摄第二次之后对比,修改了三个值,但是没什么帮助。
到这里我们可以看出exe文件只是一个安装器,运行之后就会安装msgina32.dll文件,所以后面的分析重点就在msgina32.dll上。
分析msgina32.dll:
1、先静态分析,提取字符串:
- 开机自启动(修改注册表Winlogon项)
- ”UN %s DM %s PW %s OLD %s”疑似记录什么信息和密码的字符串
- msutil32.sys不清楚是什么,留个疑点
- 一些函数名
2、之前留的疑点msgina32.dll是否和提取资源节操作有关,现在可以通过查看msgina32.dll的PE文件验证了
对比发现,PE文件和之前exe文件内嵌的不明PE文件完全相同,证明msgina32.dll是从Lab11-01.exe中提取出来的。
3、导入导出函数表:
导入表中貌似有字符串操作,没什么其他的了。
导出表中有大量Wlx开头的函数,这个是GINA拦截的特征,还有一些注册表操作。
这里基本可以确定恶意代码的主要行为就是实现GINA拦截,并且通过修改注册表实现系统开机的自启动。
三、反汇编分析:
这里我们主要是对msgina32.dll进行反汇编分析,使用的工具是IDA pro。
将msgina32.dll拖入IDA Pro。
首先从入口Dillmain分析。
先大致浏览一下,按下空格键,大体是个选择结构,结构还不复杂。
开始细致分析。
恶意代码先检查参数,检查通过后继续执行,不通过跳转到后面。
继续执行的代码调取系统目录,这里出现了一个字符串”\MSGina”,LoadLibraryW获取动态链接库句柄。
可以看出恶意代码想要获取Windows DLL msgina.dll的句柄来实现GINA拦截,这里也可以看出恶意dll的命名msgina32.dll与正规的Windows DLL命名很相近,显然是为了起到迷惑分析人员的作用。
之后恶意代码将获取的句柄保存在变量hLibModule中,以便使用msgina.dll中的函数,用FreeLibraryW释放动态链接库,至此dllmain函数执行完毕。
导出函数中有一系列与GINA拦截有关的函数,所以我们对其进行分析。
导出函数中与GINA拦截有关的一般只有Wlx开头的函数,所以我们只看这些函数。
浏览一遍后发现几乎所有的函数都结构相同且只有几行(如上图例子所示),其中都包括了调用sub_10001000位置的函数,猜测是都调用了Windows系统的msgina.dll中的函数,这样来增强隐秘性。
其中只有WlxLoggedOutSAS有很多代码,来分析一下这个函数。
分析WlxLoggedOutSAS:
第一遍浏览就注意到”UN %s DM %s PW %s OLD %s”字符串,之前分析过,猜测这个函数和窃取到的信息的存储有关。
没有例外的是这个函数也调用了sub_10001000位置的函数,说明也是使用了Windows系统的msgina.dll中的函数。这里不再赘述。
中间的部分是一些看起来没什么用的代码,不清楚具体的含义。
后面就到了那个字符串部分,仔细看会知道这个字符串被作为参数由sub_10001570位置的函数调用。
这个函数就到此为止了。
sub_10001570函数分析:
为了搞清那个神秘字符串的作用和去向,我们接着分析一下这个函数。
看到了之前不知道什么意思的文件名msutil32.sys。
分析发现这个文件被创建后进行了一系列文件操作,并且还有和之前作为参数的字符串差不多格式的字符串格式操作,说明窃取的信息按照这种格式被存入了msutil32.sys文件中保存。由于这个程序设置了自启动,并且注册表项Winlogon在C:\Windows\System32\目录中,所以推测msutil32.sys文件也被创建在此目录中。
为了验证猜想,我们重新运行Lab11-01.exe程序,并且重新启动系统。果然,在C:\Windows\System32\目录中的系统文件msutil32.sys。
检查msutil32.sys文件中的内容,如下图,分析结束。
四、总结:
这个恶意程序的运行方式是,当用户双击启动恶意程序时,程序自动提取自己的资源节到目录中,释放文件msgina32.dll,并且修改注册表项Software\Microsoft\Windows NT\CurrentVersion\Winlogon,使得重启系统时程序自启动。之后msgina32.dll在系统启动时完成GINA拦截,获取用户信息和密码,存储在C:\Windows\System32\msutil32.sys系统文件中。
补充心得:
这个恶意程序虽然难度适中,却又很多值得思考的地方。
- 这个样本的运行方式是自己提取自己。这种方式就好像给真正做坏事的凶手穿上了一层伪装。但是这个样本不得不说不是很高明,因为分析时看到了,当分析外层的exe程序时,无论提串还是导入(出)表,都能看出这是个GINA拦截,真正隐藏的dll文件的意图暴露无疑。所以个人观点,更高明的恶意程序可以把外层的exe程序设计成一个至少外观看起来人畜无害的程序,刚有利于隐藏意图。
- 这个恶意程序并不能称之为一个完整的恶意程序,因为一个恶意程序的目的首先是恶意的,而这个程序明显没有达到这个基本要求。因此,个人猜想,这个恶意程序可以作为一个做其他坏事的开头。举个例子,这个代码后面完全可以紧跟着远程操控、盗取用户计算机内各种隐私信息的代码,或者也可以通过后续的远程控制让用户的计算机成为僵尸机器。这样,这个程序才算是一个完整的恶意程序。当然,这里保存用户信息的日志也完全可以秘密传送到攻击者那里。
- 获取用户信息并不只有GINA拦截一项技术,也可以采用击键记录等其他技术,依实际情况而定。
- 这个样本分析时我使用的Windows xp系统,由于时间紧急,并没有用Windows10试试,所以不清楚其他版本的Windows是否能正常运行这个恶意程序。