HomeРазноеЗачем нужен busybox: Для чего нужен BusyBox android?

Зачем нужен busybox: Для чего нужен BusyBox android?

Содержание

Для чего нужен BusyBox android?

04 сентября, 2012

Автор: Maksim

Добрый день, уважаемые читатели нашего информационного портала fans-android! Сегодня мы продолжим тему root-прав на телефоне. Поговорим о программе, которая наряду с программой SU (SuperUser) помогает нашим программам (в частности файловым менеджерам) получать расширенные права, не прибегая к непосредственной работе с ядром вашей прошивки.

И так, что умеет данная программа и влияет ли её отсутствие на функциональность вашего телефона? Разберём данные вопросы по порядку.

Данная программа находится в свободном доступе в play market, скачать её вы можете тут.   Чем же так примечательна данная программа и почему она крайне необходима для того, чтобы ваши root-права пользовались на все 100%? Данная программа – интерфейс, который необходим для наиболее простой и полной работе с файловой системой вашего смартфона. Благодаря своему крайне малому размеру и нативному коду, написанному на ассемблере, эта программа имеет отличную производительность для слабых смартфонов. Что же конкретно данная программа может дать конечному пользователю? Как вы знаете, любой файловый менеджер работает с файловой системой вашего android-смартфона. Однако отсутствие root-прав и собственные движки, написанные на языке программирования верхнего уровня, стремительно понижают планку производительности, удобства и функциональности этих файловых менеджеров. Опытные пользователи UNIX-систем сразу же приметили эту особенность и вот, спустя несколько месяцев после выхода первой версии android на свет, началась кропотливая разработка первого BusyBox для android на свет. Сразу же после выхода данной программы (или лучше называть это не программой, а набором средств для создания интерфейса между файловой системой и пользователем) начали появляться первые файловые менеджеры, которые использовали в качестве своей основы BusyBox. Это значительно увеличило их функциональность и производительность. Всё это произошло благодаря намного меньшему размеру строк в коде программ и весьма производительному интерфейсу BusyBox. Так же, кроме файловых менеджеров, библиотеки BusyBox предоставляют работу со сторонними ядрами, обеспечивая некий интерфейс взаимодействия между ними и файловой системой вашего смартфона.

Как же программы могут общаться с данным интерфейсом, набором команд для функционального и производительного контакта с файловой системой смартфона? Всё это происходит благодаря обращениям к библиотекам, в которых заключены простейшие команды. Их вы можете найти здесь: http://ru.wikipedia.org/wiki/BusyBox. Так же для опытных пользователей возможна установка командной оболочки данного интерфейса. При помощи всё тех же команд вы можете с лёгкостью получить контроль над всеми каталогами в вашем android. Естественно, не без помощи заранее разблокированного ядра, т.е. не без помощи root-прав.

Давайте теперь рассмотрим непосредственно работоспособность данной программы на смартфоне с android 4.04, Samsung Galaxy SIII. Что будет, если вы запустите программу, которой необходимы библиотеки BusyBox? Вы увидите следующее сообщение:

Для того чтобы восстановить работоспособность программы, вам придётся установить BusyBox. Скачайте его с маркета и установите. После его запуска увидите следующую картину:

Программа начнёт собирать информацию о вашей системе и о всех приложениях и процессах, использующих файловую систему. После завершения процесса вы можете начать установку BusyBox:

Здесь рекомендуем выбрать Smart Install, так как это более безопасно для вашей системы. Однако это займёт несколько больше времени. Нажимаем на кнопку и дожидаемся окончания процесса:

После установки вы увидите окно, которое говорит об успешном окончании процесса. Нажмите красный крестик и выйдите из приложения. BusyBox установлен. Можно попробовать включить ту программу, требующую BusyBox:

Как видите, она прекрасно  работает.

Надеюсь, вы разобрались во всех тонкостях этого программного обеспечения и поняли, для чего оно нужно. Что ж, покорение android продолжается!

Что такое BusyBox? — AndroGoo.ru

BusyBox — набор консольных команд, который походит от первых версий Linux. Он появился на свет в далеком 1999 году, как интерфейс для встроенных операционных систем. Сегодня его можно использовать и для Android в качестве вспомогательного инструмента работы с внутренней файловой системой и аппаратной частью ресурсов устройства.

В CyanogemMod, MIUI и большинстве кастомных прошивок BusyBox уже установлен!

Набор команд для работы с BusyBox

Работа с файлами

pwd – текущий каталог пользователя в котором он находится
ls – показать все файлы и каталоги
ls -al – список скрытых каталогов и файлов
cd /etc – поменять директорию на /etc
cd – перейти на домашний каталог
mkdir myfolder – создать каталог myfolder
rm article.txt – удалить article.txt
rm -r myfolder – удалить рекурсивно каталог myfolder
rm -f article.txt – удалить форсированно article.txt
rm -rf myfolder – удалить форсированно каталог с подкаталогами myfolder
cp article1 article2. txt – скопировать article1 в article2.txt
cp -r dir myfolder – скопировать dir в myfolder; создаст каталог myfolder, если его не существует
mv article2.txt article2 – переименовать или переместить article2.txt в article2.
Если article2 существующий каталог — перемещает article2.txt в каталог article2
ln -s article articlelink – создать символическую ссылку articlelink к файлу article
touch myfile – создать файл myfile
cat > article.txt – направить стандартный ввод в файл article.txt
cat article.txt — показать содержимое файла article.txt
more article.txt – показать на экране содержимое article.txt
head article.txt – показать в окне 10 строк файла article.txt
tail article.txt – показать в окне 10 строк файла article.txt
tail -f file.txt – показать содержимое файла article.txt с последних 10 строк
> — Переход с одного каталога в другой:
Возьмем 10 строк с фа

Разработка и модификация прошивки для Android телефонов. Часть 2 / Хабр

В первой части мы научились перепаковывать официальную прошивку из формата RUU в формат пакета обновлений, что дало нам возможность использовать созданную нами прошивку, не опасаясь затирания модифицированного раздела восстановления (recovery rom). И тем временем, пока HTC воюет с хорошими ресурсами, мы продолжим изучать и улучшать прошивку.
В предыдущей части, хоть мы и создали прошивку, которая загружается и работает как часы, мы бы хотели расширить базовый функционал оной. Одним из самых востребованных расширений является поддержка работы с правами суперпользователя (root). Также сюда можно отнести интегрирование busybox. Кроме того, мы научимся запускать произвольные скрипты при старте системы и адаптируем ramdisk под свои нужды.

Busybox

busybox — это набор консольных unix утилит, ориентированный на малый размер и производительность, что так актуально для мобильных систем. Вместе с системой android поставляется свой набор утилит — toolbox, который предоставляет минимально необходимых функционал для системы, и как следствие более простой в количественном и функциональном плане. Наличие busybox в системе, с одной стороны, позволит нам, как разработчикам, чувствовать себя более комфортно при удаленной работе на устройстве, с другой, позволит писать сложные скрипты, и, например, реализовать механизм запуска собственных скриптов при загрузке, используя run-parts. Также стоит учитывать, что для некоторых android приложений (особенно те, которые используют root) наличие busybox — обязательно.

Дабы упростить себе жизнь, воспользуемся уже собранным busybox под нашу платформу. Например, 1.16.0 от небезызвестного modaco можно забрать тут. Кто смел духом, и обладает лишним временем, может собрать busybox из оффициального дерева (немного напильника по адаптации к андроидовскому toolchain-у, и bionic — андроидовской реализации libc), либо воспользоваться инструкцией XVilka по сборке с crosstool-ng и uCLibc, либо собрать из ветки cyanogenmod, где уже решены проблемы с bionic.

Итак, прежде чем мы добавим busybox, в систему нам нужно решить несколько идеологических моментов:

  • При общей схеме использования busybox/toolbox мы должны положить исполняемый файл и создать ссылки на него с именами апплетов. Ссылки должны быть доступны по пути из переменной $PATH. Где хранить ссылки для busybox? В /system/bin? /system/xbin? отдельная директория?
  • Использовать заранее созданные ссылки, или генерировать на этапе установки прошивки?

    В примере из первой части мы использовали заранее созданные ссылки для toolbox. Но данный вариант затруднителен, если разработка прошивки ведется на системе Windows, где есть определенные проблемы с символическими ссылками.
  • В зависимости от сборки busybox мы можем перекрыть набор команд, который уже доступен в toolbox. Кто главнее?

    С одной стороны, busybox предоставляет более широкий функционал (как пример: буквенное задание прав для chmod), но с другой стороны — мы можем захотеть исключить уже реализованные утилиты из busybox для уменьшения размера набора.

Чтобы узнать, какие апплеты поддерживает busybox, достаточно запустить его на устройстве без параметров:

  1. $ adb remount && adb push busybox /cache/
  2. $ adb shell chmod 0755 /cache/busybox
  3. $ adb shell /cache/busybox | tail
  4.         tcpsvd, tee, telnet, telnetd, test, tftp, tftpd, time, timeout, top,
  5.         touch, tr, traceroute, true, tty, ttysize, tunctl, udpsvd, umount,
  6.         uname, uncompress, unexpand, uniq, unix2dos, unlzma, unlzop, unzip,
  7.         uptime, usleep, uudecode, uuencode, vconfig, vi, vlock, volname, watch,
  8.         watchdog, wc, wget, which, who, whoami, xargs, yes, zcat, zcip

Для получения списка доступных апплетов для toolbox будем ориентироваться на те ссылки, которые были созданы в изначальной прошивке.

  1. $ find habrrom/system/bin/ -type l -printf '%f, ' | tail
  2. getprop, insmod, ifconfig, setprop, wipe, watchprops, log, sync, schedtop, ioctl, rm,
  3. sleep, notify, sendevent, dmesg, df, route, vmstat, mv, iftop, rmmod,
  4. dd, renice, kill, mount, start, rmdir, ps, ln, cmp, dumpcrash, top, getevent,
  5. umount, mkdir, setconsole, printenv, newfs_msdos, chown, cat, hd, chmod, date,
  6. stop, smd, netstat, ls, lsmod, id,

Единственным линком, указывающим не на toolbox является dumpcrash:

  1. $ ls -o  habrrom/system/bin/ | grep dumpstate
  2. lrwxrwxrwx 1 astar       9 2010-06-16 03:59 dumpcrash -> dumpstate
  3. -rwxr-xr-x 1 astar   14296 2010-06-16 03:55 dumpstate

