Com逆向

HRESULT DispCallFunc(
   void       *pvInstance,
   ULONG_PTR  oVft,
   CALLCONV   cc,
   VARTYPE    vtReturn,
   UINT       cActuals,
   VARTYPE    *prgvt,
   VARIANTARG **prgpvarg,
   VARIANT    *pvargResult
);

pvInstance 指向对象的实例指针( 在C++中就是this指针了 )
oVft 是函数在对象实例虚表中的偏移
如果函数不是在一个对象的虚表中, 那么 pvInstance 是 NULL
oVft 则指向函数地址

cc 是函数的调用约定方式.
FASTCALL=0
  CDECL=1
  STDCALL=4
vtReturn 是函数返回值的类型.
cActuals 是函数参数的个数.
prgvt 指向一个数组, 每一个值是函数相应参数的类型.
prgpvarg 是一个指针,指向一个 VARIANTARG* 数组,包含了传递给函数的每个参数(类型是 … Read More

COM 知识点摘要

IUnknown接口是COM的核心,所有其他的COM接口都必须从IUnknown继承。
IUnknown实质上就是一个含有纯虚函数的抽象类。

class IUnknown{  
public:  
     virtual HRESULT __stdcall QueryInterface(const IID& iid, void** ppv) = 0;  
     virtual ULONG __stdcall AddRef() = 0;  
     virtual ULONG __stdcall Release() = 0;  
}; 

COM客户程序要使用COM对象是通过COM库创建而来的,而实际上COM库是调用COM对象的类厂来创建的。COM类厂对象也是一个COM对象,所以它也从IUnknow继承而来,而它又支持IClassFactory接口:

class IClassFactory:public IUnknow  
{  
    public:  
        virtual HRESULT CreateInstance(IUnkonwn* pUnkOuter, REFIID iid, void** ppObject)=0;  
        virtual HRESULT LockServer(BOOL fLock)=0;  
}; 

CreateInstance是构造COM对象的函数,通过传入接口的IID,从ppObject输出COM接口指针,而pUnkOuter一般设为NULL,该参数在聚合时起作用。
LockServer是用来控制COM类厂的生命周期的函数,将fLock设为TRUE后,即使组件程序中所有COM对象已释放了,该类厂指针也会一直保存并且有效,当不再需要的时候设为FALSE即可。

若要使用类厂对象去创建COM对象,首先得创建类厂对象,可以使用库函数CoGetClassObject来创建COM类的类厂,若找到的COM对象是进程内组件,则使用DLL导出函数DllGetClassObject函数创建类厂,然后将对象指针传出。… Read More