【问题标题】:What is the effect of using JMP on a function address?对函数地址使用 JMP 有什么影响?
【发布时间】:2019-04-18 06:58:15
【问题描述】:

我正在查看 IDA 中的一个程序,因为我试图弄清楚某个函数是如何工作的,这时我遇到了这样的事情:

; C_TestClass::Foo(void)
__text:00000000 __ZN14C_TestClass7FooEv proc near
__text:00000000                 jmp     __ZN14C_TestClass20Barr ; C_TestClass::Barr(void)
__text:00000000 __ZN14C_TestClass7FooEv endp
__text:00000000

谁能向我解释在这种情况下跳转到一个函数究竟会做什么? 我猜它充当了另一个函数的包装器?

【问题讨论】:

    标签: function assembly ida


    【解决方案1】:

    您说得对,跳转通常是一种有效处理非内联包装函数的方法。

    通常,您必须先读取所有函数参数并将它们推回堆栈,然后才能调用子函数。

    但是当包装函数具有完全相同的原型时:

    1. 相同的调用约定
    2. 相同的参数(并且顺序相同)
    3. 返回类型相同

    不需要所有通常的函数调用开销。你可以直接跳到目标。 (这些类别可能不是完全必要的,因为在某些其他情况下仍然可能。)

    在调用包装函数时设置的所有参数(在堆栈或寄存器上)都已经为子函数准备好了(并且兼容)。

    【讨论】:

      【解决方案2】:

      这就是所谓的尾调用。编译器能够直接调用该函数并让 it 返回到原来的调用者,而不会造成任何问题。例如:

      int f(int x)
      {
          ...
          return g(y);
      }
      

      编译器可以在最后简单地jmp g,因为在与f的参数相同的位置有空间放置参数,并且返回值在返回到f的调用者之前不会被修改。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多