Перевод машинного кода в LLVM IR (разборка / сборка X86_64. X86. ARM в битовый код LLVM) - PullRequest
27 голосов
/ 08 августа 2011

Я хотел бы перевести исполняемые файлы X86_64, x86, ARM в LLVM IR (разборка).

Какое решение вы предлагаете?

Ответы [ 6 ]

13 голосов
/ 06 августа 2015

mcsema - бинарный подъемник производственного качества. Он берет x86 и x86-64 и статически «поднимает» его до IR LLVM. Он активно поддерживается, имеет лицензию BSD и имеет обширные тесты и документацию.

https://github.com/trailofbits/mcsema

11 голосов
/ 31 января 2012

Рассмотрите возможность использования инструмента RevGen , разработанного в рамках проекта S2E .Это позволяет преобразовывать двоичные файлы x86 в LLVM IR.Исходный код может быть извлечен из ветки Revgen GIT-репозитория, доступной по url https://dslabgit.epfl.ch/git/s2e/s2e.git.

10 голосов
/ 16 апреля 2013

Что касается инструмента RevGen , упомянутого @ bsa2000, в этой последней статье "Система двоичного анализа и перезаписи на основе промежуточного представления на уровне компилятора" указала на некоторые ограничения в S2E и Revinc..

Я вытащу их сюда.

  1. недостаток динамического перевода:

    S2E [16] и Revnic [14] представляютметод для динамического перевода x86 в LLVM с использованием QEMU.В отличие от нашего подхода, эти методы на лету преобразуют блоки кода в LLVM, что ограничивает применение анализа LLVM только одним блоком за раз.

  2. ИК неполный:

    Revnic [14] и RevGen [15] восстанавливают IR, объединяя переведенные блоки, но восстановленный IR неполон и действителен только для текущего выполнения;следовательно, различные анализы всей программы дадут неполную информацию.

  3. нет абстрактного стека или информации о продвижении

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

2 голосов
/ 14 августа 2011

Я сомневаюсь, что будет универсальное решение (подумайте о косвенных ветвях и т. Д.), LLVM IR намного «более высокого уровня», чем любой ассемблер.Хотя это возможно для перевода на основе BB.Возможно, вы захотите проверить проекты llvm-qemu и libcpu среди других.

1 голос
/ 18 января 2014

Существует новый проект, находящийся на некоторых ранних стадиях. libbeauty: https://github.com/jcdutton/libbeauty

Статья о проекте: Libbeauty: еще один инструмент обратного проектирования , 24 декабря 2013 г.,Michael Larabel - http://www.phoronix.com/scan.php?page=news_item&px=MTU1MTU

Теперь поддерживается только подмножество x86_64 в качестве входных данных.Одна из целей проекта - иметь возможность скомпилировать сгенерированный IR LLVM обратно в сборку, чтобы получить двоичный файл с той же функциональностью.

0 голосов
/ 16 апреля 2013

Просто опубликуйте несколько ссылок по переводу двоичного файла ARM в LLVM IR:

разоружить - поставить двоичный файл на дизассемблер llvm ir

https://code.google.com/p/disarm/

Однако я не пробовал его, поэтому не уверен в его качестве и стабильности. Кто-нибудь еще может опубликовать дополнительную информацию об этом проекте?

...