Это также стоит учесть при формировании скрипта обновления.
Предположим, что мы решили, что главным у нас будет busybox. У меня получилось, что следующие апплеты toolbox уникальны:

  1. getevent, getprop, iftop, ioctl, log, newfs_msdos, notify, schedtop,
  2. sendevent, setprop, smd, start, stop, top, umount, vmstat, watchprops, wipe

И предположим, что мы хотим создавать ссылки на этапе установки прошивки, для этого в скрипт обновления нам нужно будет добавить строчки следующего вида:

  1. symlink dumpstate SYSTEM:bin/dumpcrash
  2. #
  3. symlink toolbox SYSTEM:bin/getprop
  4. # повторяем процедуру для необходимых апплетов toolbox
  5. symlink busybox SYSTEM:xbin/[
  6. # повторяем процедуру для всех апплетов busybox

Не забудем удалить ссылки из самой прошивки.

  1. $ rm `find habrrom/system/bin/ -type l`

Плюс, нам понадобиться, выставить правильные права на busybox

  1. set_perm 0 0 04755 SYSTEM:xbin/busybox

Попробуем усложнить себе задачу. Давайте поместим ссылки для busybox в отдельную директорию, например /system/xbin/bb. Для этого нам понадобится в структуре прошивки добавить непустую папку (пустую папку, откажется копировать скрипт обновления):

  1. $ mkdir habrrom/system/xbin/bb
  2. $ touch habrrom/system/xbin/bb/placeholder

Теперь мы можем смело помещать наши ссылки по указанному пути, для чего откорректируем скрипт обновления:

  1. symlink ../busybox SYSTEM:xbin/bb/[
  2. # и так далее

Модификация ramdisk

Однако, просто поместить ссылки в отдельную папку — мало. Нужно расширить путь поиска исполняемых файлов для системы. Для этого нам понадобиться дополнить переменную $PATH, которая в случае с андроидом на HTC Hero определяется в /init.rc

  1. $ adb shell cat /init.rc | grep "export PATH"
  2.     export PATH /sbin:/system/sbin:/system/bin:/system/xbin

Все файлы корневой директории являются частью ramdisk-а (как и некоторые другие вложенные директории). Воспользуемся знаниями из первой части: распакуем boot, после чего мы можем изменить переменную PATH

  1. $ cat habrrom.boot/ramdisk/init.rc | grep "export PATH"
  2.     export PATH /sbin:/system/sbin:/system/bin:/system/xbin:/system/xbin/bb

Прежде чем мы соберем ramdisk обратно, сделаем еще несколько полезных дел.
Для упрощения жизни нам бы хотелось иметь следующее:

  1. Возможность монтирования файловой системы с правами на запись
  2. Отладка по usb, включенная по-умолчанию. Иначе, если что-то пойдет не так, мы не сможем получить хоть какую-то полезную информацию о причинах, так как сервис adbd будет отключен и как следствие — adb logcat во время загрузки будет недоступен
  3. Запуск произвольных скриптов при загрузке системы (самыми популярными вариантами использования являются: включение app2sd, перенос dalvik-cache в /cache)

Для этого обратим свой взор на /default. prop, в котором среди прочего хранятся следующие настройки:

  • ro.secure — используется то тут то там по всей системе, но из интересующих нас свойств, включает adb remount на запись а, также, adb shell выполняется с правами суперпользователя. Выставим значение в 0
  • persist.service.adb.enable — отвечает за старт сервиса adbd, который нам помогает совершать удаленное взаимодействие с телефоном по средством adb. Выставляем в 1

Скрипты инициализации

Для осуществления третьего пункта, нам понадобиться модифицировать скрипт инициализации /init.rc. Данный скрипт как водится, представляет собой собственный велосипед андроид скрипт на Android Init Language. Ознакомиться с форматом предлагаю в исходниках android. Нам же интересна возможность добавить собственный сервис (мы не можем добавить свои команды прямо в триггер, потому как там набор команд строго ограничен):

  1. service sysinit /system/bin/logwrapper /system/xbin/busybox run-parts /system/etc/init. d
  2.     disabled
  3.     oneshot

Т.е. мы назвали наш сервис sysinit, который при своем старте выполнит run-parts /system/etc/init.d, что в свою очередь запустит все скрипты из соответствующей папки в порядке отсортированном по алфавиту. logwrapper нам необходим, дабы перенаправить вывод вместо /dev/null (по-умолчанию) в систему логирования (доступную по logcat).

Осталось запустить наш сервис (опция disabled, говорит, что данный сервис не будет стартовать автоматически). Для этого последнюю команду из тригера on boot переместим в наш собственный триггер окончания выполнения скриптов и вызовем наш сервис.

  1.     # не сейчас
  2.     # class_start default
  3.     start sysinit
  4.  
  5. on property:habr.sysinit.done=1
  6.     # вот сейчас
  7.     class_start default

Также создадим два простых скрипта в /system/etc/init. d для демонстрации того, что все это работает. Первый будет делать стандартное echo (Hello World!, как же без него), а второй очищать кеш, и сообщать init скрипту, что мы уже закончили и можно дальше продолжать загружаться.

  1. $ cat habrrom/system/etc/init.d/00banner
  2. #!/system/bin/sh
  3. echo "Hello habrahabr!";
  4. $ cat habrrom/system/etc/init.d/99complete
  5. #!/system/bin/sh
  6. sync;
  7. setprop habr.sysinit.done 1

И последний штрих — установим им права на запуск (все там же — в скрипте обновления прошивки)

  1. set_perm_recursive 0 2000 0755 0755 SYSTEM:etc/init.d

Права суперпользователя. Root.

Для многих, наверное, самый актуальный вопрос. Для тех терпеливых, кто дочитал.

Не смотря на то, что в исходниках есть своя реализация su, она нам не подходит, потому как основной ее целью является запуск приложений суперпользователем (или из adb shell) с правами других user-ов.

Мы же воспользуемся разработкой ChainsDD — приложением Superuser 2.1. Суть приложения аналогична знакомым нам sudo, или даже Admin Approval Mode из системы Windows. Если приложение хочет повысить свои права до прав суперпользователя (и не только), у пользователя запрашивается разрешение. Также можно запомнить принятое правило и автоматически применять для всех будущих вызовов.

Воспользуемся уже собранным приложением для Android 2.1, хотя всегда есть возможность изучить и собрать самому из исходников.

Приложение состоит из двух компонент:

  1. native модуль su. Который при запросе на изменение прав перенаправляет запрос в собственный Activity и ждет реакции пользователя
  2. приложение Superuser.apk — набор интерфейсов (Activity), отвечающих за взаимодействие с пользователем, хранение настроек.

Для того, чтобы добавить в нашу прошивку указанный функционал — добавим модули в соответствующие разделы системы,

  1. $ cp su habrrom/system/xbin/
  2. $ cp Superuser. apk habrrom/system/app/

и настроим права для исполняемого файла (плюс линк в /system/bin/, так как некоторые приложения могут вызывать su по абсолютному пути)

  1. symlink ../xbin/su SYSTEM:bin/su
  2. set_perm 0 0 06755 SYSTEM:xbin/su


На этом все.
Прикладываю небольшой архив, в качестве итогового резюме тому, что было сделано в этой статье. Скрипты, busybox, Superuser и прочее. Для любопытных.
В этот раз получилось как-то уж очень по-линуксовому, и занудненько. Но в следующий раз рассмотрим тему повеселее — перепаковка системных приложений. А пока, финальная точка:

В предыдущих и будущих сериях

  1. Часть 1. Создание прошивки в формате update.zip на основе RUU. Распаковка/запаковка boot. Скрипт обновления. Подпись пакета обновления и приложений.
  2. Часть 2. Добавление busybox. Добавление root. Монтирование на запись. Скрипт инициализации. Редактирование ramdisk.

BusyBox: швейцарский нож для встраиваемых Linux-систем::Журнал СА 7.2007

Рубрика:

Администрирование / 
Администрирование

Facebook

Twitter

Мой мир

Вконтакте

Одноклассники

Google+

Дмитрий Шурупов

BusyBox: швейцарский нож для встраиваемых Linux-систем

Системные администраторы и пользователи UNIX/Linux-систем, несомненно, привыкли к работе со своей любимой командной оболочкой и к стандартным программным средствам. Но их повсеместное использование не всегда возможно. И тогда на помощь приходит BusyBox – упрощенный shell с набором компактных системных средств.

BusyBox: что это такое и зачем вообще нужно?

Несмотря на безудержный рост графических оболочек и «дружелюбных» интерфейсов, представить себе UNIX без командной строки и основных утилит в наши дни невозможно. Многочисленные интерпретаторы и базовые системные утилиты не стоят на месте, растут и развиваются, что неизбежно ведет и к увеличению их объема. В то же время существуют сферы деятельности, в которых компактность любых приложений по очевидным причинам очень важна, например, во встраиваемых устройствах. Вместе с тем во многих случаях не требуется значительная часть той функциональности, которая присуща базовым утилитам «общего назначения».

Для решения этих проблем еще в середине 90-х Брюсом Перенсом (Bruce Perens) был создан пакет BusyBox [1]. Сейчас проект позиционируется как «швейцарский нож для встраиваемых Linux-систем» и в первую очередь ориентирован на использование в небольших дистрибутивах GNU/Linux. Распространяется под второй версией лицензии GNU GPL.

BusyBox представляет собой единственный исполняемый файл, при запуске которого загружается полноценный командный интерфейс. Как гласит официальная документация BusyBox, для формирования минимальной версии GNU/Linux к этому достаточно добавить лишь ядро ОС и каталоги /etc, /dev.

Установка BusyBox

Бинарные пакеты с BusyBox для популярных дистрибутивов GNU/Linux доступны в соответствующих репозиториях, а архив с исходниками – на сайте проекта [2]. В статье рассматривается релиз BusyBox v1.5.0. Одна из главных целей, которую преследуют разработчики BusyBox, – оптимизированность и компактность кода – расчет на ограниченность памяти. Это не только вновь говорит о плюсах его использования во встраиваемых устройствах, но и хорошо сочетается с другим подходом в духе UNIX way: высокий уровень настраиваемости (в бинарный файл BusyBox можно включить только необходимые компоненты).

Еще на стадии компиляции (а точнее, до самого процесса сборки) можно выбрать только те базовые утилиты, которые нужны. Реализовано это в стиле настройки ядра Linux. Вместо более распространенного среди собираемых с automake приложений способа в виде скрипта «configure» для предварительной конфигурации BusyBox нужно выполнить одну из следующих команд:

$ make config

$ make menuconfig

$ make defconfig

Аргумент «config» инициирует запуск «вопросника» со списком доступных опций и базовых утилит, предлагающего проставлять «Y» или «N» на месте нужных и ненужных возможностей соответственно.

Аргумент «menuconfig» вызывает более удобную конфигурацию в виде меню с интерфейсом на базе curses (см. рис. 1).

Рисунок 1. Установка BusyBox: «make menuconfig» на манер Linux-ядра

Аргумент «defconfig» автоматически включает все доступные опции, подготавливая к сборке BusyBox «общего назначения».

Так же, как и в случае с ядром Linux, после настройки создается конфигурационный файл .config, к которому можно затем всегда возвращаться командой:

$ make oldconfig

Это актуально при переходе на более новую версию BusyBox со старой конфигурацией (чтобы при настройке работать только с появившимися в очередном релизе опциями).

По умолчанию, если до вызова «make menuconfig» не существовал файл .config, make автоматически предварительно запускается с аргументом «defconfig». Таким образом, пользователю останется только отключить ненужные возможности. Предусмотрен и обратный вариант: запуск make с «allnoconfig» отключает все опции, чтобы после этого можно было выбрать только то, что нужно.

Далее все традиционно:

$ make

$ sudo make install

Работа с BusyBox

Запуск оболочки BusyBox можно осуществить командой:

$ bb

Для разового вызова какой-либо функции (как правило, одна функция BusyBox ограниченно реализует возможности одной из утилит из состава GNU coreutils, util-linux и других стандартных пакетов) можно воспользоваться командой:

$ busybox <функция> [аргументы]

То есть, например:

$ busybox ls -l /

покажет в текущей оболочке (например, bash) результат выполнения команды «ls -l /» в BusyBox (см. рис .2).

Рисунок 2. BusyBox в работе: ls

Полный список доступных функций в установленной версии BusyBox можно посмотреть в выводе команды «busybox» без аргументов. Просмотр помощи по конкретной функции осуществляется так:

$ busybox —help <функция>

Это приобретает особую актуальность ввиду того, что базовые утилиты в составе BusyBox ограничены в своих возможностях, поэтому список доступных флагов будет отличаться от тех, что все привыкли видеть в стандартных средствах.

Начинка BusyBox

Помимо альтернативного набора coreutils (ls, cat, mv, cp, rm, chmod, df, ln, date, wc, nice, test…) в состав BusyBox входит и множество других программ.

Среди них, во-первых, стоит выделить наличие нескольких минималистских командных оболочек: ash (60 Кб; ответвление от dash из Debian, основанного на ash из NetBSD; рекомендован для использования с BusyBox), hush (18 Кб; понимает грамматику Bourne shell), lsh (всего 10 Кб; только самый простой функционал), msh (30 Кб; minix shell).

Для работы с архивами есть такие утилиты, как tar, gzip, bzip2, ar, zip, rpm, dpkg. Для обработки содержимого файлов есть как awk, sed, patch, так и текстовые редакторы ed и vi.

Рисунок 3. Исполнение элементарных скриптов в BusyBox

Широко представлены сетевые средства: и клиентские, и серверные. Среди демонов выделю httpd (с поддержкой авторизации, CGI), dnsd, telnetd, inetd, udhcpd. Для FTP есть ftpget, ftpput и клиент tftp. Кроме того, присутствует и собственная версия GNU wget. Из прочих стандартных утилит: ifconfig, route, traceroute, ping/ping6, netstat, nslookup, arp и arping.

Кроме того, примечательны реализации hdparm для просмотра/установки параметров жесткого диска, syslogd для ведения логов, средств работы с системными учетными записями (adduser/addgroup, deluser/delgroup, login, passwd, su), системы init.

Особого смысла в перечислении всех функций BusyBox не вижу, поэтому ограничусь простой статистикой. В моей сборке BusyBox из портежа Gentoo Linux представлена 241 функция (но в нее входит далеко не все, что реализовано в рамках этого проекта). Если рассматривать для примера ls, то в версии BusyBox для этой утилиты доступно 26 флагов, а в оригинальной в моем случае (ls из GNU coreutils 6.7) – 55 (не считая «помощи» и «версии»). Среди отсутствующих флагов в первой можно выделить: -Q (названия в кавычках), -m (список через запятую), -U и -f (вывод списка без сортировки). Другие, на мой взгляд, еще менее значительны. Общие тенденции, думаю, очевидны.

Рисунок 4. Сетевые средства в «make menuconfig» BusyBox

Подводя итоги

Насколько существенно отсутствие тех или иных возможностей, определяется общими предъявляемыми требованиями и конкретными задачами. По субъективным же впечатлениям, в BusyBox-редакциях базовых утилит представлены все основные, т.е. повседневно используемые (большинством в большинстве же случаев) возможности. Конечно, большинство – не все, и задачи бывают разные, но в целом – заслуга авторов налицо. Им действительно удалось отобрать необходимое.

При этом важно учитывать специфику BusyBox, а именно – его позиционируемое и фактическое ключевое предназначение: использование в окружениях с серьезными ограничениями в памяти, не нуждающихся в той расширенной функциональности, которую представляют современные базовые системные утилиты.

И со своими задачами BusyBox справляется отлично. Вместе с тем проект активно развивается: с января 2006 года уже вышло 16 релизов, в 5 из которых были представлены значительные нововведения (версии 1.x.0). Другим показателем роста BusyBox является тот факт, что все больше разработчиков в своих продуктах предпочитают его применение другим возможным вариантам.

Приложение

Где используется BusyBox

Примеры практического использования BusyBox при создании дистрибутива вы можете найти в статье Всеволода Стахова «Создание загрузочных дискет и CD-дисков Linux» в №6 за 2003 г. или классических публикациях Брюса Перенса (Bruce Perens) «Building Tiny Linux Systems with Busybox», доступных в Интернете (часть 1: http://www.linuxjournal.com/article/4335, часть 2:http://www.linuxjournal.com/article/4395).

BusyBox нашел применение в таких системах, как Familiar Linux (для КПК) и MoviX (популярный компактный дистрибутив с набором мультимедийных Open Source-решений), в установщиках Debian, Gentoo, Red Hat, Mandriva и других проектов, а также во многих Linux-основанных устройствах (Sharp Zaurus, роутеры, AP. ..).

В OpenWRT, (смотрите стр.42-52 журнала), в качестве командной оболочки и базовых системных средств используется именно BusyBox. Более подробный список продуктов, использующих BusyBox, доступен на сайте http://www.busybox.net/products.html.

  1. http://www.busybox.net.
  2. http://www.busybox.net/download.html.

Facebook

Twitter

Мой мир

Вконтакте

Одноклассники

Google+

Что такое Busybox в Андроид и как его установить

Известно, что платформа Android даёт пользователю свободу действий в настройке телефона или планшета под свои вкусы и нужды. Это, безусловно, интересно для тех, кому кажется недостаточным и ограничивающим полноценное использование уровень доступа к возможностям устройства. Однако и этого бывает мало потому что, как ни крути, а всегда хочется большего. Тогда на помощь нам приходят программы, позволяющие расширить доступ к настройкам аппарата.

Одна из таких программ — BusyBox, основным предназначением которой является обеспечение полного доступа ко всем функциям и к файловой системе устройства (при наличии ROOT-доступа). Надо сказать, что на самом деле «Бизибокс» — один из компонентов многих заводских прошивок. Многих, но не всех, поэтому наш сегодняшний разговор об этом инструменте.

Что такое BusyBox в Андроид и его функции

По сути, Busybox – это определённый набор Unix-утилит командной строки, позволяющий любому пользователю, вне зависимости от уровня владения технологиями, устанавливать и обновлять до последней версии программы,  улучшающие работу устройств с операционной системой Android, относящейся к семейству Unix-систем. Большим плюсом является то, что Busybox требует минимум памяти и технических характеристик. Как раз это и позволяет запускать программу на смартфонах (планшетах) и работать с ней.

Две самые главные функции, которые становятся возможны после установки Busybox и чаще всего привлекают пользователей, это разгон процессора устройства и оптимизация потребления оперативной памяти.

Разгон процессора

Всем хочется иметь мощный гаджет. Но особенность мобильных устройств такова, что и флагман через пару лет после приобретения начинает устаревать. Помочь исправить это может разгон устройства. Такая процедура повысит общую производительность гаджета, и сделает работу на нём более комфортной.

Оптимизация

Любому пользователю планшетов или телефонов известно, что перегруженность оперативной памяти приводит к замедлению работы устройства и появлению проблем при использовании приложений, требующих много оперативки в своё распоряжение. Поэтому так важна функция, оптимизирующая Андроид и позволяющая избежать этих неудобств.

Как установить Busybox на Android

Прежде всего, необходимо скачать и установить программу на ваше устройство. После запустить приложение. В самом приложении надо вначале прочитать и принять условия лицензионного соглашения.

Далее требуется выбрать нужную версию программы и прописать её путь. Обязательно надо выбрать каталог «/system/bin».

Затем следует поставить галочку напротив строки «Clean Mode».

После этого выбираем «Install» и «Smart install».

По окончании установки дождитесь сообщения о завершении процедуры и перезагрузите устройство. Вновь запустите программу, подождите, пока закончится сканирование.

 

Поставьте галочку на “Replace All”.

Как и в прошлый раз выберите «Install» и «Smart install». После перезагрузите телефон ещё раз, удалите вручную лишнее, и всё, приложение готово к работе! Теперь, поскольку утилиты будут полностью встроены в ядро системы, большинство функций добавятся автоматически.

Подводя итог можно сказать, что Busybox по-настоящему полезное приложение на андроид устройства. Оно пригодится пользователям, которые хотят получить от своего смартфона или планшета всё, что возможно. Но стоит заметить, что браться за него стоит лишь тем, кто знает, что и зачем делает — при внешней простоте, программа ориентирована всё же больше на опытных пользователей.

Busybox для ARM на QEMU

Busybox — это решение для встраиваемых систем Linux, которым нужна компактная файловая система: трюк заключается в компиляции и связывании многих системных утилит в один двоичный файл, который ведет себя по-разному в зависимости от имени, которое использовалось для его выполнения. Тогда рабочая корневая файловая система Linux состоит из небольшого дерева каталогов ( / bin , / sbin , / usr / bin , …), одного исполняемого двоичного файла в / bin / busybox и множества символических ссылок на двоичный файл Busybox ( / bin / ls , / bin / sh , / sbin / ifconfig ,…), и при использовании типичной конфигурации он может составлять всего 2 МБ (1 МБ в сжатом виде).

В прошлый раз я скомпилировал ядро ​​Linux и минимальную корневую файловую систему, содержащую только программу «Hello World». Теперь мы можем создать нормально работающую корневую файловую систему и протестировать ее с помощью QEMU. Обратите внимание, что для того, чтобы следовать этому примеру, вам необходимо:

  • Набор инструментов CodeSourcery для Linux
  • Образ ядра Linux, скомпилированный для универсальной платформы с поддержкой EABI (вот как я создал свой)
  • Эмулятор

  • QEMU ARM (пакет для установки: qemu в Debian или qemu-kvm-extras в Ubuntu)
  • Библиотеки разработчика для ncurses (пакет для установки libncurses5-dev ) для компиляции конфигурации меню

Скачал версию 1. 16.0 исходного кода Busybox и извлек его. Внутри извлеченного каталога я запустил:

 $ make ARCH = arm CROSS_COMPILE = arm-none-linux-gnueabi- defconfig 

Создается файл конфигурации по умолчанию. Чтобы изменить его под свои нужды:

 $ make ARCH = arm CROSS_COMPILE = arm-none-linux-gnueabi- menuconfig 

Я проверил возможность компилировать Busybox как статический исполняемый файл, чтобы нам не приходилось копировать динамические библиотеки внутри корневой файловой системы. Эту настройку можно найти в « Настройки Busybox -> Параметры сборки ».Затем следующая команда собирает Busybox и создает каталог с именем _install , содержащий дерево корневой файловой системы:

 $ make ARCH = arm CROSS_COMPILE = arm-none-linux-gnueabi- установить
 

Теперь мы можем создать образ корневой файловой системы с помощью инструмента cpio , а чтобы еще больше сжать файловую систему, мы можем запустить на нем gzip для создания сжатого образа:

 $ cd _install
$ найти.  | cpio -o --format = newc> ../rootfs.img
$ cd ..
$ gzip -c rootfs.img> rootfs.img.gz 

В моем случае размер сжатого изображения составляет около 1 МБ. Чтобы протестировать Busybox, мы можем эмулировать платформу ARM с QEMU, используя следующую команду, предполагая, что мы копируем ядро ​​Linux zImage в текущий каталог:

 $ qemu-system-arm -M versatilepb -m 128M -kernel zImage -initrd rootfs.img.gz -append "root = / dev / ram rdinit = / bin / sh" 

Ядро Linux загрузится, и оболочка / bin / sh будет выполнена, как указано в параметре загрузки rdinit , с отображением общей подсказки « # ».Оболочку можно использовать как обычно, например, вы можете запустить ls , чтобы найти ту же структуру каталогов, что и в каталоге Busybox _install , но с помощью таких команд, как ps и mount , мы видим, что не все на месте: обе программы жалуются на каталог / proc . Мы можем создать и заполнить каталог / proc , выполнив эти команды внутри системной подсказки, эмулируемой QEMU:

 # mkdir / proc
# mount -t proc none / proc 

После этого программы ps и mount работают нормально.Мы также можем отметить, что каталог / dev почти пуст (единственное исключение — консольное устройство ). Для его заполнения нам нужно также смонтировать каталог / sys , чтобы мы могли использовать инструмент mdev ; запустить внутри QEMU:

 # mkdir / sys
# монтировать -t sysfs none / sys
# mdev -s 

Каталог / sys и / dev теперь заполнен. Чтобы выполнять эти шаги каждый раз, мы можем использовать функциональность / sbin / init : эта программа обычно запускается ядром Linux первым, и ее поведение по умолчанию заключается в выполнении файла инициализации с путем / etc / init. д / RCS . На этот раз на главном компьютере в папке, где мы скомпилировали Busybox, мы создаем недостающие каталоги:

 $ cd _install
$ mkdir proc sys dev и т. д. / init.d
$ cd ..
 

Теперь мы создаем новый _install / etc / init.d / rcS со следующим содержимым:

 #! / Bin / sh
монтировать -t proc нет / proc
монтировать -t sysfs none / sys
/ sbin / mdev -s 

Затем установите его как исполняемый файл:

 $ chmod + x _install / etc / init.d / RCS 

Затем мы можем воссоздать обновленный сжатый образ корневой файловой системы, как и раньше, и запустить:

 $ qemu-system-arm -M versatilepb -m 128M -kernel zImage -initrd rootfs.img.gz -append "root = / dev / ram rdinit = / sbin / init"
 

Ядро Linux загрузится снова, но на этот раз оно просит нажать Enter, и когда мы это сделаем, появится обычное приглашение консоли. Системные каталоги полностью заполнены, это означает, что сценарий rcS был выполнен; кроме этого, / sbin / init также порождает терминалы оболочки, используя getty .

В нашем примере доступ к файловой системе Busybox осуществляется с помощью RAM-диска, но она также может быть прочитана из физического дискового хранилища или загружена из сети с использованием протокола NFS. Может быть, в другой раз я подробно опишу, как запустить Busybox с NFS внутри QEMU.

45,447224
8,599690

Нравится:

Нравится Загрузка …

Связанные

Практический, реальный подход / (,) / —

11.3.1. BusyBox Init

11.3.1. BusyBox Init

Обратите внимание на символическую ссылку в листинге 11-5, которая называется init. В главе 6 «Инициализация системы» вы узнали о программе init и ее роли в инициализации системы. Напомним, что ядро ​​пытается выполнить программу с именем / sbin / init на последнем этапе инициализации ядра. Нет причины, по которой BusyBox не может эмулировать функциональность инициализации, и именно так сконфигурирована система, показанная в листинге 11-5. BusyBox обрабатывает функции инициализации.

BusyBox обрабатывает инициализацию системы иначе, чем стандартная инициализация System V. Для системы Linux, использующей инициализацию System V (SysV), как описано в главе 6, требуется файл inittab, доступный в каталоге / etc. BusyBox также читает файл inittab, но синтаксис файла inittab отличается. В общем, вам не нужно использовать inittab, если вы используете BusyBox. Я согласен со страницей руководства BusyBox: если вам нужны уровни выполнения, используйте инициализацию System V. [78]

Давайте посмотрим, как это выглядит во встроенной системе.Мы создали небольшую корневую файловую систему на основе BusyBox. Мы настроили BusyBox для статического связывания, исключив необходимость в каких-либо разделяемых библиотеках. Листинг 11-6 содержит древовидный список этой корневой файловой системы. Мы создали эту небольшую файловую систему, выполнив действия, описанные в главе 9, «Файловые системы», раздел 9.10, «Создание простой файловой системы». Здесь мы не будем подробно описывать процедуру. Файлы в нашей простой файловой системе показаны в листинге 11-6.

Листинг 11-6. Минимальная корневая файловая система BusyBox

$ дерево
.
| - корзина
| | - busybox
| | - кошка -> busybox
| | - dmesg -> busybox
| | - эхо -> busybox
| | - имя хоста -> busybox
| | - ls -> busybox
| | - ps -> busybox
| | - pwd -> busybox
| '- sh -> busybox
| - разработчик
| '- консоль
| - пр.
'- proc
4 каталога, 10 файлов

Эта корневая файловая система на основе BusyBox занимает немного больше, чем размер, необходимый для самого busybox.В этой конфигурации с использованием статической компоновки и поддержки почти 100 утилит исполняемый файл BusyBox занимает менее 1 МБ:

# ls -l / bin / busybox
-rwxr-xr-x 1 корень корень 824724 3 декабря 2005 г. / bin / busybox

Теперь посмотрим, как себя ведет эта система. В листинге 11-7 показан вывод консоли при включении этой встроенной системы на основе BusyBox.

Листинг 11-7. Запуск BusyBox по умолчанию

...
Ищу порт RPC 100003/2 на 192.168.1.9
Поиск порта RPC 100005/1 на 192.168.1.9
VFS: смонтированный корень (файловая система nfs).
Освобождение памяти инициализации: 96 КБ
Облом, не удалось запустить '/etc/init.d/rcS': нет такого файла или каталога
Пожалуйста, нажмите Enter, чтобы активировать эту консоль.
BusyBox v1.01 (2005.12.03-19: 09 + 0000) Встроенная оболочка (ясень)
Введите «help» для получения списка встроенных команд.
-sh: нет доступа к tty; управление заданиями выключено
/ #

Пример из листинга 11-7 был запущен на встроенной плате, настроенной для корневого монтирования NFS.Мы экспортируем каталог на нашей рабочей станции, содержащий простой образ файловой системы, подробно описанный в листинге 11-6. В качестве одного из последних шагов в процессе загрузки ядро ​​Linux на нашей целевой плате монтирует корневую файловую систему через NFS. Когда ядро ​​пытается выполнить / sbin / init, оно терпит неудачу, потому что в нашей файловой системе нет / sbin / init. Однако, как мы видели, ядро ​​также пытается выполнить / bin / sh. В нашей цели, настроенной для BusyBox, это успешно, и busybox запускается через символическую ссылку / bin / sh в нашей корневой файловой системе.

Первое, что отображает BusyBox, — это жалоба на то, что он не может найти /etc/init.d/rcS. Это сценарий инициализации по умолчанию, который ищет BusyBox. Вместо использования inittab это предпочтительный метод инициализации встроенной системы на основе BusyBox.

По завершении инициализации BusyBox отображает запрос, предлагающий пользователю нажать Enter, чтобы активировать консоль. Когда он обнаруживает клавишу Enter, он запускает сеанс оболочки пепла, ожидая ввода пользователя.Последнее сообщение об управлении заданиями является результатом того, что мы создаем системную консоль на последовательном терминале. Ядро Linux содержит код для отключения управления заданиями, если оно обнаруживает консоль на последовательном терминале.

В этом примере была получена рабочая система с почти 100 доступными утилитами Linux, включая основные утилиты, файловые утилиты, поддержку сети и достаточно функциональную оболочку. Вы видите, что этот простой пакет предоставляет мощную платформу для создания ваших собственных системных приложений.Конечно, следует отметить, что без какой-либо поддержки libc и других системных библиотек вы столкнулись бы с огромной задачей реализации ваших приложений. Вам нужно будет обеспечить поддержку всех обычных системных вызовов и других библиотечных функций, от которых зависит типичная программа на C. В качестве альтернативы вы можете статически связать свои приложения с библиотеками, от которых это зависит, но если у вас есть несколько приложений, использующих этот метод, ваши приложения, вероятно, превысят общий размер динамического связывания и наличия общих библиотек на вашей цели.

Android 的 toolbox busybox, toybox_rockly89 的 博客 -CSDN 博客

1 ящик для инструментов

看 система / ядро ​​$ gitk toolbox /

набор инструментов 应该 是 在 5.0 及 5.0 以前 使用 , 14 年 年底 后 google 已 停止 维护

2 ящика для игрушек

6.0 ls 等 基础 linux 命令 都 执行 了 toybox

 Что такое Toybox
  - Свежая реализация командной строки linux / android, под лицензией BSD.
    - Отрисовывает из Posix, LSB, LFS, панели инструментов , справочной страницы  bash и т. Д. 
 -  Почему бы не расширить toolbox / bionic вместо замены? 
    - потому что там ничего нет
      - преднамеренно заблокированная система.1 миллиард неуправляемого широкополосного доступа.
        - достаточно, чтобы запустить dalvik. (Новый ROM BASIC.)
        - Должен перерасти dalvik для запуска собственного кода.
      - контейнеры linux, крепления для соединений
        - виртуальная машина против контейнера
          - chroot на стероидах.  Собственные пиды, крепления, сетевая маршрутизация ...
          - систематическая вложенность разрешений unix
        - проблема: LXC еще не созрел, а ваниль опережает android.
          - над этим работает ваниль
          - LXC - это всего лишь один пакет управления пользовательским пространством для инфраструктуры ядра.
            - контейнеры: пространства имен, контрольные группы, флаги монтирования...
        - Не фанат selinux, apparmor, бит возможностей
          - вы не получите «водонепроницаемости», заткнув отверстия в колландере.
          - система уже достаточно сложна для администрирования, так что вы делаете это
            _больше_ сложно? Микроуправление приложениями.
          - Кен Томпсон сказал, что файл - это последовательность байтов. Если тебе нужно
            расширенные атрибуты, вы делаете это неправильно.
        - Контейнеры (пространства имен, контрольные группы) - это способ unix для этого.
          Вложите всю систему так, чтобы у каждого контейнера был собственный корень. - Это суждение, и меня могут возразить пользователи, которые
            действительно хочу эту штуку и могу послужить хорошим аргументом в пользу этого. Но
            значительная стоимость сложности. И selinux не заменяет
            "ничего, кроме dalvik, чтобы эксплуатировать" минимализм. 
 
Что реализует toybox? 

- android toolbox - живет в git "ядро android". - сортировка - поддержка контейнера для безопасности - не делиться - изучить lxc. (Исправить chroot в ядре.) - у Google есть эпический синдром «здесь не изобретено» - установите игрушечный ящик, поместите сначала в $ PATH. Оставьте игрушечный ящик в покое. - Устранение необходимости в ящике для инструментов не устранит защитное одеяло.

3 занятых

busybox для android, для xbin, для android, xbin, для ls, для

http://stackoverflow.com/questions/26801895/the-different-between-android-foldersbin-xbin-sbin

1] / system — это основной каталог Android для хранения неизменяемых компонентов, созданных сборкой AOSP. Сюда входят собственные двоичные файлы, собственные библиотеки, пакеты фреймворка и стандартные приложения. Обычно он монтируется только для чтения из отдельного образа из корневой файловой системы, который сам монтируется из образа RAM-диска.

2] Android также включает в себя множество каталогов, которые обычно встречаются в любой системе Linux, например / dev, / proc, / sys, / sbin, / root, / mnt и / etc. Эти каталоги часто служат схожим, если не идентичным целям, с теми, которые они обслуживают в любой системе Linux, хотя они очень часто урезаны, как в случае / sbin и / etc, а в некоторых случаях пусты, например / root.

3] В корневой файловой системе Android разбросано более 150 утилит командной строки. /System/bin содержит большинство из них, но некоторые «дополнительные» находятся в / system / xbin, а некоторые — в / sbin.

