gpt4 book ai didi

delphi - 如何检测哪个 Hook 过程调用了我的蹦床?

转载 作者:行者123 更新时间:2023-12-03 15:58:01 24 4
gpt4 key购买 nike

我想对应用程序调用 dll 中的函数的次数进行一些分析。
为了做到这一点,我 Hook 了 dll 中的每个导出函数。
例如。如果我想跟踪对 user32.dll 的调用,我需要挂接 830 调用。

显然我不想编写830个trampoline函数,所以我想出了以下方案:

使用以下钩子(Hook)函数:

var
HookFunctionPtr: pointer = nil;

procedure HookFunction;
asm
.NOFRAME
CALL @@test //5 bytes
@@Start0:
ret; nop; nop //3 bytes
CALL @@test //5 bytes
@@Start1: //Repeat this 1390 times.
ret; nop; nop //3 bytes
//Examine the return address to see which call was hooked here.
@@Test:
pop rax
push rax
push rcx
mov rcx, qword ptr [HookFunctionPtr]
add rcx,5
sub rax,rcx
shr rax,3 //divide by 8
mov rcx,rax
call HookFunction
pop rcx
ret
end;

procedure LogCalledFunction(DllEntry: Cardinal);
....

在进行 Hook 时,我只需遍历 dll pe-header 即可获取导出函数的地址。并在上面的函数内部添加一个钩子(Hook)。
随后的每个钩子(Hook)都高 8 个字节。

我没有看到任何其他方法来判断哪个 dll 条目导致了 Hook 调用。
有没有更好的方法可以做到这一点,而无需重复相同的代码片段数百次。

最佳答案

您必须为每个函数动态分配一个单独的 stub ,其中 stub 包含所需的上下文信息(DLL 函数名称/ID 等)以及一些最少的代码来使用指向的额外参数调用您的真实蹦床在 stub 的上下文数据中。当您 Hook DLL 函数时,您可以使用 stub 作为 Hook 蹦床。当 stub 被调用时,它将调用真正的蹦床,然后它将可以访问上下文数据。

这类似于 Delphi 的 System.Classes.MakeObjectInstance() 函数使用的方法,该函数将 TWndMethod 包装在 stub 内以允许对象方法(最值得注意的是、TWinControl.WndProc()TTimer.WndProc() 方法)用作 CreateWindow/Ex()/的 Win32 API 回调SetWindowLongPtr(GWL_WNDPROC)。当 Windows 调用 stub 时, stub 将调用辅助函数 (System.Classes.StdWndProc()),该函数随后调用 stub 的 TWndMethod 中指定的实际对象方法。

这允许一段代码处理任意数量的对象实例。您需要适合您情况的类似内容。

关于delphi - 如何检测哪个 Hook 过程调用了我的蹦床?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29660063/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com