CoCreateInstance 跟踪笔记

CoCreateInstance用于创建一个COM Class Object,我从0开始分析这个函数并且解释一个个参数,让你对COM对象的创建有一个根本性的全面认识。

程序传入OBJECT的CLSID和IID再call CoCreateInstance后(为什么需要CLSID和IID,等下再说),CoCreateInstance从注册表里面根据CLSID找到对应的dll文件,并使用LoadLibraryExW将这个文件载入到进程内部,然后调用GetProcAddress取得此文件的DllGetClassObject导出函数地址,并且call这个函数,call时是这样的:

DllGetClassObject(CLSID,{000214E4-0000-0000-C000-000000000046},ppv)

CLSID还是call CoCreateInstance传进来的CLSID,可为什么IID不同?此时这个IID指向的对象是一个Global对象:IClassFactory。
其实一个dll内可以有多个class,一个class内又可以有多个接口,这就出现了CLSID(类ID)和IID(接口ID)的概念,所以CoCreateInstance先创建一个基于这个class的类工厂(IClassFactory)对象,然后通过IClassFactory的CreateInstance成员传入IID,CreateInstance此时再根据这个IID创建真正的一个COM对象,然后CoCreateInstance带着这个对象返回。

每个class都有类工厂对象,class内的一切接口都根据IID从类工厂对象创建,这就是为什么需要CLSID和IID的原因。

如此一来针对组件的COM Hook就很简单了,狠的可以在LdrLoadDll这个dll组件完成后直接inline DllGetClassObject,直接把整个类工厂替换了,然后Hook类函数做完事情了再call到真正的COM函数。
简单的也可以直接替换掉CreateInstance,把返回的接口指针中的某个函数替换了(COM类的内存结构,我blog下面也有),这样也稳定点,只是注意下COM函数第一个参数是this指针就行了。

而对于那些用CoCreateInstance来创建的,直接inline CoCreateInstance,ppv返回后,指向COM类的函数表,直接替换指针即可。
参与评论 您还未登录,请先 登录 后发表或查看评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

a1875566250

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值