【问题标题】:C++ mid-function hook: get register values and jump back [x86 assembly on windows]C++ 中间函数钩子:获取寄存器值并跳回 [Windows 上的 x86 程序集]
【发布时间】:2014-07-29 10:03:43
【问题描述】:

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

我在0x46AA17 对我的函数JmpHook 执行JMP

 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 也不起作用:

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

谢谢!

【问题讨论】:

  • 这是哪个特定的架构/环境??
  • Windows 上的 32 位程序集。你为什么投反对票?
  • '你为什么投了反对票?'因为你错过了澄清问题中的一些要点。
  • 啊,这有帮助,谢谢。如果什么都不指定,那显然是x86 asm...
  • '这显然是 x86 asm' 不!

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


【解决方案1】:

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

它是调用函数时压入堆栈的第一个值。如果我没记错的话,它会在 [EBP]。

至于跳,你能做到,而不是跳到钩子上,你叫它吗?函数返回后,代码将从下一个地址继续。

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

序幕:

push ebp
mov  ebp, esp

结语:

pop ebp

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

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

【讨论】:

  • 感谢这个简单的解决方案。我在另一个跳转中调用了我的函数,我将其重构为_declspec(naked)。我还能够通过 [ebp] 检索 int。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-23
  • 2017-12-07
  • 1970-01-01
  • 1970-01-01
  • 2011-02-12
  • 2012-02-17
相关资源
最近更新 更多