[英]Switch between DLL and .EXE with COM Support in Delphi
我有以下情況:
我有一個delphi應用程序{$APPTYPE GUI}
。 ( APP1
)
如果啟動APP1
,它將在begin
和end.
之間運行代碼end.
,應該是應該的。
稍后, APP1
將被轉換為DLL(另一個應用程序將執行該操作APP2
)。
APP2
將 IMAGE_FILE_DLL
標志添加到APP1
的NTFileHeader
中的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.dll
( APP1
)無法啟動。 (請參見上面的錯誤)
簡而言之:創建一個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.