如何HOOK一个COM的接口函数

wangpeng2011314 2012-10-24 05:22:18
winapi的hook和dll的注入都已经实现了。但是如果这个函数不是winapi而是一个COM接口成员函数,这个怎么实现?其实我是想知道怎么用detours去HOOK住一个directInputEffect的接口函数叫SetParameters。
...全文
933 35 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangpeng2011314 2012-10-30
  • 打赏
  • 举报
回复
能不能说下hook一个别人已经写好的exe里的该接口的思路,我确定那个exe会调用IDirectInputEffect接口的SetParameters这个函数。
wangpeng2011314 2012-10-30
  • 打赏
  • 举报
回复
[Quote=引用 32 楼 的回复:]

首先需要取得接口被实例化的指针。
这个实例化,可以是自己创建这个接口,或者直接获取一个已经存在的接口。

举个例子。Hook IUnknown 的 Release。
IUnknown 的 Release 接口方法只是一个定义。
只有当
IUnknown *p = CreateOrGet。。。
p->Release 方法才可以被 HOOK。
而 p->Release 的 的 C ……
[/Quote]能不能说下hook一个别人已经写好的exe里的该接口的思路,我确定那个exe会调用IDirectInputEffect接口的SetParameters这个函数。
wangpeng2011314 2012-10-30
  • 打赏
  • 举报
回复
再顶顶
wangpeng2011314 2012-10-29
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 的回复:]

没有办法直接去获取一个接口的方法。
因为这只是一个定义。

这个接口可能被很多类继承,然后这个方法被定义为很多不同的方法。

所以,必须首先获取 这个接口定义的类,然后获取到这个特定类定义的方法。

然后就和普通的 C 函数一致了。

HRESULT __stdcall IDirectInputEffect_SetParameters(IDirectInputEffect *p……
[/Quote]我在学习COM技术的时候遇到一个问题。com接口就是一个存放函数指针的数组,那这个函数指针所指向的函数是在什么地方实现的 ?
wangpeng2011314 2012-10-29
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 的回复:]

没有办法直接去获取一个接口的方法。
因为这只是一个定义。

这个接口可能被很多类继承,然后这个方法被定义为很多不同的方法。

所以,必须首先获取 这个接口定义的类,然后获取到这个特定类定义的方法。

然后就和普通的 C 函数一致了。

HRESULT __stdcall IDirectInputEffect_SetParameters(IDirectInputEffect *p……
[/Quote]还是不是很理解你的意思。这个接口是directX提供的,类的定义部分是有个dinput.h文件里的。但是我想要hook的程序是已经生成了exe的可执行文件,想hook那个exe每次调用的Setparameters方法也可以按照你说的方法去hook吗??
wangpeng2011314 2012-10-29
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 的回复:]

最后一天过了,还没事吗??
//呵呵
[/Quote]他后来允许我多几天时间了
Saleayas 2012-10-29
  • 打赏
  • 举报
回复
没有办法直接去获取一个接口的方法。
因为这只是一个定义。

这个接口可能被很多类继承,然后这个方法被定义为很多不同的方法。

所以,必须首先获取 这个接口定义的类,然后获取到这个特定类定义的方法。

然后就和普通的 C 函数一致了。

HRESULT __stdcall IDirectInputEffect_SetParameters(IDirectInputEffect *pThis, LPCDIEFFECT peff, DWORD dwFlags);
Saleayas 2012-10-29
  • 打赏
  • 举报
回复
最后一天过了,还没事吗??
//呵呵
wangpeng2011314 2012-10-29
  • 打赏
  • 举报
回复
再顶顶,还有高人吗?
Saleayas 2012-10-29
  • 打赏
  • 举报
回复
首先需要取得接口被实例化的指针。
这个实例化,可以是自己创建这个接口,或者直接获取一个已经存在的接口。

举个例子。Hook IUnknown 的 Release。
IUnknown 的 Release 接口方法只是一个定义。
只有当
IUnknown *p = CreateOrGet。。。
p->Release 方法才可以被 HOOK。
而 p->Release 的 的 C 模式函数签名为 void (__stcall *)(IUnknown *pThis);

给你一个我的例子。

