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

Ben*_*iss 1 windows delphi dll winapi portable-executable

我有以下情况:

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

如果APP1开始,它会在begin和之间运行代码 end.,就像它应该的那样.

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

APP2 增加了IMAGE_FILE_DLL标志的Characteristics中NTFileHeader的APP1.然后APP2尝试APP1使用LoadLibrary(或一些其他COM命令加载DLL)加载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-8-DP&p= 31749

我已正确移植它并且一切正常但是CRYPTBASE.dll(APP1)没有启动.(见上面的错误)

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

INFOS在这里: http ://www.pretentiousname.com/misc/W7E_Source/win7_uac_poc_details.html

Rem*_*mko 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;
Run Code Online (Sandbox Code Playgroud)

修改你的exe(在我设想的mem中)为dll的代码应该将入口点设置为DllMain(通过走EAT获取它的地址).

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

  • 很可能不是,你会错过各种初始化(如Delphi RTL) (2认同)