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