使用WinDbg查找C++静态类成员的地址

问题描述 投票:0回答:1

我没有使用 WinDbg 的经验,我正在尝试在 C++ Win32 应用程序中的静态成员变量上设置数据断点 (ba),以查看它何时被意外写入损坏。我们将其称为 MyClass::m_StaticData。我明白,首先我需要找到 MyClass::m_StaticData 的内存地址。但是,我不确定如何找到静态成员变量的地址。我找到了局部变量 (dv) 和类实例 (dt) 的命令,但没有找到静态的任何命令。

c++ debugging winapi static windbg
1个回答
0
投票

让我们考虑以下 C++ 代码:

class Box {
   public:
      static int objectCount;
      Box(double l = 2.0, double b = 2.0, double h = 2.0) {
         length = l;
         breadth = b;
         height = h;
         objectCount++;
      }
      double Volume() {
         return length * breadth * height;
      }
      static int getCount() {
         return objectCount;
      }
      
   private:
      double length;     
      double breadth;    
      double height;     
};

int Box::objectCount = 0;

int main(void) {
   Box Box1(3.3, 1.2, 1.5);    
   return 0;
}

有些编译器会做不同的事情,但 MSVC 会编译上面的代码并将类的静态变量存储在 PE32 二进制文件的 .data 段中,您可以看到如何被引用,并且我们可以确认正在存储

IDA 拆解

.数据段

您需要在代码的编译版本中搜索交叉引用,以便获取变量初始化时分配的相对地址。我不知道这可以通过 WinDbg 轻松完成,因此通过查看引用静态变量的第一个代码偏移量,您将获得变量的 RVA,然后您可以在那里设置数据访问断点。

© www.soinside.com 2019 - 2024. All rights reserved.