Disque dur des DVR

J'ai commencé l'analyse du disque dur de mon DVR dans le but de faire une copie de sauvegarde et de la restaurer sur un disque de capacité supérieure ou égale en cas de problème.

Une copie bit à bit fonctionne très bien, mais le décodeur ne sait pas reconnaître la capacité du nouveau disque généré.

Le but de cette analyse est de pouvoir développer un outil permettant de générer un disque sans avoir fait de sauvegarde, mais aussi de pouvoir installer et sauvegarder les firmwares diffusés par Sagem.

Toutes les adresses présentent sur le disque sont codées en little-endian, il faut donc inverser les octets pour avoir l'information cohérente. Par exemple : si vous avez la suite A6 F8 4B 09, ceci représente la valeur 0x094BF8A6. De même que 00 B0 04 00 représente la valeur 0x04B000.

Les outils d'analyse

L'étude du contenu du disque dur a été réalisée sous Linux à l'aide de l'éditeur lde : Linux Disk Editor.

lde fonctionne par défaut avec des blocs de 1024 octets, le disque à étudier est décomposé en blocs de 512 octets. En supposant que le disque à étudier est /dev/sda on lance :

lde -s 512 /dev/sda

Il faut lancer cette commande depuis un terminal en tant que root. La taille du terminal la plus pratique est de 84×35 caractères.

Après le lancement de l'éditeur, il faut appuyer sur une touche quelconque puis sur b pour passer en mode blocs.

Pour accéder à un bloc particulier, il faut appuyer sur #, rentrer le numéro du bloc (256 ou 0xff en héxadécimal) et valider.

Vue générale

Le logiciel du DVR (ou firmware) nécessaire au démarrage de l'appareil est stocké sur le disque dur. Sans disque dur, le DVR ne peut plus fonctionner.

Lors de l'alimentation ou lors de la mise en route, le firmware est lu sur le disque dur et chargé en mémoire dans l'appareil.

Je me suis inspiré d'un thread du forum pwrworld.co.uk pour retrouver ces données sur le disque dur.

Le disque semble posséder 2 tables de partitions différentes.

Table de partition du disque dur

La première table de partition (en bleu) est utilisée pour charger le firmware nécessaire au démarrage de l'appareil.

La deuxième table de partition (en rouge) est utilisée pour le fonctionnement (une fois la phase de démarrage terminée), pour l'enregistrement, le timeshift, mais aussi stocker les différents réglages : mémorisation des chaînes et des préférences.

Je pense également, que ces 2 tables de partition sont utilisées par 2 programmes différents.

La première table (en bleu) est utilisée par le programme de démarrage présent en dur sur l'appareil. Ce programme se charge de lire le programme d'exploitation de l'appareil présent sur le disque dur et le charge en RAM.

La seconde table (en rouge) est exploitée, et initialisée, par le programme qui a été chargé en RAM.

La partition de firmwares

Cette zone est colorée en bleu sur la vue générale du disque plus haut.

Cette zone est composée de 3 parties :

  • la table de partition
  • la zone de stockage des firmwares
  • une zone dont je n'ai pas trouvée l'utilité.

Table de partition firmwares

Cette table est composée d'un unique bloc en début de disque : le bloc n°1. On retrouve une copie de ce bloc en fin de disque.

Ci dessous, une copie du bloc n°1 réalisée avec lde.

