Este es un traductor binario a LLVM basado en S2E. Convierte cualquier código binario en código LLVM. El módulo LLVM resultante contiene funciones. Algunos, se recuperan los detalles del flujo de control.
La idea es reutilizar los componentes de S2E para lograr la traducción a LLVM. Rougly, QEMU se traduce de binario a TCG y S2E se traduce de TCG a LLVM. Se agregaron complementos para realizar el desmontaje recursivo del binario. El código LLVM sin procesar se alimenta a un conjunto de pases LLVM externos. El propósito de este paso es agregar más detalles sobre el código extraído, concretamente, los bloques básicos se agrupan en funciones. Se prueba principalmente en la arquitectura ARM. Bin2LLVM es una herramienta de mejor esfuerzo, intentará traducir lo más posible y luego vincular el código LLVM en un archivo 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; " Consulte a Dockerfile para obtener la lista de dependencias.
$ ./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 Esto dará como resultado que bin2llvm-dev y en imágenes 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) El código de bit final es ${OUT_DIR}/final.bc
$ cd ./tests && BIN2LLVM_INSTALL_DIR= $( realpath ../../bin2llvm-install ) makeConsulte el directorio de prueba para obtener más detalles.
Los siguientes trabajos están utilizando bin2llvm :