Подтвердить что ты не робот

Перевод машинного кода в LLVM IR (разборка/сборка X86_64.X86. ARM в бит-код LLVM)

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

Я вытаскиваю их здесь.

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

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

  • IR неполный:

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

  • нет абстрактного стека или рекламной информации

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

Ответ 3

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

https://github.com/trailofbits/mcsema

Ответ 4

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

Ответ 5

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

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

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

Ответ 6

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

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

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

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