Meefik's Blog

Freedom and Open Source

Piggy .js & .sh

В один из вечеров решил отдохнуть и сделал анимированную версию поросенка для терминала Linux, а затем и на JavaScript. Сам поросенок является логотипом сетевой системы обнаружения и предотвращения вторжений с открытым исходным кодом Snort.

piggy

Код запуска в shell и веб-версия: http://meefik.ru/piggy

Установка и настройка RDP-сервера

Linux Deploy в качестве графической подсистемы по умолчанию использует VNC, как наиболее нативный сбособ организации удаленного доступа к рабочему столу GNU/Linux системы. Однако можно настроить удаленный доступ и по протоколу RDP, используемый в операционных системах MS Windows. В примере используется дистрибутив Ubuntu 12.04 (Precise Pangolin), однако с небольшими изменениями это будет работать и в других дистрибутивах. В данном случае RDP будет работать поверх VNC-сервера, поэтому требуется чтобы он был установлен. В Linux Deploy VNC-сервер устанавливается по умолчанию.

Инструкция

  • Запустить предварительно установленную GNU/Linux систему кнопкой СТАРТ из главного окна приложения.

  • Подключиться к системе по SSH, VNC (IP-адрес для подключения указан в верхней строке главного окна приложения) или через Android-терминал (сценарий linuxdeploy shell).

  • Открыть командную строку (терминал) системы и переключиться в режим суперпользователя:
    sudo -s
    
  • Установить пакет xrdp:
    apt-get install xrdp
    
  • Разрешить пользователю xrdp работать с сетью:
    usermod -aG aid_inet xrdp
    
  • Для автоматического запуска и остановки RDP-сервера через интерфейс Linux Deploy необходимо в параметрах разрешить сценарии пользователя (Параметры -> Сценарии пользователя) и в список сценариев добавить путь /etc/init.d/xrdp (Параметры -> Список сценариев).

  • Перезапустить GNU/Linux систему кнопками СТОП/СТАРТ из главного окна приложения.

  • Подключиться через RDP-клиент: module - sesman-Xvnc, username - android, password - changeme.

Управление Linux Deploy из командной строки

Помимо графического интерфейса Linux Deploy позволяет управлять экземпляром GNU/Linux системы из командной строки через эмулятор терминала Android. Для данных целей служит специальный сценарий linuxdeploy, который может запускаться из командной строки Android и принимает следующие параметры:

  • prepare - подготовить контейнер, создать образ и файловую систему;
  • mount - смонтировать контейнер;
  • umount - размонтировать контейнер;
  • install - запустить установку новой системы;
  • configure - запустить переконфигурацию контейнера;
  • start - запустить контейнер;
  • stop - остановить контейнер;
  • shell - выполнить chroot в контейнер;
  • status - информация о системе.

По умолчанию сценарий linuxdeploy находится в каталоге ENV_DIR/bin/linuxdeploy, где ENV_DIR - каталог рабочего окружения (по умолчанию /data/data/ru.meefik.linuxdeploy/linux), однако доступ к нему можно сделать более удобным (без указания полного пути к сценарию), если поместить символьную ссылку на этот сценарий в /system/bin. Для этого в настройках Linux Deploy есть опция Настройки -> Создать симлинк, после изменения параметра необходимо выполнить обновление окружения (Настройки -> Обновить окружение).

Все параметры, установленные через графический интерфейс Linux Deploy, хранятся в файле ENV_DIR/etc/deploy.conf. Их можно менять путем редактирования этого файла, однако следует учесть, что любые изменения параметров через графический интерфейс приведут к перезаписи файла и потере внесенных изменений. Переключение профилей также приводит к перезаписи конфигурационного файла. Однако оригинальный конфигурационный файл можно скопировать, например, на карту памяти, отредактировать его и указать этот файл в качестве параметра “-c FILE”.

Команда linuxdeploy shell, наверное, наиболее полезна и нужна для доступа к командной строке установленного дистрибутива прямо из терминала Android. Эта команда также имеет необязательный параметр, принимающий команду, которую необходимо выполнить после перехода в chroot, по умолчанию запускается командный интерпретатор bash.

Примеры использования:

linuxdeploy shell date
linuxdeploy shell "uname -a"
linuxdeploy shell /bin/bash

Сборка ядра Linux и модулей для Android

