1
即時通訊工作在C + +和ASM的鉤子,目前我剛剛做了一個簡單的內聯鉤子,在目標函數的第一個指令中跳轉,在這種情況下是OutputDebugString僅用於測試目的。如何傳遞組件中的參數?
事情是我的鉤子經過大約3天的研究並找出事物的工作原理,並發現了一些問題,但我不知道如何改變參數,這些參數進入我的「虛擬「功能,然後跳到原始功能的其餘部分。
爲u可以在我的代碼中看到我試圖改變參數只是在C++中,但當然這並不作爲即時通訊工作,坡平所有後來的寄存器:/
反正這裏是我的虛擬函數是什麼該掛鉤函數跳轉到:
static void __declspec(naked) MyDebugString(LPCTSTR lpOutputString) {
__asm {
PUSHAD
}
//Where i suppose i could run my code, but not be able to interfere with parameters :/
lpOutputString = L"new message!";
__asm {
POPAD
MOV EDI, EDI
PUSH EBP
MOV EBP, ESP
JMP Addr
}
original_DebugString(lpOutputString);
}
我明白爲什麼我說的代碼不工作,我實在看不出這一個妥善的解決辦法,任何幫助是極大的讚賞。
您需要將您的參數傳送到工作寄存器,執行ADD操作,並進行必要的更改,然後再次將MOV傳送到您將用於參數的位置。 – ha9u63ar 2014-11-04 15:25:53
在純彙編語言中,您*通常*將參數傳遞到寄存器中。在將程序集與C(或其他)混合時,你需要處理那些語言認爲合適的參數以通過它們。在這種情況下,它可能在堆棧上(正好在返回地址下面)。也就是說,你的代碼似乎沒有任何意義。 – 2014-11-04 15:29:21
我建議你只是用一些參數和局部變量來創建一個c/C++函數,比如'__stdcall'約定,並在反彙編器中查看編譯器生成的asm代碼如何與參數和本地堆棧變量交互並從中學習。它使用一個簡單的技巧,並不總是必須計算出有多少'push */pop *'。 – Slyps 2014-11-04 15:43:53