【发布时间】:2011-11-05 14:36:24
【问题描述】:
我想挂钩一个 C++ 函数。但是我不想使用ms detours的蹦床机制,而不是我想完全修补它。我可以获得函数所在的 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
很糟糕,我只能挂钩函数,这些函数的名字我知道用 ms detours。我不能用弯路钩住这些 asm 函数,因为我需要传递参数的数据类型来创建函数结构!
编辑::::
“弯路到底有什么问题?”
我写道:“我不想使用 ms detours 的蹦床机制,而不是我想完全修补它。”和“这很糟糕,我只能用 ms detours 挂钩我知道的函数。我不能用 detours 挂钩那些 asm 函数,因为我需要传递参数的数据类型来创建函数结构!”而且我没有 C++ 文件的源代码。我只有十六进制转储。
“Trampoline 是一个实际的技术术语 :) 我只是想知道为什么 @lua 不能使用它。”
我写:再读一遍我的句子,如果你仍然不明白为什么,我的英语很糟糕。
“只覆盖命名函数应该可以工作,当然您可能需要重新实现整个 DLL(取决于它是否对您有任何进一步的用途)。鉴于您对汇编程序的掌握,您可能会使用十六进制编辑器来编辑(副本)您正在寻求颠覆的原始 DLL。”
我想挂钩函数,因为我不想编辑文件。我无法覆盖我的函数,因为我不知道参数的数据类型和函数的名称。
@asveikau:感谢你的真正帮助,但我不想使用蹦床机制,我想覆盖函数。
【问题讨论】:
-
走弯路到底有什么问题?
-
@bdonlan,我显然低估了这里的 lua。我认为蹦床被用作对 ms 机制膨胀的贬义词。看来detours其实是一个我一无所知的知名程序。
-
Trampoline 是一个实际的技术术语 :) 我只是想知道为什么 @lua 不能使用它。
-
@lua: 你到底想在函数中改变什么(注意不同的流水线编译成不同长度的指令,所以取决于你想要改变什么可能真的很容易或真的很难)?
-
这里的问题是一个不错的例子,我猜stackoverflow.com/q/29093398/1067003
标签: c++ assembly hook reverse-engineering