在Delphi中使用COM支持在DLL和.EXE之间切换

时间:2013-06-03 11:44:29

标签: windows delphi winapi dll portable-executable

我有以下情况:

我有一个delphi应用程序{$APPTYPE GUI}。 (APP1

如果APP1启动,则会在其间运行代码 <{1}}和begin,就像它应该的那样。

稍后,end.将转换为DLL(另一个应用程序将执行此操作 - APP1)。

APP2 APP2标记添加到IMAGE_FILE_DLL Characteristics NTFileHeader中{/ 1}}。 然后APP1尝试使用APP2(或其他一些COM命令加载DLL)加载DLL(APP1),但它返回错误:

  

Windows初始化COM时遇到内部错误   库。

我已经使用LoadLibrary项目完成了所有这些并使用了C函数。但是它似乎在Delphi中不起作用(WinMain没有作为DLL启动)。如何将APP1转换为可用的DLL?

编辑:

我正在尝试将此代码从APP1移植到Delphi:http://level-23.info/forum/showthread.php?14721-UAC-Bypass-for-Windows-7-RTM-SP1-Windows-8-DP&p=31749

我已正确移植它并且一切正常但CCRYPTBASE.dll)无法启动。 (见上面的错误)

简而言之: 创建delphi应用程序,在文件头中添加APP1特征。将其重命名为IMAGE_FILE_DLL并将其复制到C:\ Windows \ System32 \ sysprep。然后开始CRYPTBASE.dll

INFOS HERE: http://www.pretentiousname.com/misc/W7E_Source/win7_uac_poc_details.html

2 个答案:

答案 0 :(得分:5)

按照惯例,

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(在我设想的mem中)为dll的代码应该将入口点设置为DllMain(通过走EAT获取它的地址)。

另外:确保重定位表没有被剥离(在发布模式下),因为DLL在重新定位时需要它。

答案 1 :(得分:1)

我认为你根本不应该这样做。在构建EXE和DLL时,代码是根据不同的假设编译的,如果只是翻转标志并更改扩展名,它将无法工作。

尝试这样的东西是尝试和学习东西的好方法,但这对于制作来说是个坏主意。

告诉我们您要实现的目标,比“以EXE运行我的DLL”更具体。 为什么您需要将您的DLL作为EXE运行吗?

例如,您可以构建DLL,然后使用rundll32加载并调用它。如果你需要这个COM,你可以构建一个COM主机exe并依靠COM的自动编组来实现“好像我的代码在同一个进程中”的效果。它已经存在于COM中。