亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

求問在C++中如何動態創建一個函數?急!

求問在C++中如何動態創建一個函數?急!

Git
蠱毒傳說 2021-07-13 14:10:27
在堆中分配內存給函數,在調用時會發生異常。那么怎么動態創建函數?#include <cstdlib>int main(){void(*c)() = (void(*)())malloc(1);*(unsigned char*)c = 0xC3; // retc(); // raise Excpetion 0xC0000005: Access violationfree(c);}數據執行保護也來找我程序的麻煩了……有辦法繞過保護機制調用嗎?
查看完整描述

3 回答

?
至尊寶的傳說

TA貢獻1789條經驗 獲得超10個贊

BOOL VirtualProtect(
LPVOID lpAddress, // address of region of committed pages
DWORD dwSize, // size of the region
DWORD flNewProtect, // desired access protection
PDWORD lpflOldProtect
// address of variable to get old protection
);
或者WriteProcessMemory(...

但是如果你發生了內存不能執行的話 你可以用這個API改變內存的屬性
更直接得 你可以使用VirtualAlloc 它申請的內存可以直接設置讀寫執行.

#include <cstdlib>
#include <windows.h>

int main()
{
MessageBox(NULL, "我不是真的調用.", NULL, MB_OK);

char szFunText[] = {0x6A, 0x00, 0x6A, 0x00, 0x6A, 0x00, 0x6A, 0x00, 0xB8, 0x8A, 0x05, 0xD5, 0x77, 0xFF, 0xD0, 0xC3};

//PAGE_EXECUTE_READWRITE 可讀可寫可執行
PVOID pMem = VirtualAlloc(NULL, 1024, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
memcpy(pMem, szFunText, sizeof(szFunText));
((void(*)())pMem)();
VirtualFree(pMem, 1024, MEM_RELEASE);

return 0;
}



查看完整回答
反對 回復 2021-07-18
?
動漫人物

TA貢獻1815條經驗 獲得超10個贊

這樣可以的

BOOL VirtualProtect(
LPVOID lpAddress, // address of region of committed pages
DWORD dwSize, // size of the region
DWORD flNewProtect, // desired access protection
PDWORD lpflOldProtect
// address of variable to get old protection
);
或者WriteProcessMemory(...

但是如果你發生了內存不能執行的話 你可以用這個API改變內存的屬性
更直接得 你可以使用VirtualAlloc 它申請的內存可以直接設置讀寫執行.

#include <cstdlib>
#include <windows.h>

int main()
{
MessageBox(NULL, "我不是真的調用.", NULL, MB_OK);

char szFunText[] = {0x6A, 0x00, 0x6A, 0x00, 0x6A, 0x00, 0x6A, 0x00, 0xB8, 0x8A, 0x05, 0xD5, 0x77, 0xFF, 0xD0, 0xC3};

//PAGE_EXECUTE_READWRITE 可讀可寫可執行
PVOID pMem = VirtualAlloc(NULL, 1024, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
memcpy(pMem, szFunText, sizeof(szFunText));
((void(*)())pMem)();
VirtualFree(pMem, 1024, MEM_RELEASE);

return 0;
}



查看完整回答
反對 回復 2021-07-18
?
婷婷同學_

TA貢獻1844條經驗 獲得超8個贊

就我的理解 C++應該不支持這種創建方式
首先不可能new一個void對象(你文中就void的)
動態創建函數也沒有任何實際意義,它本身也不是對象,也不進行析構和構造
如果你要使用它的多態的話,可以采用模版。
個人認為C語言不支持這種創建,要用的話應該用更低級的語言。

查看完整回答
反對 回復 2021-07-18
  • 3 回答
  • 0 關注
  • 691 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號