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

Decompilation

D976a85e36e57b7a38a7290b8f7c4af9?s=47 Moscow 2600
November 06, 2020

 Decompilation

D976a85e36e57b7a38a7290b8f7c4af9?s=128

Moscow 2600

November 06, 2020
Tweet

Transcript

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

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

  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/
  4. Структура декомпилятора

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

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

    локальные переменные, • На основе анализа потока данных предоставляет резонеру потока выполнения информацию о переходах, которую невозможно получить на этапе дизассемблирования, • Оптимизирует код для удаления лишних переменных, неиспользуемого кода и пр., • Обнаруживает конструкции кода, соответствующие определённой семантике и заменяет их соответствующими выражениями.
  7. Пример

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

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

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

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

    (TurboFan, Sea of Nodes), • Линейное промежуточное представление, • Что-то среднее.
  12. Пример графового ПП (TurboFan)

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

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

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

    Ninja, • 8 уровней "зрелости" микрокода в IDA Pro, • Конвейер в TurboFan.
  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/
  17. Вопросы?