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;
}

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;
}

TA貢獻1844條經驗 獲得超8個贊
就我的理解 C++應該不支持這種創建方式
首先不可能new一個void對象(你文中就void的)
動態創建函數也沒有任何實際意義,它本身也不是對象,也不進行析構和構造
如果你要使用它的多態的話,可以采用模版。
個人認為C語言不支持這種創建,要用的話應該用更低級的語言。
- 3 回答
- 0 關注
- 691 瀏覽
添加回答
舉報