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类的函数表,直接替换指针即可。

你可能感兴趣的:(object,Blog,Class,dll,hook)