Дистрибутивы, запускаемые через Linux Deploy, работают с ядром Android (модифицированное ядро Linux), а потому изменить конфигурацию ядра или подключить новые модули можно только путем пересборки этого ядра, либо сборки модулей под данную версию ядра.

Инструкция

  • Скачать и подготовить Android NDK:
    wget http://dl.google.com/android/ndk/android-ndk-r9d-linux-x86.tar.bz2
    tar -jxf android-ndk-r9d-linux-x86.tar.bz2
    export ARCH=arm
    export CROSS_COMPILE=$(pwd)/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/arm-linux-androideabi-
    
  • Скачать и подготовить Android SDK, понадобятся утилиты adb и fastboot:
    wget http://dl.google.com/android/android-sdk_r13-linux_x86.tgz
    tar -zxf android-sdk_r13-linux_x86.tgz
    android-sdk-linux_x86/tools/android update sdk -u -t platform-tool
    export PATH=$PATH:$(pwd)/android-sdk-linux_x86/platform-tools
    
  • Получить исходники ядра данного устройства (в нашем случае это tinykernel-flo для Nexus 7 (2013), либо скачать аналогичную версию с kernel.org):
    git clone -b tiny-jb-mr2 https://github.com/meefik/tinykernel-flo
    cd tinykernel-flo
    
  • Получить файл конфигурации ядра с устройства (ядро должно быть собрано с поддержкой данной возможности):
    adb shell cat /proc/config.gz | gzip -d > .config
    

    либо из boot.img (как извлечь boot описано ниже):

    scripts/extract-ikconfig boot.img > .config
    
  • Если получить файл конфигурации ядра не получилось, то можно воспользоваться предварительной конфигурацией из поставки ядра (список конфигураций arch/arm/configs):
    make flo_defconfig
    
  • Узнать точную версию ядра устройства:
    adb shell cat /proc/version
    

    Рузультат команды:

    Linux version 3.4.0-g03485a6 (android-build@vpbs1.mtv.corp.google.com) (gcc version 4.7 (GCC) )
     #1 SMP PREEMPT Tue Mar 18 15:02:27 PDT 2014
    

    В данном случае полной версией ядра будет строка “3.4.0-g03485a6”.

  • Установить локальную версию ядра (то что отображается после основной версии 3.4.0):
    echo "-g03485a6" > .scmversion
    
  • Изменить конфигурацию ядра в файле .config или командой:
    make menuconfig
    

    В нашем случае в файл .config изменены следующие строки (включена поддержка модулей и включен модуль binfmt_misc):

    CONFIG_MODULES=y
    CONFIG_BINFMT_MISC=m
    
  • Запустить сборку ядра:
    make
    

    либо только модулей:

    make modules
    
  • Скачать утилиты для работы с загрузочным образом (boot.img):
    git clone https://github.com/meefik/binary-tools-android.git
    cd binary-tools-android
    
  • Получить загрузочный образ с устройства (ядро хранится на специальном boot разделе):
    adb shell su -с 'dd if=/dev/block/platform/msm_sdcc.1/by-name/boot' > boot.img
    

    Путь может отличаться на других устройствах, определить его можно командой:

    adb shell su -c 'ls /dev/block/platform/*/by-name/boot'
    
  • Получить информацию об образе:
    ./boot_info boot.img 
    

    Результат выглядит так:

    Page size: 2048 (0x00000800)
    Kernel size: 6722240 (0x006692c0)
    Ramdisk size: 492556 (0x0007840c)
    Second size: 0 (0x00000000)
    Board name: 
    Command line: 'console=ttyHSL0,115200,n8 androidboot.hardware=flo user_debug=31 msm_rtb.filter=0x3F ehci-hcd.park=3'
    Base address: 2149580800 (0x80200000)
    
  • Извлечь kernel и ramdisk из boot.img, заменить ядро и запаковать обратно:
    ./unmkbootimg boot.img
    ./mkbootimg --kernel ../tinykernel-flo/arch/arm/boot/zImage \
      --ramdisk initramfs.cpio.gz \
      --base 0x80200000 \
      --cmdline 'console=ttyHSL0,115200,n8 androidboot.hardware=flo user_debug=31 msm_rtb.filter=0x3F ehci-hcd.park=3' \
      -o new_boot.img
    
  • Прошить устройство новым ядром:
    adb reboot bootloader
    fastboot flash boot new_boot.img
    
  • Загрузить модуль на устройстве:
    adb push ../tinykernel-flo/fs/binfmt_misc.ko /storage/sdcard0/binfmt_misc.ko
    adb shell
    su
    mount -o rw,remount /system
    mkdir /system/lib/modules
    cp /storage/sdcard0/binfmt_misc.ko /system/lib/modules/binfmt_misc.ko
    chmod 644 /system/lib/modules/binfmt_misc.ko
    insmod /system/lib/modules/binfmt_misc.ko
    exit
    exit
    
  • Следует учесть, что vermagic модуля должен полностью соответствовать версии ядра (с точностью до символа), иначе загрузить новый модуль не удастся. Необходимо узнать vermagic модуля и сравнить его с уже присутствующими на устройстве модулями:
    modinfo binfmt_misc.ko
    

    Результат выглядит примерно так:

    filename:       /path/to/kernel/fs/binfmt_misc.ko
    license:        GPL
    depends:        
    intree:         Y
    vermagic:       3.4.0-g03485a6 SMP preempt ARMv7 
    

