¿Cómo ejecutar un ejecutable en el arranque y mantenerlo funcionando? -- root-access campo con linux campo con scripts campo con services campo con init.d camp android Relacionados El problema

How to run an executable on boot and keep it running?


3
vote

problema

Español

Tengo una construcción ejecutable de un programa ndk-build . Quiero ejecutarlo en un dispositivo Android enraizado. ¿Cuánto cuesta la posibilidad de que Android matará a mi ejecutable?

usando adb shell , soy capaz de ejecutar mi ejecutable usando los siguientes comandos:

  adb push executable /sdcard adb shell device:/ $ su device:/ # cd /system device:/system # mount -o rw,remount /system device:/system # mv /sdcard/executable . device:/system # ./executable   

Mi requisito es ejecutar este ejecutable en el inicio del dispositivo.

He intentado seguir:

  1. escribe ./executable en init.rc .
    • En Reiniciar ABCDEFGHIJKLMNABCDEFGHIJKLMN5 Restablecer a sus contenidos originales. Me di cuenta de que Magisk hizo esto.
  2. escribe comandos en /system/etc/init/bootstat.rc
    • ./executable
    • service custom /system/executable
    • on boot ABCDEFGHIJKLMNABCDEFGHIJKLMN9

Ninguna de las cosas anteriores está funcionando.

Original en ingles

I have an executable build from a ndk-build program. I want to run it on a rooted Android device. How much is the possibility that Android will kill my executable?

Using adb shell, I am able to execute my executable using following commands:

adb push executable /sdcard adb shell device:/ $ su device:/ # cd /system device:/system # mount -o rw,remount /system device:/system # mv /sdcard/executable . device:/system # ./executable 

My requirement is to run this executable on device boot.

I have tried following:

  1. Write ./executable in init.rc.
    • On reboot init.rc reset to its original contents. I figured out that Magisk done this.
  2. Write commands in /system/etc/init/bootstat.rc
    • ./executable
    • service custom /system/executable
    • on boot ./system/dhandler/diag_revealer

None of the above thing is working.

              
 
 

Lista de respuestas

6
 
vote
vote
La mejor respuesta
 

¿Cuánto cuesta la posibilidad de que Android matará a mi ejecutable?

Los procesos nativos privilegiados generalmente no son asesinados por Android, excepto si no pueden manejar un error en el interior, como algún recurso del sistema, no disponible o permiso denegado debido a SELinux, etc. para liberar la memoria, Android solo mata procesos dentro de su marco, es decir, ejecutándose bajo zygote . Para administrar los recursos para procesos nativos, Android usa cgroups .

