由于进程是计算机程序的实例,包含程序代码和它当前的活动状态,因此我尝试了以下操作:
- 解析我的进程并检索一个字节数组。
- 执行这些字节。
我的问题是,我检索到了程序代码和它当前的活动状态,而我只对第一部分感兴趣。
以下是如何检索进程“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);
执行时出现以下错误:
'mscorlib.dll' 中发生了类型为 'System.BadImageFormatException' 的未经处理的异常
与此同时,如果我从我的“foo.exe”程序中检索字节并执行它们,则可以正常工作,如下所示。
Byte[] bytes = File.ReadAllBytes(pathToFooExe);
Assembly asm = Assembly.Load(bytes);
我从进程中检索到的字节数组比我从“foo.exe”文件中检索到的字节数组要大得多。因为我认为我还检索了当前进程的活动。
如何仅检索我的进程的代码部分?
它是否从IntPtr.Zero开始,还是稍后?什么时候停止?
非常感谢您的帮助!