2014-11-04 33 views
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); 
} 

我明白爲什麼我說的代碼不工作,我實在看不出這一個妥善的解決辦法,任何幫助是極大的讚賞。

+0

您需要將您的參數傳送到工作寄存器,執行ADD操作,並進行必要的更改,然後再次將MOV傳送到您將用於參數的位置。 – ha9u63ar 2014-11-04 15:25:53

+0

在純彙編語言中,您*通常*將參數傳遞到寄存器中。在將程序集與C(或其他)混合時,你需要處理那些語言認爲合適的參數以通過它們。在這種情況下,它可能在堆棧上(正好在返回地址下面)。也就是說,你的代碼似乎沒有任何意義。 – 2014-11-04 15:29:21

+0

我建議你只是用一些參數和局部變量來創建一個c/C++函數,比如'__stdcall'約定,並在反彙編器中查看編譯器生成的asm代碼如何與參數和本地堆棧變量交互並從中學習。它使用一個簡單的技巧,並不總是必須計算出有多少'push */pop *'。 – Slyps 2014-11-04 15:43:53

回答

0

每個編譯器都有一個使用匯編語言調用函數的協議。該協議可能在其手冊中有深入的說明。

查找函數協議的更快方法是讓編譯器爲您的函數生成彙編語言列表。

用於寫入聯彙編的最好的方法是:

  1. 首先寫函數在C++源碼
  2. 下一頁打印輸出功能的組件列表。
  3. 查看並瞭解編譯器如何生成裝配體。
  4. 最後,修改內部裝配以滿足您的需求。

我的首選是儘可能高效編寫C++代碼(或幫助編譯器使用最佳彙編語言)。然後我查看彙編列表。我只更改內聯程序集以調用處理器特殊功能(例如塊移動指令)。