C ++中间函数钩子:获取寄存器值并跳回[Windows上的x86汇编]

时间:2014-06-08 20:33:29

标签: c++ windows x86 hook inline-assembly

寄存器EBP中有一个int值,EBX中有一个字符串。我需要在我自己的函数中从这些寄存器中获取值,对它们执行一些操作,最后跳回下面的一些代码。

ollydbg jmp start

我在JMP0x46AA17对我的JmpHook函数进行了 void JmpHook() { char *mystring; _asm mov mystring, ebx printf("value: %s", mystring); _asm { jmp [0x46AA87] } }

EBX

正如您所看到的,我正在尝试将mystring处的字符串移动到0x46AA87,最后跳回JMP JmpHookprintf位于EBP下面的某些行}。

正在调用

JmpHook并输出mystring但在OllyDbg中这一切似乎都非常不整齐。我也无法得到JMP,因为它在JmpHook的开头被覆盖(在OllyDbg中看到)。 {{1}}末尾的{{1}}也不起作用: ollydbg error

所以我的问题是如何正确跳转到我自己的函数,将两个寄存器保存在变量中,然后在一些操作后跳回到原始代码。

谢谢!

1 个答案:

答案 0 :(得分:3)

您可以从堆栈中获取最后一个EBP的值。

这是调用函数时在堆栈上推送的第一个值。如果我没有记错,那将是[EBP]。

至于跳跃,你可以这样做,而不是跳到钩子,你打电话给它?函数返回后,代码将从下一个地址继续。

您收到错误的原因是您从未到达该功能的结尾。 通常,函数包含序言和结尾,其中堆栈指针被保存和检索。

序幕:

push ebp
mov  ebp, esp

结语:

pop ebp

由于您从未到达函数的末尾,因此不会调用pop,并且您的堆栈已损坏。

您通过跳转获得的错误是因为您跳转到地址0x46AA87中的内存所指向的位置。您可能想跳转到该地址,因此不需要括号。