寄存器EBP
中有一个int值,EBX
中有一个字符串。我需要在我自己的函数中从这些寄存器中获取值,对它们执行一些操作,最后跳回下面的一些代码。
我在JMP
处0x46AA17
对我的JmpHook
函数进行了 void JmpHook()
{
char *mystring;
_asm mov mystring, ebx
printf("value: %s", mystring);
_asm
{
jmp [0x46AA87]
}
}
。
EBX
正如您所看到的,我正在尝试将mystring
处的字符串移动到0x46AA87
,最后跳回JMP JmpHook
,printf
位于EBP
下面的某些行}。
JmpHook
并输出mystring但在OllyDbg中这一切似乎都非常不整齐。我也无法得到JMP
,因为它在JmpHook
的开头被覆盖(在OllyDbg中看到)。 {{1}}末尾的{{1}}也不起作用:
所以我的问题是如何正确跳转到我自己的函数,将两个寄存器保存在变量中,然后在一些操作后跳回到原始代码。
谢谢!
答案 0 :(得分:3)
您可以从堆栈中获取最后一个EBP的值。
这是调用函数时在堆栈上推送的第一个值。如果我没有记错,那将是[EBP]。
至于跳跃,你可以这样做,而不是跳到钩子,你打电话给它?函数返回后,代码将从下一个地址继续。
您收到错误的原因是您从未到达该功能的结尾。 通常,函数包含序言和结尾,其中堆栈指针被保存和检索。
序幕:
push ebp
mov ebp, esp
结语:
pop ebp
由于您从未到达函数的末尾,因此不会调用pop,并且您的堆栈已损坏。
您通过跳转获得的错误是因为您跳转到地址0x46AA87中的内存所指向的位置。您可能想跳转到该地址,因此不需要括号。