Los procesos se matan cuando reciben señales del kernel u otros programas de espacio de usuario (por ejemplo, con kill ^ {© código> ( 1 , 2 ) . El kernel es el sistema operativo real, no visible para nosotros, sino que manejamos todo lo que hacemos con el dispositivo. Un desarrollador puede programar su código cómo reaccionar a una señal específica si se recibe, o ignóralo por completo (> 3 ) . Excepto sigkill . Lo que no puede ser manejado por el programa, no se advierte del núcleo, sin un período de gracia para salir de forma segura, simplemente terminada de inmediato. Pero el kernel no le importará su presencia a menos que él se sienta corto en recursos de hardware o comience a estar mal. Es por eso que la programación es importante.

Los programas pueden enviarnos mutuamente (incluyendo KILL), que se reenvían por el kernel, gobernado por UID ( 4 ) . Sin embargo, ABCDEFGHIJKLMNABCDEFGHIJKLMN3 El primer proceso en el espacio de usuario iniciado por el kernel es el querido, el kernel nunca reenvía peligrosos señales a init . Y si esto sucede por alguna razón, el kernel se pone pánico y se reinicia ( 5 ) .

Resumiendo las líneas anteriores, es posible evitar ser asesinado (AMAP) programáticamente o usando algunos Trucos de scripts < / a> como @ alecxs ha mencionado. Pero si desea asegurarse de que su proceso se reinicie si se mata, defina un servicio de Android <> ABCDEFGHIJKLMNABCDEFGHIJKLMN5 .

En Reiniciar ABCDEFGHIJKLMNABCDEFGHIJKLMN6 Restablecer a sus contenidos originales. Me di cuenta de que Magisk hizo esto.

No, Magisk no hizo esto. El ABCDEFGHIJKLMNABCDEFGHIJKLMN7 es un sistema de archivos temporal (no es una persistente como en /system o abcdefhijklmnabcdefghijklmn9 ) que se borra en cada reinicio. Contenido del directorio raíz ( cgroups0 ) se extraen de otra partición llamada cgroups1 que contiene cgroups2 y abcdefhijklmnabcdefghijklmn13 (aunque las cosas Han cambiado con sistema-as-root ). Por lo que no puede cambiar cgroups4 permanentemente a menos que extraiga, modifique, vuelva a máquina y reflejar cgroups5 .

Pero para definir un nuevo servicio init, modificar cgroups6 no es necesario. Android analiza todo cgroups7 Archivos de cgroups8 Directorios ubicados en cgroups9 y abcdefhijklmnabcdefhijklmn20 ( 6 ) . Para que pueda crear su propio archivo kill1 .


Nota: Para obtener privilegios de raíces reales y tratar con SELINUX, todas las opciones que se indican a continuación dependen de MAGISH. Consulte esta respuesta para más detalles.

init.d script

Puede usar la característica tradicional kill2 , como de Magisk para iniciar un proceso en el arranque. Crear script kill3 :

  kill4 / Código> 

* kill5 es Shell's pseudo-señal .
* El ABCDEFGHIJKLMNABCDEFGHIJKLMN26 (de kill7 ) es buggy, mejor uso kill8 applet.

Coloque el ejecutable en ABCDEFGHIJKLMNABCDEFGHIJKLMN29 y configure permisos:

  init0  

También puede colocar la secuencia de comandos en init1 , pero eso se ejecuta un poco antes. Asegúrese de que las rutas de sistema de archivos (y otros recursos requeridos si corresponde) están disponibles en esa etapa.

Ejecutar programa de init

Otra forma es ejecutar directamente el binario de Init. Crear init2 Archivo:

  init3  

Permisos establecidos:

  init4  

¡Y eso es todo! Reinicie el dispositivo para que los cambios surtan efecto.

Sin embargo, es una ejecución de una sola vez, no se reiniciará. También hay algunas características de scripting de shell que no están disponibles en init5 Archivos. Por ejemplo, no puede redirigir stdout / stderr a un archivo, esto debe ser manejado por el programa ejecutable. Para que podamos tratar de hacer uso de ambos; script shell y init6 Archivo:

Servicio de Init

En lugar de ejecutar directamente binario de init7 Archivo, ejecute un script Shell. Crear script init8 :

  ABCDEFGHIJKLMNABCDEFGHIJKLMN39   

Crear init0 Service:

  init1  

Configurar permisos en init2 , init3 y abcdefhijklmnabcdefghijklmn44 tal como se indica anteriormente y reiniciando.

Otros parámetros ( 7 ) como init5 , abcdefhijklmnabcdefghijklmn46 , abcdefghijklmninit7 Si desea ejecutar el servicio como no privilegiado usuario. Concesión Los privilegios menos requeridos es el enfoque recomendado por la perspectiva de seguridad. Consulte esta respuesta Para obtener más detalles sobre capacidades y selinux.

ABCDEFGHIJKLMNABCDEFGHIJKLMN48 se mantendrá en el servicio de reinicio cada 5 segundos (por defecto) si se mata. Puede detener el servicio con init9 . Reemplace init0 con init1 para comenzar de nuevo.
Para ver qué pasa con el servicio: ABCDEFGHIJKLMNABCDEFGHIJKLMN52 .

relacionado :

  • ¿Cómo ejecutar un servicio de inicio de Android con SuperUSER SELINUX CONTEXTO?
  • ¿Cómo ejecutar un script en el fondo de ADB Shell?

 

How much is the possibility that Android will kill my executable?

Privileged native processes usually don't get killed by Android except if they can't handle an error occurred inside, such as some system resource not available or permission denied because of SELinux etc. To free up memory, Android only kills processes within its framework i.e. running under zygote. To manage resources for native processes, Android uses cgroups.

Processes are killed when they receive SIGNALS from kernel or other userspace programs (e.g. with kill command) (1, 2). Kernel is the actual operating system, not visible to us but handling everything we do with device. A developer can program his code how to react to a specific signal if received, or completely ignore it (3). Except SIGKILL. Which can't be handled by program, no warning from kernel, no grace period to exit safely, just being terminated immediately. But kernel won't mind your presence unless he gets short on hardware resources or you start misbehaving. That's why programming is important.

Programs can send each other signals (including KILL), which are forwarded by kernel, governed by UID (4). However, init the very first process in userspace started by kernel is the dear one, kernel never forwards dangerous signals to init. And if this happens for some reason, kernel gets panic and reboots (5).

Summarizing above lines, it is possible to avoid being killed (AMAP) programmatically or using some scripting tricks as @alecxs has mentioned. But if you want to make sure that your process should restart if gets killed, define an Android init service.

On reboot init.rc reset to its original contents. I figured out that Magisk done this.

No, Magisk didn't do this. Android's rootfs is a temporary filesystem (not a persistent one like on /system or /data) that gets cleared on every reboot. Contents of root directory (/) are extracted from another partition named boot which contains kernel and ramdisk (though things have changed with system-as-root). So you can't change init.rc permanently unless you extract, modify, repack and reflash boot.img.

But to define a new init service, modifying init.rc isn't necessary. Android parses all .rc files from /etc/init directories located under /system and /vendor (6). So you can create your own .rc file.


NOTE: In order to get real root privileges and to deal with SELinux, all of the options given below depend on Magisk. See this answer for details.

INIT.D SCRIPT

You can use traditional init.d-like feature of Magisk to start a process on boot. Create script /data/adb/service.d/custom.sh:

#!/system/bin/sh  # write log file if executable throws something at stdout/sterr exec >>/data/media/0/executable.log 2>&1  # run script in background to avoid blocking boot chain [ -n "$BG" ] || { BG=Y "$0" & exit; }  # try to ignore signals as much as possible for i in $(seq 64); do trap '' "$i"; done  # execute script whenever exits e.g. when executable gets killed trap "sleep 5; exec $0" EXIT  # avoid multiple instances e.g. if script killed but executable is running pkill -9 -x /system/bin/executable  # execute the binary, should run in foreground, otherwise get in loop echo "$(date): Starting program..." /system/bin/executable  # program is killed, won't reach here if script is killed echo "$(date): Re-executing script..." 

* EXIT is shell's pseudo-signal.
* Android's /system/bin/pkill (from toybox) is buggy, better use busybox applet.

Place the executable under /system/bin and set permissions:

~# chown 0.0 /system/bin/executable /data/adb/service.d/custom.sh ~# chmod 0755 /system/bin/executable /data/adb/service.d/custom.sh 

You can also place script under /data/adb/post-fs-data.d/ but that's executed a bit earlier. Be sure that filesystem paths (and other required resources if any) are available at that stage.

EXECUTE PROGRAM FROM INIT

Another way is to directly execute the binary from init. Create custom.rc file:

#/etc/init/custom.rc  # execute the binary when boot is completed on property:sys.boot_completed=1     exec_background u:r:magisk:s0 -- /system/bin/executable 

Set permissions:

~# chown 0.0 /etc/init/custom.rc ~# chmod 0644 /etc/init/custom.rc ~# chcon u:object_r:system_file:s0 /etc/init/custom.rc 

And that's all! Restart device for changes to take effect.

However it's a one time execution, won't be restarted. Also there are some shell scripting features not available in .rc files. For instance you can't redirect stdout/stderr to a file, this has to be handled by executable program itself. So we can try to make use of both; shell script and .rc file:

INIT SERVICE

Instead of directly executing binary from .rc file, execute a shell script. Create script /system/bin/custom.sh:

#!/system/bin/sh  # write log file if executable throws something at stdout/sterr exec >>/data/media/0/executable.log 2>&1  # execute the binary, should run in foreground, otherwise get in loop echo "$(date): Starting program..." exec /system/bin/executable 

Create init service:

#/etc/init/custom.rc  # define service, use executable here if script not needed service custom /system/bin/custom.sh      # don't start unless explicitly asked to     disabled      # only execute once, don't restart if exited     # don't add if you want to restart service when killed     #oneshot      # run with unrestricted SELinux context to avoid avc denials     # it's required if SELinux is enforcing and service needs access     # to some system resources not allowed by default sepolicy     seclabel u:r:magisk:s0  # start the service when boot is completed on property:sys.boot_completed=1     start custom 

Set permissions on executable, custom.sh and custom.rc as stated above and restart.

Other parameters (7) such as user, group, capabilities are required if you want to run the service as non-privileged user. Granting least required privileges is the recommended approach from security's perspective. See this answer for more details on capabilities and SELinux.

init will keep on restarting service every 5 seconds (by-default) if it gets killed. You can stop the service with setprop ctl.stop custom. Replace stop with start to start again.
To see what happens with service: dmesg | grep init: | tail.

RELATED:

  • How to run an Android init service with superuser SELinux context?
  • How to run a script in background from adb shell?
 
 
 
 

Relacionados problema

0  Reasignar Botón BIXBY en S10 rooted  ( Reassign bixby button on rooted s10 ) 
Nunca uso BIXBY en mi Galaxy S10E rooted, así que me gustaría reutilizar el botón BIXBY, por ejemplo, como obturador de la cámara o para abrir una aplicación ...

1  Esta aplicación promete ejecutar "fstrim" sin root, pero no estoy seguro de si funciona  ( This app promises to run fstrim without root but i am not sure if it works ) 
No estoy seguro de si esta aplicación trabajos. ¿Puede alguien por favor ayudarme? Mi teléfono es nuevo y en su período de garantía, así que no puedo alojar...

1  Pregunta de limpieza de TWRP  ( Twrp wipe question ) 
Quiero rootear el borde SG S7. No he instalado TWRP. Una vez que instale TWRP, todo lo que quiero es que la raíz no sea personalizada ROMS o lo que sea. Mi pr...

0  ¿Es posible acceder a los datos de cromo sin root?  ( Is it possible to access chrome data without root ) 
Tengo un OnePlus 5T. Versión de Android 9. Versión Oxygeno 9.0.5. ¿Es posible acceder a la carpeta ABCDEFGHIJKLMNABCDEFGHIJKLMN0 sin privilegios de root? ...

0  No rootea el dispositivo Huawei, Android 4.4.4, bloqueado. La depuración USB que no está habilitada es Huawei. H60 -l01 segundo es CHM-U01  ( Not rooted huawei device android 4 4 4 locked out usb debugging not enabled o ) 
gracias por su tiempo. Tengo un teléfono Huawei, que no está enraizado y la depuración USB no está habilitada. Además, estoy bloqueado. Por favor, sugerir cua...

-1  ¿Es posible hacer múltiples comandos ADB un comando de una sola línea? (CASO CAMBIO BOOTANIMATION.ZIP)  ( Is it possible to make multiple adb commands a one liner command case change b ) 
¿Es posible hacer los siguientes comandos un comando de una sola línea? para cambiar bootanimation.zip rápidamente y ganar algo C:UsersUserDesktop>adb push...

1  Teléfono URROOTING  ( Unrooting phone ) 
Compré un nuevo teléfono de alguien el otro día y me gustaría usarlo. El único problema es cuando lo estaba pasando, noté que, en algún momento, enraizaban su...

1  ¿Por qué eliminar los archivos del sistema en una Android enraizada dice que "el dispositivo o el recurso está ocupado"?  ( Why deleting system files on a rooted android says device or resource is busy ) 
Tengo FX Explorer, estaba tratando de eliminar algunas cosas en /system/app (las cosas son solo carpetas vacías), pero sigue diciendo The operation isn't p...

0  Deshabilitar las teclas recientes y recientes mientras que los juegos  ( Disable back and recent keys while gaming ) 
El título habla de sí mismo, sigo presionándolos por error y pierdo el progreso de mis juegos, ¿hay algo como Samsung Game launcher para deshabilitar esas lla...

0  Android Nethunter no puede encontrar varios archivos  ( Android nethunter cant find several files ) 
Estoy tratando de hacer que Kalinethunter trabaje en mi OnePlus5. Aunque estoy enfrentando un problema, y ​​realmente no sé qué decirlo. Hay varios errores ...

1  ¿Cómo apagar cuando se elimina el cargador?  ( How to power off when charger is removed ) 
Dispositivo: LG G4 Versión de Android: 6.0 Estado: enraizado ¿Qué puedo hacer para apagar el dispositivo (con un retraso de 20 segundos) cuando quito el c...

1  Copia de seguridad de Whatsapp de Nandroid  ( Backup whatsapp from nandroid ) 
Hola, chicos: referando a esto: restaurar whatsapp Obtenga el mismo problema. Acabo de restablecer todo mi teléfono después de un ladrillo OTA. Hice u...

0  ¿Puede una aplicación maliciosa ejecutarse en un contenedor root the android?  ( Can a malicious application running in a container root the android ) 
¿Puede un malware raíz de Android cuando se ejecuta en un contenedor, como cuando se ejecuta a través de un espacio virtualxpuesto o paralelo, o cuando una pe...

-1  Iam usando el emulador de Android, pero no puedo acceder a la raíz, su no está funcionando para la raíz en la concha de ADB  ( Iam using android emulator but i cant access root su is not working for root i ) 
En esta imagen, he dado la captura de pantalla de mi símbolo del sistema, cualquier persona que sepa esto, explique cómo la raíz de acceso en el emulador d...

0  No puedo integrar actualizaciones al sistema  ( I cant integrate updates to system ) 
Estoy usando Xiaomi Redmi 5 Plus. Desbloqueó el cargador de arranque e instaló la recuperación de TWRP. Luego instaló Magisk como agente de raíces. Todo parec...

0  Extracción de teclas TOTP de Xfinity Autenticator  ( Totp key extraction from xfinity authenticator ) 
He estado intentando (y fallar) encontrar dónde la aplicación Xfinity Authenticator almacena el secreto de TOTP. Nada en ningún archivo en Shared_Prefs parece...

2  ¿Cómo cargar el módulo de kernel con raíz de Magisk pero sin kernel personalizado?  ( How to load kernel module with magisk root but without custom kernel ) 
Estoy teniendo un tiempo realmente difícil de encontrar algo sobre esto en Google, que no es de 2011. Tengo un Samsung Galaxy S10 +. Lo he arraigado con Magis...

0  ¿Mi Galaxy S6 tiene un cargador de arranque desbloqueado?  ( Does my galaxy s6 have an unlocked bootloader ) 
Quiero instalar la REM REMIX REMIX REMIX EN MI SM-G920I (versión australiana). Antes de empezar a hacer algo, debo asegurarme de que el cargador de arranque e...

1  Error de LINK2SD PKG  ( Link2sd pkg error ) 
Tengo problema con la aplicación LINK2SD. Cuando estoy tratando de mover cualquier aplicación a la tarjeta SD después de que aparezca el error. ¿Alguna idea d...

1  ¿Cómo ejecutar un servicio de inicio de Android con el contexto SELINUX SUPERUSER?  ( How to run an android init service with superuser selinux context ) 
Quiero ejecutar un servicio de Android init . Tengo un dispositivo que tiene cáscara arraigada (comprada de la fabricación como arraigada). Este dispositivo ...

Relacionados problema

0  Reasignar Botón BIXBY en S10 rooted 
1  Esta aplicación promete ejecutar "fstrim" sin root, pero no estoy seguro de si funciona 
1  Pregunta de limpieza de TWRP 
0  ¿Es posible acceder a los datos de cromo sin root? 
0  No rootea el dispositivo Huawei, Android 4.4.4, bloqueado. La depuración USB que no está habilitada es Huawei. H60 -l01 segundo es CHM-U01 
-1  ¿Es posible hacer múltiples comandos ADB un comando de una sola línea? (CASO CAMBIO BOOTANIMATION.ZIP) 
1  Teléfono URROOTING 
1  ¿Por qué eliminar los archivos del sistema en una Android enraizada dice que "el dispositivo o el recurso está ocupado"? 
0  Deshabilitar las teclas recientes y recientes mientras que los juegos 
0  Android Nethunter no puede encontrar varios archivos 
1  ¿Cómo apagar cuando se elimina el cargador? 
1  Copia de seguridad de Whatsapp de Nandroid 
0  ¿Puede una aplicación maliciosa ejecutarse en un contenedor root the android? 
-1  Iam usando el emulador de Android, pero no puedo acceder a la raíz, su no está funcionando para la raíz en la concha de ADB 
0  No puedo integrar actualizaciones al sistema 
0  Extracción de teclas TOTP de Xfinity Autenticator 
2  ¿Cómo cargar el módulo de kernel con raíz de Magisk pero sin kernel personalizado? 
0  ¿Mi Galaxy S6 tiene un cargador de arranque desbloqueado? 
1  Error de LINK2SD PKG 
1  ¿Cómo ejecutar un servicio de inicio de Android con el contexto SELINUX SUPERUSER? 



© 2021 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos


Licensed under cc by-sa 3.0 with attribution required.