如何使用C++从RAM运行可执行文件?

Arm*_*yan 7 c++ windows winapi

如何使用C++从RAM运行可执行文件?

可执行文件在RAM中,我知道地址,如何从我的程序调用该程序?

Oli*_*ver 10

这种事情通常来自世界的黑暗角落.;-)

结合像metasploit这样的工具,在ram中创建进程会很棒,所以有几个人试图重新实现CreateProcess()中发生的所有事情.过了一会儿,他们发现它太复杂了(请参阅PDF网站12f)以使其工作,他们试图找到另一个解决方案,它在这里:他们用一个共同的程序调用一个普通的CreateProcess()(例如notepad.exe),但他们用ThreadSuspended启动它.然后他们在这个过程中注入了一个新线程,它将从内存中填充.之后他们告诉这个线程运行,所以他们从内存中获得了一个新进程.

所以这只是全局,并且这是完全混乱(通常不是正确的方式)来做这些事情.如果您真的对这部分感兴趣,那么您有想法搜索.

顺便说一句,不要以为你可以在C#中做到这一点.这通常在C/C++甚至Assembler中完成......


Mar*_*n B 6

你的意思是你已经将EXE文件的内容加载到RAM中,现在想要运行该可执行文件吗?

既然你在谈论EXE,我认为你是在Windows下运行的.据我所知,Windows无法做到这一点 - 您唯一的选择是将可执行文件保存回文件并运行(CreateProcess例如,使用).

编辑以下是运行该过程的方法.

在C++中:

STARTUPINFO si;
PROCESS_INFORMATION pi;

ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));

if(!CreateProcess("myfilename.exe", NULL, NULL, NULL, FALSE, 0, NULL, 
    NULL, &si, &pi ))
{
    // An error occurred
}
Run Code Online (Sandbox Code Playgroud)

在C#中:

using System;
using System.Diagnostics;

Process.Start("myfilename.exe");
Run Code Online (Sandbox Code Playgroud)


Adr*_*ore 1

您的意思是与与您的应用程序同时运行的另一个应用程序进行通信?这取决于您使用的操作系统。无论如何,维基百科有一篇关于进程间通信的文章,其中展示了一些基本技术。