Выжимание максимума из MS RTTI

Тема в разделе "WASM.RESEARCH", создана пользователем Ezrah, 21 янв 2012.

  1. Ezrah

    Ezrah Member

    Публикаций:
    0
    Регистрация:
    22 мар 2011
    Сообщения:
    411
    Существуют ли программы, способные выдирать из бинарных файлов всю информацию о RTTI?
    Знаю, что есть скрипт для IDA. Пробовал, он ведёт себя некорректно, когда встречается со множественным наследованием. Кроме того, скрипт не обновлялся почти 10 лет.
    Интересуют как скрипты для IDA, так и самостоятельные программы, способные по максимуму выжать информацию из RTTI (MS), желательно с некоторым структурированием.
     
  2. bsnake

    bsnake New Member

    Публикаций:
    0
    Регистрация:
    11 сен 2005
    Сообщения:
    91
    А можете привести примеры с наследованием, где некорректный вывод?

    По MS RTTI, лично я встречал только одну статью, как раз автора скрипта (сейчас уже разработчика IDA).
     
  3. Ezrah

    Ezrah Member

    Публикаций:
    0
    Регистрация:
    22 мар 2011
    Сообщения:
    411
    bsnake
    Могу лишь дать бинарник, скомпиленный не мной. Отладочной инфы никакой. Разбирал его с помощью ms_rtti давно, поэтому точное место так же не смогу указать, а классов там множество.
     
  4. Vam

    Vam New Member

    Публикаций:
    0
    Регистрация:
    16 июл 2008
    Сообщения:
    149
    Ezrah
    Напишите сами, здесь есть вся необходимая информация о RTTI.
     
  5. Ezrah

    Ezrah Member

    Публикаций:
    0
    Регистрация:
    22 мар 2011
    Сообщения:
    411
    Придётся, если нет готового варианта.
     
  6. sergegers

    sergegers New Member

    Публикаций:
    0
    Регистрация:
    8 июн 2008
    Сообщения:
    172
    http://www.openrce.org/downloads/details/196
    http://www.openrce.org/articles/full_view/23

    пользовался этими скриптами, всё прекрасно работает, если конечно есть rtti
     
  7. Ezrah

    Ezrah Member

    Публикаций:
    0
    Регистрация:
    22 мар 2011
    Сообщения:
    411
    Про них я и указал в первом посте. Работают не прекрасно.
    От того же автора там же есть скрипты для работы с SEH/EH под код, генерируемый MSVC 2005. Их я осилил допилить, с RTTI всё как-то сложнее. Есть другие варианты?
     
  8. sergegers

    sergegers New Member

    Публикаций:
    0
    Регистрация:
    8 июн 2008
    Сообщения:
    172
    есть ещё вот это http://wasm.ru/forum/viewtopic.php?id=41859
    а что не работает-то? (просто я удивлён, в примере к статье парсится код на atl, я тоже разбирал код на atl из com объекта, который наследовал под сотню классов, а вы вдруг говорите, что плохо реверсит множественное наследование)
     
  9. Ezrah

    Ezrah Member

    Публикаций:
    0
    Регистрация:
    22 мар 2011
    Сообщения:
    411
    sergegers
    Код (Text):
    1. 004F24E0h: possible vtable (3 methods)
    2. 0000:     iTCPNETMessage
    3. 0000:         DataIO::DataSerializerBuffer
    4. 0000:             DataIO::iMemorySerializer
    5. 0000:                 DataIO::iMemoryBuffer
    6. 0004:                 DataIO::iDataSerializer
    7. 0004:                     DataIO::iDataWriter
    8. 0008:                     DataIO::iDataReader
    9. 0000:         iTCPNETObject
    10.  iTCPNETMessage::`vftable'{for `DataIO::DataSerializerBuffer'}
    11.   referencing functions:
    12.   .text:00486620
    13.   .text:004868D0
    14.   .text:00486B40
    15.   .text:00486880: thunk to .text:004868A0
    16. refcount:3
    17.  
    18. 004F24F0h: possible vtable (4 methods)
    19. 0000:     iTCPNETMessage
    20. 0000:         DataIO::DataSerializerBuffer
    21. 0000:             DataIO::iMemorySerializer
    22. 0000:                 DataIO::iMemoryBuffer
    23. 0004:                 DataIO::iDataSerializer
    24. 0004:                     DataIO::iDataWriter
    25. 0008:                     DataIO::iDataReader
    26. 0000:         iTCPNETObject
    27. 4F24F0: can't rename byte as '??_7iTCPNETMessage@@6BDataSerializerBuffer@DataIO@@@' because the name is already used in the program.
    28. 500DB4: can't rename byte as '??_R4iTCPNETMessage@@6BDataSerializerBuffer@DataIO@@@' because the name is already used in the program.
    29. 4F24F0: can't rename byte as '??_7iTCPNETMessage@@6BDataSerializerBuffer@DataIO@@@' because the name is already used in the program.
    30.  iTCPNETMessage::`vftable'{for `DataIO::DataSerializerBuffer'}
    31.   referencing functions:
    32.   .text:00486620
    33.   .text:004868D0
    34.   .text:00486B40
    35.   .text:00486890: thunk to .text:004868A0
    36. refcount:3
    37.  
    38. 004F2504h: possible vtable (47 methods)
    39. 0000:     iTCPNETMessage
    40. 0000:         DataIO::DataSerializerBuffer
    41. 0000:             DataIO::iMemorySerializer
    42. 0000:                 DataIO::iMemoryBuffer
    43. 0004:                 DataIO::iDataSerializer
    44. 0004:                     DataIO::iDataWriter
    45. 0008:                     DataIO::iDataReader
    46. 0000:         iTCPNETObject
    47. 4F2504: can't rename byte as '??_7iTCPNETMessage@@6BDataSerializerBuffer@DataIO@@@' because the name is already used in the program.
    48. 500DA0: can't rename byte as '??_R4iTCPNETMessage@@6BDataSerializerBuffer@DataIO@@@' because the name is already used in the program.
    49. 4F2504: can't rename byte as '??_7iTCPNETMessage@@6BDataSerializerBuffer@DataIO@@@' because the name is already used in the program.
    50.  iTCPNETMessage::`vftable'{for `DataIO::DataSerializerBuffer'}
    51.   referencing functions:
    52.   .text:00486620
    53.   .text:004868D0
    54.   .text:00486B40
    55.   .text:00486870: thunk to .text:004868A0
    56. refcount:3
    57.  
    58. 004F25C4h: possible vtable (4 methods)
    59. 0000:     iTCPNETMessage
    60. 0000:         DataIO::DataSerializerBuffer
    61. 0000:             DataIO::iMemorySerializer
    62. 0000:                 DataIO::iMemoryBuffer
    63. 0004:                 DataIO::iDataSerializer
    64. 0004:                     DataIO::iDataWriter
    65. 0008:                     DataIO::iDataReader
    66. 0000:         iTCPNETObject
    67.  iTCPNETMessage::`vftable'{for `DataIO::iDataReader'}
    68.   referencing functions:
    69.   .text:00486620
    70.   .text:004868D0
    71.   .text:00486B40
    72. refcount:3
    73.  
    74. 004F25D8h: possible vtable (3 methods)
    75. 0000:     iTCPNETMessage
    76. 0000:         DataIO::DataSerializerBuffer
    77. 0000:             DataIO::iMemorySerializer
    78. 0000:                 DataIO::iMemoryBuffer
    79. 0004:                 DataIO::iDataSerializer
    80. 0004:                     DataIO::iDataWriter
    81. 0008:                     DataIO::iDataReader
    82. 0000:         iTCPNETObject
    83.  iTCPNETMessage::`vftable'{for `iTCPNETMessage'}
    84.   referencing functions:
    85.   .text:00486620
    86.   .text:004868D0
    87.   .text:00486B40
    88. refcount:3
    89.  
    90. 004F2618h: possible vtable (3 methods)
    91. 0000:     TCPNETMessage
    92. 0000:         iTCPNETMessage
    93. 0000:             DataIO::DataSerializerBuffer
    94. 0000:                 DataIO::iMemorySerializer
    95. 0000:                     DataIO::iMemoryBuffer
    96. 0004:                     DataIO::iDataSerializer
    97. 0004:                         DataIO::iDataWriter
    98. 0008:                         DataIO::iDataReader
    99. 0000:             iTCPNETObject
    100. 0008:         TCPNETObject
    101. 0000:             iTCPNETObject
    102.  TCPNETMessage::`vftable'{for `DataIO::DataSerializerBuffer'}
    103.   referencing functions:
    104.   .text:004868D0
    105.   .text:00486B40
    106. refcount:2
    107.  
    108. 004F2628h: possible vtable (4 methods)
    109. 0000:     TCPNETMessage
    110. 0000:         iTCPNETMessage
    111. 0000:             DataIO::DataSerializerBuffer
    112. 0000:                 DataIO::iMemorySerializer
    113. 0000:                     DataIO::iMemoryBuffer
    114. 0004:                     DataIO::iDataSerializer
    115. 0004:                         DataIO::iDataWriter
    116. 0008:                         DataIO::iDataReader
    117. 0000:             iTCPNETObject
    118. 0008:         TCPNETObject
    119. 0000:             iTCPNETObject
    120. 4F2628: can't rename byte as '??_7TCPNETMessage@@6BDataSerializerBuffer@DataIO@@@' because the name is already used in the program.
    121. 500E88: can't rename byte as '??_R4TCPNETMessage@@6BDataSerializerBuffer@DataIO@@@' because the name is already used in the program.
    122. 4F2628: can't rename byte as '??_7TCPNETMessage@@6BDataSerializerBuffer@DataIO@@@' because the name is already used in the program.
    123.  TCPNETMessage::`vftable'{for `DataIO::DataSerializerBuffer'}
    124.   referencing functions:
    125.   .text:004868D0
    126.   .text:00486B40
    127.   .text:00486B20: thunk to .text:00486D20
    128. refcount:2
    129.  
    130. 004F263Ch: possible vtable (47 methods)
    131. 0000:     TCPNETMessage
    132. 0000:         iTCPNETMessage
    133. 0000:             DataIO::DataSerializerBuffer
    134. 0000:                 DataIO::iMemorySerializer
    135. 0000:                     DataIO::iMemoryBuffer
    136. 0004:                     DataIO::iDataSerializer
    137. 0004:                         DataIO::iDataWriter
    138. 0008:                         DataIO::iDataReader
    139. 0000:             iTCPNETObject
    140. 0008:         TCPNETObject
    141. 0000:             iTCPNETObject
    142. 4F263C: can't rename byte as '??_7TCPNETMessage@@6BDataSerializerBuffer@DataIO@@@' because the name is already used in the program.
    143. 500E74: can't rename byte as '??_R4TCPNETMessage@@6BDataSerializerBuffer@DataIO@@@' because the name is already used in the program.
    144. 4F263C: can't rename byte as '??_7TCPNETMessage@@6BDataSerializerBuffer@DataIO@@@' because the name is already used in the program.
    145.  TCPNETMessage::`vftable'{for `DataIO::DataSerializerBuffer'}
    146.   referencing functions:
    147.   .text:004868D0
    148.   .text:00486B40
    149.   .text:00486B00: thunk to .text:00486D20
    150. refcount:2
    151.  
    152. 004F26FCh: possible vtable (4 methods)
    153. 0000:     TCPNETMessage
    154. 0000:         iTCPNETMessage
    155. 0000:             DataIO::DataSerializerBuffer
    156. 0000:                 DataIO::iMemorySerializer
    157. 0000:                     DataIO::iMemoryBuffer
    158. 0004:                     DataIO::iDataSerializer
    159. 0004:                         DataIO::iDataWriter
    160. 0008:                         DataIO::iDataReader
    161. 0000:             iTCPNETObject
    162. 0008:         TCPNETObject
    163. 0000:             iTCPNETObject
    164. 4F26FC: can't rename byte as '??_7TCPNETMessage@@6BDataSerializerBuffer@DataIO@@@' because the name is already used in the program.
    165. 500E60: can't rename byte as '??_R4TCPNETMessage@@6BDataSerializerBuffer@DataIO@@@' because the name is already used in the program.
    166. 4F26FC: can't rename byte as '??_7TCPNETMessage@@6BDataSerializerBuffer@DataIO@@@' because the name is already used in the program.
    167.  TCPNETMessage::`vftable'{for `DataIO::DataSerializerBuffer'}
    168.   referencing functions:
    169.   .text:004868D0
    170.   .text:00486B40
    171. refcount:2
    172.  
    173. 004F2710h: possible vtable (4 methods)
    174. 0000:     TCPNETMessage
    175. 0000:         iTCPNETMessage
    176. 0000:             DataIO::DataSerializerBuffer
    177. 0000:                 DataIO::iMemorySerializer
    178. 0000:                     DataIO::iMemoryBuffer
    179. 0004:                     DataIO::iDataSerializer
    180. 0004:                         DataIO::iDataWriter
    181. 0008:                         DataIO::iDataReader
    182. 0000:             iTCPNETObject
    183. 0008:         TCPNETObject
    184. 0000:             iTCPNETObject
    185.  TCPNETMessage::`vftable'{for `DataIO::iDataReader'}
    186.   referencing functions:
    187.   .text:004868D0
    188.   .text:00486B40
    189. refcount:2
    190.  
    191. 004F2724h: possible vtable (3 methods)
    192. 0000:     TCPNETMessage
    193. 0000:         iTCPNETMessage
    194. 0000:             DataIO::DataSerializerBuffer
    195. 0000:                 DataIO::iMemorySerializer
    196. 0000:                     DataIO::iMemoryBuffer
    197. 0004:                     DataIO::iDataSerializer
    198. 0004:                         DataIO::iDataWriter
    199. 0008:                         DataIO::iDataReader
    200. 0000:             iTCPNETObject
    201. 0008:         TCPNETObject
    202. 0000:             iTCPNETObject
    203.  TCPNETMessage::`vftable'{for `TCPNETMessage'}
    204.   referencing functions:
    205.   .text:004868D0
    206.   .text:00486B40
    207. refcount:2
    Коротко говоря, сообщений типа
    быть не должно.
     
  10. Ezrah

    Ezrah Member

    Публикаций:
    0
    Регистрация:
    22 мар 2011
    Сообщения:
    411
    Ах да, неправильно указал. Подобные ошибки возникают при виртуальном множественном наследовании, как в этой статье.
     
  11. sergegers

    sergegers New Member

    Публикаций:
    0
    Регистрация:
    8 июн 2008
    Сообщения:
    172
    на мой взгляд, на эту чепуху не стоит обращать внимание. главное, что виртуальные таблицы построены. а что там по адресам, которые невозможно переименовать? если тоже функции, то возможно, что всё правильно. майкрософтовский компилятор при оптимизации любит делать чанки и даже собирает одинаковые функции в одну. возможно это тот случай
     
  12. ADACH

    ADACH New Member

    Публикаций:
    0
    Регистрация:
    26 май 2008
    Сообщения:
    4
    Попробуйте это, думаю, что подойдет.