Décompilation logicielle MS41

Cet article traite du fonctionnement logiciel du MS41. Je ne vais que gratter la surface.
J’ai analysé une grosse partie du logiciel MS41 ID41. Tout n’est pas parfait et il y a encore des inconnues. mais j’explique ici de manière simplifié le fonctionnement de certaines partie de ce que j’ai pu comprendre du logiciel.

Des fautes peuvent êtres présentes ou même des approximations.

J’essayerai d’ajouter dans le futur les modifications des autres version logicielles.

Plages d’adresses et octets par fonction:

Le MS41 est composé de 256Ko de mémoire flash, cependant cette mémoire est sur le même bus que la ram. donc toute une partie n’est pas adressable.

CatégorieOctets identifiés
Moteur20 166
Sécurité11 622
K-line9054
Système8270
Cliquetis7324
Adaptations6470
Injection6404
Allumage5766
EEPROM5470
EWS2858

31,8 % du fichier full read est du code identifié pendant que 64,3 % est de la flash vierge

Catégorieaddresses full read (début →fin)
ADAPTATIONS0x2974E–0x2A754 ; 0x2B610–0x2B70C ; 0x2DB14–0x2E358
ALLUMAGE0x00E78–0x01E80 ; 0x2BB42–0x2BCC8 ; 0x35FAA–0x362F0 ; 0x36606–0x36816
CLIQUETIS0x236D4–0x24000 ; 0x28BE2–0x28F84 ; 0x2C000–0x2CD8E ; 0x2EF1C–0x2F15C
EEPROM0x05718–0x05BCC ; 0x20096–0x202D6 ; 0x202D6–0x21140
EWS0x0473C–0x0496C ; 0x04A24–0x04D28 ; 0x2268E–0x227B2 ; 0x2BFB8–0x2BFFE ; 0x2F840–0x2F9EC ; 0x362F0–0x365D2
INJECTION0x0006C–0x001BC ; 0x008EE–0x00E78 ; 0x21434–0x214F2 ; 0x22E16–0x236D4 ; 0x288F4–0x28BE2 ; 0x2A754–0x2A8A4 ; 0x2E358–0x2E780 ; 0x36614–0x3665C
KLINE0x0496C–0x0498A ; 0x04D28–0x05438 ; 0x0552E–0x05718 ; 0x20000–0x20096 ; 0x26428–0x27118 ; 0x27688–0x27C62 ; 0x27D70–0x28000 ; 0x2BD10–0x2BF7A ; 0x2F37C–0x2F568
MOTEUR0x06D90–0x071B8 ; 0x2234E–0x224C4 ; 0x24000–0x25404 ; 0x25FB6–0x26428 ; 0x286B4–0x288F4 ; 0x28F84–0x2974E ; 0x2B48C–0x2B610 ; 0x2B91E–0x2BB42 ; 0x2CD8E–0x2D700 ; 0x2E780–0x2EB06 ; 0x2F15C–0x2F37C ; 0x34BD8–0x35FAA ; 0x366BE–0x366D4
SECURITE0x05BCC–0x05C14 ; 0x21140–0x21434 ; 0x219E6–0x221A8 ; 0x224C4–0x2268E ; 0x227B2–0x22E16 ; 0x25404–0x25FB6 ; 0x27118–0x27688 ; 0x27C62–0x27D70 ; 0x2B70C–0x2B91E ; 0x2BCC8–0x2BD10 ; 0x2BF7A–0x2BFB8 ; 0x2F568–0x2F840 ; 0x2F9EC–0x2FC52 ; 0x365D2–0x36606
SYSTEME0x00000–0x000DE ; 0x04000–0x04730 ; 0x05438–0x0552E ; 0x06270–0x06400 ; 0x071B8–0x076AE ; 0x221A8–0x2234E ; 0x280F2–0x28438 ; 0x34000–0x34BD8

EWS

1- A la mise sous tension du calculateur moteur, le CPU initialise son port série.(ASC1)
2- Le Calculateur moteur attend ensuite les trois lettres « BMW » envoyé sur le fil par l’EWS. Sans ca rien ne se passe.
3- Le DME présente un chalenge composé du code ISN ainsi que sa date de fabrication.
4- Le DME Calcule la réponse attendue de la par l’EWS. le résultat est une série de 4 octets
5- le DME compare le résultat avec celui de l’EWS.

Si ça correspond: Le calculateur autorise le fonctionnement normal du moteur

Si ça ne correspond pas: le calculateur retente 2 fois en incrémentant un compteur avant d’abandonner et de reste en immobilisation active.

Accès KLINE sécurisé

Il existe dans le calculateur un second jeu, non documenté et non utilisé dans INPA ou autres logiciels dispo de BMW, un mode de diagnostique avancé caché derrière un mot de passe.

L’accès sécurisé permet, entre autres, de:

  • Réécrire des zones mémoires
  • Tester pour trouver les premières zones non vides de mémoire
  • Lecture de la mémoire
  • Selftest de l’EEPROM (pas la flash ni la ram)

Le moyen d’y accéder se fait par une commande suivit d’un mot de passe.
Cette commande défini un flag qui permet ensuite d’utiliser un set de commande caché

0x25, 0x21, 0x31 et d’autres. Je prendrait le soin de tout documenter dans la section ADS/ MS41du Wiki.

Le paquet magique de déverrouillage est le suivant:

12 08 90 42 4D 57 0E DC

Bien que connu, puisque utilisé par des logiciels qui permettent de flasher les MS41, celui ci été resté secret. (pas de secret avec moi)

Retour en haut