Запуск любого GNU/Linux дистрибутива из образа

Linux Deploy предназначен для автоматической установки через Интернет последних версий наиболее популярных Linux-дистрибутивов и последующего запуска Linux-приложений этих дистрибутивов под Android. Однако он также поддерживает запуск дистрибутив из уже готовых образов. Подготовленные образы дистрибутивов можно скачать с сайта проекта Linux-on-Android.

Инструкция

  • Скачать образ нужного дистрибутива (выбрать zip-архив с образом), распаковать и скопировать его на карту памяти.

  • В приложении Linux Deploy создать новый профиль и в параметрах указать (обязательно):
    Дистрибутив - должен соответствовать образу;
    Версия дистрибутива - должна соответствовать образу;
    Архитектура - должна соответствовать образу;
    Тип установки - Файл;
    Путь установки - путь к файлу *.img (например, /storage/sdcard0/debian.img).
    Остальные параметры настраиваются по желанию.

  • Выполнить переконфигурацию (Параметры -> Переконфигурировать).

  • Запустить GNU/Linux систему кнопкой СТАРТ из главного окна приложения.

  • Подключиться по SSH или VNC, пароль - changeme.

Запуск дистрибутива Kali Linux из образа

Дистрибутив Kali Linux основан на Debian и позиционируется как дистрибутив для тестирования информационной безопасности. Установка этого дистрибутива в Linux Deploy полностью поддерживается в автоматическом режиме с установкой из официального репозитория (см. инструкцию по установке GNU/Linux и инструкцию на сайте www.kali.org), однако в некоторых случаях может понадобиться установка из уже готового образа без доступа в Интернет.

linuxdeploy

Инструкция

  • Скачать архив ARM образа (например, для Raspberry Pi) и распаковать.

  • Извлечь из полного образа образ второго раздела (выполнять из-под Linux):
    kpartx -v -a kali-1.0.9-rpi.img
    dd if=/dev/mapper/loop0p2 of=/tmp/kali.img bs=1M
    

    Для образа Raspberry Pi это второй раздел, для образов других устройств нормер раздела может отличаться. Посмотреть таблицу разделов в образе можно командой:

    fdisk -l kali-1.0.9-rpi.img
    
  • Скопировать файл kali.img на карту памяти устройства. Если образ занимает более 4095 МБ, то карта памяти должна быть отформатирована в файловой системе exFAT, NTFS или другой, которая поддерживается на устройстве и может хранить файлы размером более 4 ГБ.

  • В приложении Linux Deploy создать новый профиль и в параметрах указать: Дистрибутив - Kali Linux; Версия дистрибутива - kali; Тип установки - Файл; Путь установки - путь к файлу kali-linux.img (например, /storage/sdcard1/kali.img); Окружение рабочего стола - Xfce.

  • Выполнить переконфигурацию (Параметры -> Переконфигурировать).

  • Запустить GNU/Linux систему кнопкой СТАРТ из главного окна приложения.

  • Подключиться по SSH или VNC, пароль - changeme.

Обзор графических подсистем Linux Deploy

Linux Deploy поддерживает несколько графических подсистем, вариантов вывода графики, которые можно использовать в зависимости от поставленной задачи.

