繁体   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