簡體   English   中英

在Delphi中通過COM支持在DLL和.EXE之間切換

[英]Switch between DLL and .EXE with COM Support in Delphi

我有以下情況:

我有一個delphi應用程序{$APPTYPE GUI} APP1

如果啟動APP1 ,它將在beginend.之間運行代碼end. ,應該是應該的。

稍后, APP1將被轉換為DLL(另一個應用程序將執行該操作APP2 )。

APP2 IMAGE_FILE_DLL標志添加APP1NTFileHeader中的Characteristics中。 然后, APP2嘗試使用LoadLibrary加載DLL( APP1 )(或通過其他COM命令加載dll),但返回錯誤:

Windows在初始化COM庫時遇到內部錯誤。

我已經用C項目完成了所有這些工作,並使用了WinMain函數。 但是,它似乎無法在Delphi中工作( APP1不能作為DLL啟動)。 如何將APP1轉換為正常工作的DLL?

編輯:

我正在嘗試將此代碼從C移植到Delphi: http : //level-23.info/forum/showthread.php?14721-UAC-Bypass-for-Windows-7-RTM-SP1-Windows C -DP& p = 31749

我已經正確移植了,一切正常,但是CRYPTBASE.dllAPP1 )無法啟動。 (請參見上面的錯誤)

簡而言之:創建一個delphi應用程序,在文件頭中添加IMAGE_FILE_DLL特性。 將其重命名為CRYPTBASE.dll ,並將其復制到C:\\ Windows \\ System32 \\ sysprep。 然后啟動sysprep.exe

此處的信息: http : //www.pretentiousname.com/misc/W7E_Source/win7_uac_poc_details.html

根據慣例, WinMain只是一個名稱,用作可執行文件的入口點。 DLL的約定是使用名稱DllMain Windows加載器不搜索WinMain,而LoadLibrary不搜索DllMain,它僅調用pe標頭中的入口點。

Delphi都不使用,入口點的導出名稱是start。

WinMain簽名不同於DllMain(WinMain具有四個參數),我的建議是聲明一個函數DllMain並將其導出到您的exe中:

function DllMain(hinstDLL: THandle; fdwReason: DWORD; lpvReserverd: Pointer): BOOL; stdcall;
begin
  // do something
end;

  exports
    DllMain;

將您的exe修改為dll的代碼(應以內存為准)應將入口點設置為DllMain(通過走EAT獲取其地址)。

另外:確保重新定位表時,DLL不要求刪除它的重定位表(在發布模式下),因為DLL需要它。

我認為您根本不應該這樣做。 在構建EXE和DLL時,會以不同的假設來編譯代碼,如果僅翻轉標記並更改擴展名,它將無法正常工作。

嘗試類似的方法是進行實驗和學習的好方法,但這對生產來說是個壞主意。

與“以EXE方式運行我的DLL”相比,更具體地告訴我們您要實現的目標。 為什么需要將DLL作為EXE運行?

例如,您可以構建DLL,然后使用rundll32加載並調用它。 如果COM需要此功能,則可以構建一個COM主機exe,並依靠COM的自動編組來實現“好像我的代碼在同一進程中”的效果。 所有這些都已經存在於COM中。

暫無
暫無

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

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