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类的函数表,直接替换指针即可。
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值