Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;在内存中运行字节数组_C++_Memory - Fatal编程技术网

C++ C++;在内存中运行字节数组

C++ C++;在内存中运行字节数组,c++,memory,C++,Memory,我想做一个我认为叫做发射器的东西?其概念是将所有二进制文件写入缓冲区,然后将缓冲区加载到内存中。我已经看到这段代码跳转了很多次(我已经编写了exe,所以我可以访问其中的代码): 我最初的想法是,可能是空字节影响了执行,导致了访问冲突,因此经过一些研究,我发现一个格式为“/x41/x41/…x41/”的消息框外壳代码没有空字节,但仍然不起作用。我有点不知所措,因为关于这方面的信息不多。有没有人参考过一些好文章或有用的教程,因为我发现这些都不太有用。谢谢大家抽出时间 首先,数组是包含可执行文件的表示

我想做一个我认为叫做发射器的东西?其概念是将所有二进制文件写入缓冲区,然后将缓冲区加载到内存中。我已经看到这段代码跳转了很多次(我已经编写了exe,所以我可以访问其中的代码):


我最初的想法是,可能是空字节影响了执行,导致了访问冲突,因此经过一些研究,我发现一个格式为“/x41/x41/…x41/”的消息框外壳代码没有空字节,但仍然不起作用。我有点不知所措,因为关于这方面的信息不多。有没有人参考过一些好文章或有用的教程,因为我发现这些都不太有用。谢谢大家抽出时间

首先,数组是包含可执行文件的表示,还是包含可执行机器代码?如果是前者,它可能无法工作:大多数可执行文件格式都是从操作系统用来加载程序的各种元数据开始的;可执行机器代码位于文件的后面


第二,您的系统是否使用类似于DEP的东西?您的操作系统可能正在将阵列标记为不可执行,因此尝试执行它将失败。

相当一段时间以来,所有现代操作系统都实现了某种形式的。这意味着您不能将代码放在内存中的某个位置并运行它;必须先标记内存区域以允许执行。原因是安全性——这使得利用远程代码执行漏洞变得更加困难

这也意味着在你尝试像这样愚蠢的事情之前,你应该好好想想,因为这会在你的操作系统试图保护你的过程中留下一个巨大的漏洞

因此,在从内存运行代码之前,必须将相关区域标记为可执行区域

在Windows下,这可以通过函数完成。但是,它不能用于任意内存区域;它必须在页面边界对齐,并且页面必须使用相同的调用进行分配。所以,最终,你会

DWORD old_protect;
LPVOID executable_area = VirtualAlloc(NULL, 11414, MEM_RESERVE, PAGE_READWRITE);

memcpy(executable_area, Rawcode, 11414);
VirtualProtect(executable_area, 11414, PAGE_EXECUTE, &old_protect);

int(*f)() = (int(*)()) executable_area;
f();

// Note: RAII this in C++. Restore old flags, free memory.
VirtualProtect(executable_area, 11414, old_protect, &old_protect);
VirtualFree(executable_area, 11414, MEM_RELEASE);
(对不起,迟了回答)

从数组执行字节是个坏主意。它不跨平台,并且会导致巨大的安全风险

执行外部代码的一种更安全的方法是字节码解释器。您可以限制程序的访问权限,使其只接触所需的内容。缺点是您要么编写自己的编译器,要么自己编写原始字节码

此处链接了一个好的教程:


另一个不太安全的解决方案是使用DLL。(动态链接库)这样您就不必编写自己的编译器。

没关系,这应该是一条注释,上面写着“警告:可能无法工作”-他把指针弄错了。Hmmm。我从来没有想过这样的事情。感谢我可能需要找出一些不同的方法,我想在类似Unix的系统(MacOS、Linux等)上,您需要使用
mmap
代替
VirtualAlloc
mprotect
而不是
VirtualProtect
。谢谢。这仍然会产生一个错误,但我认为我现在已经超越了我的能力。错误是:Cons3.exe中0x66ACF8C5(msvcr120.dll)处的未处理异常:0xC0000005:访问冲突写入位置0x01070000。我想是时候回去玩更简单的东西了,直到我更好地掌握了记忆区域的工作原理。谢谢,嗯…函数是自我修改的吗?有时你会在小的演示中看到。在这种情况下,您必须使用
PAGE\u EXECUTE\u READWRITE
而不是
PAGE\u EXECUTE
。我已经尝试过了,但没有成功。稍后,我将在olly中打开程序,看看是否可以看到代码中的深层内容。VisualStudio没有世界上最好的调试器,哈哈。如果我发现了什么,我会发布它。谁知道呢?也许其他人会在这里找到他们需要的知识。@404Usernamenotfound您需要在编写代码之前剥离可执行文件头和/或元数据,进行一些修复和其他整理工作,然后才能成功执行。如果这是一个PE文件,则会记录其格式,并且有许多为其创建加载程序的示例。如果它是EXE,则可能无法工作,因为它可能不包含重新定位信息。
DWORD old_protect;
LPVOID executable_area = VirtualAlloc(NULL, 11414, MEM_RESERVE, PAGE_READWRITE);

memcpy(executable_area, Rawcode, 11414);
VirtualProtect(executable_area, 11414, PAGE_EXECUTE, &old_protect);

int(*f)() = (int(*)()) executable_area;
f();

// Note: RAII this in C++. Restore old flags, free memory.
VirtualProtect(executable_area, 11414, old_protect, &old_protect);
VirtualFree(executable_area, 11414, MEM_RELEASE);