2012-05-20 73 views
3

我正在向另一個進程注入一個DLL,並且想要根據它的地址(0x54315)調用該二進制文件中的函數。將函數指針設置爲靜態地址

我該如何實際聲明一個函數,然後將其設置爲這個地址?

#define FUNC 0x54315 

void *myFuncPtr; 

int main() 
{ 
myFuncPtr = FUNC; // pretty sure this isn't how 

myFuncPtr(); // call it? 
} 
+0

也許libffi可能有些用處? –

回答

3

現有的答案有效,但你甚至不需要函數指針的變量。你可以這樣做:

#define myfunc ((void (*)(void))0x54315) 

,然後把它作爲myfunc()就像你一個普通的功能。請注意,您應該更改轉換中的類型以匹配函數的實際參數和返回類型。

3

一旦語法被糾正爲實際上是函數指針,您的代碼應該工作。我沒有正確閱讀這個答案的第一個版本。抱歉。

如上所述通過墊,用於一個函數指針的正確語法是:

void (*myFuncPtr)(void) = (void (*)(void)) FUNC; 

這常常通過使用typedef由於C函數指針語法簡化是有些令人費解。

此外,您必須確保被調用的函數在每次注入DLL運行時都處於相同的確切地址。我不知道你怎麼可以肯定,雖然...

此外,你需要注意調用約定和FUNC可能期望的功能的任何參數,因爲如果你得到那個錯誤你可能最終會發生堆棧損壞。

5

您需要將myFuncPtr定義爲函數指針,void*不可調用。

最好使用typedef爲:

typedef void (*funptr)(void); 
funprt myFuncPtr; 

(假設你的函數需要什麼,並沒有返回值)

然後你會得到分配的警告 - 使用類型轉換爲「沉默」它,因爲這確實是你需要做的。

儘管如此,如果簽名不匹配,調用約定錯誤或地址錯誤,編譯器無法驗證任何內容,並且可以拾取碎片。