将字符串转换为c+中的函数+; 我一直在寻找一种方法来动态加载函数C++,现在我想我终于明白了。计划如下: 将函数作为字符串传递到C++(通过套接字连接、文件或某物)。 将字符串写入文件 让C++程序编译文件并执行它。如果有任何错误,请捕获并返回 让新执行的具有新函数的程序将函数的内存位置传递给当前运行的程序 将函数的位置保存到函数指针变量(函数将始终具有相同的返回类型和参数,因此 这简化了指针的声明) 使用函数指针运行新函数

将字符串转换为c+中的函数+; 我一直在寻找一种方法来动态加载函数C++,现在我想我终于明白了。计划如下: 将函数作为字符串传递到C++(通过套接字连接、文件或某物)。 将字符串写入文件 让C++程序编译文件并执行它。如果有任何错误,请捕获并返回 让新执行的具有新函数的程序将函数的内存位置传递给当前运行的程序 将函数的位置保存到函数指针变量(函数将始终具有相同的返回类型和参数,因此 这简化了指针的声明) 使用函数指针运行新函数,c++,memory-management,C++,Memory Management,问题是,在第4步之后,我不想让新程序继续运行,因为如果我经常这样做,许多正在运行的程序将占用线程。是否有办法关闭新程序,但保留存储新函数的内存位置?我不希望它被覆盖或提供给其他程序,而它仍然在使用中 如果你们对其他步骤也有任何建议,我们将不胜感激。可能还有其他的图书馆做类似的事情,推荐它们也不错,但这是我想研究的方法——如果不是为了完成它,那么是为了了解如何做到这一点 编辑:我知道动态链接库。这是我主要想了解的事情是如何更好地理解C++中的工作。 a如何? 这些可以在运行时链接/取消链接/替换

问题是,在第4步之后,我不想让新程序继续运行,因为如果我经常这样做,许多正在运行的程序将占用线程。是否有办法关闭新程序,但保留存储新函数的内存位置?我不希望它被覆盖或提供给其他程序,而它仍然在使用中

如果你们对其他步骤也有任何建议,我们将不胜感激。可能还有其他的图书馆做类似的事情,推荐它们也不错,但这是我想研究的方法——如果不是为了完成它,那么是为了了解如何做到这一点

编辑:我知道动态链接库。这是我主要想了解的事情是如何更好地理解C++中的工作。

a如何?

这些可以在运行时链接/取消链接/替换

或者,如果您真的想在流程之间进行沟通,您可以使用


编辑-您也可以创建。

我看不出这是如何工作的。运行新程序时,它将是一个单独的进程,因此其进程空间中的任何地址在原始进程中都没有意义

不仅如此,您要调用的代码甚至不存在于原始流程中,因此无法在原始流程中调用它


正如Nick在回答中所说,您需要一个DLL/共享库,或者必须设置某种形式的进程间通信,以便原始进程可以将数据发送到新进程,由相关函数操作,然后发送回原始进程。

步骤4。我们不能直接将内存位置(地址)从一个进程传递到另一个进程,因为这两个进程使用不同的虚拟内存空间。一个进程不能在另一个进程中使用内存。 因此,您需要通过两个进程创建共享内存。并将函数复制到此内存中,然后可以关闭新进程。 对于共享内存,如果在windows中,则看起来是创建命名共享内存

在此之后,您仍然要创建另一个内存空间来再次将函数复制到它。 其思想是,分配的普通内存只有读/写属性,如果程序员在其上执行,CPU将生成异常

因此,如果在windows中,您需要使用VirtualAlloc来分配带有标志PAGE\u EXECUTE\u READWRITE()的内存


将函数复制到
地址
后,您可以在
地址
中调用函数,但需要非常小心地保持堆栈平衡。

动态库最适合您的问题。另外,忘了启动一个不同的进程,这本身就是另一个问题,但是除了上面的文章之外,如果您正确地执行了虚拟alloc,只需在同一个“Loader”中调用您的函数,那么您就不必担心,因为您将运行相同的RAM大小绑定堆栈

真正的问题是:

1-从主程序脱机编译要加载的函数

2-从编译器生成的二进制文件中提取相关代码

3-加载字符串

1和2需要深入了解整个编译器套件,包括编译器标志选项、链接器等。。。不仅仅是IDE的按钮

如果您对1和2没有问题,您应该知道为什么使用std::string或纯char*以外的任何东西都是有害的


我可以继续整个故事,但它绝对值得一读,因为这是黑客/破解者的做法,我强烈建议普通用户使用动态库,这就是它们存在的原因。

通常我们称之为代码注入

基本上,为了安全起见,任何现代操作系统都禁止在完成初始加载后访问某些内容,因此我们必须回到操作系统范围内经过验证的动态库

也就是说,如果你有一个有效的编译代码,如果你真的想达到这个效果,你必须把你的函数加载到内存中,然后用系统特定的方式将它定义为可执行文件(清除NX位)


但让我们明确一点,您的函数必须是代码位置独立的,并且您没有动态链接器的帮助来解析符号。。。这是工作的难点。

为什么不将代码编译到动态库中呢?这是我一直在研究的一种方法。这是我想为应对it挑战而做的事情,并更好地理解c++中的工作原理。。我认为内存地址在各个进程中保持一致。在非Windows系统上,这些通常称为“共享对象”。绝对是正确的方法。
void* address = NULL;
address= VirtualAlloc(NULL,
        sizeof(emitcode),
        MEM_COMMIT|MEM_RESERVE,
        PAGE_EXECUTE_READWRITE);