【问题标题】:What kind of C++ code would generate this x86 assembly instruction?什么样的 C++ 代码会生成这个 x86 汇编指令?
【发布时间】:2015-01-31 22:15:15
【问题描述】:

我一直在对自己的一些库进行“逆向工程”,以了解有关编译器优化的更多信息。我已经看到我最简单的类构造函数之一(一个 4-D 向量)被编译为以下内容:

fldz                                                        ; push +0.0 to FPU stack
mov     eax, ecx                                            ; set eax to this (ecx)
mov     dword ptr [eax], offset data_??_7vector_t@data@@6B@ ; what is this doing?
fst     dword ptr [eax+4]                                   ; assign this->first
fst     dword ptr [eax+8]                                   ; assign this->second
fst     dword ptr [eax+0Ch]                                 ; assign this->third
fstp    dword ptr [eax+10h]                                 ; assign this->fourth, pop FPU stack
retn                                                        ; return this (eax)

在第三行,我不知道这是在做什么。我最初认为这可能是某种优化,它引用了一些硬编码的常量数据块。

为了确定它可能是什么,我将DLL加载到一个容器进程中,然后附加一个调试器并查看data??_7vector_t@data@@6B@位置的数据,但它只是db offset unk??_7vector_t@data2@@6B@。我遵循了第二个标签,并且有一个数据区域与我在项目中识别的任何内容都不对应,即使将前 8 个字节转换为双精度字节也是如此。

我使用的编译器是带有 Visual Studio 2013 的 MSVC++,经过全面优化,没有任何高级指令集(SSE 等已关闭)。

哪些 C++ 代码会生成相关指令?

【问题讨论】:

  • 最好在Reverse Engineering 提问,它只处理这类问题。
  • data??_7vector_t@data@@6B@ 我认为这是一个错误的名字。
  • @sashoalm 没有意识到有一个 SE 站点。谢谢。

标签: c++ assembly x86 reverse-engineering


【解决方案1】:

不确定data_ 前缀的来源,但? 是修饰(损坏)名称的标准标记,您可以使用undname 工具来破译它们:

>undname ??_7vector_t@data@@6B@
Microsoft (R) C++ Name Undecorator
Copyright (C) Microsoft Corporation. All rights reserved.

Undecoration of :- "??_7vector_t@data@@6B@"
is :- "const data::vector_t::`vftable'"

是的,它只是初始化 vtable 指针。

【讨论】:

  • 啊,我不知道微软有这样的工具。我一直在另一个程序中使用它,它只解开导出的函数名称。感谢您提供的额外信息!
【解决方案2】:

有问题的行是为正在构造的对象分配一个 vtable 指针。

【讨论】:

    【解决方案3】:

    在我看来,它正在将构造函数应用于 ECX 的未初始化存储。

    这些步骤将在其第一个插槽中插入一个 vtable 指针,并将您说您的应用程序使用的 4d 向量归零。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-27
      • 2019-09-09
      • 1970-01-01
      • 1970-01-01
      • 2021-07-30
      • 2021-07-18
      • 1970-01-01
      • 2021-02-18
      相关资源
      最近更新 更多