我使用EasyHook已经有一段时间了,并且在使用静态链接的 DLL 方面非常成功。现在,我尝试使用与静态链接 DLL 相同的方法从主机应用程序动态加载的 DLL 中挂钩一个函数。
在这种情况下,挂钩无法工作。尝试创建钩子时出现以下异常:
System.DllNotFoundException: The given library is not loaded into the current process.
异常表示库尚未加载是非常正确的,但是主机/挂钩进程将在启动后的几 ns/ms 内加载它(这完全没关系)。
我在 Internet 上搜索的教程和结果仅涉及挂钩静态链接的 DLL。我还没有找到有关动态加载的 DLL 的任何信息。想到的一种解决方案:挂钩LoadLibrary
并GetProcAddress
等待正确的 winapi 调用以进行所需的替换。
有没有其他/更简单的方法可以从动态加载的 DLL 中挂钩函数?
有一个限制:不能将外部程序更改为以静态方式使用 DLL。
为了促进可能的解决方案,这里有一些片段显示了我想要挂钩的内容:
AddIntegers
首先,这是我要替换的函数的 DLL (代码在 Delphi 中)
library Calculate;
function AddIntegers(_a, _b: integer): integer; stdcall;
begin
Result := _a + _b;
end;
exports
AddIntegers;
begin
end.
其次,这是使用上述DLL的程序使用导出的AddIntegers
函数。
program HostConsole;
{$APPTYPE CONSOLE}
uses
Winapi.Windows, System.SysUtils;
var
n1, n2, sum: Int32;
// Variables for DLL Loading
h: HMODULE;
AddIntegers: function(_a, _b: integer): integer; stdcall;
begin
try
// Load Library
h := LoadLibrary('Calculate.dll');
if h = 0 then
begin;
raise Exception.Create('Cannot load DLL');
end;
// Load function
AddIntegers := GetProcAddress(h, 'AddIntegers');
if not Assigned(AddIntegers) then
begin
raise Exception.Create('Cannot find function');
end;
Write('Enter first number: ');
Readln(n1);
Write('Enter second number: ');
Readln(n2);
// To the calculation
sum := AddIntegers(n1, n2);
Writeln('The sum is ', sum);
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
// Unload Library
FreeLibrary(h);
Readln;
end.