Как я могу получить информацию о том, чтобы получить информацию во время выполнения от файла DMP в расширении WINDBG?
-
24-09-2019 - |
Вопрос
Это связано с мой предыдущий вопрос, относительно тяги объектов из файла DMP.
Как я уже упоминал в предыдущем вопросе, я могу успешно вытянуть объект из файла DMP, создавая Wrapper 'Remote' объекты. Я внедрил несколько из них до сих пор, и, похоже, хорошо работает. Однако я столкнулся с зацеплением.
В одном случае указатель хранится в классе, говорит о типе «quotebaSeclass», но этот объект на самом деле является типом «когда-нибудь», который вытекает из «quotebaSeclass». Например, это было бы что-то подобное:
MyApplication!SomeObject
+0x000 field1 : Ptr32 SomeBaseClass
+0x004 field2 : Ptr32 SomeOtherClass
+0x008 field3 : Ptr32 SomeOtherClass
Мне нужен какой-то способ узнать, какой тип «Field1» есть.
Быть более конкретным, используя пример адресов:
MyApplication!SomeObject
+0x000 field1 : 0cae2e24 SomeBaseClass
+0x004 field2 : 0x262c8d3c SomeOtherClass
+0x008 field3 : 0x262c8d3c SomeOtherClass
0:000> dt SomeBaseClass 0cae2e24
MyApplication!SomeBaseClass
+0x000 __VFN_table : 0x02de89e4
+0x038 basefield1 : (null)
+0x03c basefield2 : 3
0:000> dt SomeDerivedClass 0cae2e24
MyApplication!SomeDerivedClass
+0x000 __VFN_table : 0x02de89e4
+0x038 basefield1 : (null)
+0x03c basefield2 : 3
+0x040 derivedfield1 : 357
+0x044 derivedfield2 : timecode_t
Когда я в WINDBG, я могу сделать это:
dt 0x02de89e4
И это покажет тип:
0:000> dt 0x02de89e4
SomeDerivedClass::`vftable'
Symbol not found.
Но как я могу получить это внутри расширения? Могу ли я использовать SearchMemory () для поиска «ComeederiveClass ::` VFFable »? Если вы следуете за моим другом вопросом, мне нужен эта информация о типе, поэтому я знаю, какой тип удаленных классов обертки для создания. Я полагаю, что это может в конечном итоге быть каким-то вариантом, где я должен соответствовать строке к типу? Я в порядке с этим, но я до сих пор не знаю, где я могу получить эту строку, которая представляет тип рассматриваемого объекта (т. Е. Некоторые -> поле 1 в приведенном выше примере).
Решение
Дох! Это было намного проще, чем я думал. В таблицах виртуальных функций - это просто другие символы, поэтому я могу использовать getsymbol () с адресом VFFable Field1. Затем просто настройте оператор регистра с несколькими типами, которые я ожидаю, и создать правильный для ситуации.
Например:
char buffer[255];
ULONG64 displacement;
GetSymbol(0x02de89e4,buffer, &displacement);
dprintf("0x%08lx = %s\n", 0x02de89e4, buffer);
В WINDBG, когда я запускаю расширение это выходы:
0x02de89e4 = MyApplication!SomeDerivedClass::`vftable'
Простой. Просто нужно разбирать этот буфер, и мне должно быть хорошо, чтобы пойти ...