【发布时间】:2019-11-10 18:08:48
【问题描述】:
WinDBG 是否提供了一种显示普通堆地址的类型信息 (dt?) 的方法?
我正在查看分页堆和用户模式堆栈跟踪不可用的情况。在分析堆时,我正在追踪堆的过度使用情况,并在堆中发现了引用某个内存地址的各种对象。
主要是
!heap -srch [UserPtr] +0x30
像这样返回对象:
0:004> !heap -srch 00000224ceade3a0+30
_HEAP @ 224ceaa0000
HEAP_ENTRY Size Prev Flags UserPtr UserSize - state
00000224ceae3ac0 045c 0000 [00] 00000224ceae3ad0 045ac - (busy)
_HEAP @ 224ceaa0000
HEAP_ENTRY Size Prev Flags UserPtr UserSize - state
00000224ceae8080 0346 045c [00] 00000224ceae8090 03454 - (busy)
现在由于缺少用户模式堆栈跟踪,!heap -p -a [UserPtr] 不返回任何内容。
所以我在这里,我知道实际上0x00000224ceae3ad0 和0x00000224ceae8090 是罪魁祸首。实际上[UserPtr]+0x30(48 字节)出于某种原因,我还需要找出原因,但我被困在这里。 (我创建了一个小样本,我可以在其中验证地址,所以至少在样本中我很确定地址是正确的)
在这一点上,我可以做些什么来获得有关!address [Addr] 旁边的地址的更多信息,但这并没有太大帮助。
由于我知道大小和地址,我可以在堆中四处走动,看看我能找到什么,但这似乎是随机的。
任何关于如何获取更多数据的提示都会很棒。
对于它的价值:我与 LFH 在 NT 堆上。
编辑: 在我的示例中,我当然知道数据类型,但在现实世界的场景中,我所面临的这些类型对我来说是未知的,即使可以访问代码,除了大小的巧合匹配之外,哪些对象的哪个实例指向该地址可能并不明显.
【问题讨论】:
-
您没有提供任何关于
00000224ceade3a0+30是什么或您的程序如何使用堆的信息,因此很难提供任何具体的指导。在没有任何其他信息的情况下,您只需将内存块转储到0x00000224ceae3ad0和0x00000224ceae8090并寻找有关其身份的间接证据。也许其中有一个 vtable 或指针。也许还有其他具有已知身份的堆块指向它们。 -
@RaymondChen 我更新了条目,但对该对象知之甚少。我将如何发现 vtable?你将如何转储这些块?一些
d*命令? -
您可以使用
dps转储地址,就好像它是一个vtable。可以看看结果是不是一堆虚函数指针。 -
与 .NET 不同,C++ 不与对象一起维护类型信息。所以一般来说,无法确定堆块的类型
-
@ThomasWeller 当我在 Visual Studio 中使用
/GR启用运行时类型信息时,您知道运行时如何存储它们的类型信息吗?