Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Decompilation

Moscow 2600
November 06, 2020

 Decompilation

Moscow 2600

November 06, 2020
Tweet

More Decks by Moscow 2600

Other Decks in Research

Transcript

  1. Декомпиляторы и как они
    работают
    руководство для начинающих

    View Slide

  2. Что такое декомпилятор?

    View Slide

  3. Структура современного компилятора
    • Front-end генерирует ПП из
    исходного кода.

    • Middle-end оптимизирует и
    преобразует ПП в более
    низкоуровневую форму.

    • Back-end генерирует код для
    целевой архитектуры.
    https://en.wikibooks.org/wiki/GNU_C_Compiler_Internals/GNU_C_Compiler_Architecture
    https://blog.gopheracademy.com/advent-2018/llvm-ir-and-go/

    View Slide

  4. Структура декомпилятора

    View Slide

  5. Front-end
    • Дизассемблер преобразовывает инструкции в специфичное для
    архитектуры ПП,

    • Резолвер потока выполнения выделяет базовые блоки кода,

    • Лифтер "поднимает" вывод дизассемблера в архитектурно-
    независимое ПП, основываясь на информации и потоке выполнения.

    View Slide

  6. Middle-end
    • Производит анализ стека и на основе него генерирует локальные
    переменные,

    • На основе анализа потока данных предоставляет резонеру потока
    выполнения информацию о переходах, которую невозможно
    получить на этапе дизассемблирования,

    • Оптимизирует код для удаления лишних переменных,
    неиспользуемого кода и пр.,

    • Обнаруживает конструкции кода, соответствующие определённой
    семантике и заменяет их соответствующими выражениями.

    View Slide

  7. Пример

    View Slide

  8. Анализ потока данных и поток выполнения

    View Slide

  9. SSA-форма
    • Каждая переменная задаётся только один раз,

    • Если две версии значения достигают одного места, используется
    специальная Φ-функция,

    • Позволяет ассоциировать с каждой переменной единственный набор
    значений.
    https://ru.wikipedia.org/wiki/SSA

    View Slide

  10. SSA-форма

    View Slide

  11. Различные подходы к созданию
    промежуточного представления
    • Графовое промежуточное представление (TurboFan, Sea of Nodes),

    • Линейное промежуточное представление,

    • Что-то среднее.

    View Slide

  12. Пример графового ПП (TurboFan)

    View Slide

  13. Пример линейного ПП (Binary Ninja)

    View Slide

  14. Пример чего-то среднего (IDA Pro)
    https://blog.ret2.io/2020/07/22/ida-pro-avx-decompiler/

    View Slide

  15. Различия в уровнях абстракции
    • LLIL, MLIL, HLIL в Binary Ninja,

    • 8 уровней "зрелости" микрокода в IDA Pro,

    • Конвейер в TurboFan.

    View Slide

  16. Что почитать?
    • Simple And Efficient Construction Of Static Single Assignment Form: https://pp.info.uni-karlsruhe.de/uploads/publikationen/braun13cc.pdf

    • Классическая Теория Компиляторов: http://rema44.ru/resurs/study/compiler1/Compiler1.pdf

    • Simplex Method in IDA Pro: https://www.hex-rays.com/blog/simplex-method-in-ida-pro/

    • Hacker's Delight: https://www.amazon.com/Hackers-Delight-2nd-Henry-Warren/dp/0321842685

    • 7 Days to Lift: A mission in microcode: https://blog.ret2.io/2020/07/22/ida-pro-avx-decompiler/

    • Decompiler internals: microcode: https://i.blackhat.com/us-18/Thu-August-9/us-18-Guilfanov-Decompiler-Internals-Microcode-wp.pdf

    • Hex-Rays microcode API vs. Obfuscating compiler: https://www.hex-rays.com/blog/hex-rays-microcode-api-vs-obfuscating-compiler/,

    • Список для чтения TruboFan: https://v8.dev/docs/turbofan

    • Writing An Optimizing IL Compiler, For Dummies, By A Dummy: https://blog.can.ac/2020/04/11/writing-an-optimizing-il-compiler-for-
    dummies-by-a-dummy/

    View Slide

  17. Вопросы?

    View Slide