Windbg:从 vftable 到 C++ 类

逆向工程 动态分析 风袋
2021-06-16 12:53:16

作为作业的一部分,我正在深入研究 Internet Explorer 的世界,并试图弄清楚在堆上分配了哪些类。

mshtml!CEventObj::GenericGetElement()方法中,eax寄存器指向一个类的实例,edi指向它引用的对象,esi指向vftable。

话虽如此,我插入了一个断点,每次通过函数都会列出这些寄存器,并且它们总是指向同一个 vftable。

有问题的 vftable 是mshtml!CBodyElement,但这是否真的意味着所有这些实例都属于CBodyElement,或者它们可以用于从CBodyElement.

如果它们来自派生类,我如何确定分配的实际类?

1个回答

如果派生类vtable覆盖了任何虚函数,它就会得到它自己的

如果派生类没有覆盖任何虚函数,它将使用原始的vtable.

我会说你的假​​设在大约 90% 的情况下是正确的。

您可以为静态类型恢复做的最好的事情是查看vtable正在使用的。

您可以做的有点帮助是使用堆栈跟踪 ( gflags.exe /i iexplore.exe +hpa +ust)转一个 PageHeap并查看为对象分配的地址 ( !heap -p -a 0xaddress)。这将为您提供到对象分配站点的完整堆栈跟踪,有时用于确定对象的类型(例如,是否使用了Factory模式)。

最后,您还可以使用其他动态分析技巧。为这个应用程序编写了一个 Pin 工具和 IDA Python 插件ida-splode通过在运行时捕获信息,您可以增强 IDA 跟踪。下面是幻灯片的示例屏幕截图。您拥有的符号信息越好(或者您的 IDB 越充实),您获得的信息就越好。

在此处输入图片说明