2010-08-20 50 views
1

lpBuffer是指向(二進制)資源的第一個字節的指針。我怎樣才能立即執行它,而不會將其轉儲到臨時文件?直接執行二進制資源

HMODULE hLibrary; 
HRSRC hResource; 
HGLOBAL hResourceLoaded; 
LPBYTE lpBuffer; 

hLibrary = LoadLibrary("C:\\xyz.exe"); 
if (NULL != hLibrary) 
{ 
    hResource = FindResource(hLibrary, MAKEINTRESOURCE(104), RT_RCDATA); 
    if (NULL != hResource) 
    { 
     hResourceLoaded = LoadResource(hLibrary, hResource); 
     if (NULL != hResourceLoaded)   
     { 
      lpBuffer = (LPBYTE) LockResource(hResourceLoaded);    
      if (NULL != lpBuffer)    
      {     
       // do something with lpBuffer here    
      } 
     }  
    } 
    FreeLibrary(hLibrary); 
} 

回答

2

這裏沒有爲Windows內置的函數;你唯一的選擇是CreateProcess,它需要一個EXE文件。

可以自己分析可執行文件格式。您將有效地重新創建LoadLibrary函數。

下面是如何加載DLL和調用其中的函數的說明:http://www.joachim-bauch.de/tutorials/loading-a-dll-from-memory/。爲了適應您的EXE,您需要遵循相同的重定位和導入步驟。一旦你完成了,你會打電話給EXE的入口點。 (本教程介紹如何調用DLL的導出函數。)

根據EXE中的內容,您可能會在將問題直接加載到現有過程中時遇到問題。例如,您自己的EXE會執行各種Win32和C初始化代碼,並且嵌入式EXE可能會嘗試再次執行相同的初始化。如果這成爲一個問題,您的選擇是將嵌入式EXE放入其自己的過程中;然後,您又回到創建臨時文件並調用CreateProcess

+0

事情並不像那樣。你不能只執行已經作爲資源加載的代碼。必須執行重新定位。進口必須解決。 – wj32 2010-08-20 07:58:17

+0

事情可以這樣工作,因此我的「你的格式是什麼」問題。 OP沒有提及二進制資源中的內容。 – 2010-08-20 07:59:53

+0

這是一個exe文件 – Bubblegun 2010-08-20 08:06:33

1

如果資源是PE文件,那麼AFAIK是沒辦法的。如果這是一個簡單的編譯過程,請嘗試Tim的竅門。

編輯: 經過Tim的答案更新後,它是最完整的答案。

0

這就是爲什麼你必須讓操作系統處理這幾個原因:

  • EXE不能簡單地加載到內存中,然後執行,立竿見影。 某些任務必須在執行開始之前執行,例如在內存中佈置段(包括設置堆棧),然後將機器指令中的內存引用調整到特定的內存位置(又稱重定位)(可能是動態的加載DLLs)等

  • 這些日子的EXE文件格式實際上是一個衆多的格式,你將必須知道和相應處理。它可能包含DOS的可執行代碼(具有MZ/ZM標頭),Windows(PE —可移植可執行文件)或.NET(也可能是PE)。

  • 新的處理器將擁有一個不執行位(谷歌如NX bit基本上禁止的駐留在數據段代碼執行。也就是說,如果你加載二進制資源(包含代碼)到內存中,它會駐留在數據段。如果您的處理器具有NX Bit功能,和OS使得使用它,你將不會被允許執行該代碼。

出於所有這些原因(和可能更多),最好讓操作系統處理你的EXE文件。對於NX機制(或類似的機制),你沒有別的選擇,因爲在操作系統可以設置代碼段。所以你可以通過選擇一個不太強大的可執行格式(如.com)來擺脫前面指出的前兩個問題,但是你根本無法擺脫在用戶空間中運行的正在運行的程序中的NX機制。