00000200  00 02 FF FF 08 00 00 00  :  02 00 00 00 A6 F8 4B 09   ..............K.
00000210  00 B0 04 00 03 FF FF FF  :  FF FF FF FF FF FF FF FF   ................
00000220  FF FF FF FF FF FF FF FF  :  FF FF FF FF FF FF FF FF   ................
00000230  FF FF FF FF FF FF FF FF  :  FF FF FF FF FF FF FF FF   ................
00000240  FF FF FF FF FF FF FF FF  :  FF FF FF FF FF FF FF FF   ................
00000250  FF FF FF FF FF FF FF FF  :  FF FF FF FF FF FF FF FF   ................
00000260  FF FF FF FF FF FF FF FF  :  FF FF FF FF FF FF FF FF   ................
00000270  FF FF FF FF FF FF FF FF  :  FF FF FF FF FF FF FF FF   ................
00000280  FF FF FF FF FF FF FF FF  :  FF FF FF FF FF FF FF FF   ................
00000290  FF FF FF FF FF FF FF FF  :  FF FF FF FF FF FF FF FF   ................
000002A0  FF FF FF FF FF FF FF FF  :  FF FF FF FF FF FF FF FF   ................
000002B0  FF FF FF FF FF FF FF FF  :  FF FF FF FF FF FF FF FF   ................
000002C0  FF FF FF FF FF FF FF FF  :  FF FF FF FF FF FF FF FF   ................
000002D0  FF FF FF FF FF FF FF FF  :  FF FF FF FF FF FF FF FF   ................
000002E0  FF FF FF FF FF FF FF FF  :  FF FF FF FF FF FF FF FF   ................
000002F0  FF FF FF FF FF FF FF FF  :  FF FF FF FF FF FF FF FF   ................
00000300  FF FF FF FF FF FF FF FF  :  FF FF FF FF FF FF FF FF   ................
00000310  FF FF FF FF FF FF FF FF  :  FF FF FF FF FF FF FF FF   ................
00000320  FF FF FF FF FF FF FF FF  :  FF FF FF FF FF FF FF FF   ................
00000330  FF FF FF FF FF FF FF FF  :  FF FF FF FF FF FF FF FF   ................
00000340  FF FF FF FF FF FF FF FF  :  FF FF FF FF FF FF FF FF   ................
00000350  FF FF FF FF FF FF FF FF  :  FF FF FF FF FF FF FF FF   ................
00000360  FF FF FF FF FF FF FF FF  :  FF FF FF FF FF FF FF FF   ................
00000370  FF FF FF FF FF FF FF FF  :  FF FF FF FF FF FF FF FF   ................
00000380  FF FF FF FF FF FF FF FF  :  FF FF FF FF FF FF FF FF   ................
00000390  FF FF FF FF FF FF FF FF  :  FF FF FF FF FF FF FF FF   ................
000003A0  FF FF FF FF FF FF FF FF  :  FF FF FF FF FF FF FF FF   ................
000003B0  FF FF FF FF FF FF FF FF  :  FF FF FF FF FF FF FF FF   ................
000003C0  FF FF FF FF FF FF FF FF  :  FF FF FF FF FF FF FF FF   ................
000003D0  FF FF FF FF FF FF FF FF  :  FF FF FF FF FF FF FF FF   ................
000003E0  FF FF FF FF FF FF FF FF  :  FF FF FF FF FF FF FF FF   ................
000003F0  FF FF FF FF FF FF FF FF  :  54 6F 6F 42 74 50 E6 22   ........TooBtP."

Ce bloc fournit plusieurs informations nécessaires au téléchargement du firmware pour le démarrage de l'appareil. Je vais les détailler dans l'ordre :

  • 02 00 FF FF : marque de début du bloc.
  • 08 00 00 00 : utilité inconnue, parfois FF FF FF FF ou 07 00 00 00.
  • 02 00 00 00 : utilité inconnue.
  • A6 F8 4B 09 : bloc de début de la zone de firmware. Ici 0x94BF8A6 ou 155973798.
  • 00 B0 04 00 : taille de la zone de firmware en blocs. Ici 0x4B000 ou 307200.
  • 03 : numéro du firmware à charger. Valeurs possibles de 0 à 3. FF si pas de firmware.
  • Zone sans informations remplie de FF.
  • 54 6F 6F 42 : marque de fin du bloc. BooT à l'envers.
  • 74 50 E6 22 : cheksum du bloc. Contrôle la validité des informations du bloc.

La taille de la zone de firmware est de 0x04B000 blocs, soit 307200 blocs de 512 octets, ce qui nous donne exactement 150Mo.

