2010-11-23 1 views
6

Прошу прощения - Исходный код на C++ можно рассматривать как реализацию дизайна, а с обратная инженерия Я имею в виду вернуть дизайн. Кажется, большинство из вас прочитало это как получение исходного кода на C++ из двоичных файлов. Я отправил более точный вопрос на Understanding a C++ codebase by generating UML - tools&methologyОбратное проектирование C++ - лучшие инструменты и подход


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

Неужели кто-то нашел хорошую методологию?

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

+0

Если у вас есть исходный код, что именно вы подразумеваете в первую очередь под «обратным инженером»? – SingleNegationElimination 2010-11-23 23:50:57

+0

Вы ожидаете, что dissasembler или декомпилятор обнаружит пакеты, вытащите элементы пользовательского интерфейса из кода, отличного от UI, или что-нибудь близкое к этому? – Falmarri 2010-11-23 23:52:59

ответ

8

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

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

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

+1

Это также не биекция даже при условии, что информация о компиляторе: к тому времени, когда несколько вызовов шаблонов функций были вложены, создаются с использованием разных типов, невозможно знать, и может быть очень трудно догадаться, что они действительно все пришли из того же шаблон в первую очередь. Разумеется, если двоичный файл не имеет отладочной информации. – 2010-11-24 00:09:07

3

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

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

3

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

Это больше для «обратного проектирования» в традиционном смысле фразы. Как и в случае, это даст вам достаточно хорошее представление о том, как будет выглядеть код на C-подобном языке, но не сможет (не может) обеспечить полноценный исходный код.

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

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

0

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

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

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

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

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