Como executar um executável na inicialização e mantê-lo em execução? -- root-access campo com linux campo com scripts campo com services campo com init.d camp android Relacionado O problema

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


3
vote

problema

português

Eu tenho uma compilação executável a partir de um programa ndk-build . Eu quero executá-lo em um dispositivo Android enraizado. Quanto é a possibilidade de o Android matar meu executável?

Usando adb shell , sou capaz de executar meu executável usando os seguintes 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    

Meu requisito é executar este executável na inicialização do dispositivo.

Eu tentei seguir:

    .
  1. write ./executable em init.rc .
    • na reinicialização init.rc redefinir para o seu conteúdo original. Eu descobri que Magisk fez isso.
  2. write comandos em /system/etc/init/bootstat.rc
    • ./executable
    • service custom /system/executable
    • on boot ./system/dhandler/diag_revealer

Nenhuma das coisas acima está funcionando.

Inglês Original

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 respostas

6
 
vote
vote
Melhor resposta
 
.

Quanto é a possibilidade de o Android matar meu executável?

Processos nativos privilegiados geralmente não são mortos pelo Android, exceto se eles não podem lidar com um erro ocorrido dentro, como algum recurso do sistema não disponível ou permissão negado por causa do selimux etc. Para liberar a memória, o Android só mata processos No seu quadro, ou seja, em execução sob ABCDEFGHIJKLMNABCDEFGHIJKLMN0 . Para gerenciar recursos para processos nativos, o Android usa cgroups .

Os processos são mortos quando recebem sinais de kernel ou outros programas do UsEspace (por exemplo, com ABCDEFGHIJKLMNABCDEFGHIJKLMN2 Command) ( 1 , 2 ) . O kernel é o sistema operacional real, não visível para nós, mas lidar com tudo o que fazemos com o dispositivo. Um desenvolvedor pode programar seu código Como reagir a um sinal específico, se recebido, ou ignore completamente o ( 3 ) . Exceto sigkill . O que não pode ser tratado pelo programa, sem aviso do kernel, sem período de graça para sair com segurança, apenas sendo finalizado imediatamente. Mas o kernel não se importa com a sua presença, a menos que ele seja curto em recursos de hardware ou você começa mal comportando. É por isso que a programação é importante.

Programas podem enviar umas outros sinais (incluindo matar), que são encaminhados pelo kernel, regido pelo UID ( 4 ) . No entanto, ABCDEFGHGJKLMNABCDEFGHIJKLMN3 O primeiro processo no Usepace iniciado pelo kernel é o querido, o kernel nunca encaminha Perigosos sinais para abcdefghijklmn4 . E se isso acontecer por algum motivo, o kernel fica em pânico e reinicializa ( 5 ) .

resumindo as linhas acima, é possível evitar ser morto (AMAP) programaticamente ou usar alguns Truques de script / a> como @ alecxs mencionado. Mas se você quiser ter certeza de que seu processo deve reiniciar se for morto, definir um andróide init serviço.

.

Na reinicialização init.rc Redefinir para o seu conteúdo original. Eu descobri que a magisk fez isso.

Não, Magisk não fez isso. O Android's ABCDEFGHIJKLMNABCDEFGHIJKLMN7 é um sistema de arquivos temporário (não um persistente como no abcdefghijklmn4 ou /data ) que é apagado em cada reinicialização. Conteúdo do diretório raiz ( cgroups0 ) é extraído de outra partição chamada cgroups1 que contém cgroups2 e cgroups3 (embora as coisas mudaram com sistema como raiz ). Então você não pode alterar cgroups4 permanentemente a menos que você extrair, modificar, reembalar e reflash cgroups5 .

Mas para definir um novo serviço de inicialização, modificando cgroups6 não é necessário. Android Parses ABCDEFGHIJKLMNABCDefGHIJKLMN17 Arquivos de ABCDEFGHIJKLMNABCDEFGHIJKLMN18 Diretórios localizados em ABCDEFGHIJKLMNABCDEFGHIJKLMN19 e ABCDEFGHIJKLMNABCDEFGHIJKLMN20 ( 6 ) . Para que você possa criar seu próprio arquivo abcdefghgjklmnabcdefghijklmn21 .


Nota: Para obter privilégios de raiz reais e para lidar com o Selinux, todas as opções fornecidas abaixo dependem do Magisk. Veja Esta resposta para detalhes.

script init.d

Você pode usar o tradicional kill2 como recurso de MAGISK para iniciar um processo na inicialização. Criar script kill3 :

  kill4 / código>  

* kill5 é o shell pseudo-sinal .
* android's kill6 (de kill7 ) é buggy, melhor uso abcdefghijklmn28 applet.

Coloque o executável sob kill9 e defina permissões:

  init0   

Você também pode colocar script sob init1 mas isso é executado um pouco mais cedo. Certifique-se de que os caminhos do sistema de arquivos (e outros recursos necessários se houver) estiverem disponíveis nesse estágio.

Programa de Execução da Init

Outra maneira é executar diretamente o binário do init. Criar init2 arquivo:

  init3   

Definir permissões:

  init4   

e isso é tudo! Reiniciar o dispositivo para alterações para entrar em vigor.

No entanto, é uma execução única, não será reiniciada. Também há alguns recursos de script shell não disponíveis no ABCDEFGHIJKLMNABCDEFGHIJKLMN35 Arquivos. Por exemplo, você não pode redirecionar STDOUT / STERDR para um arquivo, isso deve ser tratado pelo próprio programa executável. Então podemos tentar fazer uso de ambos; Script de shell e init6 arquivo:

serviço init

