2010-03-23 64 views
6

我使用Detours掛鉤到可執行文件的消息功能,但我需要運行我自己的代碼,然後調用原始代碼。根據我在Detours文檔中看到的,它肯定聽起來像是應該自動發生。原始功能會在屏幕上打印一條消息,但只要我附加繞道,它就會開始運行我的代碼並停止打印。需要從繞道功能調用原始功能

原先的功能代碼大致是:

void CGuiObject::AppendMsgToBuffer(classA, unsigned long, unsigned long, int, classB); 

我的功能是:

void CGuiObject_AppendMsgToBuffer([same params, with names]); 

我才知道,原來的功能駐留在內存中的位置,所以使用:

DWORD OrigPos = 0x0040592C; 
DetourAttach((void*)OrigPos, CGuiObject_AppendMsgToBuffer); 

讓我進入功能。這段代碼幾乎完美地工作:我的函數被調用了正確的參數。但是,執行會離開我的函數,並且不會調用原始代碼。我已經試過jmping了,但是這個程序崩潰了(我假設代碼Detours移動到適合鉤子負責崩潰)。

編輯:我設法解決第一個問題,沒有返回到程序執行。通過將OrigPos值作爲函數調用,我可以轉到「蹦牀」功能,並從那裏到原始代碼。但是,在某些地方,寄存器正在發生變化,並且一旦我回到原始代碼中,就會導致程序崩潰並出現段錯誤。

EDIT2:最後的工作代碼:

class CGuiObject 
{ 
public: 
    void MyFunc([params]); 
}; 

DWORD TrueAddr = 0x0040592C; 

CGuiObject::MyFunc([params]) 
{ 
    _asm { pushad } 
    // process 
    _asm { 
     popad 
     leave 
     jmp TrueAddr 
    } 
} 

,並使用TrueAddr在DetourAttach的第一個參數。

+0

你可以在反彙編中通過這個步驟嗎? – 2010-03-23 02:43:28

+0

是的,我建立了調試,並在我的函數開始時設置了一個斷點。代碼命中,我pushad,做一些日誌記錄(使用<<運算符),popad和jmp將消息發送到fstream到Detours返回的地址。執行通過複製的東西,並回到原來的可執行文件。它運行了幾行,但據我所知,ECX正被重置爲0,並被用作指針,因此是段錯誤。如果這沒有幫助,我可以用asm發佈完整的代碼。 – ssube 2010-03-23 18:55:08

回答

1

鑑於您試圖攔截C++方法調用,因此調用原始函數時可能會遇到調用約定問題。

我還沒有試圖親自去做這個彎路,但這篇文章指出的東西可能會幫助你。 C++ — Detours (Win32 API Hijacking) — Hijack Class Methods請參閱第二個答案中的鏈接。

+0

這工作,在一個圓的方式。最後,我創建了一個完美的框架類。它甚至可以調用自己將消息插入隊列或跳過最後的部分以防止消息。感謝您的鏈接! :) – ssube 2010-03-24 01:47:27