從記憶體緩衝區建立進程
在這篇文章中,我們將探索一種直接從記憶體緩衝區產生進程的技術,而不需要文件儲存。這可能是涉及程式碼注入或安全修補的有用場景,例如在提供的背景故事中。
技術分解
Windows 為 CreateProcess API 提供了 CREATE_SUSPENDED 標誌,允許進程保持掛起狀態,直到呼叫 ResumeThread 函數。此視窗提供了在執行之前操作進程記憶體和上下文的機會。
-
掛起並檢查進程:使用CreateProcess(CREATE_SUSPENDED) 掛起進程並使用以下命令檢索掛起線程的上下文GetThreadContext.
-
識別基址:
EBX 暫存器將包含指向進程環境塊(PBE) 結構的指標。 ImageBaseAddress 可在 PBE 內的偏移 8 處找到。 -
準備記憶體中EXE:
如果掛起進程和記憶體中EXE 的基底位址與記憶體中的相匹配EXE 小於或等於大小,使用WriteProcessMemory 將其直接寫入掛起進程的內存。 -
需要魔法:
如果不滿足步驟 3 中的條件,則取消映射原始映像 ( ZwUnmapViewOfSection),使用 VirtualAllocEx 分配內存,並使用 WriteProcessMemory 寫入內存中 EXE。 -
修補 PEB 和線程上下文:
使用記憶體中 EXE 的基底位址更新掛起進程的 ImageBaseAddress ,修補線程上下文的 EntryPoint 位址,並使用 SetThreadContext 儲存變更的上下文。 -
恢復執行:
使用 ResumeThread 恢復掛起的程序以執行記憶體中的 EXE。
結論
透過執行以下步驟,可以從記憶體緩衝區中建立流程,從而為程式碼注入和安全修補場景提供彈性。
以上是如何在沒有檔案儲存的情況下直接從記憶體緩衝區建立進程?的詳細內容。更多資訊請關注PHP中文網其他相關文章!