超难的Hook以及COM问题,高手进
没有目标程序的代码,只是知道他会使用com的方式调用,所以我想使用我自己修改过的API HOOK 类(Hook了LoodLibraryEx...GetProcAddress等)想hook CoCreateInstace API,失败,发现没有进入的我的Hook_CoCreateInstaceEx...,自己写的测试代码ok,不知道为什么,
然后考虑到目标程序可能不是这样用的尝试hook msi.dll的DllGetClassObject ( REFCLSID rclsid, REFIID riid, void** factory)函数,使factory指向我自己写的工厂对象,然后果然目标程序调用了工厂对象的(*factory)- >CreateInsance(IUnknown * pUnkOuter,REFIID riid,void ** misobject)//因为是我的工厂,所以我知道他进行了调用;我想返回给目标程序我自己写的misobject,方法是使*misobject = myobject,失败了,发现函数返回后目标代码还是使用的原来的misobject(靠他怎么找到内存中的misobject ???)
我的MyFactory的CreateInstance实现:
HRESULT MyFactory::CreateInstance( Iunknown pUnkOuter, REFIID riid, void** object)
{
HRESULT hr = m_Factory- >CreateInstance(pUnkOuter,riid,ppv);//形成misobject(ppv) m_Factory为MyFactory成员对象,是windows MsiInstaller的工厂对象
Hook_Msi_Installer *myInstaller = new Hook_Msi_Installer((WindowsInstaller::Installer*)(*ppv));//形成我的msi对象,用ppv作为参数---方便自己的对象以后的调用
*ppv = (void*)myInstaller;//使ppv指向我自己写的msi对象,我认为它会返回给 WINAPI CoCreateInstance( const CLSID& id,IUnknown* )
pIUnknownOuter, DWORD dwClsContext, const IID& iid, void** ppv );的PPV参数,从而实现HOOK,发现失败了,发现函数返回后目标代码ppv指向的还是原来的WindowsInstaller.Installer 而不是Myinstaller
return hr ;
}
请教高手CoCreateInstance的内部细节是怎么样的阿?
我模式目标程序可能的调用方式
IClassFactory *pCF=NULL;
msi::Installer *qupload;
MYPROC myproc;
HMODULE hin=LoadLibrary("msi.dll");
myproc=(MYPROC)GetProcAddress(hin,"DllGetClassObject");
HRESULT hr= myproc(CLSID_Installer,IID_IClassFactory ,(void**)(&pCF));
hr=pCF- >CreateInstance(NULL,IID_Installer,(void**)(&qupload));
qupload- >OpenDatabsase(); //..ok 进入了我的MyInstaller函数的Invoke Interface的实现函数
Hook成功,
但如果使用
msi::Installer *qupload
CoCreateInstance(CLSID_Installer,NULL,IID_Installer,,(void**)(&qupload));
qupload- >OpenDatabsase(); // 调用了api的OpenDatabsase,没有hook住
虽然我发现CoCreateInstance内部会调用DllGetClassObject,并因为我hook了DllGetClassObject,所以返回我自己 写的IFactory,接着发现CoCreateInstance会调用myFactory- >CreateInstance(NULL,IID_Installer,(void**)(&qupload));
(of course i know,beacause DllGetClassObjectis hooked by me and return myFactory),并以qupload参数返回我的Myinstaller, 再然后CoCreateInstance会作什么我就不知道了,反正我没有hook到他内部的其他函数,所以不知道,函数返回后我调用 qupload- >OpenDatabsase() 进行测试,发现他调用的是msi的installer,而不是Myinstaller
跟踪代码我发现在实际上我发现myFactory- >CreateInstance(NULL,IID_Installer,(void**)(&qupload))后CoCreateInstance会释放qupload这个对象,
不明白啊,这个东西不是要返回的吗,CoCreateInstance释放了他就没有Installer对象可以用拉,但是我的测试代码qupload- >OpenDatabsase(); 调用了api的OpenDatabsase没有 出错.晕......难道CoCreateInstance在myFactory- >CreateInstance又作了什么????
[解决办法]
没明白楼主的意思...