BOOL SetDirect3DHook(HWND hDirectXWindow)
{
TR(L"Direct3D9 ¹Ò¹³º¯Êý¿ªÊ¼¡­¡­");
#ifdef HOOK_MODE
#ifdef HOOK_RENDER
BOOL bResult = FALSE;
IDirect3D9 * pD3D = NULL;
IDirect3DDevice9 * pDevice = NULL;
HRESULT hr = CreateHookDevice(hDirectXWindow, &pD3D, &pDevice);
if (SUCCEEDED(hr))
{
Real_IDirect3DDevice9Present = pDevice->lpVtbl->Present;
bResult = HOOK_FUNCTION(IDirect3DDevice9Present);
if (bResult)
{
bResult = SetDirect3DAcquireHook(pDevice);
if (!bResult)
{
UNHOOK_FUNCTION(IDirect3DDevice9Present);
}
}
pDevice->lpVtbl->Release(pDevice);
pD3D->lpVtbl->Release(pD3D);
}
#else
BOOL bResult = TRUE;
#endif
#else
BOOL bResult = TRUE;
#endif
if (bResult)
{
TR(L"Direct3D9 ¹Ò¹³º¯Êý³É¹¦½áÊø¡£");
}
else
{
DR(L"Direct3D9 ¹Ò¹³º¯Êý·µ»ØÊ§°Ü¡£");
}
return bResult;
}
wangpeng2011314 2012-10-28
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 的回复:]

继承IDirectInputEffect接口,你的方法可以直接调用IDirectInputEffect的方法
这样可以Hook整个接口 这里有个Hook D3d9.dll 中IDirect3D9等接口的示例
http://download.csdn.net/detail/lethe555/4692983
引用 23 楼 的回复:

引用 22 楼 的回复:

实现IDirect……
[/Quote]你给的链接我下载了,你能举个更精简的例子吗?我对COM技术不太懂,正在学习中
BlackGhost 2012-10-27
  • 打赏
  • 举报
回复
继承IDirectInputEffect接口,你的方法可以直接调用IDirectInputEffect的方法
这样可以Hook整个接口 这里有个Hook D3d9.dll 中IDirect3D9等接口的示例
http://download.csdn.net/detail/lethe555/4692983
[Quote=引用 23 楼 的回复:]

引用 22 楼 的回复:

实现IDirectInputEffect接口 覆盖SetParameters方法,
需要自己实现IDirectInputEffect接口 ?
[/Quote]
wangpeng2011314 2012-10-27
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 的回复:]

实现IDirectInputEffect接口 覆盖SetParameters方法,
[/Quote]需要自己实现IDirectInputEffect接口 ?
wangpeng2011314 2012-10-26
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 的回复:]

“msdn里对这个接口的成员函数的介绍”里面有这些?
C/C++ code
File: "C:\Microsoft SDK\Include\prerelease\dinput.h" 3 occurrences found on 3 lines
335: STDMETHOD(SetParameters)(THIS_ LPCDIEFFECT,DWORD) PURE;
353:……
[/Quote]这些是什么意思 ?
赵4老师 2012-10-26
  • 打赏
  • 举报
回复
“msdn里对这个接口的成员函数的介绍”里面有这些?
File: "C:\Microsoft SDK\Include\prerelease\dinput.h" 3 occurrences found on 3 lines
335: STDMETHOD(SetParameters)(THIS_ LPCDIEFFECT,DWORD) PURE;
353: #define IDirectInputEffect_SetParameters(p,a,b) (p)->lpVtbl->SetParameters(p,a,b)
367: #define IDirectInputEffect_SetParameters(p,a,b) (p)->SetParameters(a,b)
wangpeng2011314 2012-10-26
  • 打赏
  • 举报
回复
再顶顶,求各路高手解答
wangpeng2011314 2012-10-26
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

Hook 一个 Com 接口方法,其实就是 Hook 一个 第一个参数为 this 的 C 签名函数。

创建或获取指定的接口。
然后,根据偏移量获取接口方法的函数指针。使用 C 定义的接口可以直接获取。C++ 定义的接口需要计算偏移量。
这个函数指针就是需要 旁路 的函数。
[/Quote]我用的detours是2.1版
wangpeng2011314 2012-10-26
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

Hook 一个 Com 接口方法,其实就是 Hook 一个 第一个参数为 this 的 C 签名函数。

创建或获取指定的接口。
然后,根据偏移量获取接口方法的函数指针。使用 C 定义的接口可以直接获取。C++ 定义的接口需要计算偏移量。
这个函数指针就是需要 旁路 的函数。
[/Quote]听懂你的意思了。其实在一个控制台应用程序的工程里,我这有个detours提供的样本可以实现对COM接口的hook,但是怎么能把hook的步骤写到一个dll里,大侠可以帮忙解答下吗?
Saleayas 2012-10-26
  • 打赏
  • 举报
回复
Hook 一个 Com 接口方法,其实就是 Hook 一个 第一个参数为 this 的 C 签名函数。

创建或获取指定的接口。
然后,根据偏移量获取接口方法的函数指针。使用 C 定义的接口可以直接获取。C++ 定义的接口需要计算偏移量。
这个函数指针就是需要 旁路 的函数。
wangpeng2011314 2012-10-26
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

第一个参数为 this 的 C 函数签名。
[/Quote]什么意思?
加载更多回复(15)

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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