1

我有以下情况:

我有一个德尔福应用程序{$APPTYPE GUI}。( APP1)

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

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

APP2 IMAGE_FILE_DLL标志添加到CharacteristicsNTFileHeaderAPP1然后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

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

4

2 回答 2

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 所要求的那样剥离(在发布模式下)。

于 2013-06-03T13:49:31.473 回答
1

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

尝试这样的事情是实验和学习东西的好方法,但对于生产来说这是一个坏主意。

用比“将我的 DLL 作为 EXE 运行”更具体的方式告诉我们您想要实现什么。为什么需要将 DLL 作为 EXE 运行?

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

于 2013-06-05T10:36:18.490 回答