2016-04-12 4 views
2

Я пытаюсь обнаружить бит (32 или 64 бит) двоичного файла ELF в оболочке bash устройства android.Проверка бинарной битности ELF на Android

У меня нет file, objdump или readelf, которые являются очевидными ответами на настоящую систему Linux. Кроме того, у меня нет head, tail, sed, awk, grep или perl.

Я видел в поле ELF header description, что поле двоичного заголовка должно содержать байт, который описывает битность. Может быть, я мог бы использовать это? Но у меня возникли проблемы с дразнением этого байта из файла с помощью такого ограниченного набора инструментов.

ответ

1

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

head -c 20 ${executable} | tail -c 2 получит Вас 2 байта для e_machine. Затем вы можете продолжить обработку. Например, x86 может быть либо 32-разрядным, либо 64-разрядным, а x86-64 - 64-разрядным.

В качестве альтернативы, если вы специально искали разрядность контейнера ELF (в отличие от исполняемого кода), который подразумевает требования коды, вы могли бы попытаться смотреть на e_ident[EI_CLASS]:

head -c 5 ${executable} | tail -c 1. Если байт равен 0x01, это 32 бит. Если это 0x02, это 64 бит. Если это что-то еще, в настоящее время оно не определено.

Edit: Рекомендуется read Инг (хех каламбур) описывает разницу между -n и -N.

Так без использования head и tail, это было бы лучше: read -r -N 5 elf_header < ${executable} && echo -n "${elf_header:4:1}"

На данный момент, единственный символ, который вторит на стандартный вывод будет "\\x1" для 32-битных и "\\x2" для 64-разрядных. В более полной среде linux вы можете передать это через xxd, чтобы увидеть шестнадцатеричный дамп. Вы можете проверить бит с этим 1-лайнер:

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

Это выглядит чище, чем решение для чтения, но я не могу полагаться на мой андроид оболочки, имеющие 'head' и' tail'. – kb0

+0

Итак, я обновил ответ с этим ограничением – inetknght

2

Благодаря Charles Duffy «s ответа на How do I read first line using cat, я нашел способ, чтобы прочитать только байты мне нужно из файла:

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

Если седьмой характер этой продукции„А“, то двоичный - 32-битный. Если это «B», то 64-бит.

1

Использование printf и 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