Цель этого проекта-реализовать конвейер декомпиляции, состоящий из независимых компонентов, взаимодействующих через четко определенные интерфейсы, как и описано в проектных документах проекта.
git clone https://github.com/decomp/decomp
cd decomp
go install -v ./...См. Пример использования в примерах/демонстрации, и этот комментарий для получения более подробной информации.
С точки зрения высокого уровня, компоненты трубопровода декомпиляции концептуально сгруппированы в три модуля. Во-первых, фронт-энды переводит исходный язык (например, x86 сборка) в LLVM IR; Платформу-независимое промежуточное представление о низком уровне. Во-вторых, средние конструкции структуры LLVM IR, идентифицируя примитивы управляющего потока высокого уровня (например, петли перед тестированием, двухсторонние условия). Наконец, задняя часть переводит структурированный IR LLVM в язык целевого программирования высокого уровня (например, GO).
Следующий плакат суммирует текущие возможности трубопровода декомпиляции, используя композицию независимых компонентов для перевода IR LLVM для работы.
Перевести машинный код (например, x86 сборка) в LLVM IR.
Сторонние передовые компоненты.
Выполните анализ потока управления на IR LLVM, чтобы идентифицировать примитивы контрольного потока высокого уровня (например, петли предварительного тестирования).
https://godoc.org/github.com/decomp/decomp/cmd/ll2dot
Инструмент генерации потока управления.
Создать графики потока управления от IR Assembly LLVM ( *.ll -> *.dot).
https://godoc.org/github.com/decomp/decomp/cmd/restructure
Инструмент восстановления потока управления.
Восстановить примитивы потока управления из графиков потока управления ( *.dot -> *.json).
Перевести структурированный LLVM IR на целевой язык высокого уровня (например, GO).
https://godoc.org/github.com/decomp/decomp/cmd/ll2go
Go Code Generation Tool.
Decompile LLVM IR Assembly для перемещения исходного кода ( *.ll -> *.go).
https://godoc.org/github.com/decomp/decomp/cmd/go-post
Идите инструмент после обработки.
Post -Processe Go Исходный код, чтобы сделать его более идиоматическим ( *.go -> *.go).
Основная фокус версии 0.2: скорость компиляции по всему проекту .
Разработка компонентов декомпиляции должна быть веселой.
Похоже, что существует обратная корреляция между в зависимости от огромной библиотеки C ++ и развлечением разрабатывания компонентов декомпиляции.
Версия 0.2 Декомпиляционного трубопровода стремится решить эту проблему, используя библиотеку IR LLVM, написанную в Pure Go. До этого выпуска компиляция по всему проекту может занять несколько часов. Теперь они завершаются менее чем за 1 минуту - устоявший жесткий предел для всех будущих выпусков.
Первоначальный выпуск.
Основная фокус версии 0.1: композиционная декомпиляция .
Декомпиляторы должны быть композируемыми и открытым исходным кодом.
Декомпиляционный трубопровод должен состоять из отдельных компонентов, каждый из которых с одной целью и четко определенным входом и выводом.
Версия 0.1 проекта Decomp исследует осуществимость сочинения конвейера декомпиляции от независимых компонентов и потенциала обнародования этих компонентов конечному пользователю.
Для получения дополнительной информации обратитесь к композиционному декомпилированию, используя документ LLVM IR Design.
Основная фокус версии 0.3: Бинарный подъемник с типами .
Декомпиляторы полагаются на высококачественную бинарную подъем.
Качество выхода IR из бинарного подъема фронт-энда в основном определяет качество производства всего трубопровода декомпиляции.
Версия 0.3 направлена на улучшение качества выхода LLVM IR путем внедрения бинарного подъема бинарного подъема типа.
Основная фокус версии 0.4: Анализ потока управления .
Декомпиляторы должны восстановить примитивы управления на высоком уровне.
Одним из основных различий между сборкой низкого уровня и исходным кодом высокого уровня является использование высокоуровневых примитивов управления; Например, 1-й, двухсторонние и n-way Conditanals ( if , if-else и switch ), петли до и пост-теста ( while и do-while ).
Версия 0.4 стремится восстановить примитивы потока управления высокого уровня с использованием надежных алгоритмов анализа потока управления.
Основная фокус версии 0.5: терпимость разлома .
Декомпиляторы должны быть надежными.
Компоненты декомпиляции должны хорошо реагировать на неожиданные состояния и неполный анализ.
Версия 0.5 фокусируется на стабильности и стремится стресс-тестирование трубопровода декомпиляции с использованием полуреального программного обеспечения World (см. Серию проблем проблем).
Основная фокус версии 0.6: Анализ потока данных .
Основная фокус версии 0.7: Анализ типа .