4] / sbin dir В Linux это будет содержать двоичные файлы, необходимые системному администратору. В Android он содержит только ueventd и adbd.

5] / bin dir Все собственные двоичные файлы и демоны, созданные как часть AOSP. Все модули, созданные с помощью BUILD_EXE CUTABLE, находятся здесь.Единственным исключением является adbd, для которого LOCAL_MODULE_PATH задано значение / sbin, и поэтому он устанавливается вместо него.

6] / xbin dir «Дополнительные» двоичные файлы, генерируемые некоторыми пакетами, которые создаются в рамках AOSP, но не являются необходимыми для работы системы.

Благодарность господину Кариму Ягмуру, Великому; Автор учебника по встроенному Android.

几天 , Android 点儿 少得可怜 的 shell 折磨 的 死去活来 , 终于 下定 了 的 决心。 看 的 怎么 把 渺小 的 toolbox 伟大 Android 中оболочка 程序 部分。

оболочка 实现 分为 两 部分 :

一 、 оболочка 解释 器 和 内置 命令

— это команда system / core / sh, встроенная в shell.c 中 包含 的 内置 命令 , 直接 执行 , toolbox 的 扩展 命令 , toolbox 程序 完成。

二 、 ящик для инструментов 扩展 命令

的 的 执行 , 每 一个 命令 对应 name_main 函数 , 如 ls 命令 , 对应 ls_main 函数。 同时 扩展 都由 system / core / toolbox / 下面 的 . c 文件 实现 toolbox. c 根据 这个 目录 下面 的 .c 文件 生成 tools.h 文件 , 并 system / core / toolbox / Android.mk 文件 中 为 的 命令 生成 toolbox 的 连接 。toolbox 使它 扩展 一个 命令 很容易。

