Sécurité dans l'électronique automobile - Hello World sur le contrôleur de tableau de bord

Après avoir expérimenté avec le bus CAN dans la voiture, il y avait un désir fou de creuser un peu plus profondément dans le plus saint des saints. Je pense que tout le monde connaît un terme tel que «chip tuning». En russe, il s'agit d'un simple firmware pour les unités de contrôle (moteur, boîte de vitesses, etc.). Le fabricant d'équipement établit initialement des fonctionnalités dans ses appareils pour mettre à jour ou modifier le logiciel du microcontrôleur, mais son mécanisme n'est divulgué à personne pour des raisons évidentes, et pour compliquer ce processus, le programme lui-même, avec lequel il travaille avec une mémoire non volatile, n'est pas stocké dans le firmware, mais chargé dans contrôleur uniquement au moment du service. Cet article explique comment faire en sorte que le microcontrôleur de tableau de bord exécute le code de quelqu'un d'autre tout en ayant accès au connecteur de diagnostic automatique.

En général, le mécanisme de chargement des données dans l'ECU (unité de contrôle électronique) est décrit dans le protocole de diagnostic UDS , à savoir les fonctions:

34 - Demande de téléchargement
36 - Transférer des données

Mais en termes d'implémentation de l'UDS, les constructeurs automobiles ne sont pas pressés d'apporter des modifications / ajouts au protocole, créant un module complémentaire propriétaire. Dans mon cas, le processus de mise à jour ressemble à ceci:

  1. Se connecter à une session de diagnostic étendue
  2. Redémarrez dans le chargeur de démarrage
  3. Obtention d'un accès sécurisé pour permettre une opération de chargement de données
  4. Transfert de l'adresse en mémoire où le volume d'enregistrement et de données sera conservé
  5. Chargement des données
  6. Faire ce qui était chargé
  7. Ensuite, vous programmez l'EEPROM avec le programme que vous avez téléchargé auparavant.

Les points 1 à 3 n'étaient pas difficiles, mais que faire ensuite? Où obtenir l'adresse et la quantité maximale de données? Comment après le démarrage faire ce qui a été téléchargé? En fait, pour cela, un article est en cours de rédaction.

Une combinaison d'appareils a été choisie comme sujet de test, car, premièrement, j'en ai un de plus en cas d'apocalypse, et deuxièmement, son contrôleur peut être lu avec un simple adaptateur USB-RS232. Après avoir étudié l'intérieur, nous avons le contrôleur Fujitsu MB91F223. Il s'agit d'un micron 32 bits avec un cœur FR60Lite, 512 Ko de mémoire et 16 Ko de RAM. Fiche technique, RM, manuel d'assembleur, un programmeur pour celui-ci sont facilement recherchés sur Internet, je ne m'arrêterai pas là. Ici, il est beau:



Plan d'action:

  1. Rechercher des gestionnaires de demandes de diagnostic
  2. Trouvez des adresses en mémoire où vous pouvez écrire quelque chose
  3. Trouver un moyen d'exécuter du code enregistré

Pour effectuer l'étape 1, vous devez étudier le gestionnaire d'interruption à partir du bus CAN et comprendre où les données sont stockées pour un traitement ultérieur. De nombreux contrôleurs ont une table dite de vecteur d'interruption, qui contient les adresses des fonctions responsables de leur traitement. Dans la famille Fujitsu FR, cette table est dans son industrie, et le pointeur vers elle est stocké dans le registre TBR (Table base register). Une simple recherche de texte dans l'IDA donne un résultat positif et l'adresse de la table d'interruption avec nous.



Selon le manuel, l'adresse d'interruption CAN est située à l'offset 0x370 depuis le début du TBR. Il est là.



Lui, mais déjà en pleine croissance, est également un gestionnaire de messages utilisant le protocole ISO-TP

Le gestionnaire ISO-TP n'est pas complet, mais là où les cadres de différents types divergent


À partir de la base de données du logiciel de diagnostic du concessionnaire, j'avais les identifiants SID et LID (31E1) du protocole UDS qui ont commencé la procédure d'exécution du code, cela a simplifié la tâche et m'a permis d'agir de la fin au début. Dans le gestionnaire de fonctions 31E1, un fragment a été trouvé où l'adresse appartenant à la zone RAM est chargée, puis un appel est effectué vers cette adresse. N'est-ce pas ce que nous recherchons?



La recherche de l'utilisation de la constante 0x3F100 nous conduit à un autre endroit du firmware, vers le gestionnaire de fonctions UDS 34 - Demande de téléchargement! C'est exactement ce dont vous avez besoin, l'adresse pour écrire des données et la quantité maximale (0x700 octets) dans la RAM est trouvée.



Maintenant, après avoir envoyé une commande pour demander l'autorisation de télécharger des données 34 03F100 00 00010C (l'adresse indiquée en italique est indiquée en gras), le tableau de bord répond par un bon 740401 en réponse. Ensuite, les données utilisateur sont chargées à l'aide de la fonction Transférer les données et une commande est émise à remplir. Nous avons compris le chargement et l'exécution, mais maintenant vous devez trouver quoi télécharger. Je n'ai pas trouvé d'environnement de développement open source pour ce microcontrôleur, mais après un mois, le support technique de Cypress a été renversé (oui, pas Fujitsu, ils les ont également absorbés, en général, je ne sais pas), ils ont donné un lien vers un IDE appelé Shaggy Softune Workbench 97 années avec lesquelles le compilateur est passé sous le noyau FR.

Voilà à quoi ça ressemble, pas une paire de vscode.

Dans la capture d'écran, un fragment du programme pour les LED clignotantes (ne donnez pas un coup de pied pour le style d'écriture en assembleur, c'est ma première expérience).



Le même code, mais déjà en 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; } } } 

Eh bien, le résultat lui-même


Avec les autres nœuds, tout a à peu près la même apparence, à l'exception de l'architecture du contrôleur et de l'ordre dans lequel les commandes sont exécutées. Est-il sûr de laisser de telles lacunes dans l'équipement automobile? Apparemment oui, puisque le fabricant le fait. Pourquoi est-ce que je fais ça? C'était juste intéressant, eh bien, l'assembleur m'intéressait depuis longtemps, je l'ai rencontré, pour ainsi dire.

Objet - Tableau de bord Mitsubishi 8100B197, la communication sur le bus CAN a été réalisée par l'adaptateur Tactrix OpenPort 2.0, logiciel sur un ordinateur de sa propre conception.

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


All Articles