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