现在 我们 自己 想 手工 添加 一个 shell 命令 mycommand , 在 system / core / toolbox / 目录 下面 新建 一个 mycommand.c 文件 , 并 实现 mycommand_main 函数 , system / core / toolbox / Android.mk 中Mycommand.c Android.mk 会 自动 把 编译 toolbox 程序 , 并 在 的 Android 系统 / system / bin 的 为 这个 一个 toolbox。

的 一篇 文章 , 借助 它 , 可以 Android 的 toolbox busybox。

Установка инструментов командной строки Busybox

英文 原文 地址 :

https: // gforge.ti.com/gf/project/omapandroid/wiki/?pagename=Installing+Busybox+command+line+tools

Android 中 安装 busybox 命令 行 工具

文 简单 地 介绍 了 怎么 busybox 安装 Android 的 文件 系统 中 去。 如果 下面 的 地址 好 Android2.1 系统 成功 busybox 然后过 下面 的 安装 步骤。

http://download.csdn.net/source/3093680

Busybox vi учебник — Кшиштоф Адамски

Vim — мой любимый редактор. Мне это нравится, я использую его везде, где могу.Проблема в том, что он довольно тяжелый, и я трачу много времени на
встроенные устройства, где он недоступен. Благо у меня busybox
на всех устройствах, и это означает, что у меня есть доступ к busybox vi
команда.

