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

时间:2016-05-22 08:24:03

标签: c# windows process bytearray exe

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

  • 解析我的进程并检索一个字节数组。
  • 执行这些字节。

我的问题是我检索了程序代码及其当前活动,而我只对第一部分感兴趣。

这是我如何检索我的进程的字节" foo" :

 public static byte[] retrieveProcessBytes(String processName) {
        Process process = ApplicationFinder.FromProcessName(processName).First();
        var sharp = new MemorySharp(process);

        List<byte> bytes = new List<byte>();
        IntPtr ptr = IntPtr.Zero;
        try
        {
            while (true) {
                bytes.Add(sharp.Read<byte>(ptr, 1)[0]);
                ptr = IntPtr.Add(ptr, 1);
            }
        }
        catch (Exception e) {
            Console.Write("Exception caught : " + e);
        }
        return bytes.ToArray();
    }

以下是我尝试执行它的方法:

byte[] bytes = retrieveProcessBytes("foo");
Assembly asm = Assembly.Load(bytes);
Object[] Args = new Object[0];
asm.EntryPoint.Invoke(null, Args);

它给了我以下错误:

  

未处理的类型&#39; System.BadImageFormatException&#39;发生在mscorlib.dll

同时,如果我从我的&#34; foo.exe&#34;中检索字节。编程并执行它们,如下所示,它可以工作。

Byte[] bytes = File.ReadAllBytes(pathToFooExe);
Assembly asm = Assembly.Load(bytes);

我从我的进程中检索的字节数组远远大于我从&#34; foo.exe&#34;中检索到的字节数组。文件。因为我想我也检索当前的流程活动。

如何只检索流程的代码部分?

它是从IntPtr.Zero开始还是以后开始?我什么时候停止?

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

1 个答案:

答案 0 :(得分:0)

如果您阅读有关Assembly.Load功能的信息,您可以看到您使用不当。仅仅因为它允许输入字节数组并不意味着你正在为它提供一个合适的字节数组。

Assembly.Load(Byte[])

  

使用包含已发射装配的基于公共对象文件格式(COFF)的图像加载装配。程序集将加载到调用者的应用程序域中。

COFF file format

这显然不是你在做什么的。基本上,你正在做的事情是无法完成的。 CherryDT在他的评论中也给出了很好的理由。