COM Hook原理

转载 2011年04月15日 21:48:00

掌握 C++ 对象模型底层知识的人都知道, C++ 利用虚函数的机制来实现运行期的多态。

例如一个类申明如下:

class A

{

public:
A(){}

~A(){}

 

virtual void f1(){ printf("Founction f1 called"); }

virtual void f2(){ printf("Founction f2 called"); }

virtual void f3(){ printf("Founction f3 called"); }

 

private:

 

int n;

};

 

那么 A 对象在内存中的结构图大概如下 :

 


如上图:可以看到 A 对象的前 4 个字节是虚函数表的指针 vptr ,而虚函数表本身又是一个数组。所以 vptr 可以看作一个指向指针的指针。
那么已知 pA A 对象指针,我们如果想得到虚函数表的地址,只需要如下即可。
long** pplVrtable= (long**)(pA);
我们可以为类 A 添加一个成员函数确认一下。
void A::reset_f1()
{
long** pplVrtable= (long**)(this); //
取得虚函数表的指针
*pplVrtable = *pplVrtable +1;//
将虚函数表的指针指向虚函数表第二个值。
}
测试代码:
int main(int argc, char* argv[])
{
A* pA = new A;

pA->reset_f1();

printf("Begin to call founction f1./n");


pA->f1();


delete pA;


return 0;

}
运行输出:
Begin to call founction f1.
Founction f2 called.
结果证实虚函数表的指针已经被成功修改,对于成员函数 f1 的调用变成了对 f2 的调用 .
但是我们这里修改的只是虚函数指针,那么我们可不可以直接修改 虚函数表那?
试一下看看,修改代码如下:
void A::reset_f1()
{

long** pplVrtable= (long**)(this); //
取得虚函数表的指针

(*pplVrtable)[0]= (*pplVrtable)[1];//
将虚函数表的第一个值设置为虚函数表第二个值。
}
运行 , 结果程序 crash , 看样子虚函数表这块内存是被系统保护了 , 看似山重水复疑无路了 , 不过没关系 ,Windows 提供了一组针对内存保护的函数 :
VirtualQueryEx, VirtualProtectEx,( 相关定义和使用方法 , 可以看看 MSDN).
利用这两个函数我们可以实现修改 虚函数表的功能 , 再次修改代码如下 :
void reset_f1()
{
      long** pplVrtable= (long**)(this);

      HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, ::GetCurrentProcessId());

MEMORY_BASIC_INFORMATION mbi = {0};

if (VirtualQueryEx(hProcess, (LPVOID)(*pplVrtable), &mbi, sizeof(mbi)) != sizeof(mbi))

return;

DWORD dwOldProtect = 0;

if(!::VirtualProtectEx(hProcess, mbi.BaseAddress, 4, PAGE_EXECUTE_READWRITE, &dwOldProtect))

return;

(*pplVrtable)[0] = (*pplVrtable)[1];


DWORD dwTemp = 0;
::VirtualProtectEx(hProcess, mbi.BaseAddress, 4, dwOldProtect, &dwTemp);

CloseHandle(hProcess);

}
运行输出:
Begin to call founction f1.
Founction f2 called.
结果与预期一样 , 虚函数表终于被成功修改了 .
因为 COM 接口是没有成员变量的只有纯虚函数的类 , 其虚函数指针在内存分配上具有唯一性 , 所以我们可以通过以上的技术实现对所有 COM 接口成员函数的 HOOK. ,

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

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

COM接口Hook的用法

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

COM HOOK的原理

主要思想是改虚函数表,代码不长, 很容易看懂.嘿嘿.学了不少东西#include #include class mytest { public: mytest() { ...
  • UUcall007
  • UUcall007
  • 2010年07月23日 17:40
  • 594

COM Hook原理

 掌握C++对象模型底层知识的人都知道,C++利用虚函数的机制来实现运行期的多态。例如一个类申明如下:class A{public:A(){}~A(){}virtual void f1(){ prin...
  • IT_Fly
  • IT_Fly
  • 2008年08月05日 10:12
  • 4656

Hook API 原理 解析

1 什么是Hook API 简单的说,一个应用程序要调用一个API函数,例如CreateFileW,那么应用程序必须要知道函数的地址,才能调用它,我对Hook API的理解是,把这个函数地址替换为另...
  • on_1y
  • on_1y
  • 2012年05月23日 19:27
  • 4528

Hook原理分析

首先说说这个技术的实现环境,大家都知道windows的近几个版本都是使用了消息循环机制的,所谓的消息循环机制就是在windows上跑的各种程序之间和windows 之间的交互都是通过消息实现的,这里特...
  • zhx278171313
  • zhx278171313
  • 2014年04月01日 17:33
  • 2262

API hook 原理与Windows hook 应用

CSDN 上图片很麻烦,请到百度文库直接看Word 文档,图片比这个全http://wenku.baidu.com/view/0946ce1155270722192ef74f.html Hook 字...
  • zwh37333
  • zwh37333
  • 2012年04月14日 12:20
  • 8272

HOOK DLL

前一阶段闲着无聊,用远程线程注入的方法把DLL注入到Explorer.exe进程实现音乐循环播放。   在DLL中的代码是这样的: BOOL WINAPI DllMain(HINSTA...
  • flyingleo1981
  • flyingleo1981
  • 2013年11月13日 16:19
  • 1008

对DirectX/COM接口的挂钩

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

自动化(Automation)基础概念:COM组件(Component)与接口(Interface)

COM组件(Component)与接口(Interface)许式伟 (版权声明)2007-3-12在前文,我预告了我将开始介绍WINX对自动化(Automation)的支持。首先我打算解释一下自动...
  • hejishan
  • hejishan
  • 2008年04月01日 16:56
  • 236
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:COM Hook原理
举报原因:
原因补充:

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