2016-04-12 19 views
2

Ich versuche, die Bitness (32 oder 64 Bit) einer ELF-Binärdatei in der Bash-Shell eines Android-Geräts zu erkennen.Überprüfen ELF binäre Bitness auf Android

Ich habe keine file, objdump oder readelf, die die offensichtlichen Antworten auf einem echten Linux-System sind. Außerdem habe ich keine head, tail, sed, awk, grep oder perl.

Ich habe in der ELF header description, dass das e_ident[EI_CLASS] Feld des binären Headers ein Byte enthalten sollte, die die Bissigkeit beschreibt. Vielleicht könnte ich das benutzen? Aber ich habe Probleme, dieses Byte mit einem so begrenzten Toolset aus der Datei zu reißen.

Antwort

1

https://en.wikipedia.org/wiki/Executable_and_Linkable_Format

head -c 20 ${executable} | tail -c 2 finden Sie die 2 Bytes für e_machine bekommen. Dann kannst du weiter damit arbeiten. ZB kann x86 entweder 32-Bit oder 64-Bit sein, während x86-64 64-Bit ist.

Alternativ, wenn Sie speziell sind für die Bitness des ELF Containers suchen (im Gegensatz zu dem ausführbaren Code im Gegensatz), die die Anforderungen des Codes bedeutet, können Sie bei e_ident[EI_CLASS] versuchen suchen:

head -c 5 ${executable} | tail -c 1. Wenn das Byte 0x01 ist, ist es 32 Bit. Wenn es 0x02 ist, ist es 64 Bit. Wenn es etwas anderes ist, ist es zu dieser Zeit undefiniert.

Edit: Empfohlen read ing (hehe pun intended) beschreibt den Unterschied zwischen -n und -N.

Also ohne den Einsatz von head und tail, dies wäre besser: read -r -N 5 elf_header < ${executable} && echo -n "${elf_header:4:1}"

An diesem Punkt das einzelne Zeichen, die auf der Standardausgabe Echo wurde wäre "\\x1" für 32-Bit- und "\\x2" für 64-Bit. In einer vollständigeren Linux-Umgebung können Sie das durch xxd übergeben, um einen Hex-Dump zu sehen. Sie können mit diesem 1-liner das Bit überprüfen:

bitness32=$(printf "\\x1") && bitness64=$(printf "\\x2") && read -r -N 5 elf_header < ~/a.out && elf_bitness="${elf_header:4:1}" && { [[ "${bitness32}" == "${elf_bitness}" ]] && echo "32-bit"; } || { [[ "${bitness64}" == "${elf_bitness}" ]] && echo "64-bit"; } || { echo "???"; }

+0

Das sieht sauberer als die Lese Lösung, aber ich kann nicht verlassen sich auf meine Android-Schale "Kopf" und "Schwanz". – kb0

+0

Okay, ich habe die Antwort mit dieser Einschränkung aktualisiert – inetknght

2

Dank Charles Duffy ‚s Antwort auf How do I read first line using cat, fand ich eine Art und Weise nur die Bytes zu lesen, ich aus der Datei benötigt:

$ # Read 5 bytes of the 'adb' binary.  
$ read -r -n 5 elf_header < /system/bin/adb; echo $elf_header | cat -v 
^?ELF^A 

Wenn das 7. Zeichen dieser Ausgabe ist‚A‘, dann ist die Binär ist 32-Bit. Wenn es "B" ist, dann 64-Bit.

1

Mit printf und dd:

#!/bin/sh 

elf32="$(printf "\177ELF\001")" 
elf64="$(printf "\177ELF\002")" 
header="$(dd bs=5 seek=0 count=1 "if=$1" 2> /dev/null)" 

case "$header" in 
    "$elf32") echo ELF32 ;; 
    "$elf64") echo ELF64 ;; 
    *)  exit 1 ;; 
esac