为了账号安全,请及时绑定邮箱和手机立即绑定

求问在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 关注
  • 545 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信