Le checksum est calculé sur l'ensemble du bloc moins les 4 derniers octets.
Si le checksum n'est pas correct, vous aurez le classique Er07 ou Er09 au démarrage de l'appareil.
La méthode de calcul du checksum utilisée ici est un crc32, avec une valeur initiale à 0xC3.

Voici un petit programme en C qui calcule le checksum à appliquer sur ce bloc. Il calcule le checksum d'un fichier se nommant RECOVERED.file sur les 508 premiers octets.
N'oubliez pas que les octets sont inversés. Si le programme donne 0x22E65074, il faut écrire sur le disque : 74 50 E6 22.

Zone de firmwares

C'est dans cette zone que l'on va retrouver le programme qui permet d'utiliser l'appareil. Le numéro de bloc de début de la zone, ainsi que sa taille, se trouve dans la table de partition firmwares décrite plus haut.

Zone de stockage des firmwares

Cette zone commence par un bloc listant les firmwares disponibles sur le disque. Une copie de ce bloc se trouve dans le dernier bloc de cette zone.

Ensuite, on retrouve les différents firmwares, les uns à la suite des autres (au gré des mises à jours successives).
Chaque firmware est toujours présent 2 fois.

Sur mon disque, j'ai retrouvé 6 firmwares différents. Seuls les 3 derniers sont présents dans la liste du 1er bloc de la zone.

Voici une copie du bloc 0x94BF8A6 de mon disque de 80Go de référence. Je vais vous en détailler le contenu.

