簡體   English   中英

使用Windows API和C ++,如何從硬盤驅動器加載exe並在其自己的線程中運行它?

[英]Using the windows api and C++, how could I load an exe from the hard drive and run it in its own thread?

為了學習,我正在嘗試執行操作系統在啟動程序時的工作,即。 解析PE文件並為其提供執行線程。

如果我有兩個名為foo.exe的exe文件,另一個名為bar.exe的exe文件,我如何讓foo.exe將bar.exe的內容加載到內存中,然后在自己的線程中從那里執行它? 我知道如何使用MapViewOfFile或通過將硬盤驅動器上的內容簡單地加載到緩沖區中來將其存儲到內存中。 我假設只是將磁盤上的bar.exe內容復制到其自己的掛起線程中,然后運行它將無法正常工作。 我對PE文件的內部內容不熟悉。 當然,非常感謝所有幫助:)

首先,蘭伯特是正確的。 EXE在自己的進程中運行。 無法將EXE加載到另一個進程的原因是因為它們沒有為相對尋址而編譯,並且不容易將其代碼重新映射到另一個地址。 開發人員使用Win32系統調用“ CreateProcess”啟動其他EXE程序。 但是我不認為這是你的問題...

我想您想知道如何從二進制文件手動將代碼加載到運行的進程中(並使它在專用線程上運行)。 大多數開發人員只是調用LoadLibrary / GetProcessAddress將DLL映射到進程空間,並調用CreateThread啟動線程。

因此,我想您基本上是在問,“我如何實現內核和操作系統的核心組件,即加載器?” 或換一種說法,“我如何自己實現CreateProcess和LoadLibrary?”

OS加載程序不僅僅將二進制文件解析到內存並將指令指針設置為代碼的第一行。 它還會加載其他依賴的DLL。 因為該進程可能已經分配了其他代碼以在DLL被編譯到的目標地址上運行,所以它可能還必須修復DLL的地址以將其加載到另一個地址。 我可能會錯過許多其他步驟,包括為二進制代碼本身分配虛擬內存。

我確實建議查看Richter一書中有關進程,線程和DLL的章節。 他討論了這一點以及有關解析DLL的PE格式的一些細節。

研究Linux內核如何將.SO文件加載到進程空間中的實現也可能是值得進行的研究。

可執行文件始終作為單獨的進程運行。 它不能在其他進程線程中運行。 但是,您可以從其他進程的線程中將可執行文件作為進程運行。 看看CreateProcess()函數!

由於我個人不喜歡“為什么還要這樣做?”的答案,因此這里的鏈接將非常有幫助。 但是要警告您,您可能不會成功,因為EXE根本不希望在另一個進程的線程中運行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM