2015-05-04 31 views
0

注意:不询问启动外部进程或监视线程。是否有可能作为子线程执行命令行应用程序?

是否有可能,给出byte[]代表命令行.exe应用程序,在我的进程中执行它,作为线程? (鉴于此应用程序和我的应用程序之间的处理器架构是相同的)。

如果用户打开任务管理器,他们不应该看到或有机会杀死“子进程”,同时不杀死父应用程序理论上使这种方法最好)。

我想动态地导入.exe作为参考,并调用main(args),但不知道这将分崩离析,因为应用程序不一定有控制台上下文来处理。

这似乎是类似Windows服务的主机上如何表现,但还没有看到它在管理世界做...

+0

有可能,是的。你应该这样做,可能不是。使用不安全的代码,您可以始终写出字节,然后将执行指针移至该代码,但出于安全原因,将字节写入文件并执行文件几乎肯定是一个更好的主意。 – Servy

+0

极不可能。 “儿童进程”可能有许多关于在自己的流程中开始运行的假设。 – xxbbcc

+0

@Brandon你究竟在做什么? – xxbbcc

回答

1

我想的动态导入.exe文件作为参考某种方式 和调用main(args),但不知道这将崩溃多快 因为应用程序不一定会有一个控制台上下文来处理 。

虽然执行任意 exe可能证明是困难的。

合作

它可以以合作的方式由例如进行将它作为新装配装入新的AppDomain。例如参见Executing Code in Another Application Domain。我相信这个例子接近你的意图。

非合作的方式

也有更棘手的非合作的方式,由此,(潜在的恶意)代码注入本身在目标应用程序的进程空间中。那是用来实现这一目标的一些方法摘要列出here

  • 可以HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs下列出一个DLL,它会被加载到每一个(新的)进程链接到user32.dll中(即几乎每一个用户模式进程)。
  • 利用错误地加载一个按路径加载库的函数的弱点(通常是将目标进程加载的dll放在搜索路径中更高的位置),或者简单地用你自己的代替现有的库。
  • 通过CreateRemoteThreadCreateRemoteThreadEx。这有点复杂(有趣),但可以让你为现有流程做到这一点。一个例子可以发现here
  • 通过SetWindowsHookEx。这是执行正在运行的流程的最简单方法。
  • 使用SuspendThread或NtSuspendThread函数挂起所有线程,然后使用SetThreadContext或NtSetContextThread函数修改应用程序中现有线程的上下文以执行注入的代码。
  • 写一个shim

通过将.NET运行时加载到非托管进程中,可以将.NET程序集注入非托管进程,如this article中所述。

您还可以查看CInject project on Codeplex,了解其他方法。

相关问题