一. 待解决问题
- 这个恶意代码执行了什么功能?
- 通过什么方式实现其功能?
- 如何实现长久驻留?
- 有什么关键特征,或者说这一类恶意代码有什么关键特征?
- 如何清除该恶意代码造成的影响?
二. 分析流程
这个恶意代码是通过调用组件模型实现其功能,但是在开始的时候走错了方向,花了一个下午的时间来动态调试,不停的在动态链接库里兜圈子,最后放弃了。查询了有关资料才知道,是通过组件调用模型实现其功能的。思路很简单,但是在一开始什么都不知道的情况下确实走了很多歪路。但这也再次体现了恶意代码需要很深的知识与经验储备,只有在见的多了,了解的多了后,才能在最短的时间内找到突破口。接下来先分析一下一开始的错误思路再介绍组件调用模型,最后介绍一下在本代码中未体现,但感觉值得学习的一种方式——COM组件劫持。
1.查看壳以及文件类型
无壳的32位程序,直接使用IDA静态调试。
2.查看字符串以及导入函数,寻找突破口
这里就出现了不寻常的地方,作为一个程序,载入的dll居然连Kernel32.dll等最基础的都没有,导入函数也都是一些与组件对象有关的函数,当时并没有往组件对象方向考虑,也没找到任何的突破口,暂时存疑,继续分析。
3.静态分析,梳理逻辑
整个程序的运行逻辑非常的简单,在分析完之后我还是云里雾里,不知道这个程序到底想做什么,唯一值得关注的就是这个网站,怀疑是不是想通过访问该网站然后下载后续恶意代码,通过行为检测和动态调试来验证。
4.行为检测
直接双击运行程序,发现打开了IE浏览器,并且访问了我们刚刚看到的那个网站,猜测正确,接下来通过Procommon来进一步分析程序行为。
但在这个时候发现,该程序进行了大量的注册表和文件有关操作。
再次陷入迷茫,这些注册表和文件都是怎么实现的,程序的功能就这么多,功能都是在哪里实现的。
最后进行动态调试分析,一直在动态链接库当中转圈,分析了很久还是一无所获,最后放弃该思路,开始在网上查找有关组件调用模型(COM)的有关知识,终于理清了思路找到突破口,接下来介绍正确的分析思路。
什么是组件调用模型
不同软件组件在不知道其他组件代码的接口规范时,相互之间可以相互调用,实现该功能的就是组件调用模型。类似我们所熟知的dll,其实就是一种面向对象的编程思路。
那么什么是软件组件?为自包含的、可编程的、可重用的、与语言无关的软件单元,软件组件可以很容易被用于组装应用程序中。
我的理解就是可以实现借用某个程序的组件实现特定功能。
组件调用模型分为两部分:
- 接口通过IID标识
- COM类通过CLSID标识
正确分析思路
通过IID和CLSID在注册表中找到了IE浏览器以及其对应接口,然后执行该模型对应代码,实现访问网站的功能。
在这里创建组件对象模型,传入参数就是IID和CLISD,继续跟进分析。