Busybox vi — это очень простая реализация в редакторе vi , который Vim является
на основе. Таким образом, он использует ту же философию редактирования, что и Vim , но просто
имеют гораздо меньше возможностей. Тем не менее, мне нравится использовать его в полной мере.Нет документации о busybox vi , о которой я знаю, но поскольку
его код короткий, я легко мог узнать, что есть в наличии. я буду
начните с основ, чтобы вы могли использовать редактор даже
если вы никогда раньше не использовали vi . Я также дам несколько советов о том, как
используйте его более эффективно.

Так как busybox vi настолько прост, этот учебник направлен на документирование всех
о его возможных характеристиках (по крайней мере, на момент написания этой статьи). Если какая-то особенность
не задокументирован, сообщите об ошибке.Все задокументировано
здесь тоже должно работать Vim (попробую добавить примечания, если есть
некоторые заметные различия между ними), поэтому я считаю, что это могло быть
также используется как неплохое введение в использование и Vim .

Банкноты

В этом руководстве предполагается, что у вас есть busybox vi со всеми дополнительными
функции включены. Однако обратите внимание, что VI_REGEX_SEARCH отключен во многих
установки, которые запрещают использование регулярных выражений при поиске.Каждый раз, когда я использую имя vi , я имею в виду busybox vi , а не
исходный vi .

Режимы работы

Важно понимать, что vi — это модальный редактор. Это значит, что
ваши нажатия клавиш будут интерпретироваться по-разному в зависимости от того, в каком режиме вы
прямо сейчас. Это очень мощная функция, но она также
головная боль для тех, кто никогда раньше не пользовался модальным редактором.

Busybox vi имеет всего три режима работы:

  • командный режим (с подрежимом команд с двоеточием)
  • режим вставки
  • режим замены

