miércoles, 7 de noviembre de 2012

Compilando un pequeno programa en [C] para Android (rooteado)

Se alguén trastea cun android rooteado un rato acabará atopándose cun programa do SDK  `adb`, que entre outras moitas cousas permite levantar unha shell no celular, se resulta que se engade un `bash` á mistura resulta que temos un mini computador totalmente capaz nas mans e non necesariamente atado ás limitacións de Java e a interface puramente táctil do resto de android... e que se fai cos computadore? prográmaselles!

Nota: partiremos de que o SDK de android está instalado, só hai que descargar-lo arquivo comprimido, descomprimilo e se tal (por comodidade) engadi-los directorios tools e platform-tools ó PATH.

Para compilar usaremo-lo NDK de android, só hai que descargalo e descomprimirlo (como referencia para a configuración, aquí fíxeno en `~/android-ndk/`), a partires de aquí pódese  usar o compilador a pelo a base de comandos... pero sería un pouco pesado, así que imos alixeralo, o primeiro é preparar unhas cantas variables de entorno (sería recomendable engadílas ó .bashrc ou a algún arqivo que esté a man):
export AND_NDK=$HOME/android-ndk # Indica onde está o NDK, de primeiras só habería que adaptar este
export AND_PLATFORM=$AND_NDK/platforms/android-9/arch-arm # Plataforma para a que se compilarará (neste caso android 2.3)
export AND_LIB=$AND_PLATFORM/usr/lib # Aquí está a libc
export AND_PREBUILT=$AND_NDK/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86 # O de linux-x86 cambiaría segundo o sistema anfitrión
export PATH=$AND_PREBUILT/bin:$PATH # E por último poñer os binarios no PATH
Supoñamos que temos un programa en C, `hackliza.c`:
#include 

int main(int argc, char **argv){
    int i;
    for (i = 0; i < 10;i++){
        puts("Hackliza!");
    }
    return 0;
}
Se queremos compilalo nun arqivo `hackliza` faríamos:
arm-linux-androideabi-gcc  -I$AND_PLATFORM/usr/include -L$AND_LIB -Wl,-rpath-link=$AND_LIB -nostdlib -lc $AND_LIB/crtbegin_static.o $AND_LIB/crtend_so.o hackliza.c -o hackliza
Bufff, pero iso non é precisamente algo que sexa cómodo de teclear de cada vez, así que estaría ben definir un alias:
alias andgcc='arm-linux-androideabi-gcc  -I$AND_PLATFORM/usr/include -L$AND_LIB -Wl,-rpath-link=$AND_LIB -nostdlib -lc $AND_LIB/crtbegin_static.o $AND_LIB/crtend_so.o'
Agora sí podemos compilalo como root manda:
andgcc hackliza.c -o hackliza
E listo, xa está compilado, agora ímos executalo.

Para "instalalo" habería que mandalo ó teléfono:
adb push hackliza /sdcard/
Despois montar-la partición de /system/ como de escritura (dende o `adb shell`):
## Vemos cal é o dispositivo que contén a /system/
$ df -h|grep system
Filesystem                Size      Used Available Use% Mounted on
/dev/block/stl6         209.1M    161.2M     48.0M  77% /system
## Neste caso /dev/bloc/stl6, remontámolo con outros parámetros
$ mount -o rw,remount /dev/block/stl6 /system

E xa podemos pasar o programa ó PATH:
cp hackliza /system/xbin/

E, claro está, executalo, sexa polo `adb` ou no propio celular :



Ahí o está, C puro en Android!

ps: casi me esquezo, para volver a deixar /system/ como de só lectura usariase este comando (cambiando /dev/block/stl6 polo que corresponda)
mount -o ro,remount /dev/block/stl6 /system

No hay comentarios:

Publicar un comentario