{ZipArchive} – Cacher des fichiers dans une archive Zip !

Salut les Dyrknautes,

Comme vu précédemment ici : {ZipArchive} Faire du Debug online !
Le format Zip est un format relativement simple, et qui permet de nombreuses choses, probablement beaucoup trop pour faire un seul article sans perdre la moitié des lecteurs.

J'ai donc pris le plie de faire un premier jet, portant sur les bases de la structures d'un fichier Zip.
Une découverte des 3 entêtes principales que l'on y retrouve :

  • Local Header File (1, n)
  • Record of Central Directory (1, n)
  • End of Central Directory (1)

NB : (1, n) signifie que l'entête est présente au moins 1 fois, mais peut être présente plusieurs fois.

Pour une mise en bouche, je vous propose donc un léger rappel.
L'archive ZIP se décompose en 3 enchainements :

Local(s) File Header

D'abord, on mets à la suite, tous les fichiers.
Pour chacun, nous avons d'abord un "Local Header File", décrivant le fichier, puis à la suite de celui-ci nous retrouvons directement le contenu compressé de celui-ci.

Record(s) of Central Directory

Ensuite, nous faisons une sorte de "table des matières" (un index).
Nous allons successivement mettre une entête de type "Record of Central Directory" pour chaque fichier présent dans l'archive.
Cette entête va contenir les informations importantes du fichier, mais contiendra également l'offset (la position) de l'endroit où se trouve le "Local Header File" associé au fichier dans l'archive.
Cette entrée dans l'entête se nomme "Relative Offset of local file header" (ndlr. Wikipedia).

End of Central Directory

Dernière entête de l'archive (ou première selon le sens de lecture), elle contient les informations liées à l'archive en elle même.
Celle-ci contient également une infos important, l'offset vers le "Central Directory", en gros ... là où commence la succession des entêtes de type "Record of Central Directory", son petit nom est "Offset of Start of Central Directory" (ndlr. Wikipedia).
Elle contient également une autre information importante le "Total number of central directory records" (ndlr. Wikipedia).

Identifier les différentes parties de chaque entête

Comme précisé dans l'article précédent (lien), chaque entête regroupe plusieurs informations.
Cependant, il n'est pas toujours simple d'identifier les parties "manuellement".

Un éditeur hexadécimal vous révèlera le contenu du fichier, mais ne vous indiquera pas "automatiquement" où se trouve les différentes entêtes, et ce qui les composes.

Pour ce faire j'ai développé un super script qui se substituera à votre éditeur hexadécimal (en ce qui concerne l'édition d'archive zip), avec une coloration des entêtes et de leurs composantes, ainsi que des informations au survol des différents octets composants le fichier !

Le script est téléchargeable ici :

Il vous suffit de le télécharger, et de l'ouvrir comme une simple page HTML.
Le code couleur, vous permet d'identifier assez rapidement les entêtes (PK) des différentes parties de l'archive.
L'image ci-dessus ne contient qu'un seul fichier, il est donc normal de voir uniquement les 3 entêtes (Local File Header, Record of Central Directory et End of Central Directory)

Mais que se passerait-il si nous prenions une archive avec 2 fichiers ?

Je vous propose donc de créer une archive Zip avec 2 fichiers :

Téléchargez les 2 fichiers ci-dessus, puis avec une sélection multiple, créez une archive "zip"
(Attention, une archive ZIP ... pas un rar, pas un 7z, .... un zip !
Tout autre format ne servira à rien dans la suite du tuto)

Ensuite ouvrez cette archive à l'aide de l'éditeur hexa que je vous offre en téléchargement un plus haut.

La lecture d'un fichier Zip se fait du bas vers le haut.

Ainsi, si vous allez directement en bas du fichier, vous devriez voir ceci.
La partie gauche correspond au code hexadécimal, la partie droite à une version visuel du code "binaire".

On distingue nos 2 entêtes de type "Record of Central Directory", puis la dernière entête la "End of Central Directory".

Si vous survolez un peu les différents blocs couleur du "End of Central Directory" avec votre souris, vous devriez trouver assez vite les fameux champs dont je vous parle plus haut :

  • "Total number of central directory records"
  • "Offset of Start of Central Directory"

"Total number of central directory records"

Nous allons donc modifier le premier champs : 02 00
Qui signifie une fois la conversion hexa vers décimal "2"
C'est le nombre de fichier (record of central directory)...
Notre objectif étant de cacher un fichier, il suffit de modifier cette info pour lui dire qu'il n'y a qu'un seul fichier : 01 00

"Offset of Start of Central Directory"

Mon "éditeur hexa" vous donne les différents octets / "position" (l'offset) en hexa parmi les informations que vous obtenez au survol de la souris .

Ci-dessus, nous voyons dans le "End of Central Directory", l'offset (la position) de départ des "Records of Central of Directory"

La suite des opérations doit donc vous paraitre évidente !
Nous allons modifier ce fameux "Offset of Start of Central Directory" du "End of Central Directory", pour le faire pointer non pas vers le premier "Record", mais sur le second !

Et hop, plus qu'à télécharger le fichier modifié !
En l'ouvrant avec l'explorateur Windows (par exemple), vous ne devriez plus voir qu'un seul fichier.

Warning

Les logiciels d'archive (Winzip, 7zip, Winrar, ...) ont tous un fonctionnement différent.
Il y a ceux qui appliquent à la lettre la norme pkzi, et qui auront le comportement "attendu".
Et les autres ... certains logiciels vont effectuer davantage de contrôle et vont donc identifier de façon plus "intelligente" les fichiers présents dans l'archive.

Ne soyez donc pas surpris si votre logiciel préféré continu d'afficher les 2 fichiers, ne dites pas "ça ne marche pas".

Conclusion

Cet article vous aura permis de disposer d'un nouvel outil, et de consolider votre connaissance sur ce format aussi largement utilisé que méconnu dans son fonctionnement.
Il existe un certain nombre de choses amusantes qu'il est possible de faire avec un ZIP (Zip Slip, Zip Bomb, ...).

Si cet article vous a plus, d'autres sur ce même thème pourront peut-être le jour, n'hésitez pas à vous manifester en commentaire ;)

Laisser une réponse

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site est protégé par reCAPTCHA et Google Politique de confidentialité et Conditions d'utilisation appliquer.