如何使用C ++从RAM运行可执行文件?
可执行文件在RAM中,我知道地址,如何从我的程序调用该程序?
答案 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!