VNC используется по умолчанию и представляет собой программный сервер, который запускается параллельно с работой Android и создает виртуальный рабочий стол, к которому можно подключиться через специальное приложение — VNC-клиент. По VNC можно подключиться как локально, прямо с устройства, так и удаленно, например, с компьютера или другого устройства. Единственным условием является то, чтобы устройства были в одной подсети, например, подключены к одному роутеру. VNC имеет два основных параметра: адрес сервера и номер дисплея. Адрес сервера — это IP или имя хоста, где запущен VNC-сервер. Номер дисплея — это номер виртуального рабочего стола с которым мы хотим работать и на котором запускается окружение рабочего стола. Номер дисплея находится в диапазоне от 0 до 99 и соответствует номеру порта VNC-сервера от 5900 до 5999 соответственно, именно этот порт будет открыт на сервере для ожидания подключения клиента. VNC прост в настройке, есть множество приложений-клиентов, кроссплатформенный, но не лишен своих недостатков. К таким недостаткам можно отнести относительно невысокую отзывчивости графики, отсутствие поддержки аппаратного ускорения, отсутствие мультитача, дополнительная нагрузка на систему и некоторые другие.

Для использования VNC в Linux Deploy достаточно зайти в параметры текущего профиля и выбрать VNC в качестве графической подсистемы (Параметры -> Графическая подсистема -> VNC). А затем, при необходимости, можно изменить настройки VNC-сервера в меню Параметры -> Параметры GUI. После этого, при запуске GNU/Linux, окружение рабочего стола будет запускаться внутри виртуального X-сервера, доступ к которому будет открыт для VNC-клиента. Для подключения к серверу в VNC-клиенте достаточно указать IP-адрес данного устройства (IP-адрес отображается в верхней строке приложения Linux Deploy) и номер дисплея, к которому следует подключиться.

Другой графической подсистемой, позволяющей запускать GNU/Linux параллельно с Android, является режим X Server (X Window System). Включается режим также в параметрах графической подсистемы (Параметры -> Графическая подсистема -> X Server). Данный режим позволяет запускать графическое окружение рабочего стола на стороннем X-сервере. Здесь сервер отвечает за прорисовку графики и отображение ее на видеоадаптере, а клиент — за выполнение приложений и передачу графики на сервер. Так, в данном случае, клиентом является GNU/Linux система и запускаемые в ней приложения, а сервером — другое приложение в Android (например, XServer XSDL), либо вообще на другом компьютере (например, Xorg, Xnest, Xephyr, Xming). X-сервер позволяет в некоторой степени решить вопрос производительности и существенно повысить отзывчивость графических интерфейсов, при этом не лишает возможности использовать необходимые функции Android-устройства в случае локального запуска сервера.

Для вывода графики на внешний X-сервер в параметрах Linux Deploy следует указать адрес сервера (IP или имя хоста) и дисплей сервера. Затем запустить X-сервер, а после запустить GNU/Linux через Linux Deploy. После этого на указанном X-сервера должно запуститься окружение рабочего стола. По такой схеме работают тонкие клиенты, только в данном случае роль тонкого клиента выполняет компьютер (или само устройство), а роль сервера — телефон/планшет.

И, наконец, следует упомянуть еще один режим графической подсистемы — фреймбуфер. В этом режиме при выводе графики GNU/Linux приложениями нет посредников, все работает как в полноценных десктопных дистрибутивах. Входящий в комплект дистрибутива X-сервер (Xorg) настраивается таким образом, что вывод графики осуществляется через специальный драйвер — fbdev. Отдельно настраивается адрес видеоустройства (например, /dev/graphics/fb0) и устройств ввода (например, /dev/input/event2 для тачскрина) для работы напрямую с железом. Данный режим дает указание X-серверу перенаправлять изображение напрямую на видеоустройство, а также использовать прямой доступ к устройствам ввода. В этом случае появляется выигрыш в производительности за счет прямого доступа к аппаратным ресурсам устройства. Однако тут есть обратная сторона. К сожалению, графическая подсистема Android и GNU/Linux не могут работать одновременно. Чтобы иметь возможность запустить графические приложения GNU/Linux в этом режиме, Linux Deploy приостанавливает работу Android на время, пока выполняются Linux-приложения. После завершения графического сеанса работа Android корректно возобновляется без необходимости перезагружать устройство (впрочем, есть и другие варианты, как с полной остановкой Android, так и вообще без остановки). Другим ограничением использования данного режима является проблема совместимости Xorg с аппаратными ресурсами устройства в некоторых случаях.

