Como Executar Módulos Xposed Sem Acesso Root Usando NPatch
Quando você precisa fuçar em um aplicativo Android de outra pessoa, contornar SSL pinning ou ativar a depuração oculta, o instinto usual é recorrer ao Magisk ou KernelSU. Mas fazer root em um celular de uso diário só para uma utilidade é inconveniente. Clientes bancários começam a reclamar, o Play Integrity quebra, e em dispositivos corporativos o root é simplesmente proibido por políticas de segurança.
Por muito tempo, esse problema foi resolvido pelo projeto LSPatch. Ele pegava um APK pronto, embedava um runtime LSPosed e os hooks necessários dentro dele, após o qual o aplicativo rodaria com módulos Xposed sem privilégios de sistema. Quando o LSPatch original parou de ser mantido ativamente, um fork chamado NPatch (Neo LSPatch) entrou em ação para preencher essa lacuna.
O que essa ferramenta faz
O projeto pega um arquivo APK comum e o reempacota. Dentro do arquivo, ele injeta os arquivos DEX do loader e as bibliotecas nativas (.so) responsáveis por interceptar as chamadas do ART (Android Runtime). Quando o aplicativo modificado é iniciado, essa camada embedada é carregada primeiro. Ela inicializa o ambiente de execução da API Xposed diretamente dentro do processo isolado do aplicativo.
Para o restante do sistema, você está simplesmente executando um programa de usuário comum. Ele não requer direitos de superusuário, não modifica a partição do sistema /system, e não tenta substituir zygote. Todas as modificações e hooks ficam restritos dentro do sandbox desse pacote específico.
Versões a partir do Android 9 até as versões atuais do Android compatíveis com a base de código JingMatrix/LSPosed são suportadas.
Como funciona o processo de patching
Nos bastidores, o NPatch se baseia no trabalho de vários projetos de código aberto:
- LSPosed gerencia as chamadas da API Xposed e a interceptação de métodos em runtime no ART.
- Xpatch forneceu o conceito central de injeção de código em um APK sem intervenção do sistema.
- Apkzlib é usado para descompactar, modificar o arquivo zip e reempacotar rapidamente sem descompilação completa para smali.
Diferentemente da abordagem clássica com apktool + jarsigner, onde descompilar projetos grandes e ofuscados frequentemente resulta em erros, essa abordagem é mais rápida e confiável. Os recursos e o manifesto são ajustados diretamente, após o que o loader é injetado.
Opções de uso
Você pode trabalhar com a ferramenta de duas formas: no computador via terminal ou diretamente no celular.
Opção 1. Console via jar
Se você está automatizando a montagem de builds de teste em CI ou analisando software em uma estação de trabalho, é mais conveniente pegar o arquivo jar pronto dos releases:
# Базовый синтаксис запуска утилиты
java -jar npatch.jar [аргументы]
O utilitário recebe o APK fonte e os módulos a serem embedados como entrada. A saída é um pacote modificado pronto que só precisa ser assinado com uma chave de teste e instalado via adb install.
Opção 2. Gerenciador no dispositivo
Para tarefas do dia a dia, é mais simples baixar manager.apk dos releases no GitHub.
- Instale o gerenciador no seu dispositivo Android.
- Selecione um aplicativo instalado ou um arquivo APK local.
- Especifique os módulos Xposed que devem carregar na inicialização.
- O gerenciador constrói um novo pacote de instalação e sugere remover o original antes de instalar a modificação.
Como a assinatura do aplicativo muda inevitavelmente durante o reempacotamento, você não poderá atualizar o programa original sobre ele. Você precisará removê-lo, perdendo dados locais se não estiverem sincronizados.
Casos de uso práticos
Uso regularmente esses patchers em engenharia reversa e testes de clientes móveis.
- Contornar SSL Pinning para interceptação de tráfego. Empacotar o tráfego no Burp Suite ou mitmproxy é muito mais simples quando você pode embedar um módulo como TrustMeAlready ou JustTrustMe diretamente no APK. Não precisa fazer push de certificados no armazenamento do sistema via Magisk.
- Instrumentação e coleta de logs. Se você precisa ver quais argumentos estão sendo passados para métodos privados em um SDK de terceiros, você escreve um pequeno hook Xposed, injeta no build e loga a call stack no logcat.
- Testar módulos em dispositivos limpos. Desenvolvedores de módulos acham útil verificar como seu código se comporta isoladamente sem o LSPosed do sistema.
Pontos de atenção e limitações
A abordagem rootless tem limites naturais que você deve conhecer antecipadamente:
- Módulos de sistema não funcionam. Se um hook é projetado para mudar o comportamento do
SystemUI, shades de notificação ou serviços Android, o NPatch é impotente aqui. Ele vive estritamente dentro do processo do usuário. - Alguns aplicativos com anti-cheat rigoroso ou proteção avançada (verificações de integridade de assinatura, detecção de arquivos .so estranhos) detectarão a adulteração e sairão na inicialização.
- A documentação no repositório ainda é esparsa. A maioria dos detalhes são discutidos no chat do Telegram do projeto, e builds recentes frequentemente precisam ser puxados diretamente dos artefatos do GitHub Actions.
Vale a pena tentar
Se você precisa periodicamente mexer nos bastidores de um aplicativo Android de terceiros ou testar rapidamente uma hipótese sem refazer o flash do dispositivo, adicione npatch.jar à sua caixa de ferramentas. O projeto mantém a base de código do LSPatch atualizada e lida com o reempacotamento de aplicativos para versões mais recentes do Android sem problemas.
Projetos relacionados