командный режим является значением по умолчанию (поэтому в нем он называется нормальный режим
в Vim ).Вы всегда можете вернуться в этот режим с помощью клавиши ESC (или
ctrl- [). Режимы вставки и замены предназначены для редактирования текста. Единственный
разница в том, что в режиме замены символы под курсором заменяются
в то время как в режиме вставки они сдвинуты вправо. двоеточие команды режим
(называется ex command mode в Vim ) — это специальный режим, в который можно войти из
командный режим с использованием клавиши : . Текущий режим всегда печатается в
нижний левый угол экрана. - означает командный режим , I означает
режим вставки , R означает режим замены .

Перемещение курсора

После запуска vi вы находитесь в командном режиме . Это означает, что вы не можете ввести
текст, но (среди прочего) вы можете перемещать курсор. Здесь очень много
способов перемещения в vi , но основной — перемещение одного персонажа в
каждое направление. Вы можете сделать это как минимум двумя способами — с помощью клавиш со стрелками,
что не рекомендуется, так как для этого вам нужно переместить
пальцами из основного ряда клавиатуры или используя клавиши h , j , k , l
настоятельно рекомендую использовать как можно больше ключей hjkl .

Еще один аргумент против использования клавиш со стрелками заключается в том, что, поскольку busybox vi является
используется в основном на встроенных устройствах, скорее всего, ваш терминал не
правильно настроен для их использования. В этой ситуации вам будет очень
раздражает каждый раз, когда вы нажимаете клавишу со стрелкой.

Для перемещения курсора влево или вправо вы также можете использовать SPACE и
BACKSPACE ключа. Обратите внимание, что если вы находитесь в режиме вставки, вы также можете переместить
курсор, но ключи hjkl будут недоступны (т.к. они нужны для
ввод текста, конечно).

Базовое редактирование

Для того, чтобы ввести текст, вы должны войти в режим вставки или замены.
Есть много команд, которые входят в один из этих режимов, но большинство
базовые — и (для добавления после текущей позиции курсора),
i (для вставки перед текущей позицией курсора) и R для ввода
заменить режим. После вставки текста вы можете использовать клавишу ESC , чтобы вернуться
в командный режим. В режиме вставки / замены вы также можете удалить текст
используя ключи DEL и BS .

Многие новички в vi переходят в режим вставки сразу после запуска программы.
и использовать его в течение всего сеанса редактирования, оставляя его только при закрытии
файл. Таким образом, они в основном меняют vi на режим без отсутствующего редактора
многие его особенности. Чтобы использовать vi эффективно, вы должны оставаться
в командном режиме, насколько это возможно, используя только режим вставки, когда
ввод текста. Прирост эффективности будет не таким большим, как в Vim, но
вы все равно должны это почувствовать, особенно при использовании . команда.

Сохранение файла

Теперь вы знаете, как перемещать курсор и выполнять базовое редактирование. Но как
сохранить файл и выйти из редактора? Есть несколько способов. Если ты
редактируя какой-то файл, у которого уже есть имя файла, вы можете использовать ZZ в
командный режим. Это означает сохранение и выход из . Только писать изменения, но не
exit, вы можете использовать команду : написать двоеточие (просто нажмите двоеточие, затем введите
написать ). Чтобы выйти, вы можете использовать команду : quit , но vi не позволит вам сделать это
что если у вас есть модификации, о которых еще не написано. если ты
хотите отменить изменения, добавьте ! в конце : выйти из команды , чтобы
заставить бросить курить. Команда write и quit имеет более короткие версии —
вы можете использовать : w или : q соответственно. Писать и увольняться одновременно
time, используйте ярлык : wq или : x .

Редактирование в командном режиме

Командный режим не ограничивается перемещением курсора. Есть некоторые
команды, которые можно использовать для редактирования текста.Самый простой — удалить
команда. Нажав кнопку x , вы можете удалить символ в
курсора и, нажав X , вы можете удалить символ непосредственно перед курсором.

Каждый раз, когда вы удаляете что-либо в vi , оно сохраняется во временном
буфер. Вы можете вставить содержимое этого буфера, используя p (чтобы вставить
после курсора) или P (вставить перед курсором).

Вы также можете скопировать строку в буфер с помощью команды yy (или Y ) и
используя команду dd , вы можете удалить строку.Помните ту удаленную строку
будет скопирован во временный буфер, чтобы вы могли запатентовать его в другом месте
используя p или P . Таким образом, вы можете вырезать и вставить vi .

J Команда может использоваться для присоединения (конкатенации) следующей строки к текущей
один. Команда ~ переключит текущий символ на верхний / нижний регистр. >>
и << команды могут использоваться для сдвига влево / вправо текущей строки на
табулятор. Используя команду r {x} , вы можете заменить текущий символ на
{x} .

При редактировании следите за тем, чтобы не вводить числа перед командами, так как
это может привести к неожиданным (пока что) результатам.

Дополнительные способы перемещения файла

Если вы редактируете файл, вы будете довольно много перемещаться по нему. vi имеет некоторые
полезные команды, позволяющие делать это более эффективно. Посмотрим на них.

Вместо того, чтобы двигаться влево или вправо на одного персонажа, вы можете перемещаться целиком
слово. Есть несколько команд, которые позволяют это сделать.Чтобы использовать
их, вы сначала должны знать, что для vi есть два типа слов.
Я люблю называть их word и WORD . Первый - это куча
буквы, цифры и символы подчеркивания. Каждый персонаж, не являющийся частью
этот набор считается разделителем слов (и все такие символы следующие
друг к другу - само слово). Есть еще одно определение -
СЛОВО . Обычно это набор символов, разделенных белым
персонаж.Таким образом, для vi «это» состоит из двух слов , но только одного
СЛОВО .

Теперь команды - w Команда перемещает курсор вперед в начало
из следующих слов , e перемещает его в конец следующего слова , а b
команда перемещает его в начало следующего слова назад. Если хочешь
чтобы переместить WORD , используйте вместо них команды W , B и E . команда. + переместит курсор
к первому непустому символу в следующей строке, а переместится к
первый непустой символ в предыдущей строке.

Если вы нажмете f {x} (заменив {x} любым символом), vi перейдет к
следующее появление указанного символа {x} в текущей строке. Использовать
t {x} вместо f {x} , если вы хотите переместить на один символ до {x} .
Если вы хотите повторить последний поиск f , вы можете использовать ; (искать
вперед) или , (для поиска назад).К сожалению, в busybox vi, ;
и , нельзя использовать для повторения команды t .

Вы также можете искать шаблоны длиной более одного символа. Сделать это,
используйте команду / {pattern} для поиска вперед и ? {pattern} для поиска
назад. Чтобы повторить последний поиск, используйте n (вперед) или N (назад)
команды. Также есть одна полезная команда поиска — % . Используйте это, если хотите
чтобы найти соответствующую скобку () , {} или [] .

Чтобы переместить курсор в первую строку, видимую на экране, используйте H
( h igh) команда. L ( l ow) команда переместит его в последнюю
видимая линия, а M ( м холостой ход) переместит его на строку в
середина экрана. Также команда gg переместит курсор на
первая строка файла, а команда G переместит его в последнюю строку
файл.

Последняя группа команд навигации — это команды прокрутки.Если хочешь
прокрутите полноэкранный режим вниз, используя клавишу ctrl-f ( f и выше) или PgDn . В
для прокрутки на одну страницу вверх вы можете использовать ctrl-b ( b ackwards)
или PgUp . Вы также можете прокрутить половину экрана, используя ctrl-d ( d own)
и ctrl-u ( u p) или только одну строку, используя ctrl-e (вниз) или ctrl-y
(вверх). Вы также можете прокрутить экран, чтобы текущая строка была вверху
экрана ( z- ), посередине ( z.) или внизу
z {any_other_character} ).

Повторение команд

Я уже упоминал некоторые команды, которые можно использовать для редактирования текста или
перемещаться по файлу. Большинство этих команд могут иметь префикс
число. Это повторит команду на указанное количество. Например, в
чтобы удалить 10 строк, вместо этого, если вы нажмете d 20 раз, вы можете использовать
10dd команда. Если вы хотите удалить 5 символов, вы можете использовать 5x , чтобы
переместите 3 слова вперед, используйте 3w и так далее.

Имеется особое значение счетчика для gg (перейти на первую строку
файл) и G (перейти к последней строке файла). Если они
имеют префикс count, они оба делают то же самое — переходят к указанному
строка файла. Итак, если вы хотите переместить курсор на 12-ю строку файла
вы можете использовать 12gg или 12G .

Есть еще одна команда движения, о которой я раньше не упоминал (это
потому что в этом нет особого смысла, если вы не умеете использовать счетчики) —
это | команда.Вы можете использовать его для перехода к указанному столбцу в
текущая строка. Итак, чтобы перейти к 12-му столбцу, используйте 12 | .

Команда точки

К сожалению, команда точки (активируется нажатием . в команде
mode) не такой мощный в busybox vi , как в Vim. Тем не менее это
все еще можно использовать, чтобы сэкономить время на вводе текста. Точка повторяет последнюю команду, которую
изменил текст . Это оно. Вроде не много, но поскольку
вы можете сделать довольно много, используя одну команду в busybox vi (и еще больше
в Vim ), это может сэкономить вам время на вводе текста.Например, если вы только что удалили
10 строк, используя 10dd , вы можете удалить еще 10 строк, нажав всего . .

Отменить функцию

busybox vi имеет очень ограниченную функциональность отмены. Все, что ты можешь сделать, это
отменить все изменения в текущей строке с помощью команды U . Но ты
может делать это только до тех пор, пока вы не перейдете на другую строку.
К сожалению, здесь нет повтора, отмены отдельных изменений или многоуровневых
отменить.

Использование именованных регистров

В отличие от большинства других известных мне редакторов, vi может использовать несколько регистров для
сохранение скопированного текста.Это может быть очень полезно, если мы хотим вставить
несколько фрагментов текста в разных местах. По умолчанию vi использует
регистр по умолчанию каждый раз, когда вы копируете или удаляете текст. Отдельная форма
регистр по умолчанию, vi также имеет именованные регистры. Каждый такой регистр
присвоена строчная буква ( a-z ) . Вы можете выбрать, какое имя
регистр должен использоваться путем добавления команд копирования, удаления или вставки
с префиксом "{letter} .

В качестве примера вы можете скопировать строку в буфер с "ауу , а затем скопировать
другая строка к b регистр с "на .Теперь, когда захочешь
вставьте строку из в регистр , вы используете "ap и когда хотите
вставьте строку из регистра b , вы используете "bp .

Использование меток

Часто при редактировании или просмотре длинного текста вы будете
прыгать по разным частям. vi может сделать это проще,
вспоминая такие места как , отмечает . Каждый знак, аналогично названному
регистров, присваивается строчная буква .Чтобы установить отметку, вы используете
м {буква} команда. Чтобы перейти к определенной отметке, используйте '{letter}
команда. Он не переместится в то место, где была установлена ​​отметка — вместо этого он
перейдет к началу строки с отметкой. Часто использую отметку q
чтобы запомнить какое-то место — чтобы установить его, я использую mq , чтобы перейти к нему, я использую
.