Для перевода Linux Deploy в режим фреймбуфера нужно выбрать соответствующую графическую подсистему (Параметры -> Графическая подсистема -> Framebuffer). Если в списке компонентов не выбран X-сервер, то это следует сделать (Параметры -> Выбрать компоненты) и выполнить переконфигурацию (Параметры -> Переконфигурировать) для установки необходимых пакетов. В параметрах графической подсистемы (Параметры -> Параметры GUI) следует указать видеоустройство и устройство ввода конкретного девайса. Также может потребоваться заморозить Android UI для корректной работы данного режима. Параметры Xorg сервера можно настроить более тонко в файле /etc/X11/xorg.conf внутри окружения установленного дистрибутива.

Снимок файловой системы и поиск изменений

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

Формат запуска утилиты такой:

java -jar jcut.jar <directory> [snapshot.gz]

Пример использования (жесткий диск SATA 7.2k):

$ java -jar jcut.jar /path/to/dir
add	/dir1	0
del	/dir2	0
del	/dir2/file1	1433802787000
mod	/file1	1433802751000
Time: 3742 ms
Processed: 209846 items
Snapshot: 1384480 bytes

Скорость обработки линейно возрастает с увеличением числа файлов в директории.

Поворот экрана в режиме кадрового буфера

Ниже приводится решение для правильного поворота экрана в режиме фрейм-буфера. Т.е. чтобы была повернута картинка на 90 градусов (ландшафтная ориентация) и драйвер сенсорного экрана обрабатывал это поворот корректно. Решение опробовано на Samsung Galaxy S2 (i9100), тачскрин MXT224 (узнать модель тачскрина можно командой: cat /sys/devices/virtual/sec/sec_touchscreen/tsp_touchtype), Ubuntu 13.04 Raring Ringtail и Debian 7.0/wheezy.

Что работает:

  • позиционирование курсора к месту нажатия;
  • обработка удерживания (эмуляция удерживания левой кнопки мыши);
  • обработка двойного нажатия одним пальцем (эмуляция левой кнопки мыши);
  • обработка нажатия двумя пальцами (эмуляция правой кнопки мыши);
  • поворот координат сенсорного экрана.

Для этого нужно выполнить следующие шаги:

  • Установить дистрибутив через Linux Deploy (Debian или Ubuntu) и подключиться к консоли под пользователем root (например, по SSH).

  • Доставить необходимые пакеты:
    apt-get install build-essential wget unzip xorg-dev libmtdev-dev
    
  • Загрузить исходный код модифицированного драйвера mtev для Xorg:
    wget https://github.com/meefik/xorg-input-mtev/archive/master.zip --no-check-certificate
    unzip master.zip
    
  • Запустить сборку драйвера:
    cd ./xorg-input-mtev-master/
    make
    
  • Скопировать драйвер в каталог модулей Xorg:
    cp obj/mtev.so /usr/lib/xorg/modules/input/mtev_drv.so
    
  • Отредактировать файл /etc/X11/xorg.conf:
      Section "ServerLayout"
          Identifier "Layout0"
          Screen "Screen0"
          InputDevice "touchscreen" "CorePointer"
      EndSection
    
      Section "InputDevice"
          Identifier "touchscreen"
          Option "Device" "/dev/input/event2" #linuxdeploy
          Driver "mtev"
          Option "Rotation" "1"
      EndSection
    
      Section "Device"
          Identifier "Card0"
          Driver "fbdev"
          Option "fbdev" "/dev/graphics/fb0" #linuxdeploy
          Option "Rotate" "CW"
      EndSection
    
      Section "Screen"
          Identifier "Screen0"
          Device "Card0"
          DefaultDepth 24
          SubSection "Display"
              Depth 24
          EndSubSection
      EndSection
    
  • Запустить GNU/Linux через Linux Deploy в режиме фрейм-буфера (Параметры -> Графическая подсистема -> Framebuffer). Для набора текста можно использовать виртуальную клавиатуру florence.

Веб-терминал для Android

wShell - эмулятор терминала с веб-интерфейсом для Android. Основан на Shell In A Box. Приложение позволяет подключиться к консоли Android-устройства прямо из веб-браузера, если компьютер и устройства находятся в одной локальной сети.

wshell

Приложение распространяется под лицензией GPL версии 3 или более поздней.

Исходный код: https://github.com/meefik/wshell
Установить из Google play: https://play.google.com/store/apps/details?id=ru.meefik.wshell