-
COM组件的逆向
一、前言
com组件可能属于相对冷门的东西,但是通过com却可以实现很多API可以实现的功能
。当病毒使用com来实现某些恶意功能时,由于com与平常API实现的方式不相同,可能会出现在沙箱中监控不到恶意行为的情况。而如果没有接触过com,在逆向分析时也会存在不少困惑。
二、正文
在使用com之前需要进行初始化工作。无论是正常com编程或是恶意软件中都需要调用CoInitializeEx进行初始化工作。
![](https://img2020.cnblogs.com/blog/1271576/202003/1271576-20200315182343320-1299800014.png)
初始化了com组件后,使用函数CoCreateInstance来调用对象和接口。这里有几个比较重要的参数,其中第一个参数使用CLSID指定了对象,第四个参数使用IID指定了接口,最后一个参数为获得的接口指针。CLSID和IID都是标识COM的GUID,所以通过查找对应的GUID就可以找到使用了什么对象和接口。
![](https://img2020.cnblogs.com/blog/1271576/202003/1271576-20200315182400071-1466198312.png)
GUID的结构体如图,格式为xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx。IDA识别出clsid则直接显示,如果没有识别则需要自己添加和关联结构体。
![](https://img2020.cnblogs.com/blog/1271576/202003/1271576-20200315182421022-924910289.png)
![](https://img2020.cnblogs.com/blog/1271576/202003/1271576-20200315182433997-85781481.png)
![](https://img2020.cnblogs.com/blog/1271576/202003/1271576-20200315182450049-658602618.png)
如果clsid是动态解密生成的,则需要自己在调试器的数据窗口中查看。如图下一个例子,数据窗口中为小端序,根据前面结构体可以得出下面的clsid为4590F811-1D3A-11D0-891F-00AA004B2E24
![](https://img2020.cnblogs.com/blog/1271576/202003/1271576-20200315182500962-1154062092.png)
获取到clsid或IID后,就要找到对应的对象和接口,这里有3种方法,在多数情况下,需要同时使用这几种方法才可以找到对应的对象和接口。
1、注册表项查找:其中clsid在注册表HKEY_CLASSES_ROOTCLSID下,IID在HKEY_CLASSES_ROOTInterface或HKLMSoftwareClassesInterface下。
![](https://img2020.cnblogs.com/blog/1271576/202003/1271576-20200315182509303-320875023.png)
2.OleView:OleView是读取注册表里的clsid和iid相关内容并显示出来,这里查找和查看相对方便一点,不过需要系统配有.net环境。下载地址:https://github.com/tyranid/oleviewdotnet。
![](https://img2020.cnblogs.com/blog/1271576/202003/1271576-20200315182524617-1833158888.png)
3.谷歌:如果前面都找不到就只能Google查找,直接输入GUID来查找对应的对象或接口
![](https://img2020.cnblogs.com/blog/1271576/202003/1271576-20200315182532921-891302070.png)
前面说了这么多,最主要的还是确定使用了那个接口,然后根据接口来确定调用的成员函数,找到成员函数后可以查找对应的文档来查看具体功能的实现。如果在用OD分析com组件时,会发现看不到调用了那个函数的情况,这是由于这里call的只是一个虚函数表的地址,所以在分析com组件时一般需要ida进行辅助分析。
![](https://img2020.cnblogs.com/blog/1271576/202003/1271576-20200315182541999-217538010.png)
由于我们前面确定了使用的接口,所以可以通过导入接口成员函数的结构体来识别出调用的函数,这里测试例子中的接口为IWbemLocator,所以首先在structure窗口中获取这个接口的结构体。其中Vtbl是虚函数表的意思,这个就是我们的要导入的结构体
![](https://img2020.cnblogs.com/blog/1271576/202003/1271576-20200315182549831-970851999.png)
导入结构体后就可以把接口指针和结构体关联起来,接口指针是CoCreateInstance的第五个参数,所以关联起来后就可以看到实际调用的函数。
![](https://img2020.cnblogs.com/blog/1271576/202003/1271576-20200315182603325-342531609.png)
![](https://img2020.cnblogs.com/blog/1271576/202003/1271576-20200315182611747-1535129431.png)
三、参考文章
https://www.4hou.com/reverse/15870.html
-
相关阅读:
Git学习笔记06-版本回退
python3+selenium入门07-元素等待
[cerc2017J]Justified Jungle
[codeforces126B]Password
计算几何基础模板
floyd路径记录
[数据结构复习]层序建立二叉树
[patl2-011]玩转二叉树
[poj3348]Cows
[poj3347]Kadj Squares
-
原文地址:https://www.cnblogs.com/QKSword/p/10927987.html
Copyright © 2020-2023
润新知