我想挂钩一个C ++函数。但我不想使用ms绕道的蹦床机制,而不是我想要完全修补它。我可以得到DLL的句柄,函数所在的位置,我有正确的偏移量(imageBase东西......)。那怎么挂钩呢?我不知道参数的数据类型(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
这很糟糕,我只能挂钩功能,我知道这个名字有很多东西。我无法通过绕道来挂钩那些asm函数,因为我需要为创建函数结构而传递的参数的数据类型!
EDIT ::::
“走弯路有什么问题,确切地说?”
我写道:“我不想使用ms绕行的蹦床机制,而不是我想完全修补它。”并且“这很糟糕,我只能挂钩函数,我知道这些函数有很多东西。我不能用绕道来挂钩那些asm函数,因为我需要为创建函数结构而传递的参数的数据类型!”我没有C ++文件的源代码。我只有hex-dump。
“蹦床是一个实际的技术术语:)我只是想知道为什么@lua不能使用它。”
我写道:再读一遍我的句子,如果你还不明白为什么,我的英语很糟糕。
“只覆盖命名函数应该可以工作,当然你可能需要重新实现整个DLL(取决于它是否对你有任何进一步的用处)。鉴于你对汇编程序的掌握,你可能会使用十六进制编辑器编辑(副本)您想要破坏的原始DLL。“
我想挂钩该功能,因为我不想编辑该文件。我无法覆盖我的函数,因为我不知道参数的数据类型和函数的名称。
@asveikau:感谢您的真正帮助,但我不想使用蹦床机制,我想覆盖该功能。
答案 0 :(得分:1)
一个好方法是用这个替换前几条指令:
push dword xxxx ; where xxx = new code location
ret
这有点像混淆jmp
。我这样编写它是因为这个组合版本很容易在运行时用你的指针替换push
操作数。它组装成:
68 XX XX XX XX c3
“XX XX XX XX”是您在little-endian的地址。
然后你可以制作一个“调用函数的旧版本”代码位置,其中前几条指令是你用上面的序列替换的指令,然后跳转到原始代码中的下一条有效指令。 / p>
答案 1 :(得分:0)
只覆盖命名函数应该可以工作,当然你可能需要重新实现整个DLL(取决于它是否对你有任何进一步的用处)。鉴于您对汇编程序的掌握,您可能会使用十六进制编辑器来编辑(您的副本)您想要破坏的原始DLL。