MSVC内联asm中的相对近跳(需要挂钩)

时间:2014-11-02 10:44:40

标签: assembly x86 hook

作为一个练习,我在一个正在逆转的应用程序中挂钩一个函数。我正在尝试实现一种非常类似于蹦床跳跃的技术。假设我们要挂钩的地址是src

  • 使用JMP myFunc
  • 替换src处的5个字节
  • 在myFunc
  • 的最开头复制丢失(覆盖)5个字节的功能
  • 做我自己的事情
  • JMP回到src + 5

我在做最后一件事时遇到了麻烦 - 将控制权交还给src + 5。在我的情况下,地址(src)是0x420CAE,这就是我正在做的事情:

//virtual protect stuff
*(BYTE*)0x0420CAE = 0xE9;
*(DWORD*)(0x0420CAE + 1) = ((DWORD)Hooked - (DWORD)0x0420CAE - 5);
//restore protect

这很好用,控件传递给我的函数(Hooked)。这就是它的样子:

void __declspec(naked) Hooked()
    {
        __asm{
            LEA EAX, [ESP+0x1C]
            PUSH EBP
        }//stolen bytes

        __asm PUSHAD ;in case puts messes up some registers
        puts("i'm inside.");
        __asm POPAD

        __asm JMP (0x420CB3 - $ - 5)
    }

至于最后一条指令 - 我认为应该是这样:我想跳转到0x420CB3,所以我减去当前地址,然后减去5(JMP的大小)。然而,MSVC抱怨道:

Error   1   error C2425: '-' : non-constant expression in 'first operand'

但是,如果我以相反的顺序($ - 0x420CB3)执行此操作,则没有问题。我真的不明白为什么。

1 个答案:

答案 0 :(得分:0)

哈哈,结果我把直接字节编辑与实际装配混淆了。只需编写__asm JMP 0x420CB3即可,汇编程序将负责处理。