Анализ бинарных файлов: различия между версиями
Zombah (обсуждение | вклад) м (add nm) |
Zombah (обсуждение | вклад) м (add android blob utility) |
||
(не показана 1 промежуточная версия этого же участника) | |||
Строка 4: | Строка 4: | ||
ниже способы получения информации о бинарных файлах: | ниже способы получения информации о бинарных файлах: | ||
===file,strings,readelf=== | |||
Первое что можно посмотреть это вывод комманды ''file'' | Первое что можно посмотреть это вывод комманды ''file'' | ||
<pre> | <pre> | ||
Строка 53: | Строка 54: | ||
# nm -C -D ~/src/blobs/libril-qc-qmi-1.so | # nm -C -D ~/src/blobs/libril-qc-qmi-1.so | ||
</pre> | </pre> | ||
===binwalk=== | |||
Если бинарник запакован, часто это легко увидеть с помощью утилиты '''binwalk''', на примере Linux Kernel | |||
<pre> | |||
$ binwalk vmlinuz | |||
DECIMAL HEXADECIMAL DESCRIPTION | |||
-------------------------------------------------------------------------------- | |||
16375 0x3FF7 gzip compressed data, maximum compression, from Unix, NULL date (1970-01-01 00:00:00) | |||
</pre> | |||
проверяем с помошью GNU coreutils od что сдвиг правильный: | |||
<pre> | |||
$ od -A d -t x1 vmlinuz| grep '1f 8b 08 00' | |||
0016368 20 65 72 72 6f 72 00 1f 8b 08 00 00 00 00 00 02 | |||
</pre> | |||
выходит все верно до начала 1f 8b 08 00 7 знаков, 16368+7=16375. | |||
Теперь с полной уверенностью можно вырезать содержимое: | |||
<pre> | |||
$ dd if=vmlinuz bs=1 skip=16375 | zcat > vmlinux | |||
</pre> | |||
===Автоматизированный анализ бинарных файлов=== | |||
При первом знакомстве с бинарными файлами производителя и для упрощения поиска <br/> | |||
зависимостей есть отличная утилита [https://github.com/JackpotClavin/Android-Blob-Utility Android Blob Utility] | |||
[[user:zombah|1337898155]] | [[user:zombah|1337898155]] |
Текущая версия от 22:54, 5 ноября 2017
Способы анализа бинарных файлов
В Android часто встречаются части системы доступные только в бинарном виде ака blobs, ниже способы получения информации о бинарных файлах:
file,strings,readelf
Первое что можно посмотреть это вывод комманды file
file gralloc.tegra.so gralloc.tegra.so: ELF 32-bit LSB shared object, ARM, version 1 (SYSV), dynamically linked, stripped
тут видно что это биннарник под arm архитектуру, динамически слинкованый и изнего удалена не вилияющая на исполнение информация, например отладочного характера.
Потом можно посмотреть какие переменные/функции есть в бинарном файле с помощью утилиты strings
strings gralloc.tegra.so __aeabi_unwind_cpp_pr0 NvOsStrcmp pthread_mutex_lock NvGrAllocDevOpen NvGrFbDevOpen pthread_mutex_unlock NvGrDevUnref ...
Аналогично strings можно воспользоваться утилитой objdump выдвет более вменяюмую информацию, но игнорирует левый текст, который тоже иногда бывает интересен.
Так как бинарник динамический хорошо узнать на какие библиотеки он динамически ссылается, это делается
утилитой readelf
readelf -d gralloc.tegra.so |grep Shared 0x00000001 (NEEDED) Shared library: [liblog.so] 0x00000001 (NEEDED) Shared library: [libcutils.so] 0x00000001 (NEEDED) Shared library: [libhardware_legacy.so] 0x00000001 (NEEDED) Shared library: [libnvos.so] 0x00000001 (NEEDED) Shared library: [libnvrm.so] 0x00000001 (NEEDED) Shared library: [libnvrm_channel.so] 0x00000001 (NEEDED) Shared library: [libnvddk_2d_v2.so] 0x00000001 (NEEDED) Shared library: [libpkip.so] 0x00000001 (NEEDED) Shared library: [libcrypto.so] 0x00000001 (NEEDED) Shared library: [libc.so] 0x00000001 (NEEDED) Shared library: [libstdc++.so] 0x00000001 (NEEDED) Shared library: [libm.so]
Анализ функций
По выводу strings часто не очень понятны функции которые использует библиотека или бинарник, для этого лучше использовать утилиту nm
# nm -C -D ~/src/blobs/libril-qc-qmi-1.so
binwalk
Если бинарник запакован, часто это легко увидеть с помощью утилиты binwalk, на примере Linux Kernel
$ binwalk vmlinuz DECIMAL HEXADECIMAL DESCRIPTION -------------------------------------------------------------------------------- 16375 0x3FF7 gzip compressed data, maximum compression, from Unix, NULL date (1970-01-01 00:00:00)
проверяем с помошью GNU coreutils od что сдвиг правильный:
$ od -A d -t x1 vmlinuz| grep '1f 8b 08 00' 0016368 20 65 72 72 6f 72 00 1f 8b 08 00 00 00 00 00 02
выходит все верно до начала 1f 8b 08 00 7 знаков, 16368+7=16375.
Теперь с полной уверенностью можно вырезать содержимое:
$ dd if=vmlinuz bs=1 skip=16375 | zcat > vmlinux
Автоматизированный анализ бинарных файлов
При первом знакомстве с бинарными файлами производителя и для упрощения поиска
зависимостей есть отличная утилита Android Blob Utility