Обратите внимание, что в vi метки указывают на определенное место в файле во времени.
когда они где сидят. Если текст редактируется, метка может не указывать на
снова на том же месте.Технически метки указывают на определенный байт в файле.

Операторы

Оператор — это команда, за которой может следовать движение , чтобы
применить некоторую операцию к указанному региону. Что такое движение? Это
почти любая команда, перемещающая курсор, например w , b , j , f и т. д.
что по какой-то причине движения G и gg не работают в busybox
vi
.

vi не имеет много операторов, только c , d , y , < и > .Давайте посмотрим на них один за другим:

  • c is ( c hange). Он удалит указанный регион и изменит его на
    режим вставки, чтобы вы могли написать новый текст вместо удаленного
    один. Я его много использую в виде cw (сменить на начало следующего
    слово) или заменить часть слова или c $ , чтобы заменить текст из
    курсор в конец строки.
  • d is ( d elete). Он похож на c в том, что удаляет текст, но
    он не меняет режим вставки.Вы можете удалить весь текст из
    курсор в конец строки, используя d $ . Для этого есть ярлык,
    однако - D команда.
  • y is ( y ank). Это значит копировать. Вы можете выбрать регион, который должен
    быть скопировано в реестр. Чтобы скопировать от курсора до конца
    слово, используйте yw .
  • > - сдвиг вправо, а < - сдвиг влево. Они добавляют табулятор в
    конец каждой строки в регионе.Это означает, что нет
    имеет смысл использовать с операторами this движения, которые не занимают несколько строк.

Каждый оператор в vi может иметь префикс счетчика. Итак, если вы хотите
сдвиньте 3 строки вправо, вы можете использовать 2> j (текущая и две следующие строки).

Помните команды dd , yy , << и >> , упомянутые ранее? Они есть
особые ароматы операторов d , y , < и > .Каждый повторяется
оператор работает на всей текущей строке, независимо от того, какая текущая
положение курсора в строке. Так и есть cc - меняется
целая линия.

Операторы

могут быть очень мощными, если использовать их с f , t и %
движения. Также помните, что вы можете повторить последний оператор, используя . команда.

Другие команды, входящие в режим вставки

Мы уже знаем несколько способов входа в режим вставки, но есть пара
Больше.i , есть I . с
очень полезно - это изменение одного символа - аналогично c , но это
не оператор, поэтому вам не нужно указывать движение (но вы можете
по-прежнему префикс счетчик, чтобы изменить больше символов). Наконец, есть
o и O . Они оба вставляют новую строку и входят в режим вставки. Первый
из них вставляют строку после курсора, а второй - перед
курсор.

Двоеточие команды

Если вы нажмете команду : , вы войдете в подрежим команды с двоеточием.Ваш
курсор переместится в последнюю строку (строка состояния), и вы сможете
введите команды с двоеточием. busybox vi имеет только несколько таких команд, и я
уже представили некоторые из них (: написать и : выйти из ).

Все команды двоеточия могут иметь префикс необязательного спецификатора диапазона. Это
состоит из двух частей, разделенных точкой с запятой в виде
: [от] [, к] {команде} . Вы можете опустить из и до или только до .Значение по умолчанию для обоих аргументов зависит от конкретной команды. И то и другое
от и до указывают диапазон строк, к которым должна применяться команда.
Вы можете использовать номера строк, отмечать регистры (например, : 'a,' b {command}
запустит команду из строки с меткой a в строку с меткой b ), найдите
некоторый текст (начиная с текущей позиции курсора) с
: / text1 /, / text2 / {command} или используйте . (текущая строка) и $ (последняя строка
в файле). Вы также можете смешивать эти спецификаторы. Например, чтобы удалить
строки от отметки q до первого вхождения текста включают , вы можете
используйте команду : 'q, / include / d . Вы также можете использовать % вместо от, до
номинал - это синоним 1, доллара, что означает от 1 до последней строки. Пока
вы можете указать диапазон для всех команд, он игнорируется некоторыми из них
(когда это не имеет смысла).

