我有一个关于远程线程的问题。我读过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());
现在我的问题是:
在上面的代码中,为什么VirtualAllocEx()
不起作用?它已使用Kernel32中的DLLImport导入。 allocatedPtr
始终为0.
如何计算分配大小?有没有办法可以看到代表可能需要多少空间,或者我应该把它留作一个大常数?
如何在所有这些之后调用WriteMemory()
来让我的代表进入其他流程?
提前谢谢。
答案 0 :(得分:1)
该博客文章的非常值得怀疑。在一般情况下不可能完成这项工作。它只能起作用,因为:
通过将客户端进程交给它所需要的一切来实现它所获得的线程。当目标进程不合作时,CreateRemoteThread的更典型用法是这样做。换句话说,你没有CLR,你必须为代码注入一个DLL,代码无法管理,你必须处理重新定位的DLL,Windows将不会这么做。
Anyhoo,解决你的问题:你没有检查任何错误,所以你不知道出了什么问题。确保您的[DllImport]声明具有SetLastError = true,检查失败的返回值(此处为IntPtr.Zero)并使用Marshal.GetLastWin32Error()来检索错误代码。