在
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越充实),您获得的信息就越好。