2011-02-15 25 views
3

我正在向遊戲中注入C++ DLL,並且想要將一個函數掛接到我自己的一些代碼中。由於DLL每次都映射到不同的位置,所以直接跳轉和調用會更容易。另外,因爲這是一個鉤子,我不想在返回該函數時更改堆棧或註冊表。 (char * asm =「\ x00」;) 如果你可以提供十六進制,這將爲我節省一些時間。在不使用相關性的情況下直接在ASM中調用/跳轉(x86)

我曾嘗試使用FF和EA進行調用和跳轉,但我想我只是不明白這些如何工作。當我使用它們時,我注意到我在手術中有一個冒號。

JMP FAR FWORD PTR DS:[00000000] 

這不起作用,它仍然之後,我試圖用一個指針跳躍位置沒有工作。

這裏之前,我開始嘗試不同的方法,我用的是裝配:

01270000 50    PUSH EAX 
01270001 57    PUSH EDI 
01270002 E8 E9CC1BFF  CALL fwound.0042CCF0 
01270007 5F    POP EDI 
01270008 58    POP EAX 
01270009 50    PUSH EAX      //replacements 
0127000A 8D4C24 7C  LEA ECX,DWORD PTR SS:[ESP+7C] // 
0127000E - E9 36D11BFF  JMP fwound.0042D149 

我使用奧利取得該塊,因此它知道在當時所需的相關跳躍/調用。

之後,Asm在內存中,然後我必須在函數中寫入兩個操作(已被替換)以跳轉到此位置。

那麼,我該如何修復我的Asm塊以使用直接跳轉和調用?

回答

4

可以這樣的代碼它(GCC式/ AT & T彙編語法):

jmp *.Ltgtaddr 
.Ltgtaddr: .long absoluteAddrOfFunctionToCall 

此組裝成10個字節(在32位x86)的 - ff 25與32位內存操作數的絕對JMP,然後四個字節與下一個字的地址,然後是您的代碼的(絕對)目標地址的內容。

編輯:我已經更新了一個編譯和測試的例子下面的部分。

您可以從C源代碼中動態創建這樣一個蹦牀。示例源(需要32位的x86,作爲練習留給讀者如何蹦牀轉換爲64位):

#include <sys/mman.h> 
#include <stdio.h> 

void oneWay(char *str, int arg) 
{ printf("string is \"%s\", int is %d\n", str, arg); } 

void otherWay(char *str, int arg) 
{ printf(str, arg); printf("\n"); } 

void *trampGen(void *tgtAddr) 
{ 
    char *trampoline = mmap(NULL, 10, PROT_EXEC | PROT_WRITE | PROT_READ, 
     MAP_PRIVATE | MAP_ANON, -1, 0); 
    trampoline[0] = (char)0xff; trampoline[1] = (char)0x25; 
    *(char**)(trampoline+2) = trampoline + 6; 
    *(void**)(trampoline+6) = tgtAddr; 
    return trampoline; 
} 

int main(int argc, char **argv) 
{ 
    void * (*funcptr)(char*, int) = trampGen(oneWay); 
    *funcptr("Test %d String", 12345); 
    *(void **)(((char *)funcptr) + 6) = otherWay; 
    *funcptr("Test %d String", 12345); 
    munmap(funcptr, 10); 
    return 0; 
} 

輸出對我來說:

$ ./tt 
string is "Test %d String", int is 12345 
Test 12345 String 

注意它的效率會低一點,預留整個MMU頁面只能使用它的十個字節。如果您需要不止一個蹦牀,請實施您自己的蹦牀內存管理器...

0

從未嘗試過這樣的事情,
但我認爲你應該使用從遊戲的一個已知的內存位置的偏移量(用OllyDbg中找到),因此每多加一個這個時間(固定)偏移到(可變)地址。例如,這個地址可以是在ss:ebp處找到的返回地址(因爲你的函數被遊戲調用),並且該地址的偏移量是在ollyDBG的幫助下計算的。

相關問題