在C++中如何动态创建一个函数

在堆中分配内存给函数,在调用时会发生异常。那么怎么动态创建函数?#include<cstdlib>intmain(){void(*c)()=(void(*)())mall... 在堆中分配内存给函数,在调用时会发生异常。
那么怎么动态创建函数?

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

2015-10-02 · 关注我不会让你失望
知道大有可为答主
回答量:7533
采纳率:67%
帮助的人:707万
展开全部
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;
}
CIW_BLUE
2009-01-27 · TA获得超过487个赞
知道小有建树答主
回答量:178
采纳率:0%
帮助的人:0
展开全部
这样可以的

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;
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2009-01-27
展开全部
不能这样分配。乎改函数在内存中的位中姿置由编译器来决定。

你可以输出一下已经存卖顷绝在的函数的地址,和Malloc的地址不是相同的区域。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
牛比的琭琭
2009-01-27 · TA获得超过685个赞
知道小有建树答主
回答量:588
采纳率:0%
帮助的人:427万
展开全部
就我的理解 C++应该不支持这种创建方式

首先不可能new一个void对象(你文中就闭谨void的)
动态创建函数也没裤神有任何实际意义,它本身也不是对象,也不进行析构和构造

如果你要使用它的多态的话,可以采用模版。

个人认为C语言不支持这种创建,要用胡态亏的话应该用更低级的语言。
另外,你得到答案的话,也发个消息告诉我。^^
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
ydnhwan
2009-01-27 · TA获得超过443个赞
知道小有建树答主
回答量:222
采纳率:0%
帮助的人:318万
展开全部
你的0xC3;是如何计祥察算出来的?
用malloc申请了空间,那么就应该用malloc的返回值才对培答啊!配宴慧~
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式