C#如何从进程中检索代码并运行它?

C#如何从进程中检索代码并运行它?,c#,windows,process,bytearray,exe,C#,Windows,Process,Bytearray,Exe,由于进程是计算机程序的实例,包含程序代码及其当前活动,因此我尝试了以下操作: 解析我的进程并检索字节数组 执行这些字节 我的问题是,我检索程序代码及其当前活动,而我只对第一部分感兴趣 下面是我如何检索进程“foo”的字节: 它给出了以下错误: mscorlib.dll中发生类型为“System.BadImageFormatException”的未处理异常 同时,如果我从我的“foo.exe”程序中检索字节并执行它们,如下所示,它就会工作 Byte[] bytes = File.ReadAll

由于进程是计算机程序的实例,包含程序代码及其当前活动,因此我尝试了以下操作:

  • 解析我的进程并检索字节数组
  • 执行这些字节
我的问题是,我检索程序代码及其当前活动,而我只对第一部分感兴趣

下面是我如何检索进程“foo”的字节:

它给出了以下错误:

mscorlib.dll中发生类型为“System.BadImageFormatException”的未处理异常

同时,如果我从我的“foo.exe”程序中检索字节并执行它们,如下所示,它就会工作

Byte[] bytes = File.ReadAllBytes(pathToFooExe);
Assembly asm = Assembly.Load(bytes);
从进程中检索的字节数组比从“foo.exe”文件中检索的字节数组大得多。因为我假设我也检索了当前的流程活动

如何仅检索流程的代码部分

它是从IntPtr.Zero开始还是更晚?我什么时候停


任何帮助都将不胜感激,提前感谢。

如果您阅读了有关函数汇编.Load的内容,您会发现您使用它不正确。仅仅因为它允许一个字节数组作为输入,并不意味着你正在给它一个合适的字节数组

使用基于公共对象文件格式(COFF)的映像加载程序集,该映像包含发出的程序集。程序集加载到调用方的应用程序域中


这显然不是你正在做的。基本上,你正在做的事情是做不到的。CherryDT在上面的评论中也为您提供了很好的理由。

这是一种非常简单的查看方式。但是你不能像那样从一个正在运行的进程中提取程序。首先,内存不是线性块,其次,进程内存中还有其他加载的模块(程序集/DLL等),第三,EXE文件没有以1:1的比例加载到内存中。有关EXE文件格式以及如何将其加载到内存的详细信息,请查看。此操作的目标是什么?可能有更好的解决方案来实现您想要的。我想比较我的进程中的代码是否与exe文件中的代码相同。如果程序在运行时经常不同,比如带有DRM或保护的程序。在您自己的进程中还是在另一个进程中?在任何情况下,您都可以专门检查代码部分和/或数据部分,并将它们与EXE文件中的相应部分进行比较(再次查看我上面发布的文件格式链接)。但是请注意,可能有第三方软件,例如Antivirus,也会在运行时修补您的代码(例如,COMODO这样做了/做了,我过去也因此遇到了问题)。
byte[] bytes = retrieveProcessBytes("foo");
Assembly asm = Assembly.Load(bytes);
Object[] Args = new Object[0];
asm.EntryPoint.Invoke(null, Args);
Byte[] bytes = File.ReadAllBytes(pathToFooExe);
Assembly asm = Assembly.Load(bytes);