Существуют ли программы, способные выдирать из бинарных файлов всю информацию о RTTI? Знаю, что есть скрипт для IDA. Пробовал, он ведёт себя некорректно, когда встречается со множественным наследованием. Кроме того, скрипт не обновлялся почти 10 лет. Интересуют как скрипты для IDA, так и самостоятельные программы, способные по максимуму выжать информацию из RTTI (MS), желательно с некоторым структурированием.
А можете привести примеры с наследованием, где некорректный вывод? По MS RTTI, лично я встречал только одну статью, как раз автора скрипта (сейчас уже разработчика IDA).
bsnake Могу лишь дать бинарник, скомпиленный не мной. Отладочной инфы никакой. Разбирал его с помощью ms_rtti давно, поэтому точное место так же не смогу указать, а классов там множество.
http://www.openrce.org/downloads/details/196 http://www.openrce.org/articles/full_view/23 пользовался этими скриптами, всё прекрасно работает, если конечно есть rtti
Про них я и указал в первом посте. Работают не прекрасно. От того же автора там же есть скрипты для работы с SEH/EH под код, генерируемый MSVC 2005. Их я осилил допилить, с RTTI всё как-то сложнее. Есть другие варианты?
есть ещё вот это http://wasm.ru/forum/viewtopic.php?id=41859 а что не работает-то? (просто я удивлён, в примере к статье парсится код на atl, я тоже разбирал код на atl из com объекта, который наследовал под сотню классов, а вы вдруг говорите, что плохо реверсит множественное наследование)
sergegers Код (Text): 004F24E0h: possible vtable (3 methods) 0000: iTCPNETMessage 0000: DataIO::DataSerializerBuffer 0000: DataIO::iMemorySerializer 0000: DataIO::iMemoryBuffer 0004: DataIO::iDataSerializer 0004: DataIO::iDataWriter 0008: DataIO::iDataReader 0000: iTCPNETObject iTCPNETMessage::`vftable'{for `DataIO::DataSerializerBuffer'} referencing functions: .text:00486620 .text:004868D0 .text:00486B40 .text:00486880: thunk to .text:004868A0 refcount:3 004F24F0h: possible vtable (4 methods) 0000: iTCPNETMessage 0000: DataIO::DataSerializerBuffer 0000: DataIO::iMemorySerializer 0000: DataIO::iMemoryBuffer 0004: DataIO::iDataSerializer 0004: DataIO::iDataWriter 0008: DataIO::iDataReader 0000: iTCPNETObject 4F24F0: can't rename byte as '??_7iTCPNETMessage@@6BDataSerializerBuffer@DataIO@@@' because the name is already used in the program. 500DB4: can't rename byte as '??_R4iTCPNETMessage@@6BDataSerializerBuffer@DataIO@@@' because the name is already used in the program. 4F24F0: can't rename byte as '??_7iTCPNETMessage@@6BDataSerializerBuffer@DataIO@@@' because the name is already used in the program. iTCPNETMessage::`vftable'{for `DataIO::DataSerializerBuffer'} referencing functions: .text:00486620 .text:004868D0 .text:00486B40 .text:00486890: thunk to .text:004868A0 refcount:3 004F2504h: possible vtable (47 methods) 0000: iTCPNETMessage 0000: DataIO::DataSerializerBuffer 0000: DataIO::iMemorySerializer 0000: DataIO::iMemoryBuffer 0004: DataIO::iDataSerializer 0004: DataIO::iDataWriter 0008: DataIO::iDataReader 0000: iTCPNETObject 4F2504: can't rename byte as '??_7iTCPNETMessage@@6BDataSerializerBuffer@DataIO@@@' because the name is already used in the program. 500DA0: can't rename byte as '??_R4iTCPNETMessage@@6BDataSerializerBuffer@DataIO@@@' because the name is already used in the program. 4F2504: can't rename byte as '??_7iTCPNETMessage@@6BDataSerializerBuffer@DataIO@@@' because the name is already used in the program. iTCPNETMessage::`vftable'{for `DataIO::DataSerializerBuffer'} referencing functions: .text:00486620 .text:004868D0 .text:00486B40 .text:00486870: thunk to .text:004868A0 refcount:3 004F25C4h: possible vtable (4 methods) 0000: iTCPNETMessage 0000: DataIO::DataSerializerBuffer 0000: DataIO::iMemorySerializer 0000: DataIO::iMemoryBuffer 0004: DataIO::iDataSerializer 0004: DataIO::iDataWriter 0008: DataIO::iDataReader 0000: iTCPNETObject iTCPNETMessage::`vftable'{for `DataIO::iDataReader'} referencing functions: .text:00486620 .text:004868D0 .text:00486B40 refcount:3 004F25D8h: possible vtable (3 methods) 0000: iTCPNETMessage 0000: DataIO::DataSerializerBuffer 0000: DataIO::iMemorySerializer 0000: DataIO::iMemoryBuffer 0004: DataIO::iDataSerializer 0004: DataIO::iDataWriter 0008: DataIO::iDataReader 0000: iTCPNETObject iTCPNETMessage::`vftable'{for `iTCPNETMessage'} referencing functions: .text:00486620 .text:004868D0 .text:00486B40 refcount:3 004F2618h: possible vtable (3 methods) 0000: TCPNETMessage 0000: iTCPNETMessage 0000: DataIO::DataSerializerBuffer 0000: DataIO::iMemorySerializer 0000: DataIO::iMemoryBuffer 0004: DataIO::iDataSerializer 0004: DataIO::iDataWriter 0008: DataIO::iDataReader 0000: iTCPNETObject 0008: TCPNETObject 0000: iTCPNETObject TCPNETMessage::`vftable'{for `DataIO::DataSerializerBuffer'} referencing functions: .text:004868D0 .text:00486B40 refcount:2 004F2628h: possible vtable (4 methods) 0000: TCPNETMessage 0000: iTCPNETMessage 0000: DataIO::DataSerializerBuffer 0000: DataIO::iMemorySerializer 0000: DataIO::iMemoryBuffer 0004: DataIO::iDataSerializer 0004: DataIO::iDataWriter 0008: DataIO::iDataReader 0000: iTCPNETObject 0008: TCPNETObject 0000: iTCPNETObject 4F2628: can't rename byte as '??_7TCPNETMessage@@6BDataSerializerBuffer@DataIO@@@' because the name is already used in the program. 500E88: can't rename byte as '??_R4TCPNETMessage@@6BDataSerializerBuffer@DataIO@@@' because the name is already used in the program. 4F2628: can't rename byte as '??_7TCPNETMessage@@6BDataSerializerBuffer@DataIO@@@' because the name is already used in the program. TCPNETMessage::`vftable'{for `DataIO::DataSerializerBuffer'} referencing functions: .text:004868D0 .text:00486B40 .text:00486B20: thunk to .text:00486D20 refcount:2 004F263Ch: possible vtable (47 methods) 0000: TCPNETMessage 0000: iTCPNETMessage 0000: DataIO::DataSerializerBuffer 0000: DataIO::iMemorySerializer 0000: DataIO::iMemoryBuffer 0004: DataIO::iDataSerializer 0004: DataIO::iDataWriter 0008: DataIO::iDataReader 0000: iTCPNETObject 0008: TCPNETObject 0000: iTCPNETObject 4F263C: can't rename byte as '??_7TCPNETMessage@@6BDataSerializerBuffer@DataIO@@@' because the name is already used in the program. 500E74: can't rename byte as '??_R4TCPNETMessage@@6BDataSerializerBuffer@DataIO@@@' because the name is already used in the program. 4F263C: can't rename byte as '??_7TCPNETMessage@@6BDataSerializerBuffer@DataIO@@@' because the name is already used in the program. TCPNETMessage::`vftable'{for `DataIO::DataSerializerBuffer'} referencing functions: .text:004868D0 .text:00486B40 .text:00486B00: thunk to .text:00486D20 refcount:2 004F26FCh: possible vtable (4 methods) 0000: TCPNETMessage 0000: iTCPNETMessage 0000: DataIO::DataSerializerBuffer 0000: DataIO::iMemorySerializer 0000: DataIO::iMemoryBuffer 0004: DataIO::iDataSerializer 0004: DataIO::iDataWriter 0008: DataIO::iDataReader 0000: iTCPNETObject 0008: TCPNETObject 0000: iTCPNETObject 4F26FC: can't rename byte as '??_7TCPNETMessage@@6BDataSerializerBuffer@DataIO@@@' because the name is already used in the program. 500E60: can't rename byte as '??_R4TCPNETMessage@@6BDataSerializerBuffer@DataIO@@@' because the name is already used in the program. 4F26FC: can't rename byte as '??_7TCPNETMessage@@6BDataSerializerBuffer@DataIO@@@' because the name is already used in the program. TCPNETMessage::`vftable'{for `DataIO::DataSerializerBuffer'} referencing functions: .text:004868D0 .text:00486B40 refcount:2 004F2710h: possible vtable (4 methods) 0000: TCPNETMessage 0000: iTCPNETMessage 0000: DataIO::DataSerializerBuffer 0000: DataIO::iMemorySerializer 0000: DataIO::iMemoryBuffer 0004: DataIO::iDataSerializer 0004: DataIO::iDataWriter 0008: DataIO::iDataReader 0000: iTCPNETObject 0008: TCPNETObject 0000: iTCPNETObject TCPNETMessage::`vftable'{for `DataIO::iDataReader'} referencing functions: .text:004868D0 .text:00486B40 refcount:2 004F2724h: possible vtable (3 methods) 0000: TCPNETMessage 0000: iTCPNETMessage 0000: DataIO::DataSerializerBuffer 0000: DataIO::iMemorySerializer 0000: DataIO::iMemoryBuffer 0004: DataIO::iDataSerializer 0004: DataIO::iDataWriter 0008: DataIO::iDataReader 0000: iTCPNETObject 0008: TCPNETObject 0000: iTCPNETObject TCPNETMessage::`vftable'{for `TCPNETMessage'} referencing functions: .text:004868D0 .text:00486B40 refcount:2 Коротко говоря, сообщений типа быть не должно.
Ах да, неправильно указал. Подобные ошибки возникают при виртуальном множественном наследовании, как в этой статье.
на мой взгляд, на эту чепуху не стоит обращать внимание. главное, что виртуальные таблицы построены. а что там по адресам, которые невозможно переименовать? если тоже функции, то возможно, что всё правильно. майкрософтовский компилятор при оптимизации любит делать чанки и даже собирает одинаковые функции в одну. возможно это тот случай