Как восстановить тип и структуру данных в разобранной C / C ++ программе? - PullRequest
4 голосов
/ 10 апреля 2011

Я сделал двоичный исполняемый файл, разобранный с помощью дизассемблера, такого как IDA Pro.Теперь я планирую максимально полно распознать информацию о типе и структуре данных.Есть ли какие-либо ссылки на ресурсы или идеи, которые помогут мне выполнить задачу?

Спасибо! ~

РЕДАКТИРОВАТЬ :

Большое спасибо за советы ниже,Помимо type and data structure information, есть идеи по поводу class object recognition?

Ответы [ 5 ]

4 голосов
/ 10 апреля 2011

Уже упомянутый Reversing: Secrets of Reverse engineering от Eldad Eilam содержит несколько хороших описаний того, как различные потоки управления и структуры данных выглядят в сборке.Однако, поскольку вы специально упоминаете классы, я бы хотел включить мою статью по реализации Visual C ++.Многое из этого применимо и к другим компиляторам.

Кстати, я бы рекомендовал начать с небольших функций / классов и указывать их в двоичном виде.Если вы используете Visual C ++ и компилируете свой код с отладочной информацией (Debug build или / Zi в командной строке), IDA (по крайней мере, последние версии) обнаружит и предложит загрузить символы PDB.Это облегчит идентификацию вашего кода.

1 голос
/ 12 апреля 2011

В последнее время были опубликованы некоторые исследовательские работы на эту тему, они, вероятно, имеют открытый исходный код и могут даже иметь веб-интерфейсы, с помощью которых вы можете отправить свой двоичный файл для анализа, хотя они, вероятно, обрабатывают только двоичные файлы Elf. Они достигли довольно впечатляющих результатов:

Копка для структур данных Энтони Коззи, Фрэнк Страттон, Хуэй Сюэ и Сэмюэль Т. Кинг

Автоматический обратный инжиниринг структур данных из двоичного исполнения Чжицян Лин, Сяньюй Чжан и Дунъянь Сюй

1 голос
/ 10 апреля 2011

Основываясь на типе инструкций доступа, выполняемых в некоторой части памяти, можно угадать и выбрать некоторые виды базовых типов, такие как логические, целые, с плавающей запятой, даже некоторые строковые сообщения (легко, если это ascii char, но в настоящее время мы также видим utf).

Даже если вы выбрали один или другой для «представления» того, что, по вашему мнению, находится в памяти, нет никакой связи между вашими опциями и реальным кодом.

Места, которые вы должны искать, чтобы получить подсказку, - это инструкции push перед каждым вызовом функции, так как они, вероятно, являются параметрами. Если вы знаете исходный язык, вы получите некоторую информацию о используемом соглашении о вызовах *1006*.

Но, как сказал Мерадад, просто нет адекватной информации, которой можно доверять.

Береги себя, Бек

1 голос
/ 10 апреля 2011

Есть пара книг, которые могут оказаться полезными:

  1. Код обратной инженерии с IDA Pro
  2. Реверс: секреты обратного проектирования
  3. IDA Probook

Кроме того, удобно иметь справочник по API и "внутреннюю" книгу для любой операционной системы, с которой вы имеете дело.Вы можете понять немного, основываясь на том, что передано в какие функции API.

1 голос
/ 10 апреля 2011

Это практически невозможно; адекватная информация просто не существует в файле после компиляции.

Вам нужно пройти разборку вручную во время выполнения и попытаться расшифровать числа самостоятельно.

...