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

时间:2009-08-27 07:41:07

标签: c++ windows winapi

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

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

5 个答案:

答案 0 :(得分:10)

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

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

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

顺便说一下,不要以为你可以在C#中做到这一点。这通常在C / C ++或甚至汇编程序中完成......

答案 1 :(得分: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
}

在C#中:

using System;
using System.Diagnostics;

Process.Start("myfilename.exe");

答案 2 :(得分:1)

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

答案 3 :(得分:1)

与从磁盘运行它的方式相同。您的程序不知道它是否已经加载(即在RAM中)或磁盘上。这是由操作系统抽象出来的。

答案 4 :(得分:1)

Mabye这可以帮到你: http://www.codeproject.com/Articles/13897/Load-an-EXE-File-and-Run-It-from-Memory

PS:编写恶意软件并非违法(即大多数国家;))使用is!