0x1297F14C00  00 00 00 00 00 00 00 00 : 6F C5 4C 09 88 1B 00 00  ........o.L.....
0x1297F14C10  7F FC 4C 09 76 1D 00 00 : 6B 37 4D 09 89 1D 00 00  ..L.v...k7M.....
0x1297F14C20  00 00 00 00 00 00 00 00 : 00 00 00 00 00 00 00 00  ................
0x1297F14C30  00 00 00 00 00 00 00 00 : 00 00 00 00 00 00 00 00  ................
0x1297F14C40  00 00 00 00 00 00 00 00 : 00 00 00 00 00 00 00 00  ................
0x1297F14C50  00 00 00 00 00 00 00 00 : 00 00 00 00 00 00 00 00  ................
0x1297F14C60  00 00 00 00 00 00 00 00 : 00 00 00 00 00 00 00 00  ................
0x1297F14C70  00 00 00 00 00 00 00 00 : 00 00 00 00 00 00 00 00  ................
0x1297F14C80  00 00 00 00 00 00 00 00 : 00 00 00 00 00 00 00 00  ................
0x1297F14C90  00 00 00 00 00 00 00 00 : 00 00 00 00 00 00 00 00  ................
0x1297F14CA0  00 00 00 00 00 00 00 00 : 00 00 00 00 00 00 00 00  ................
0x1297F14CB0  00 00 00 00 00 00 00 00 : 00 00 00 00 00 00 00 00  ................
0x1297F14CC0  00 00 00 00 00 00 00 00 : 00 00 00 00 00 00 00 00  ................
0x1297F14CD0  00 00 00 00 00 00 00 00 : 00 00 00 00 00 00 00 00  ................
0x1297F14CE0  00 00 00 00 00 00 00 00 : 00 00 00 00 00 00 00 00  ................
0x1297F14CF0  00 00 00 00 00 00 00 00 : 00 00 00 00 00 00 00 00  ................
0x1297F14D00  00 00 00 00 00 00 00 00 : F7 E0 4C 09 88 1B 00 00  ..........L.....
0x1297F14D10  F5 19 4D 09 76 1D 00 00 : F4 54 4D 09 89 1D 00 00  ..M.v....TM.....
0x1297F14D20  00 00 00 00 00 00 00 00 : 00 00 00 00 00 00 00 00  ................
0x1297F14D30  00 00 00 00 00 00 00 00 : 00 00 00 00 00 00 00 00  ................
0x1297F14D40  00 00 00 00 00 00 00 00 : 00 00 00 00 00 00 00 00  ................
0x1297F14D50  00 00 00 00 00 00 00 00 : 00 00 00 00 00 00 00 00  ................
0x1297F14D60  00 00 00 00 00 00 00 00 : 00 00 00 00 00 00 00 00  ................
0x1297F14D70  00 00 00 00 00 00 00 00 : 00 00 00 00 00 00 00 00  ................
0x1297F14D80  00 00 00 00 00 00 00 00 : 00 00 00 00 00 00 00 00  ................
0x1297F14D90  00 00 00 00 00 00 00 00 : 00 00 00 00 00 00 00 00  ................
0x1297F14DA0  00 00 00 00 00 00 00 00 : 00 00 00 00 00 00 00 00  ................
0x1297F14DB0  00 00 00 00 00 00 00 00 : 00 00 00 00 00 00 00 00  ................
0x1297F14DC0  00 00 00 00 00 00 00 00 : 00 00 00 00 00 00 00 00  ................
0x1297F14DD0  00 00 00 00 00 00 00 00 : 00 00 00 00 00 00 00 00  ................
0x1297F14DE0  00 00 00 00 00 00 00 00 : 00 00 00 00 00 00 00 00  ................
0x1297F14DF0  00 00 00 00 00 00 00 00 : 53 46 53 5F 00 02 17 5B  ........SFS_...[
  • 00 00 00 00 00 00 00 00 : informations du firmware 00.
  • 6F C5 4C 09 88 1B 00 00 : informations du firmware 01.
  • 7F FC 4C 09 76 1D 00 00 : informations du firmware 02.
  • 6B 37 4D 09 89 1D 00 00 : informations du firmware 03.
  • une série de 00 avant de commencer la 2è partie.
  • 00 00 00 00 00 00 00 00 : informations de la copie du firmware 00.
  • F7 E0 4C 09 88 1B 00 00 : informations de la copie du firmware 01.
  • F5 19 4D 09 76 1D 00 00 : informations de la copie du firmware 02.
  • F4 54 4D 09 89 1D 00 00 : informations de la copie du firmware 03.
  • Une autre série de 00 avant la fin.
  • 53 46 53 5F 00 02 : marque de fin de la zone.
  • 17 5B : checksum du bloc.

Le numéro du firmware est à mettre en relation avec le numéro trouvé dans la table de partition firmwares.
Je n'ai pas de firmware 00 sur mon disque, mais il est utilisé sur l'une des images disque qui m'a été donnée.

Le checksum du bloc est un crc16_zmodem. Il est calculé sur l'ensemble du bloc sans prendre en compte la marque de fin de la zone.

L'information du firmware est décomposée en 2 parties. Par exemple pour le firmware 03 :

  • 6B 37 4D 09 : n° du bloc où se trouve le début du firmware. Ici le bloc 0x94D376B.
  • 89 1D 00 00 : taille du firmware en blocs. Ici le firmware fait 0x1D89 blocs.

Sauvegarde d'une image disque

Pour faire une image disque minimale, il faut sauvegarder les 257 premiers blocs du disque et la dernière partie du disque.

Sauvegarde des 257 premiers blocs :

dd if=/dev/sda of=debut.img count=257

Pour sauvegarder la fin du disque, il faut repérer l'adresse de début du firmware.
Cette adresse est indiquée dans les bloc 1 (secteur de boot).
Chez moi, cette adresse est 0x094BF8A6 soit 155973798 en décimal.
On sauvegarde à partir de ce déplacement moins 1 :

dd if=/dev/sda of=fin.img skip=155973797

Cette dernière image fait environs 180Mo.
J'ai réussi à compresser l'ensemble à moins de 3 Mo avec 7zip :

7z a image_sagem_dvr6280 debut.img fin.img
sagem/dvr6280/disquedur.txt · Dernière modification: 26/09/2010 23:51 par lagamel
GNU Free Documentation License 1.2
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0