[英]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.