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

mshtml!CEventObj::GenericGetElement()方法中,eax register指向类的实例,edi指向其引用的对象,esi指向vftable。

这就是说,我插入了一个断点,该断点每次都会通过函数列出这些寄存器,并且它们始终指向相同的vftable。

有问题的vftable是mshtml!CBodyElement,但这是否实际上意味着所有这些实例都是CBodyElement的,或者它们适用于从CBodyElement派生的类。

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

#1 楼

如果派生类重写了任何虚函数,它将得到自己的vtable

如果派生类没有重写任何虚函数,它将使用原始vtable

我会说您的假设在90%的时间内都是正确的。

对于静态类型恢复,您可以做的最好的事情就是查看所使用的vtable

您可以做些什么来帮助您打开一个具有堆栈跟踪的PageHeap(gflags.exe /i iexplore.exe +hpa +ust),然后查看为该对象分配的地址(!heap -p -a 0xaddress)。这将为您提供到对象分配位置的完整堆栈跟踪,这有时可以确定对象的类型(例如,如果使用Factory模式)。最后,还有其他动态您可以玩的分析技巧。我为这个应用程序编写了Pin工具和IDA Python插件ida-splode。通过在运行时捕获信息,可以增强IDA跟踪。以下是幻灯片中的示例屏幕截图。您拥有的符号信息越好(或者IDB越充实),您获得的信息就越好。