hook com IFileOpenDialog 接口的GetResults函数,请帮忙解答下,急

lck2015 2015-07-02 08:47:26
为什么我的程序 hook 不到 com的 IFileOpenDialog 接口的GetResults函数呢,是不是我的变更虚函数表HookVtbl参数不正确啊,请帮忙解答下,急

int HookVtbl(void* pObject, unsigned int classIdx, unsigned int methodIdx,unsigned int newMethod);
typedef HRESULT (__stdcall* PGetResults)(IFileOpenDialog*, IShellItemArray**);
static PGetResults GetResults_old = NULL;
#define HOOK(a, b) b##_old = (P##b)HookVtbl(a, 2, 23, (unsigned int)b##_new) //----是不是这块参数不正确啊

HRESULT __stdcall GetResults_new(IFileOpenDialog *pThis,
IShellItemArray **ppenum)
{
OutputDebugStringA("调用了 GetResults_new ");
HRESULT hr = GetResults_old(pThis, ppenum);
return hr;
}


BOOL WINAPI StartHook()
{
PVOID pInterface = NULL;
CoInitialize(NULL);
//CLSCTX_ALL
HRESULT hr = CoCreateInstance(CLSID_FileOpenDialog, NULL, CLSCTX_SERVER, IID_IFileOpenDialog, &pInterface);
if(FAILED(hr))
{
OutputDebugStringA("CoCreateInstance 失败");
return FALSE;
}
HOOK(pInterface, GetResults);
return TRUE;
}


int HookVtbl(void* pObject, unsigned int classIdx, unsigned int methodIdx,unsigned int newMethod)
{
int** vtbl = (int**)pObject;
DWORD oldProtect = 0;
int oldMethod = vtbl[classIdx][methodIdx];
VirtualProtect(vtbl[classIdx] + sizeof(int*) * methodIdx, sizeof(int*), PAGE_READWRITE, &oldProtect);
vtbl[classIdx][methodIdx] = newMethod;
VirtualProtect(vtbl[classIdx] + sizeof(int*) * methodIdx, sizeof(int*), oldProtect, &oldProtect);
return oldMethod;
}
...全文
372 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Saleayas 2015-07-03
  • 打赏
  • 举报
回复
	typedef struct
	{
		const struct
		{
			void *lpfnMethods[1];
		} FAR *lpVtbl;
	} ICInterface;
Interface 的接口就是一个指向虚表的指针,其中虚表就是一个函数指针的数组。 而这个数组是按照接口中方法顺序排列的。 假定 pInterface 就是接口指针,而 nIndex 就是方法在接口中的顺序。 那么
	((ICInterface *)pInterface)->lpVtbl->lpfnMethods + nIndex;
就是接口方法的函数指针的位置,你需要的就是把这个位置上的函数替换掉。 而 nIndex 是需要你自己去数的。从最初的基类开始数。 比如你的 IFileOpenDialog 接口是 COM 接口,此时这个接口就是 从 IUnknwon::QueryIterface 开始数,这个 QI 的 nIndex 是 0。 如果不容易数,那就看看 接口的 C 模式的接口定义,在那个 VTBL 里面一个一个的数。
lck2015 2015-07-03
  • 打赏
  • 举报
回复
引用 1 楼 Saleayas 的回复:
vtbl 对于每一个接口是一个表。不是二维的。 你需要从 IUnknown 开始数。 其实可以使用 C 模式的。 &pInterfae->lpVtbl->Method 直接找到接口方法的引用。
To Saleayas:能不能告诉我怎么修改呢,这块折腾我比较长的时间了,多谢
Saleayas 2015-07-02
  • 打赏
  • 举报
回复
vtbl 对于每一个接口是一个表。不是二维的。 你需要从 IUnknown 开始数。 其实可以使用 C 模式的。 &pInterfae->lpVtbl->Method 直接找到接口方法的引用。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