【问题标题】:Create a Delphi Dll and load it with DllMain创建一个 Delphi Dll 并使用 DllMain 加载它
【发布时间】:2021-05-19 19:44:38
【问题描述】:

朋友

我有一个小问题。我试图在 RAD Studio 中创建一个带有表单的 delphi Dll,但我不知道 如何使用 DllMain 加载它。我想在运行时将这个 Dll 注入到一个第三方进程中

我用没有问题的表单创建了 Dll 项目,但我找不到任何与“如何使用 DllMain 加载它”相关的好东西,或者至少我发现的教程/东西对我没有帮助(或者我我只是愚蠢)。 有人能帮我吗?给我一些提示或我可以学习的网站/视频?

我真的很感谢你们的时间! =)

【问题讨论】:

  • DLLMain 在加载 DLL 时由 Windows 调用。你永远不会自己调用它。
  • 是的,但我想在第三方进程中加载​​我的表单,以防出现 DLL_PROCESS_ATTACH。
  • 你想做什么没关系——你不能自己调用​​DLLMain。
  • 无论如何,在DllMain() 中调用 UI 函数是不安全的。请参阅DllMain Best Practices:“您永远不应该在 DllMain 中执行以下任务:...调用 User32.dll 或 Gdi32.dll 中的函数。某些函数会加载另一个可能未初始化的 DLL。 " 猜猜CreateWindow/Ex() 在哪个图书馆?提示:user32.dll。因此,请勿尝试直接在DllMain() 中显示 UI 表单。
  • 不过,如果您要遵循最佳实践,您可以在单元的初始化部分编写代码。

标签: forms delphi load dllmain


【解决方案1】:

您可以使用汇编将基于 ebp 的堆栈注入到一些变量中。这是一个例子:

library Project1;

uses
  System.SysUtils,
  Windows,
  System.Classes;

var
  hInstDLL: THandle;
  fdwReason: DWORD;
  lpReserved: DWORD;
begin
  asm
    push eax; // Save the current eax
    mov eax, [ebp+$8] // Put into eax the first argument of the current function (DLLMain)
    mov [hInstDLL], eax; // Put into hInstDLL this argument
    mov eax, [ebp+$c] // Load into eax the second argument
    mov [fdwReason], eax; // Save to fdwReason
    mov eax, [ebp+$10] // Put into eax the last argument
    mov [lpReserved], eax; // Put into lpReserved (unnecessery)
    pop eax; // Restore the original eax value
  end;

  if fdwReason = 1 {DLL_PROCESS_ATTACH} then
  begin
    // Do your stuff;
  end;
end.

【讨论】:

  • 解释一下:windows函数使用公共栈([esp+x])来传递和接收参数,Delphi在任何函数的最开始就将esp移动到ebp,所以,一开始,Delphi不期望它的入口点有任何参数,但仍然调整堆栈,所以我们可以接受它。 :)
  • 我不明白您的回答与问题有何关联。你能解释一下吗?
  • 此代码仅获得对操作系统传递给 DLL 的参数的访问权限。 Delphi 为此提供了DllProc/DllProcEx 回调(尽管您必须为DLL_PROCESS_ATTACH 手动调用它们)。但是,这并不能回答所询问的根本问题 - 当 DLL 加载到进程中时如何创建表单。 DPR 的代码已经响应DLL_PROCESS_ATTACH 执行,无需手动检查fdwReason = 1
  • 另外,我认为这里显示的代码仅适用于 32 位,在 64 位下会惨遭失败,其参数调用堆栈布局完全不同。
  • 如果你用创建表单代码替换“// Do your stuff”,它将完全按照他的意愿行事。我知道他想将 DLL 注入某个进程,然后该进程将运行 DLLMain,他想选择 DLLMain 在附加时所做的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-17
  • 1970-01-01
  • 1970-01-01
  • 2012-05-08
  • 1970-01-01
  • 2010-12-13
相关资源
最近更新 更多