Este projeto consiste em uma aplicação C# desenvolvida para ser executada no sistema de multimídia do veículo Haval H6. O sistema nativo do carro expõe uma porta Telnet com acesso root, e esta aplicação é projetada para ser iniciada através dessa conexão.
Ao ser executado com privilégios de root, o programa consegue:
- Acessar e extrair dados do sistema do veículo que são restritos e só podem ser lidos pelo superusuário.
- Iniciar um servidor Frida, que permite a injeção de scripts (JavaScript) em aplicações nativas da multimídia.
O objetivo principal é monitorar dados do veículo e modificar ou adicionar funcionalidades às aplicações existentes no sistema de infoentretenimento.
- Acesso: O acesso inicial é feito via Telnet, conectando-se ao IP da multimídia na porta correspondente.
- Execução: O binário compilado deste projeto é transferido para o sistema de arquivos do carro e executado via linha de comando no shell do Telnet.
- Operação: Uma vez em execução, a aplicação opera em background, expondo APIs e monitorando o sistema. O servidor Frida fica ativo, aguardando conexões de um cliente (ex: um PC na mesma rede) para injetar os scripts desejados.
O projeto é composto pelas seguintes classes principais:
Program.cs: Ponto de entrada da aplicação. Responsável por inicializar e orquestrar os outros componentes.CarMonitor.cs: Monitora propriedades e dados específicos do carro, como velocidade, status das portas, etc.FridaApiServer.cs: Implementa o servidor que permite a comunicação com o Frida para injeção de scripts.FridaInjector.cs: Contém a lógica para realizar a injeção dos scripts nos processos alvo.LogApiServer.cs: Expõe uma API para centralizar e gerenciar logs gerados pela aplicação e pelos scripts injetados.PropertyMonitor.cs: Uma classe genérica para monitorar mudanças em propriedades do sistema Android.IpTablesUtils.cs: Utilitário para gerenciar regras deiptables, possivelmente para redirecionamento de portas ou controle de rede.TermuxCommandRunner.cs: Módulo para executar comandos no shell do sistema, aproveitando o ambienteroot.
Para compilar o projeto para a arquitetura correta da multimídia (um sistema Linux ARM64 com Bionic), utilize o seguinte comando. A compilação AOT (Ahead-Of-Time) é usada para gerar um binário nativo e otimizado.
dotnet publish -r linux-bionic-arm64 -p:DisableUnsupportedError=true -p:PublishAotUsingRuntimePack=truePara preparar o ambiente na multimídia do carro, siga os passos abaixo:
- Instale o F-Droid: Baixe e instale o F-Droid na multimídia para ter acesso a aplicativos de código aberto.
- Instale o Termux: Pelo F-Droid, instale o Termux, um emulador de terminal para Android.
- Instale o Frida no Termux: Abra o Termux e execute o seguinte comando para instalar o
frida-clie suas dependências:wget https://maglit.me/frida-python -O frida-python.sh && bash frida-python.sh - Instale o Termux:Boot: Pelo F-Droid, instale o Termux:Boot. Este aplicativo permite que scripts sejam executados automaticamente na inicialização do sistema.
- Configure o Script de Inicialização: Adicione o arquivo
start.sh(localizado na pastafilesdeste projeto) ao diretório de scripts do Termux:Boot (~/.termux/boot/). - Instale o Frida Server: É crucial que a versão do
frida-servercorresponda exatamente à versão dofrida-cliinstalada no passo 3. Verifique a versão do cliente com o comandofrida --versionno Termux. - Após baixar a versão correta do
frida-serverpara a arquiteturaarm64, renomeie o arquivo parafrida-servere coloque-o no seguinte diretório no sistema de arquivos da multimídia:/data/local/tmp/frida-server
Certifique-se de que o arquivo tenha permissões de execução (chmod +x /data/local/tmp/frida-server).
O serviço principal escuta na porta 9999 e expõe três áreas principais:
/propriedades– interface web para visualizar valores do veículo e salvar preferências./frida– gerenciamento de injeção de scripts Frida./logs– visualização de logs em tempo real.
CarMonitor lê o logcat em busca de alterações de propriedades e as distribui via Server‑Sent Events (/propriedades/events).
Também é possível:
- Forçar a leitura de um conjunto de propriedades com
/propriedades/status. - Atualizar manualmente um valor usando
/propriedades/update?property=...&value=.... - Definir o modo de salvamento com
/propriedades/save_property_setting.
FridaApiServer permite listar aplicativos e injetar scripts. Os pontos mais importantes são:
/frida/– lista os pacotes instalados./frida/inject– recebe um JSON comappId,script,mode(waitouspawn) epersistpara registrar o script./frida/persistent– lista injeções persistentes configuradas./frida/remove?appId=...– remove a injeção persistente do pacote indicado.
Por meio do LogApiServer é possível acompanhar mensagens em tempo real em /logs. Os níveis de log podem ser enviados através dos caminhos /logs/debug, /logs/info, /logs/warning e /logs/error.
FridaInjector salva e restaura configurações específicas de usuário, além de responder a comandos recebidos dos scripts injetados.
As configurações são armazenadas em /sdcard/havalApi/settings.json e manipuladas pelo SettingsManager.
Na pasta files/frida-scripts estão incluídos exemplos de scripts. O nome do arquivo corresponde ao pacote que deve ser configurado no campo appId ao fazer a injeção via API. Para instalar um script, envie seu conteúdo para /frida/inject conforme exemplo abaixo:
curl -X POST http://<ip>:9999/frida/inject \
-H "Content-Type: application/json" \
-d '{"appId":"com.beantechs.personalization","script":"<conteudo>","mode":"wait","persist":true}'Scripts disponíveis:
- com.beantechs.account.js – evita que a janela de privacidade seja exibida se todas as permissões já estiverem aceitas.
- com.beantechs.accountservice.js – corrige a expiração do token e expõe o usuário atual para o monitoramento.
- com.beantechs.personalization.js – registra BroadcastReceivers para comandos de leitura e escrita de propriedades do veículo.
- com.ts.car.power.controller.core.js – remove sobreposições indesejadas da interface.
- mediacenter.js – altera o retorno de
getCPListda multimídia para uma lista personalizada. - waze.js – registra a chamada do método interno
n1do Waze.