如何使用asm挂钩C ++函数

时间:2011-08-28 19:39:13

标签: c++ assembly hook reverse-engineering

我想挂钩一个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:感谢您的真正帮助,但我不想使用蹦床机制,我想覆盖该功能。

2 个答案:

答案 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。