2011-03-18 23 views
5

查看OSR OnlineNtInternals之類的各種頁面後,看起來好像NtCreateProcess(和ZwCreateProcess)指定給內存段的句柄是可選的有沒有可執行支持的圖像的過程?

這是否意味着我們可以擁有沒有可執行映像支持的進程?如果是這樣,他們可能(或他們)有可能使用什麼?這是否意味着我們可以將一個可執行文件完全複製到內存中,然後甚至從磁盤上刪除該文件,並讓該過程繼續運行?這似乎是一個非常有用的功能。

回答

4

如果部分(win32域中的文件映射)爲NULL,它將使用父進程的部分。使用NULL並分配新內存並指向EIP(或使用頁面文件映射)可能是可能的,但使用NtCreateProcess會有問題,它沒有記錄,並且不像CreateProcess那樣向win32子系統註冊。 (如果你只想使用ntdll導出,這可能是好的)

在Win9x,NT4和2000上,你可以使用here列出的骯髒技巧在運行時將自己從磁盤上刪除。

其他選項:

  • 使用驅動程序,就可以加載了這之後被刪除(在sysinternal工具做到這一點)
  • 使用主機的過程;啓動Explorer.exe,CMD.EXE或RUNDLL32.EXE暫停,並使用遠程線程注入+代碼(當然,這意味着存在磁盤上的EXE文件,但沒有你的代碼是在它)
+0

我對Posix'fork'機制不太熟悉,但是你認爲,因爲使用了父進程的部分,所以可以用它在Windows上實現'fork'? (和+1,感謝文件刪除信息,這很有趣!) – Mehrdad 2011-03-18 02:41:35

+0

@Mehrdad:根據2008年的http://www.eggheadcafe.com/software/aspnet/32040421/ntcreateprocess-and-fork.aspx,Cygwin大家都嘗試使用NTCreateProcess分叉和失敗,我不知道自那時以來事情是否有所改變,但你可以檢查他們的來源... – Anders 2011-03-18 02:44:34

+0

:哦,這太酷了!我想我會嘗試(第十億次)看看我是否可以編寫自己的'CreateProcess'版本...祝我好運! :] – Mehrdad 2011-03-18 02:50:42

2

我只是想自己創建一個包含非映像支持的Section對象的流程。 :)

結果呢?

NtCreateProcess返回:

STATUS_SECTION_NOT_IMAGE 
// An attempt was made to query image information on a section which 
// does not map an image. 

因此很明顯,過程需要圖像支持(假設你沒有修改內核不這樣做)。