作为一个练习,我在一个正在逆转的应用程序中挂钩一个函数。我正在尝试实现一种非常类似于蹦床跳跃的技术。假设我们要挂钩的地址是src
:
src
处的5个字节
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)执行此操作,则没有问题。我真的不明白为什么。
答案 0 :(得分:0)
哈哈,结果我把直接字节编辑与实际装配混淆了。只需编写__asm JMP 0x420CB3
即可,汇编程序将负责处理。