2011-06-08 175 views
4

直到現在,我還有某種插件機制,我使用LoadLibrary和GetProcAddress加載dll來創建具體對象並返回一個通用接口。這工作得很好,直到我決定其中一個DLL應該是一個EXE。C++/CLI:使用LoadLibrary + GetProcAddress和exe

LoadLibrary's documentation說它也可以用於exe的,所以我給它一個鏡頭。該exe被加載沒有錯誤,作爲GetProcAddress。但是,當我嘗試調用具體對象的構造函數時,出現訪問衝突。

我認爲這會發生,因爲加載一個exe不會加載它使用的所有dll。所以我嘗試使用LoadLibrary加載它們,但我得到了同樣的錯誤。 對此有何建議?

這裏是我的代碼(混合C++/CLI):

Interface* MCFactory::LoadInstanceFromAssembly(String^concreteAssemblyName, String^param){ 
    string fullPathToAssembly = ""; 
    fullPathToAssembly += FileSystem::GetPathToProgramDirectory(); 
    fullPathToAssembly += "\\" + marshal_as<string>(concreteAssemblyName); 

    MODULE hDLL = AssemblyLoader::GetInstance().LoadAssembly(fullPathToAssembly); 

    Interface* pObject = NULL; 
    if (hDLL != NULL){ 
     t_pCreateInstanceFunction pCreateInstanceFunction = 
      (t_pCreateInstanceFunction) ::GetProcAddress (hDLL, CREATE_INSTANCE_FUNCTION_NAME.c_str()); 

     if (pCreateInstanceFunction != NULL){ 
      //Yes, this assembly exposes the function we need 
      //Invoke the function to create the object 
      pObject = (*pCreateInstanceFunction)(marshal_as<string>(param));    
     } 
    }   
    return pObject; 
} 

(AssemblyLoader ::的GetInstance()LoadAssembly僅僅是::調用LoadLibrary的包裝。)

回答

2

很可能是有用的。

http://www.codeproject.com/Articles/1045674/Load-EXE-as-DLL-Mission-Possible

的想法是修補IAT,然後調用CRT。當然,EXE必須是可重定位的,並且默認情況下(ASLR)。

+0

當然,這種方法需要對EX​​E進行一些非常有創意的更改。它可能適用於特定情況,但不適用於一般情況。 – 2015-11-15 19:23:08

+0

我在那篇文章中所說的一切都沒有記錄。因此,只要條件保持不變(即現有的重新配置,CRT稱爲IAT修補),它就會工作。 – Michael 2015-11-15 20:06:01

+0

咦?你正在使用的每一個技巧都是做出無證的假設。向我展示一個官方的微軟文檔,說可以在第二個模塊中調用WinMainCRTStartup'(重要的觀察:每次'WinMainCRTStartup'調用'GetModuleHandle(0)'時,它都沒有得到它正在初始化的模塊的句柄,而是流程的主要模塊,包括清單在內的所有資源都不會被正確找到。)這僅僅是一個開始。 – 2015-11-15 20:34:59

6

您可以使用LoadLibraryGetProcAddress您的進程的主要可執行文件,這允許反向(.exe到.dll)的動態導出。

由於.exe代碼不可重定位,因此除了訪問資源/數據外,不能將第二個.exe文件加載到進程內存空間中。 (純MSIL的.exe文件是一個例外,因爲文件中沒有任何代碼,這一切都是由JIT生成的。)

基本上,LoadLibrary上的.exe是有用的,只有當

  • 的.exe文件的主要流程是exe文件,在這種情況下,你還不如用GetModuleHandle

  • LOAD_LIBRARY_AS_DATAFILE標誌用於

+0

啓用ASLR是否可以將多個.exes加載到單個進程中? – ildjarn 2011-06-09 02:15:31

+0

@ildjarn:你的意思是一個ASLR兼容性編譯器選項,而不是OS設置?我不這麼認爲。 – 2011-06-09 02:29:43

+0

是的,這就是我的意思。只是好奇。 – ildjarn 2011-06-09 02:32:07