2015-05-04 46 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,瞭解其他方法。

相關問題