描述:
我现在的思路是这样:
用APIHook钩挂某一进程中MSADO15.DLL的DllGetClassObject方法
方法的原型为
STDAPI DllGetClassObject(
REFCLSID rclsid,
REFIID riid,
LPVOID* ppv
);
然后监视Connection15接口(GUID为{00000515-0000-0010-8000-00AA006D2EA4})
也就是riid为{00000515-0000-0010-8000-00AA006D2EA4},我要进行相应处理
现在是处理方式有两种:
void SetConnectionString(LPCTSTR lpszNewValue);
1、我自己写个类,实现Connection15,在SetConnectionString方法中提取信息,其他的直接调用ADO的相应接口
2、查找SetConnectionString方法的地址,强制修改接口引用中该方法的地址进行截获
不过看了下,似乎接口的所有方法都是通过IDispatch->Invoke来调用的,COM我不是太熟悉,对于Connection15这种接口,我能不能认为它就是函数指针的集合(struct)?而接口就是这个集合的指针?
在VC中,使用了类进行包装(代理),然后使用InvokeHelper将其全部映射至IDispatch->Invoke,而对于COM服务器,似乎只要实现Invoke就行了(我还没研究过过COM服务器),还是有一套工具或包装类又将Invoke映射回接口各个方法的实现之中?
小弟对Delphi熟悉一些,对于VC中如何处理接口的不太清楚,好像interface就是struct,然后中间塞一堆函数指针。。。
无权发这么多可用分。。。郁闷。。。
解决方案1:
想看看结果,帮你顶一下
解决方案2:up
解决方案3: 可以使用com hook实现
可以通过对应的dll的GetModuleHandele()后直接处理调用偏移地址,修改为jmp xxx,然后再跳转调用
实际上,自己写一个COM,接口classID什么的都和ADO的一样
然后修改注册表相应的路径,这样就算是HOOK了吧
然后你自己在调用dll中的函数,创建实际的ADO对象