Обратите внимание, что имена команд могут быть сокращены до нескольких первых символов.Поэтому вместо ввода : write вы можете ввести : wri или даже просто : w . В
в случае неоднозначности первая команда, протестированная в исходном коде, будет
используемый. Таким образом, s - это set , а не заменяющая команда, а f - для файла
не особенности .

  • {number} - перейдите к строке номер {number} .

  • ! {Command} - запустить команду во внешней оболочке, показывая ее вывод
    и статус выхода.

  • = - вывести номер текущей строки.

  • версия - информация о версии для печати.

  • edit [путь] - при запуске без аргумента перезагружает текущий файл (полезно
    если файл был изменен извне. Вы также можете указать путь к
    файл, который будет редактироваться вместо текущего файла.

  • файл [путь] - при запуске без аргументов печатает текущее имя файла
    и информация о состоянии.Если вы укажете путь, он будет
    считается текущим именем файла при записи буфера в файл.

  • features - распечатать список функций .

  • список - печатает текущую строку в строке состояния, показывая все
    непечатаемые символы.

  • выйти из - просто выйти из vi .

  • читать {путь} - прочитать файл по {пути} (обязательно) и просто вставить
    после курсора.

  • set - при запуске без аргументов показывает список времени выполнения
    варианты (и их значения). В противном случае он устанавливает параметр, указанный как
    Аргумент.

  • write [путь] - при запуске без аргументов записывает изменения в
    текущий файл. Если запустить с путем, он запишет текущий файл в
    указанный путь к файлу. В этом случае вы можете указать диапазон, чтобы указать
    какие строки следует записать в этот файл.

  • delete - удалить указанные (текущие по умолчанию) строки (копирование
    их в буфер).

  • yank - указана yank (копия) (текущие по умолчанию строки в буфер.

  • s / {find} / {replace} / [flag] ( s ubstitute) - находит {find} и
    заменяет его на {replace} . Вы можете указать дополнительно г
    ( g lobal), чтобы найти все вхождения в строке, в противном случае
    только первый будет заменен. По умолчанию работает только в
    текущая строка, но вы можете перезаписать ее, используя спецификатор диапазона.

  • wq / x - ярлык для : написать и : выйти из .

  • wn - ярлык для : напишите и : следующий .

  • следующие , предыдущие (добавлены совсем недавно) и перемотка назад объяснены в
    следующий раздел.

edit , quit , next , prev and rewind команды не могут быть запущены, если
в буфере есть несохраненные изменения.Однако вы можете заставить их
добавление ! (без пробела) в конце имени команды.

Редактирование нескольких файлов

Если вы запустите busybox vi с несколькими аргументами имени файла, запустится vi
в режиме редактирования нескольких файлов. Первое изменение, которое вы заметили, это то, что вы
невозможно выйти (без принуждения), и вы получите «Еще X файлов для редактирования». В
этот режим vi не позволит вам выйти, пока вы не отредактируете (или, по крайней мере, не выполните
посмотрите) все файлы.

Вы можете использовать : следующий и (в последних версиях busybox) : предыдущий двоеточие
команды для перехода к следующему или предыдущему файлу в списке.Вы можете
всегда возвращаться к первому файлу с помощью команды : rewind (это единственный способ
чтобы вернуться в начало списка файлов, если ваш busybox vi делает
не поддерживает : предыдущая команда ).

Обратите внимание, что при использовании команды : edit вы начнете редактировать новый файл.
Однако если вы перейдете к другому файлу, вы не вернетесь к этому файлу.
Вы всегда будете переходить к файлам, указанным в командной строке и там
Невозможно изменить этот список во время выполнения в busybox vi .

Параметры времени работы

Каждый параметр времени выполнения может быть установлен с помощью команды : set {option} . Обратите внимание, что
в случае логических опций (все опции, кроме , остановка в busybox
vi
), вы можете отключить их, добавив к ним префикс . Итак, чтобы
включите опцию autoindex , вы должны использовать : set autoindex . Если хочешь
чтобы отключить его, используйте : установите noautoindex . Помни, ты всегда можешь
проверьте все текущие значения с помощью команды : set (без аргументов).

Текущий busybox vi поддерживает следующие параметры (настраивается с помощью : установить ):

  • autoindent ( ai ) - при вставке новой строки используйте такое же количество
    отступ как предыдущая строка в начале строки. Это
    очень полезно отключить эту опцию при вставке текста с помощью
    буфер обмена мыши, например.

  • flash ( fl ) - экран будет мигать вместо звукового сигнала при ошибке

  • ignorecase ( ic ) - регистр не учитывается при поиске

  • showmatch ( sm ) - предполагается, что курсор переместится на
    соответствие [, {, ( открывающая скобка при вставке закрывающей скобки.К сожалению, у меня это работает некорректно. В
    кроме того, он будет мигать или издавать звуковой сигнал (в зависимости от варианта flash ), если
    он не может найти совпадения.

  • tabstop = X - устанавливает количество пробелов, используемых табулятором

Вместо использования полного имени параметра вы можете использовать ярлык, указанный в
подтяжки. Обратите внимание, что tabstop не имеет такого ярлыка.

Значения по умолчанию для параметров жестко заданы в исходном коде.Вы можете
изменить их двумя способами - с помощью параметра командной строки -c при запуске
busybox vi или с помощью переменной среды EXINIT . Но это будет только
позволяют изменить один вариант.

Параметры командной строки и EXINIT

busybox vi не имеет многих параметров командной строки. Вы можете использовать -H для
см. список функций, -R для открытия файла в режиме только для чтения и -c для
укажите команду двоеточия, которую следует запустить.Если вы не указали -c
вы также можете использовать переменную EXINIT , чтобы сделать то же самое.

Обратите внимание, что бот -c и EXINIT могут использовать только одно двоеточие.
команда. Вам не нужно использовать двоеточие в начале команды, чтобы
запустить. Итак, чтобы запустить команду : версия сразу после запуска vi , вы
можно запустить так:

 busybox vi -c "версия" / tmp / file
 

Некоторые другие полезные команды:

  • ctrl-g принудительное обновление строки состояния
  • ctrl-r и ctrl-l принудительно перерисовывают экран.Может пригодиться, когда ты
    console, например, заполняется сообщениями ядра.
  • ctrl-h , ctrl-l и ctrl-j можно использовать вместо h , l и
    Дж . Обратите внимание, что нет ctrl-k .
  • ctrl-m или ENTER можно использовать вместо +

В то время как busybox vi даже близко не такой многофункциональный, как оригинал
vi , не говоря уже о Vim , я нахожу довольно впечатляющим, насколько вы
можно с этим справиться, тем более, что это всего лишь около 100 КБ кода.И с тех пор
это всего лишь несколько килобайт скомпилированного двоичного файла, он почти везде
busybox есть. Это помогает, если вы хотите что-то отредактировать
прямо на целевом устройстве.

Уязвимость

0day (бэкдор) в прошивке для видеорегистраторов, сетевых видеорегистраторов и IP-камер на базе Xiaongmai / Хабр

Это полное раскрытие недавнего бэкдора, интегрированного в устройства DVR / NVR, построенные на базе HiSilicon SoC с прошивкой Xiaongmai. Описанная уязвимость позволяет злоумышленнику получить доступ к корневой оболочке и полный контроль над устройством.Формат полного раскрытия информации для этого отчета был выбран из-за отсутствия доверия к поставщику. Доказательство концептуального кода представлено ниже.

Предыдущая работа и исторический контекст

В самых ранних известных версиях был включен доступ по telnet со статическим паролем root, который можно было восстановить из образа прошивки с (относительно) небольшими вычислительными затратами. Об этой уязвимости говорилось в предыдущей статье автора в 2013 году. В 2017 году Иштван Тот провел наиболее полный анализ прошивки цифрового видеорегистратора.Он также обнаружил уязвимость удаленного выполнения кода на встроенном веб-сервере и многие другие уязвимости. Стоит отметить, что производитель проигнорировал раскрытие информации.

В более поздних версиях прошивки по умолчанию отключены доступ через Telnet и порт отладки (9527 / tcp). Вместо этого у них был открытый порт 9530 / tcp, который использовался для приема специальной команды для запуска демона telnet и включения доступа к оболочке со статическим паролем, который одинаков для всех устройств. Такой случай освещен в следующих статьях:

В самых последних версиях встроенного ПО есть открытый порт 9530 / tcp, который прослушивает специальные команды, но для их фиксации требуется криптографическая аутентификация запрос-ответ.Это предмет фактического раскрытия.

Технические характеристики

Обсуждаемые уязвимые устройства DVR / NVR / IP-камеры работают под управлением Linux с минимальным набором утилит, предоставляемым busybox, основным видеоприложением Sofia и небольшим набором специальных дополнительных утилит, отвечающих за поддержку работы устройства. Оборудование имеет процессор на базе ARM от десятков до сотен мегабайт оперативной памяти.

Устройство с уязвимой прошивкой имеет процесс macGuarder или dvrHelper , который работает и принимает соединения через TCP-порт 9530.Строки кода и журнала предполагают, что macGuarder раньше был отдельным процессом, но позже его функции были объединены в процесс dvrHelper как отдельный поток.

Стоит отметить, что в более ранних версиях прошивки процесс dvrHelper был скомпилирован в busybox в качестве дополнительного апплета. Принимая во внимание, что у busybox есть лицензия GNU GPL, возможно нарушение лицензии имеет место из-за того, что программное обеспечение dvrHelper распространялось без исходного кода.

Успешный процесс активации бэкдора выглядит следующим образом:

  1. Клиент открывает соединение с портом TCP-порт 9530 устройства и отправляет строку OpenTelnet: OpenOnce с добавлением байта, указывающего общую длину сообщения.Этот шаг является последним для предыдущих версий бэкдора. Если после этого шага ответа нет, возможно, telnetd уже был запущен.
  2. Сервер (устройство)

  3. отвечает строкой randNum: XXXXXXXX , где XXXXXXXX - случайное 8-значное десятичное число.
  4. Клиент

  5. использует свой предварительный общий ключ и создает ключ шифрования как объединение полученного случайного числа и PSK.
  6. Клиент шифрует случайное число с помощью ключа шифрования и отправляет его после строки randNum: .Ко всему сообщению добавляется байт, указывающий общую длину сообщения.
  7. Сервер

  8. загружает тот же общий ключ из файла / mnt / custom / TelnetOEMPasswd или использует ключ по умолчанию 2wj9fsa2 , если файл отсутствует.
  9. Сервер выполняет шифрование случайного числа и проверяет, что результат идентичен строке от клиента. В случае успеха сервер отправляет строку verify: OK или verify: ERROR в противном случае.
  10. Клиент шифрует строку Telnet: OpenOnce , добавляет к ней байты общей длины, CMD: строку и отправляет на сервер.
  11. Сервер извлекает и дешифрует полученную команду. Если результат дешифрования равен строке Telnet: OpenOnce , он отвечает Open: OK , включает порт отладки 9527 и запускает демон telnet.

Весь процесс аутентификации может напоминать некую разновидность аутентификации запрос-ответ HMAC, за исключением того, что он использует симметричный шифр вместо хэша. Этот конкретный симметричный шифр напоминает некоторый вариант 3DES-EDE2 для ключей длиной более 8 байтов и похож на простой DES для более коротких ключей.

Легко видеть, что все, что требуется клиентам для успешной аутентификации, - это знание PSK (который является обычным и может быть получен из прошивки в виде открытого текста) и реализация этого симметричного блочного шифра. Восстановление этой реализации симметричного шифра наиболее сложно, но это было достигнуто в ходе этого исследования. Исследования и тесты проводились с использованием этого набора инструментов:

  • Ghidra 9.1.1 от NSA (https://ghidra-sre.org/) - набор для проверки исполняемого двоичного кода.
  • QEMU (точнее, qemu-user в Debian chroot - https: // www.qemu.org/) - программное обеспечение, позволяющее прозрачно выполнять исполняемые файлы сторонней архитектуры (ARM) на хосте.
  • Общие утилиты и набор инструментов GNU.

После активации демон telnet весьма вероятно, что он примет одну из следующих пар логин / пароль:

Эти пароли можно восстановить как из прошивки, так и путем перебора хешей в файле / etc / passwd . Современный GPGPU потребительского уровня с hashcat способен находить предварительный образ для хеширования за считанные часы.

Порт отладки 9527 принимает тот же логин / пароль, что и веб-интерфейс, а также обеспечивает доступ к оболочке и функции для управления устройством. Говоря об учетных записях веб-интерфейса, злоумышленник может сбросить пароль или получить хэши паролей из файлов / mnt / mtd / Config / Account * . Хеш-функция была описана в предыдущем исследовании Иштвана Тота.

Затронутые устройства

Предыдущее исследование показало хорошую коллекцию затронутых брендов: https://github.com/tothi/pwn-hisilicon-dvr#summary. Существуют десятки марок и сотни моделей.

Автор этого отчета, основываясь на опросе случайных IP-адресов, оценивает общее количество уязвимых устройств, доступных через Интернет, от сотен тысяч до миллионов.

Наверное, самый простой способ проверить, уязвимо ли ваше устройство, - это PoC-код, указанный ниже.

Тестирование уязвимости

PoC-код: https://github.]'.Вход в LocalHost: root
Пароль:
IP-адрес

в приведенном выше примере - это IP-адрес из блока адресов, зарезервированный для документации RFC5737.

Устройство следует считать уязвимым, если:

  • Telnet-порт открывается после запуска hs-dvr-telnet .
  • Устройство отвечает запросом на запрос hs-dvr-telnet . Даже если проверка не удалась из-за неправильного PSK, существует правильный PSK, извлекаемый из прошивки.
  • hs-dvr-telnet зависает в ожидании ответа, но порт telnet открывается (это произойдет со старыми версиями прошивки, для которых требуется только команда OpenTelnet: OpenOnce ).

Смягчение

Принимая во внимание более ранние фиктивные исправления этой уязвимости (фактически, бэкдор), нецелесообразно ожидать исправлений безопасности для прошивки от производителя. Владельцам таких устройств стоит подумать о переходе на альтернативы.

Однако, если замена невозможна, владельцы устройств должны полностью ограничить сетевой доступ к этим устройствам для доверенных пользователей. В этой уязвимости задействованы порты 23 / tcp, 9530 / tcp, 9527 / tcp, но более ранние исследования показывают, что нет уверенности, что реализация других сервисов надежна и не содержит RCE уязвимостей.

Объекты, не охваченные данным исследованием

Анализ кода показал, что процедура аутентификации на порту 9530 расшифровывает полезную нагрузку «CMD» произвольного размера (до размера буфера, считанного из сокета сразу) в буфер на стеке с фиксированным размером 32 байта. Целенаправленное использование этого переполнения требует знания PSK, поэтому для получения доступа более практично действовать обычным способом. С другой стороны, мусор, отправленный с командой CMD, может вызвать повреждение стека и сбой демона dvrHelper.Возможные последствия этого (потенциального) сбоя не изучались, потому что бэкдор macGuarder / dvrHelper выглядит строго превосходным и прямым подходом.

ОБНОВЛЕНИЕ (2020-02-05 02: 10 + 00: 00): Иштван Тот, автор предыдущих исследований по этому вопросу, представил свою собственную реализацию программы PoC: https://github.com/tothi/hs- dvr-telnet Данная реализация написана на чистом коде Python и реализует симметричный шифр более понятным образом. Также в нем описаны различия между вариантом шифра 3DES, используемым Xiongmai для аутентификации бэкдора, и оригинальным шифром 3DES.Эти различия могут быть выражены этим git-коммитом: https://github.com/tothi/pyDes/commit/7a26fe09dc5b57b175c6439fbbf496414598a7a2.

ОБНОВЛЕНИЕ (2020-02-05 17: 28 + 00: 00): Другие исследователи и пользователи Хабра отметили, что такая уязвимость ограничена устройствами на базе программного обеспечения Xiongmai (Hangzhou Xiongmai Technology Co, XMtech), включая продукты другие поставщики, которые поставляют продукты на основе такого программного обеспечения. На данный момент HiSilicon не может нести ответственность за бэкдор в двоичном файле dvrHelper / macGuarder.

ОБНОВЛЕНИЕ (2020-02-21 10: 30 + 00: 00): Xiaongmai признал уязвимость и выпустил рекомендации по безопасности: ссылка, архив 1, архив 2.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *