Rooting a Minix

Index

Introduction

This article is about rooting a Minix set top box (a Neo X5 mini in my case), although it may be applicable to similar hardware, either from Minix or simply running on a Rockchip RK3066.

These devices are problematic simply because the default android tools won't detect them. Most solutions I've come across are reduced to "install Moborobo" or "run this fine one-click solution", which is of little help when you're running on a different OS or when something fails.

So this little guide is a lot more barebones, I've collected what steps should be followed and what ADB commands must be run instead of providing a script. Although it is written for Linux systems, most steps and all ADB commands will be the same on other systems.

Some of these steps might be unnecessary, but they will do no harm.

Setting up the device

By default the Minix won't even be visible by a computer, but that's easy to enable.

Just go into Settings → USB → Connect to PC.

Note this option will be re-disabled on each reboot.

You should also enable USB debugging:

Settings → Developer options → USB debugging

Now, plugging the device to the computer will make it detectable but ADB won't recognise it just yet.

ADB access

This section is tailored to Linux. Source: [1]

Enable normal users to access the device

Check that the device is detected:

$ lsusb
[...]
Bus 003 Device 025: ID 2207:0006
[...]

Devices like 2207:xxxx with no description are the ones this guide is about.

Add an udev rule to allow normal users to access the device:
Create a file in /etc/udev/rules.d/ named <SOMETHING>.rules with the contents:

SUBSYSTEM=="usb", ATTR{idVendor}=="2207", MODE="0666", GROUP="plugdev"

And reload udev rules:

# udevadm trigger

Enable ADB to recognise the device

You'll need to add the vendor id to the list of known android devices.
Simply add a line containing 0x2207 to the file ~/.android/adb_usb.ini:

$ echo 0x2207 >> ~/.android/adb_usb.ini

And stop ADB:

$ adb kill-server

It should now be able to recognise the device:

$ adb devices
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
List of devices attached 
ABCDE12345      device

Rooting procedure

You'll need the following:
su and busybox binaries
SuperSu apk

You can download a handy archive containing them from this thread on xda (post #2, file X5 Mini v4.2.2 Root.rar).

You might try running the included BAT if you're on Windows or continue with this guide for the dissection of it. The BAT contains commands you can copy-paste directly in the command-line, what follows are equivalent commands.

Note that, at least on the Minix, you'll already have root shell access. What's lacking is allowing "scalation" of privileges outside the shell.

Stage 1

$ adb shell
android# mv /data/local/tmp /data/local/tmp.bak
android# ln -s /data /data/local/tmp
android# reboot

The device will reboot. You'll have to re-enable "Connect to PC" in settings.

Stage 2

$ adb shell
android# rm /data/local.prop
android# echo "ro.kernel.qemu=1" > /data/local.prop
android# reboot

The device will reboot. You'll have to re-enable "Connect to PC" in settings.

Stage 3

$ adb remount
$ adb push su /system/bin/su
$ adb push busybox /system/bin/busybox
$ adb push SuperSU.apk /system/app
$ adb shell
android# cd /system/bin
android# chown root.shell su
android# chmod 6755 su
android# chown root.shell busybox
android# chmod 0755 busybox
android# cd /system/app
android# chown root.root SuperSU.apk
android# chmod 0644 SuperSU.apk
android# cd /data
android# rm local.prop
android# rm tmp
android# mv tmp.bak tmp
android# reboot

The device will reboot and you should have root access.
Launch the SuperSU app to check. It will probably want to update the su binary, let it do so.

If SuperSU doesn't seem to find the su binary, check it's there and that it has the appropriate permissions:

$ adb shell
android# cd /system/bin
android# ls -l su
-rwxr-xr-x root     shell       91980 2012-06-27 21:50 su  # ← Incorrect permissions
android# chmod 6755 su
-rwsr-sr-x root     shell       91980 2012-06-27 21:50 su  # ← Correct permissions

And re-run SuperSU

Sources

  1. ADB shell with RK3066
  2. Minix Neo X5 Mini 4.2.2 root how to? – xda-developers

Copying EXIF metadata between files

This tip might be useful for those cases when an editor ignores a photo meta-information (which seems fairly common in phones).

$ exiftool -TagsFromFile source.jpg target.jpg

or

$ exiv2 ex -e e source.jpg  # Extraction. Also $ exiftool -exif -b source.jpg > source.exv
$ mv source.exv target.exv  # Names must match
$ exiv2 in -i e target.jpg  # Injection

Descarga de vídeos Flash, Parte 3: El formato F4F

Y continuando con la serie, tenemos un nuevo formato que, de nuevo, viene a complicarnos la vida, aunque como de costumbre hay formas de descargarlo: El (relativamente) nuevo formato de Adobe "HTTP Dynamic Streaming" (o F4F). A día de hoy este formato lo utiliza, por ejemplo, La Sexta en sus programas completos.

La mayor complicación de este formato es que los vídeos vienen en múltiples fragmentos pequeños, y unirlos tiene su truco. Por suerte un tal KSV ha preparado un script que permite automatizar el proceso de descarga y unión de fragmentos. El script está escrito en PHP por lo que debería funcionar en cualquier sistema operativo, una vez instalado el intérprete de PHP.

En el caso que he probado, la descarga no puede ser más fácil: hay que obtener la URL del "manifiesto" (un archivo que indica qué archivos hay que descargar) y ya está.
Una forma fácil de obtener esta URL (aunque un pelín complicada de explicar) es abrir Firefox, presionar CTRL+SHIFT+K para desplegar la consola y asegurarse que "Net" está marcado, cargar la pagina del vídeo y darle al "play". En la consola introducimos ".f4m" en el campo Filtro y deberíamos obtener la URL indicada, haciendo click en la URL se abrirá una ventana, donde la linea Request URL (o URL de la petición) es la que nos interesa.

Por ejemplo, si obtenemos:
Request URL: http://servicio.ejemplo.com/v/programa/hd/ABCDEF.mp4/manifest.f4m?c=ABCDEF, deberemos ejecutar el script con:

$ php AdobeHDS.php --manifest "http://servicio.ejemplo.com/v/programa/hd/ABCDEF.mp4/manifest.f4m?c=ABCDEF"

con lo cual se descargarán y unirán los fragmentos, creando un archivo con extensión .flv. Los fragmentos individuales no se borrarán automáticamente.
No lo he comprobado pero dependiendo del servidor es posible que tengas que pasar también el argumento --auth {VALOR}, donde {VALOR} se obtiene de forma parecida a como con el manifiesto pero filtrando con "Seg".

Se puede obtener el script AdobeHDS.php en https://raw.github.com/K-S-V/Scripts/master/AdobeHDS.php
 (y otros scripts del mismo autor en https://github.com/K-S-V/Scripts)


Fuente: http://stream-recorder.com/forum/adobe-hds-downloader-t12074.html

Descarga de vídeos Flash, Parte 2: rtmpsuck

Los métodos que comentaba en la primera parte no siempre funcionan, principalmente porque últimamente han proliferado las webs en que el archivo no se descarga por métodos tradicionales y por lo tanto no se encuentra donde siempre. Éstas webs usan el protocolo RTMP, diseñado precisamente para dificultar que nos guardemos el vídeo. Sin embargo no es imposible, sólo más complicado.
Webs como las de las televisiones a menudo usan RTMP. Este método lo he probado con La Sexta y funciona sin problema.

Usaremos rtmpsuck. El método explicado aquí es para Linux. rtmpsuck también funciona en Windows aunque el método es algo más complicado.

Este método consiste en hacer pasar todo el tráfico RTMP (el protocolo usado con esos vídeos Flash que en teoría no se pueden descargar) por el programa rtmpsuck, que actuará de proxy y guardará los vídeos al mismo tiempo que se reproducen.

Paso 1. Descarga rtmpdump. En muchas distribuciones ya está incluido así que primero prueba con el método estándar:

# apt-get install rtmpdump
o
# yum install rtmpdump

Si necesitases bajar el código fuente y compilar, usa
$ make SYS=posix
una vez descomprimido

Paso 2. Crea un nuevo usuario. Usaremos este usuario para interceptar el tráfico RTMP.

# adduser rtmpsucker
o gráficamente, en GNOME, Sistema > Administración > Usuarios y grupos

Paso 3. Re-asigna todo el tráfico RTMP a este usuario:

# iptables -t nat -A OUTPUT -p tcp --dport 1935 -m owner  ! --uid-owner rtmpsucker  -j REDIRECT

Paso 4. Usa rtmpsuck con el nuevo usuario

# su rtmpsucker
# /usr/sbin/rtmpsuck

Esto crea un proxy que interceptará el tráfico RTMP, te permitirá ver los vídeos con normalidad pero al mismo tiempo los guardará en el disco. Usa CTRL+C para cancelar rtmpsuck cuando ya no lo necesites.

Paso 5. Abre el vídeo normalmente con el navegador.

rtmpsuck lo guardará al mismo tiempo que lo reproduces.

El programa acelerará la descarga del vídeo, descargándolo más rápido que el navegador, aunque cuando lo he probado, si pausaba la reproducción en el navegador se paraba la descarga.

Según los casos puede ser que tengas que volver a lanzar rtmpsuck para diferentes vídeos. Si éste es el caso y antes del vídeo que te interesa te ponen publicidad, lo mejor es lanzarlo mientras se reproduce la publicidad, así no la capturará pero sí el vídeo.


Fuente: http://stream-recorder.com/forum/showthread.php?t=7070

Descarga de vídeos Flash, Parte 1

Para guardar un vídeo flash, de una de esas webs estilo Youtube que se han multiplicado como conejos, una forma muy fácil y que ha funcionado durante mucho tiempo es buscar el video entre los archivos temporales y/o la caché del navegador, dependiendo de la versión de Flash instalada.
Sin embargo en Linux, con las últimas versiones, el vídeo no se encuentra en ninguno de los dos sitios.

El truco: el archivo sí que se guarda en el directorio temporal, pero se borra una vez abierto. Es una de las características de Linux: un archivo abierto puede ser borrado "virtualmente", a todos los efectos parecerá que se ha borrado pero mientras siga abierto se podrá acceder a él normalmente; cuando se cierre, el archivo se borrará de verdad.

Es una forma de crear archivos temporales auto destructibles, que se borran una vez se cierra el programa que los está usando.
El plugin de Flash usa este método, lo cual hace parecer que el archivo de vídeo que se está reproduciendo no está disponible en el disco duro. Sin embargo no es así.

Linux proporciona un método para acceder a los archivos abiertos por un proceso, lo cual nos permite hacer una copia antes de cerrar el reproductor: el sistema de archivos /proc.
Dentro de /proc hay un directorio para cada proceso, y dentro de cada uno de ellos hay un directorio que contiene enlaces a todos los archivos abiertos por el proceso. Podemos usar esos enlaces para acceder a los archivos sin problema.

El proceso es simple, primero reproducimos el vídeo en navegador, es importante no cerrar la página del vídeo y en algunos casos interesa no acabar la reproducción. En la mayoría de reproductores Flash una barra de otro color nos indicará cuánto del vídeo se ha descargado, por lo tanto bastará con reproducir hasta que se llene la barra y luego pausar el vídeo. A continuación buscaremos el enlace en /proc:

Paso 1. Obtenemos el identificador de proceso. En la mayoría de navegadores deberemos buscar el proceso del navegador. Si usamos Google Chrome (o Chromium) deberemos buscar el proceso del plugin flash ya que son procesos separados:

$ pidof firefox-bin # Firefox
4725

En este caso el identificador es 4725

$ ps -ef | grep libflashplayer # Google Chrome
toni  18393 12796 0 17:55 pts/0 00:05:28 /opt/google/chrome/chrome --type=plugin --plugin-path=/usr/lib/flashplayer-square/libflashplayer_square.so --lang=ca --plugin-data-dir=/home/toni/.config/google-chrome/Default --channel=16248.0x6d16e00.377218180

En este caso el identificador es 18393

Paso 2. Accedemos a la lista de archivos abiertos por firefox. La lista será larga pero encontrar los vídeos Flash es fácil porque todos se llaman "FlashXXXXXXXX" donde las X son letras al azar
$ cd /proc/4725/fd
$ ls -l | grep Flash........
lrwx------ 1 toni toni 64 29 mar 17:48 77 -> /tmp/FlashXXUR50Bl (deleted)

Es decir, el archivo "77" (/proc/4725/fd/77) enlaza con un video borrado del disco. Ahora podemos copiar ese archivo. Copiar, ya que es un enlace blando no podemos ni moverlo ni enlazarlo. Por eso es importante haber dejado que se llene la barra (que se descargue por completo), ya que al copiarlo sólo copiaremos la parte descargada hasta ese momento.

$ cp 77 ~/video.flv

Si hemos dejado descargar el archivo por completo tendremos una copia del vídeo 🙂


En la segunda parte, descarga de vídeos sólo en streaming (protocolo rtmp).

Quick tip: Concatenating video files (with no quality loss)

Concatenation of video files can be done quickly from the command-line, video files must "match" (e.g. a movie formerly split into parts) i.e. they must use the same codec and parameters, this methods won't work as expected with random files.

  • AVI files: Use mencoder with multiple inputs
    $ mencoder -oac copy -ovc copy -o output.avi input1.avi input2.avi [...]
  • MPEG files: They can either be concatenated directly:
    $ cat input1.mpg input2.mpg > output.mpg
    Or the mencoder method, which I prefer, can be used (note the output format must now be set):
    $ mencoder -oac copy -ovc copy -of mpeg -o output.mpg input1.mpg input2.mpg [...]
  • Quirks and other formats:
    • The mencoder method won't work for multi-audio files
    • mencoder has worse support for other formats, they might require an intermediate transmuxing to avi.

I'll update this post if I find better ways or alternatives to do this.


References:

Native flash plugin in 64 bits, Debian package

Adobe has had an awful track record with their Flash plugin as far as 64bits support go, forcing us to use 32 bits plugins. But since some time ago they re-booted their efforts with the Flash Player "Square" project, gaining *native* 64bits support in Linux, Mac OS X and Windows, albeit in a parallel unofficial developer release.

For those of you using Debian, Ubuntu or derivatives on the amd64 platform, I'm sharing here my packaging script which will generate a DEB package that should install (and uninstall) cleanly. I won't be sharing binary packages since this is non-free stuff but it should be easy enough to create them following these instructions.

Instructions:

This should generate a package named "mozilla-flashplugin-square-nonfree_10.3.d162.p3-out.1_amd64.deb", which you can install with 'dpkg -i'.

The plugin should be loaded on the next start of Firefox/Iceweasel, Mozilla/IceApe, Google Chrome, etc.

Valor de retorno en el prompt

Este código sirve para indicar si el último comando ha tenido éxito o no, de manera que siempre esté visible en el propio prompt, es ideal para depurar código entre otras cosas.

Versión rápida (aunque no muy legible :P):
export PS1='$( [ "$?" -eq 0 ] && M=")" || M="("; echo -n :$M ) '$PS1

Incluyendo este fragmento en ~/.bashrc siempre estará activo:

# Indicacion de si el ultimo comando ha tenido exito
#    inspirada por http://mendel.livejournal.com/128965.html
#export PS1='`test "$?" -eq 0 && echo -n ":)" || echo -n ":(" ` '$PS1
# Version con funcion sacada de http://linuxgazette.net/122/lg_tips.html
#Alternativamente: "More-or-less undocumented Bash-ism - a C-style trinary operator":
#smiley () { echo -e ":\$(($??50:51))"; }
_smiley() {
   if [ $? -eq 0 ]; then echo ':)'
      else echo ':('
   fi
}
#...
export PS1='$(_smiley) '$PS1

Ejemplo:

:) toni@host:~$ false
:( toni@host:~$ true
:) toni@host:~$ 

Revisado y corregido por última vez el 2013-10-22

Instalación de la máquina virtual Java de Sun en Debian

La información de esta página no es necesaria en sistemas actuales, basta con instalar los paquetes sun-java-*.

Debian incluye varias máquinas virtuales Java que funcionan bastante bien pero puede interesar usar la de Sun, por ejemplo en estudios de informática en que se de por hecho que se va a usar esa máquina.
Éste es el método más elegante: de una forma simple crea un archivo deb instalable (y desinstable) como cualquier otro.
Además puede crear tanto archivos para la SDK como para el JRE.

El encargado de la magia es java-package, que desde hace algún tiempo forma parte de Debian Sid.

http://z42.de/debian/ aunque es más recomendable incluirlo como una fuente para apt e instalarlo con apt-get:

Para instalarlo:
# apt-get install java-package

Para crear el deb hay que bajar el binario adecuado de la web de Sun, y una vez descargado ejecutar, por ejemplo para J2SDK 1.4.2_05:

$ make-jpkg /ruta/j2sdk-1_4_2_07-linux-i586.bin

Finalmente tendremos el deb que podremos instalar normalmente, el archivo creado en el ejemplo se llamará sun-j2sdk1.4_1.4.2+07_i386.deb:
# dpkg -i sun-j2sdk1.4_1.4.2+07_i386.deb