Обратный инжиниринг C++ - лучшие инструменты и подходы

Я сожалею - исходный код C++ можно рассматривать как реализацию проекта, а с помощью обратного инжиниринга я имею в виду возвращение дизайна обратно. Кажется, что большинство из вас читали это как получение исходного кода C++ из двоичных файлов. Более точный вопрос я опубликовал в статье " Понимание кодовой базы C++ путем создания UML - инструменты и методология".


Я думаю, что есть много инструментов, которые могут перепроектировать C++ (исходный код), но обычно не так просто понять, что вы получаете.

Кто-нибудь нашел хорошую методологию?

Я думаю, что одна из вещей, которые я хотел бы увидеть, например, это GUI-слой и то, как он отделен (или нет от остальных). Думаю, инструменты должны как-то обнаруживать пакеты, а затем позвольте мне вручную организовать их.

4 ответа

Насколько мне известно, нет надежных инструментов, которые могут перепроектировать скомпилированный C++.

Более того, я думаю, что создать такое устройство практически невозможно. Скомпилированная программа C++ становится не более чем инструкциями машинного языка. Чтобы узнать, как это соотносится с конструкциями C++, вам нужно знать компилятор, настройки компилятора, включенные библиотеки и т. Д. До бесконечности.

Зачем тебе такая вещь? В зависимости от того, для чего вы этого хотите, могут быть другие способы достичь того, чего вы действительно хотите.

Пока это не полное решение. Вы должны посмотреть на IDA Pro и Hexrays.

Это больше для "обратного инжиниринга" в традиционном смысле этого слова. Например, он даст вам достаточно хорошее представление о том, как будет выглядеть код на языке, подобном Си, но не сможет (не может) предоставить полностью функционирующий исходный код.

То, для чего это хорошо, - это хорошее понимание того, как работает определенный сегмент (обычно функция). Это "помощь пользователю", что означает, что он часто делает много разыменований смещений, когда есть действительно структура или класс. В этот момент вы можете предоставить декомпилятору определение структуры (классы на самом деле просто структуры с дополнительными вещами, такими как v-таблицы и тому подобное), и он повторно проанализирует код с информацией о новом типе.

Как я уже сказал, это не идеально, но если вы хотите сделать "реверс-инжиниринг", это лучшее решение, которое я знаю. Если вы хотите полную "декомпиляцию", вам не повезло.

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

В сборке есть только целые числа (и, возможно, несколько шорт). Подумайте об объектах, массивах, структурах, строках и арифметике указателей одного типа!

Проект OovAide по адресу http://sourceforge.net/projects/oovaide/ или на github имеет несколько функций, которые могут помочь. Он использует компилятор CLang для получения точной информации из исходного кода. Он сканирует каталоги в поисках исходного кода и собирает информацию в меньший набор данных, который содержит информацию, необходимую для анализа.

Одна концепция называется зональными диаграммами. Он показывает отношения между классами на очень высоком уровне, так как каждый класс обозначен точкой на диаграмме, и показаны линии отношений, соединяющие их. Это позволяет диаграммам показывать сотни или тысячи классов. Дисплей диаграммы зоны программы OovAide имеет опцию "Показать дочерние зоны", которая группирует классы в каталогах ближе друг к другу. Существуют также фильтры каталогов, которые позволяют сократить количество классов, показанных на диаграмме для очень больших проектов. Пример диаграмм зон и их работы приведен здесь: http://oovaide.sourceforge.net/articles/ZoneDiagrams.html

Если каталогам назначены типы компонентов в настройках сборки, тогда диаграмма компонентов покажет зависимости между компонентами. Это даже показывает, какие компоненты зависят от внешних компонентов, таких как GTK, или других внешних библиотек.

Следующий уровень вниз показывает что-то вроде диаграмм классов UML, но показывает все отношения, а не только агрегацию и наследование. Он может отображать классы, которые используются внутри методов, или классы, которые передаются в качестве параметров в методы. Любой класс может быть выбран в качестве отправной точки, затем перед добавлением диаграммы на диаграмму отображается список, позволяющий просмотреть, какие классы будут отображаться по типу отношения.

Самый нижний уровень показывает диаграммы последовательности. Это позволяет перемещаться вверх или вниз по дереву вызовов, показывая классы, содержащие методы.

Другие вопросы по тегам