COM接口Hook的用法

转载 2015年03月11日 14:51:11
// Dsound.h 中的定义
HRESULT CreateSoundBuffer(
  LPCDSBUFFERDESC pcDSBufferDesc,
  LPDIRECTSOUNDBUFFER * ppDSBuffer,
  LPUNKNOWN pUnkOuter 
);


// 我定义的替代函数
HRESULT __stdcall PASCAL fakeIDirectSound8_CreateSoundBuffer(
  LPCDSBUFFERDESC pcDSBufferDesc,
  LPDIRECTSOUNDBUFFER * ppDSBuffer,
  LPUNKNOWN pUnkOuter 
  );

当应用程序调用IDirectSound::CreateSoundBuffer的时候,跳转到了我自己的写 fakeIDirectSound8_CreateSoundBuffer,但是我调试的时候发现,传到  fakeIDirectSound8_CreateSoundBuffer的参数出错了,顺序乱了





lpDS->CreateSoundBuffer(NULL, &lpDSB, NULL);

  0042EC18  mov         esi,esp 
  0042EC1A  push        0    
  0042EC1C  lea         eax,[lpDSB] 
  0042EC1F  push        eax  
  0042EC20  push        0    
  0042EC22  mov         ecx,dword ptr [lpDS] 
  0042EC25  mov         edx,dword ptr [ecx] 
  0042EC27  mov         eax,dword ptr [lpDS] 
  0042EC2A  push        eax  
  0042EC2B  mov         ecx,dword ptr [edx+0Ch] 
  0042EC2E  call        ecx  
  0042EC30  cmp         esi,esp 
  0042EC32  call        @ILT+3545(__RTC_CheckEsp) (42CDDEh) 

参数压栈时为: 0, 0x0049964c, 0x0018fd60
eax = 0x02610ac8


#define CMCALLTYPE  STDMETHODCALLTYPE

HRESULT CMCALLTYPE Hook::fakeIDirectSound_CreateSoundBuffer(
  LPCDSBUFFERDESC pcDSBufferDesc, 
  LPDIRECTSOUNDBUFFER *ppDSBuffer, 
  LPUNKNOWN pUnkOuter)
{
10033CA0  push        ebp  
10033CA1  mov         ebp,esp 
10033CA3  sub         esp,0CCh 
10033CA9  push        ebx  
10033CAA  push        esi  
10033CAB  push        edi  
10033CAC  lea         edi,[ebp-0CCh] 
10033CB2  mov         ecx,33h 
10033CB7  mov         eax,0CCCCCCCCh 
10033CBC  rep stos    dword ptr es:[edi] 

跳转到我自己写的函数后,检查各个参数发现出错了。
pcDSBufferDesc = 0x0210ac8
ppDSBuffer = 0x0018fd60
pUnkOuter = 0x0049964c

运行后出现以下错误提示:Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call.  This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.

根据提示分析应该是我自己写的函数声明的call方式错误引起的,因此我将CMCALLTYPE 修改成
1、 __cdecl
2、 __stdcall
3、 __fastcall
4、 WINAPI

运行还是出现错误。

请问下到底出什么问题了,thx in advance。 
 
回复时引用此帖 返回顶端
最佳答案 - 作者: cherryEx
COM里面的函数都是__stdcall的,
并且有隐藏参数,第一个参数都是 this ,



lpDS->CreateSoundBuffer(NULL, &lpDSB, NULL);
=
CreateSoundBuffer(lpDS, NULL, &lpDSB, NULL);

普通会员
普通会员

资 料:
注册日期: Jul 2011
帖子: 193 cherryEx 品行端正
精华: 1
现金: 217 Kx
致谢数: 0
获感谢文章数:3
获会员感谢数:4
2 旧 2012-08-08, 12:44:51 默认
cherryEx 当前离线

COM里面的函数都是__stdcall的,
并且有隐藏参数,第一个参数都是 this ,



lpDS->CreateSoundBuffer(NULL, &lpDSB, NULL);
=
CreateSoundBuffer(lpDS, NULL, &lpDSB, NULL); 

Windows Hook经验总结之四:COM组件Hook原理及实践

前面已经介绍过API的hook方法及具体实践,本文则讲述COM组件的Hook方式。COM组件可简单理解为一个二进制可执行程序或DLL,内部包含一系列的接口和函数。Hook COM本质上也是进行函数地址...
  • u011559599
  • u011559599
  • 2016年11月17日 14:31
  • 1245

Hook Com接口函数

标 题: 【原创】COM接口函数通用Hook方法 作 者: zhangluduo 时 间: 2014-12-08,22:34:20 链 接: http://bbs.pediy.com/showt...
  • lionzl
  • lionzl
  • 2016年07月22日 07:58
  • 535

通过COM接口来实现对应用程序的HOOK

  • 2009年06月24日 21:03
  • 794KB
  • 下载

hook COM接口 挂钩

  • 2016年03月30日 16:46
  • 242KB
  • 下载

Intercepting Calls to COM Interfaces(hook com接口)

Table of Contents Introduction Some Basic Concepts of COM Practical Example  Approach #1: Pr...
  • zhoujiaxq
  • zhoujiaxq
  • 2014年03月07日 08:55
  • 1194

对DirectX/COM接口的挂钩

 对DirectX/COM接口的挂钩           一般的挂钩(Hook)都是针对Windows API或消息的,而本文要讲的是如何挂钩一个DirectX/COM接口,有意思吧,请往下看,文中以...
  • xieqidong
  • xieqidong
  • 2008年05月05日 10:02
  • 6359

COM接口Hook的用法

// Dsound.h 中的定义 HRESULT CreateSoundBuffer(   LPCDSBUFFERDESC pcDSBufferDesc,   LPDIRECTSOUNDBUFF...
  • wxl1986622
  • wxl1986622
  • 2015年03月11日 14:51
  • 1462

API hook原理和实例快速入门(inline hook),以dll线程注入方式使用(win7-64bit)

一个完整的hook,如果hook程序是以dll形式生成的,是分两步:1.完成dll本身的设计和生成,2.完成dll注入程序的设计和生成 本文完成第一步。 第二步在http://blog.csdn....
  • arvon2012
  • arvon2012
  • 2012年07月20日 10:56
  • 10315

如何分析解决COM接口IFileOperation的hook去支持vista、win7、win8、win10 x86 x64系统

怎么进行COM接口IFileOperation hook我就不讲了,下面这个链接有讲解, http://blog.csdn.net/wzsy/article/details/17665311 ; ...
  • basketwill
  • basketwill
  • 2016年08月03日 12:54
  • 1469

Hook使用方法

大致步骤如下: 1、安装一个鼠标监视钩子 2、指向相应的钩子过程 3、指定线程由当前进程创建 4、指定于钩子过程相关的线程ID 需要函数: HHOOK SetWindowsHookEx...
  • csf111
  • csf111
  • 2011年11月03日 22:54
  • 3007
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:COM接口Hook的用法
举报原因:
原因补充:

(最多只允许输入30个字)