在EBP
寄存器中有一个int值,在EBX
有一个string。 我需要从我自己的函数中获取这些寄存器的值,对它们进行一些操作,最后跳回下面的代码。
我在0x46AA17
为我的JmpHook
函数做JMP
。
void JmpHook() { char *mystring; _asm mov mystring, ebx printf("value: %s", mystring); _asm { jmp [0x46AA87] } }
正如你所看到的,我试图将EBX
的string移动到mystring
,最后跳转到位于JMP JmpHook
下方的JMP JmpHook
。
printf
被调用,mystring被输出,但在OllyDbg中这一切似乎都很不整洁。 我也无法获得EBP
因为它在JmpHook
开始时被覆盖(见OllyDbg)。 JmpHook
结束时的JmpHook
也不起作用:
所以我的问题是如何正确地跳转到我自己的function,将两个寄存器保存在variables中,然后在一些操作之后跳回到原始代码。
谢谢!
您可以从堆栈中获取最后一个EBP的值。
当你调用你的函数时,这是第一个被压入堆栈的值。 如果我没有弄错的话,将会在[EBP]。
至于跳跃,你可以这样做,而不是跳到钩子,你打电话吗? 函数返回后,代码将从下一个地址继续。
你得到一个错误的原因是因为你永远不会达到函数的结尾。 通常一个函数包含一个序言和一个结语,栈指针被保存和检索。
序幕:
push ebp mov ebp, esp
结语:
pop ebp
由于你永远不会到达函数的末尾,弹出窗口不会被调用,并且你的堆栈已经损坏。
跳转出现的错误是因为您跳转到地址0x46AA87内存指向的位置。 你可能想跳转到地址,所以括号是不必要的。