[英]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.