Il s'agit d'un traducteur binaire basé sur S2E. Il convertit tout code binaire en code LLVM. Le module LLVM résultant contient des fonctions. Certains, les détails des flux de contrôle sont récupérés.
L'idée est de réutiliser les composants de S2E pour réaliser la traduction en LLVM. Rougly, Qemu se traduit du binaire à TCG et S2E se traduit de TCG à LLVM. Des plugins ont été ajoutés pour effectuer le démontage récursif du binaire. Le code LLVM brut est ensuite transféré à un ensemble de laissez-passer LLVM externes. Le but de cette étape est d'ajouter plus de détails sur le code extrait, concrètement, les blocs de base sont regroupés en fonctions. Il est principalement testé sur l'architecture du bras. BIN2LLVM est un meilleur outil d'effort, il essaiera de traduire autant que possible, puis de lier le code LLVM dans un fichier final.
$ docker pull docker.io/cojocar/bin2llvm
$ # run one example binary
$ docker run --rm -t docker.io/cojocar/bin2llvm /bin/bash -c " /usr/local/bin2llvm/bin/bin2llvm.py --file /usr/local/bin2llvm/bin/ls-example "
$ # run the tests
$ docker run --rm -t docker.io/cojocar/bin2llvm /bin/bash -c " cd /usr/local/bin2llvm/tests; BIN2LLVM_INSTALL_DIR=/usr/local/bin2llvm make; " Consultez le dockerfile pour la liste des dépendances.
$ ./scripts/setup.sh # this will copy some dependencies in the third_party directory
$ ./scripts/build.sh ../bin2llvm-build
$ ./scripts/install.sh ../bin2llvm-build ../bin2llvm-install$ ./scripts/build_docker.sh Cela se traduira par bin2llvm-dev et dans des images bin2llvm-release-squashed .
$ cd ../bin2llvm-install && ./bin/bin2llvm.py --file ./bin/ls-example
Press Ctrl+C
INFO:bin2llvm:Using /tmp/bin2llvm-W4yJvU as temp_dir
INFO:bin2llvm:Use entry: 0x00009a74
INFO:bin2llvm:Use entry: 0x00009fa8
INFO:bin2llvm:Use entry: 0x0000c470
INFO:bin2llvm:Use entry: 0x0000c4d0
INFO:bin2llvm:Use entry: 0x0000c514
INFO:bin2llvm:Use entry: 0x0000c560
....
INFO:bin2llvm:Use entry: 0x00000000
WARNING:bin2llvm:(passes) crashed with entry: 0x00000000
INFO:bin2llvm:FINAL output is in /tmp/bin2llvm-W4yJvU/final.bc (370 functions) Le code de bit final est ${OUT_DIR}/final.bc
$ cd ./tests && BIN2LLVM_INSTALL_DIR= $( realpath ../../bin2llvm-install ) makeVoir le répertoire de test pour plus de détails.
Les œuvres suivantes utilisent BIN2LLVM :