【问题标题】:What would this register contain after该寄存器将包含什么之后
【发布时间】:2010-07-21 00:52:41
【问题描述】:

我似乎无法弄清楚 eax 在这个组装之后包含什么:

mov     edi, [edi+4]
lea     eax, [edi+88h]

edi 指向一个类

【问题讨论】:

  • 程序集已分类? (或者:你是在告诉我们一切吗?)
  • 你的班级有虚拟会员吗? @科比;可能是 c++ 反汇编,或者在汇编之前停止。
  • @Kobi 是一个 C++ 共享对象的反汇编。当然,汇编中实际上没有任何类,但它让我更容易理解@roe 是的,它有虚拟成员
  • kotarou3 - 我意识到这一点。我试图暗示您应该提供尽可能多的信息,以获得更好的答案。

标签: assembly reverse-engineering


【解决方案1】:

Load Effective Address 获取引用的实际地址。由于某种神秘的原因,符号程序集的编写方式好像它引用了 edi+88h 的内容,但指令实际所做的是加载 edi 寄存器的 value 加上常量 088h(相当于 @ 987654323@)。我怀疑 edi+4 是一个函数指针:更可能的是,它是一个 vtbl 指针或数组。

【讨论】:

  • 等等,一个类不是类似于vftable吗?实际上,edi 指向 vftable,edi+4 指向 vftable 中的一个函数
  • 如果涉及多重继承,编译器可能会通过多个 vtable 指针 (en.wikipedia.org/wiki/Virtual_method_table) 来实现它。 [edi+4] 可能正在加载辅助 vtable,其中在偏移量 088h 处有一个函数。也许你应该说为什么你这么肯定edi+4是一个函数指针?
  • 其实我想多了……它可能不是指向函数的指针
【解决方案2】:

一个很长的机会,因为我对你的课程一无所知,但无论如何都可以。

你有多重继承吗?也许edi+4 是第二个虚拟表,[edi+4]+88h 是您要调用的函数指针?或者取决于您的编译器,虚拟表可能位于 +4,在任何一种情况下,eax 都包含要调用的虚拟函数的地址。

【讨论】:

    【解决方案3】:

    基于edi的使用,它可能最终指向一个内存位置,但lea并不总是这样使用:http://en.wikipedia.org/wiki/Addressing_mode#Useful_side_effect

    【讨论】:

      【解决方案4】:
      mov     edi, [edi+4]
      lea     eax, [edi+88h]
      
          edi points here after 'mov'
          .
          xxxx....................
          |                      ^
      xxxx....                   eax points here after 'lea'
      ^
      edi pointed here before 'mov'
      
      char* edi;
      void* eax;
      
      edi = *(char**)(edi+4);
      eax = edi+0x88;
      

      看起来有些记录正在那里被访问。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-04-16
        • 2021-06-13
        • 2010-09-18
        • 2011-08-18
        • 1970-01-01
        • 2017-05-18
        • 2019-11-30
        相关资源
        最近更新 更多