從記憶體緩衝區載入EXE 而不寫入檔案
許多開發人員遇到了從記憶體緩衝區啟動EXE 而不需要寫入入文件的挑戰用於文件創建。本文採用 CreateProcess 函數和源自學術研究的技術,深入探討了這個常見問題的解決方案。
Windows 提供了 CreateProcess 函數,可以建立新進程。 CREATE_SUSPENDED 標誌允許暫停進程,直到明確恢復為止。這種暫停提供了操作進程上下文所需的時間。
GetThreadContext 函數會擷取暫停執行緒的上下文,其中 EBX 包含指向進程環境區塊 (PEB) 結構的指標。 ImageBaseAddress 對於定位進程的基底位址至關重要,它儲存在 PEB 內的偏移量 8 處。
一旦確定了掛起進程的基底位址,就可以載入記憶體中的 EXE。如果記憶體中的EXE和掛起的進程的基底位址對齊,且記憶體中的EXE的大小小於或等於掛起的進程的大小,則可以使用WriteProcessMemory直接覆蓋掛起的進程的記憶體空間。
但是,如果不符合上述條件,則需要採取額外的步驟。 ZwUnmapViewOfSection 函數取消映射原始影像,而 VirtualAllocEx 在掛起進程的記憶體空間中分配足夠的記憶體。然後使用 WriteProcessMemory 將記憶體中的 EXE 寫入此分配的空間。
隨後,記憶體中的 EXE 的 BaseAddress 被修補到掛起進程的 PEB->ImageBaseAddress 中。使用線程上下文的 EAX 暫存器,以記憶體中 EXE 的入口點重寫掛起程序的 EntryPoint 位址。 SetThreadContext 函數儲存變更後的執行緒上下文,最後 ResumeThread 執行修補後的程序。
透過這個精心設計的流程,開發人員可以繞過將 EXE 寫入檔案的需要,並從記憶體緩衝區無縫啟動它,確保高效、安全地分發更新和修補程式。
以上是如何從記憶體緩衝區啟動 EXE 而不寫入檔案?的詳細內容。更多資訊請關注PHP中文網其他相關文章!