繁体   English   中英

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

[英]C++ mid-function hook: get register values and jump back [x86 assembly on windows]

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

ollydbg jmp开始

我在0x46AA17做了一个名为JmpHookJMP

 void JmpHook()
 {
      char *mystring;
      _asm mov mystring, ebx

      printf("value: %s", mystring);

      _asm
      {
          jmp       [0x46AA87]
      }
  }

正如你所看到的,我试图将EBX的字符串移动到mystring中,最后跳回到0x46AA87 ,它位于我的JMP JmpHook下面的一些行。

正在调用printf并输出mystring但在OllyDbg中这一切似乎都非常不整洁。 我也无法获得EBP因为它在JmpHook开始时被覆盖(在OllyDbg中看到)。 JMP在年底JmpHook也不起作用: ollydbg错误

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

谢谢!

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

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

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

您收到错误的原因是因为您永远不会到达函数的末尾。 通常,函数包含序言和结尾,其中堆栈指针被保存和检索。

序幕:

push ebp
mov  ebp, esp

结语:

pop ebp

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

跳转时出现的错误是因为您跳转到地址0x46AA87中内存所指向的位置。 你可能想跳转到地址,所以括号是不必要的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM