Segurança em eletrônica automotiva - hello world on dashboard controller

Depois de experimentar o ônibus CAN no carro, havia um desejo selvagem de se aprofundar um pouco mais no santo dos santos. Acho que todo mundo conhece um termo como “chip tuning”; em russo, esse é um firmware simples para as unidades de controle (motor, caixa de câmbio etc.). O fabricante do equipamento estabelece inicialmente a funcionalidade em seus dispositivos para atualizar ou alterar o software do microcontrolador, mas seu mecanismo não é divulgado a ninguém por razões óbvias e, para complicar esse processo, o próprio programa, com o qual trabalha com memória não volátil, não é armazenado no firmware, mas carregado no firmware controlador somente no momento do serviço. Este artigo é sobre como fazer o microcontrolador do painel executar o código de outra pessoa enquanto tem acesso ao conector de diagnóstico automático.

Em geral, o mecanismo de carregamento de dados na ECU (unidade de controle eletrônico) é descrito no protocolo de diagnóstico UDS , a saber, as funções:

34 - Solicitar download
36 - Transferir dados

Mas em termos de implementação do UDS, as montadoras não são delicadas para fazer alterações / adições ao protocolo, criando um complemento proprietário. No meu caso, o processo de atualização é mais ou menos assim:

  1. Fazendo login em uma sessão de diagnóstico estendida
  2. Reinicialização no carregador de inicialização
  3. Obtendo acesso de segurança para permitir uma operação de carregamento de dados
  4. Transferência do endereço na memória onde o registro e o volume de dados serão mantidos
  5. Carregamento de dados
  6. Fazendo o que foi carregado
  7. Em seguida, é programar a EEPROM com o programa que você baixou anteriormente.

Os pontos 1-3 não foram difíceis, mas o que fazer a seguir? Onde obter o endereço e a quantidade máxima de dados? Como após a inicialização para fazer o que foi baixado? Na verdade, por uma questão de isso, um artigo está sendo escrito.

Uma combinação de dispositivos foi escolhida como objeto de teste, porque, em primeiro lugar, tenho mais um em caso de apocalipse e, em segundo lugar, seu controlador pode ser lido com um simples adaptador USB-RS232. Depois de estudar o interior, temos o controlador Fujitsu MB91F223. Este é um micron de 32 bits com um núcleo FR60Lite, 512 KB de memória e 16 KB de RAM. Folha de dados, RM, manual do Assembler, um programador para ele é facilmente pesquisado na Internet, não vou parar por aqui. Aqui ele é bonito:



Plano de ação:

  1. Localizar manipuladores de solicitação de diagnóstico
  2. Encontre endereços na memória onde você pode escrever algo
  3. Encontre uma maneira de executar o código gravado

Para executar a etapa 1, você precisa estudar o manipulador de interrupções do barramento CAN e entender onde os dados são armazenados para processamento adicional. Muitos controladores possuem a chamada tabela de vetor de interrupção, que contém os endereços das funções responsáveis ​​por processá-los. Na família Fujitsu FR, esta tabela está em seu setor e o ponteiro para ela é armazenado no registro TBR (registro base da tabela). Uma simples pesquisa de texto na IDA fornece um resultado positivo e o endereço da tabela de interrupção conosco.



De acordo com o manual, o endereço de interrupção CAN está localizado no deslocamento 0x370 desde o início do TBR. Lá está ele.



Ele, mas já em pleno crescimento, também é um manipulador de mensagens usando o protocolo ISO-TP

O manipulador ISO-TP não está completo, mas onde os quadros de tipos diferentes divergem


No banco de dados do software de diagnóstico do revendedor, eu tinha os identificadores SID e LID (31E1) do protocolo UDS que iniciaram o procedimento de execução do código, isso simplificou a tarefa e me permitiu agir do fim ao começo. No manipulador de função 31E1, foi encontrado um fragmento onde o endereço pertencente à área de RAM é carregado e, em seguida, é feita uma chamada para esse endereço. Não é isso que estamos procurando?



A busca pelo uso da constante 0x3F100 nos leva a outro local do firmware, ao manipulador de funções UDS 34 - Solicitar download! É exatamente isso que você precisa, o endereço para gravar dados e a quantidade máxima (0x700 bytes) na RAM.



Agora, após enviar um comando para solicitar permissão para fazer o download dos dados 34 03F100 00 00010C (o endereço mostrado em itálico é indicado em negrito), o painel responde com uma boa resposta 740401. Em seguida, os dados do usuário são carregados usando a função Transfer data e um comando é emitido cumprir. Nós descobrimos o carregamento e a execução, mas agora você precisa encontrar o que fazer o download. Eu não encontrei o ambiente de desenvolvimento de código aberto para este microcontrolador, mas depois de um mês houve uma batida no suporte técnico de ciprestes (sim, não o fujitsu, eles os absorveram, em geral, não sei) eles deram um link para um IDE chamado Shaggy Softune Workbench 97 anos com os quais o compilador veio sob o kernel FR.

É assim que parece, não um par de vscode.

Na captura de tela, um fragmento do programa para LEDs intermitentes (não dê um chute no estilo de escrever no assembler, esta é minha primeira experiência).



O mesmo código, mas já em si

void delay(int loops) { while(--loops) { #pragma asm NOP NOP #pragma endasm __asm(" nop"); } } #define DDR2 (*((char*)0x402)) #define PDR2 (*((char*)0x2)) #define WPR (*((char*)0x485)) #define LVRC (*((char*)0x57D)) void wdt_reset(void) { WPR = 0xA5; WPR = 0x5A; LVRC = 0x10; } void main(void) { int current_pin = 2; DDR2 |= 0x7E; while(1) { wdt_reset(); PDR2 |= current_pin; delay(0x7FFF); PDR2 &= ~current_pin; delay(0x7FFF); current_pin <<= 1; if(current_pin >= 0x80) { current_pin = 2; } } } 

Bem, o resultado em si


Com outros nós, tudo parece praticamente o mesmo, com exceção da arquitetura do controlador e a ordem em que os comandos são executados. É seguro deixar essas brechas em equipamentos automotivos? Aparentemente sim, já que o fabricante faz isso. Por que estou fazendo isso? Foi apenas interessante, bem, o montador me interessou por um longo tempo, eu o conheci, por assim dizer.

Assunto - No painel de instrumentos Mitsubishi 8100B197, a comunicação no barramento CAN foi realizada pelo adaptador Tactrix OpenPort 2.0, software em um computador de seu próprio projeto.

Source: https://habr.com/ru/post/pt474718/


All Articles