Em vez de executar diretamente o binário de init7 arquivo, execute um script de shell. Criar script init8 :

  init9   

Criar init0 serviço:

  init1   

Configurar permissões sobre init2 , abcdefghijklmn43 e abcdefghijklmn44 como indicado acima e reiniciar.

outros parâmetros ( 7 ) Abcdefghijklmnabcdefghijklmn44 , init6 , abcdefghijklmn47 é necessário se você quiser executar o serviço como não privilegiado do utilizador. Privilégios de concessão é a abordagem recomendada da perspectiva da segurança. Veja Esta resposta Para mais detalhes sobre recursos e selinux.

init8 manterá em reiniciar o serviço a cada 5 segundos (por padrão) se for morto. Você pode parar o serviço com init9 . Substitua init0 com init1 para começar de novo.
Para ver o que acontece com o serviço: init2 .

relacionado :

  • Como executar um serviço de inicialização do Android com o Superuser Selinux contexto?
  • como executar um script no fundo da concha adb?

 

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?
 
 
 
 

Perguntas relacionadas

0  Não é possível estabelecer uma conexão confiável com o servidor Google Play?  ( Cant establish a reliable connection to the server google play ) 
ok então eu tenho samsung galaxy s3 eu enraizado há uma semana e funcionou impecável então, depois, depois, quando hoje abri o Google Play, ele diz que nenhum...

1  Instalador Xposed no HTC One M8  ( Xposed installer on htc one m8 ) 
Eu tenho raiz meu htc um m8 rodando android 4.4.3 (usando Este método ). O processo foi bom e eu não tinha soluços. Uma das principais razões que eu enraizei...

2  Preso na animação de inicialização  ( Stuck on boot animation ) 
Recentemente eu instalei o MIUI V5 Rom no meu smartphone. Quando reiniciei meu smartphone, ficou preso no logotipo da animação de inicialização do MI. Qua...

2  Substituído / System / Bin / Toolbox. Como eu reverter isso?  ( Replaced system bin toolbox how to i revert that ) 
Eu renomeei a caixa original / sistema / bin / toolbox "para" toolbox_alt ". Eu substituí o arquivo / sistema / bin / caixa de ferramentas por um arquivo que ...

1  Como usar o Glase em um dispositivo Android enraizado?  ( How to use glase on a rooted android device ) 
Como posso usar o aplicativo de pagamento de toque e pagar glaso (anteriormente seqr ) em um dispositivo que foi enraizado usando o MAGISK? ...

0  Ligar ao carregar, mas somente quando o nível da bateria é maior que 20%  ( Power on when charging but only when battery level is greater than 20 ) 
Eu tentei recentemente para encaixar um tablet no meu carro e me deparei com um problema com acordar o dispositivo sem usar o botão liga / desliga. Minha so...

0  Build.prop modifica ok. Mas não atualizações no sistema (por exemplo, sobre tablet em configurações)  ( Build prop modifies okay but not updates in system e g about tablet in settin ) 
Eu estou executando Android-X86 4.4 na caixa virtual. Tudo funciona bem. Mas quando estou modificando o Build.Prop (com ES File Explorer ou Editor BuildProp) ...

0  Como habilitar Não perturbe para 1 SIM apenas em um telefone Dual SIM?  ( How to enable do not disturb for 1 sim only in a dual sim phone ) 
Eu tenho um oneplus enraizado 2 executando Lineageos 14 mais recente. Como posso habilitar o recurso Não perturbe para apenas meu cartão SIM pessoal, sem ta...

1  Como fazer uma recuperação persistir através de instalações da ROM?  ( How to make a recovery persist through rom installations ) 
. É muito comum que a recuperação seja instalada como parte do Instalação rom, mas é possível impedir a recuperação de sendo alterado durante esse processo? ...

0  Como posso contar um Samsung Galaxy CH @ T B5330?  ( How can i root a samsung galaxy cht b5330 ) 
Eu não consegui não encontrar nenhum trabalho (mas um não funciona e um com base na versão muito antiga do Android) Root Package (nem um ROM personalizado com...

0  Auto desligar o interruptor para o telefone Android de acordo com o status da bateria  ( Auto turn off switch for android phone according to battery status ) 
Procurando por qualquer interruptor com conectividade Bluetooth com o celular e desligar a energia para o carregador móvel de acordo com o status de barfagem ...

1  ROOT - Como remover um dos Superuser App?  ( Root how to remove one of the superuser app ) 
Eu enraizei meu telefone por mês e baixei o aplicativo superusuário ontem. No entanto, quando uso o aplicativo SuperSu, ele não está em execução e disse que...

0  Posso copiar uma imagem de partição, modificar e restaurá-lo de volta ao telefone Android?  ( Can i copy a partition image modify and then restore it back to android phone ) 
Eu já comecei a obter minhas mãos sujas em Android Rom. Eu tenho um dispositivo Android enraizado sem recuperação específica do TWRP. Eu tenho uma pergunta qu...

0  Como verificar se alguém fez uma recuperação de dados no meu celular?  ( How to check if somebody had done a data recovery on my phone ) 
Então eu recentemente empresto meu telefone para o meu pai. Ele quebrou sua exibição e levou-o a um centro de serviços para reparos, todos não conhecidos para...

9  O acesso ao logcat precisa de root?  ( Does access to logcat need root ) 
meu dispositivo já está enraizado, é por isso que estou perguntando. Você precisa de root para monitorar o fluxo do logcat no telefone? Se eu correr o comand...




© 2021 pergunte.org All Rights Reserved. Casa de perguntas e respostas todos os direitos reservados


Licensed under cc by-sa 3.0 with attribution required.