我正在向另一個進程注入一個DLL,並且想要根據它的地址(0x54315)調用該二進制文件中的函數。將函數指針設置爲靜態地址
我該如何實際聲明一個函數,然後將其設置爲這個地址?
#define FUNC 0x54315
void *myFuncPtr;
int main()
{
myFuncPtr = FUNC; // pretty sure this isn't how
myFuncPtr(); // call it?
}
我正在向另一個進程注入一個DLL,並且想要根據它的地址(0x54315)調用該二進制文件中的函數。將函數指針設置爲靜態地址
我該如何實際聲明一個函數,然後將其設置爲這個地址?
#define FUNC 0x54315
void *myFuncPtr;
int main()
{
myFuncPtr = FUNC; // pretty sure this isn't how
myFuncPtr(); // call it?
}
現有的答案有效,但你甚至不需要函數指針的變量。你可以這樣做:
#define myfunc ((void (*)(void))0x54315)
,然後把它作爲myfunc()
就像你一個普通的功能。請注意,您應該更改轉換中的類型以匹配函數的實際參數和返回類型。
一旦語法被糾正爲實際上是函數指針,您的代碼應該工作。我沒有正確閱讀這個答案的第一個版本。抱歉。
如上所述通過墊,用於一個函數指針的正確語法是:
void (*myFuncPtr)(void) = (void (*)(void)) FUNC;
這常常通過使用typedef
由於C函數指針語法簡化是有些令人費解。
此外,您必須確保被調用的函數在每次注入DLL運行時都處於相同的確切地址。我不知道你怎麼可以肯定,雖然...
此外,你需要注意調用約定和FUNC
可能期望的功能的任何參數,因爲如果你得到那個錯誤你可能最終會發生堆棧損壞。
您需要將myFuncPtr
定義爲函數指針,void*
不可調用。
最好使用typedef爲:
typedef void (*funptr)(void);
funprt myFuncPtr;
(假設你的函數需要什麼,並沒有返回值)
然後你會得到分配的警告 - 使用類型轉換爲「沉默」它,因爲這確實是你需要做的。
儘管如此,如果簽名不匹配,調用約定錯誤或地址錯誤,編譯器無法驗證任何內容,並且可以拾取碎片。
也許libffi可能有些用處? –