求问在C++中如何动态创建一个函数?急!

在堆中分配内存给函数,在调用时会发生异常。
那么怎么动态创建函数?

#include <cstdlib>
int main()
{
void(*c)() = (void(*)())malloc(1);
*(unsigned char*)c = 0xC3; // ret
c(); // raise Excpetion 0xC0000005: Access violation
free(c);
}
数据执行保护也来找我程序的麻烦了……
有办法绕过保护机制调用吗?

蛊毒传说
浏览 619回答 3
3回答

至尊宝的传说

BOOL VirtualProtect(LPVOID lpAddress, // address of region of committed pagesDWORD dwSize, // size of the regionDWORD flNewProtect, // desired access protectionPDWORD 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;}

动漫人物

这样可以的BOOL VirtualProtect(LPVOID lpAddress, // address of region of committed pagesDWORD dwSize, // size of the regionDWORD flNewProtect, // desired access protectionPDWORD 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;}

婷婷同学_

就我的理解 C++应该不支持这种创建方式首先不可能new一个void对象(你文中就void的)动态创建函数也没有任何实际意义,它本身也不是对象,也不进行析构和构造如果你要使用它的多态的话,可以采用模版。个人认为C语言不支持这种创建,要用的话应该用更低级的语言。
打开App,查看更多内容
随时随地看视频慕课网APP