簡體   English   中英

將函數指針設置為靜態地址

[英]Set a function pointer to a static address

我正在將DLL注入另一個進程,並希望根據它的地址(0x54315)調用該二進制文件中的函數。

我怎樣才能實際聲明一個函數,然后將其設置為該地址?

#define FUNC 0x54315

void *myFuncPtr;

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

 myFuncPtr(); // call it?
}

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

最好使用typedef:

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

(假設你的函數什么也沒用,什么都不返回。)

然后你會得到關於作業的警告 - 使用類型轉換來“沉默”它,因為這確實是你需要做的。

盡管如此,如果簽名不匹配,調用約定錯誤,或者地址錯誤,編譯器無法驗證任何內容,您就可以獲取它們。

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

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

然后將其稱為myfunc() ,就像普通函數一樣。 請注意,您應該更改強制轉換中的類型以匹配函數的實際參數和返回類型。

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

如Mat所述,函數指針的正確語法是:

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

這通常通過使用typedef來簡化,因為C函數指針語法有些復雜。

此外,每次注入的DLL運行時,您必須確定要調用的函數位於同一個確切的地址。 我不確定你怎么能確定這一點,不過......

此外,您需要注意調用約定以及FUNC函數可能期望的任何參數,因為如果您出錯,您可能最終會遇到堆棧損壞。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM