gpt4 book ai didi

c++ - 如何使用 asm Hook C++ 函数

转载 作者:太空狗 更新时间:2023-10-29 23:08:58 31 4
gpt4 key购买 nike

我想挂接一个 C++ 函数。但是我不想用ms detours的trampoline机制,取而代之的是我想全面打补丁。我可以获得函数所在的 DLL 的句柄,并且我有正确的偏移量(imageBase stuff ...)。那么怎么钩呢?而且我不知道参数的数据类型(var_4 和 arg_0),或者不需要它们?一般来说,我想用我自己的函数替换以下函数(我的函数几乎相同,只有一行改变):

sub_39001A40    proc near

var_4 = dword ptr -4
arg_0 = dword ptr 4
push ecx
cmp dword_392ADAB4, 0
jnz short loc_39001A4F
call loc_39024840

loc_39001A4F:
push esi
mov esi, [esp+8+arg_0]
lea eax, [esp+8+var_4]
push eax
push esi
call dword_392ADA98
mov ecx, [esp+10h+var_4]
add esp, 8
add dword_392ADA80, ecx
adc dword_392ADA84, 0
add dword_392ADA90, esi
pop esi
adc dword_392ADA94, 0
add dword_392ADA7C, 1
pop ecx
retn
sub_39001A40 endp

糟糕的是,我只能 Hook 函数,我知道哪些名称是用 ms detours 的。我不能绕道钩住那些 asm 函数,因为我需要传递参数的数据类型来创建函数结构!

编辑::::

“绕行到底有什么问题?”

我写道:“我不想使用 ms detours 的 trampoline 机制,而不是我想完全修补它。”和“这很糟糕,我只能 Hook 函数,我知道这些函数的名称是用 ms detours 的。我不能用 detours Hook 那些 asm 函数,因为我需要传递的参数的数据类型来创建函数结构!”而且我没有 C++ 文件的源代码。我只有十六进制转储。

“蹦床是一个实际的技术术语 :) 我只是想知道为什么@lua 不能使用它。”

我写:再读一遍我的句子,如果你还不明白为什么,我的英语不好。

“仅覆盖命名函数应该可行,当然您可能需要重新实现整个 DLL(取决于它是否对您有任何进一步的用途)。鉴于您对汇编程序的掌握,您可能会使用十六进制编辑器来编辑(拷贝)您要破坏的原始 DLL。”

我想 Hook 函数,因为我不想编辑文件。我无法覆盖我的函数,因为我不知道参数的数据类型和函数的名称。

@asveikau:感谢您的真正帮助,但我不想使用蹦床机制,我想覆盖该功能。

最佳答案

一个好的技巧是用这个替换前几条指令:

push dword xxxx ; where xxx = new code location
ret

这有点像经过混淆的 jmp。我这样写是因为它的汇编版本很容易在运行时用你的指针替换 push 操作数。它组装成:

68 XX XX XX XX c3

其中“XX XX XX XX”是您的小端地址。

然后你可以创建一个“调用旧版本函数”的代码位置,其中前几条指令是你用上面的序列替换的指令,然后跳转到原始代码中的下一条有效指令。

关于c++ - 如何使用 asm Hook C++ 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7223407/

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