COM Hook原理

掌握 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. ,

發佈了30 篇原創文章 · 獲贊 5 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章