CreateRemoteThread()用于将函数注入另一个进程

时间:2010-10-26 09:46:46

标签: c# multithreading


我有一个关于远程线程的问题。我读过Mike Stall的文章:http://blogs.msdn.com/b/jmstall/archive/2006/09/28/managed-create-remote-thread.aspx
我想创建一个远程线程,在另一个进程中执行委托,就像Mike Stall那样。但是,他在目标进程中声明了委托,为它获取了一个内存地址,然后他使用该地址从另一个进程创建了远程线程。不能修改目标进程的代码。 所以,我不能使用他的例子,除非我可以在目标进程中分配内存,然后WriteProcessMemory()使用我的委托。 我尝试使用VirtualAllocEx()在目标进程中分配空间,但它总是返回0。 这就是它到目前为止的样子。

Console.WriteLine("Pid {0}:Started Child process", pid);
uint pidTarget= uint.Parse(args[0]);
IntPtr targetPid= new IntPtr(pidTarget);

// Create delegate I would like to call.
ThreadProc proc = new ThreadProc(MyThreadProc);
Console.WriteLine("Delegate created");
IntPtr fproc = Marshal.GetFunctionPointerForDelegate(proc);
Console.WriteLine("Fproc:"+fproc);
uint allocSize = 512;
Console.WriteLine("AllocSize:" + allocSize.ToString());
IntPtr hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, pidParent);
Console.WriteLine("Process Opened: " + hProcess.ToString());
IntPtr allocatedPtr = VirtualAllocEx(targetPid, IntPtr.Zero, allocSize, AllocationType.Commit, MemoryProtection.ExecuteReadWrite);
Console.WriteLine("AllocatedPtr: " + allocatedPtr.ToString());

现在我的问题是:

  1. 在上面的代码中,为什么VirtualAllocEx()不起作用?它已使用Kernel32中的DLLImport导入。 allocatedPtr始终为0.

  2. 如何计算分配大小?有没有办法可以看到代表可能需要多少空间,或者我应该把它留作一个大常数?

  3. 如何在所有这些之后调用WriteMemory()来让我的代表进入其他流程?

  4. 提前谢谢。

1 个答案:

答案 0 :(得分:1)

该博客文章的非常值得怀疑。在一般情况下不可能完成这项工作。它只能起作用,因为:

  • 已知CLR可用
  • 要执行的方法的地址已知
  • 它不需要在目标进程中注入DLL
  • Windows安全不太可能阻止这种特殊方法

通过将客户端进程交给它所需要的一切来实现它所获得的线程。当目标进程合作时,CreateRemoteThread的更典型用法是这样做。换句话说,你没有CLR,你必须为代码注入一个DLL,代码无法管理,你必须处理重新定位的DLL,Windows将不会这么做。

Anyhoo,解决你的问题:你没有检查任何错误,所以你不知道出了什么问题。确保您的[DllImport]声明具有SetLastError = true,检查失败的返回值(此处为IntPtr.Zero)并使用Marshal.GetLastWin32Error()来检索错误代码。