Exporter le contenu binaire d’une réponse HTTP depuis Firefox

Lors de l'exploration d'un site, il peut être utile de sauvegarder le contenu d'une réponse à une requête HTTP. Le débogueur de Firefox apparaît alors comme l'outil tout indiqué. De fait, non seulement il se trouve immédiatement à disposition, mais il est de plus véritablement bien conçu. Entre autres, il comprend un moniteur Réseau qui permet de visualiser l'intégralité des requêtes formulées par le navigateur et les réponses reçues en retour.
Toutefois, le contenu de la réponse qu'il s'agit de sauvegarder peut consister non pas en texte, mais en binaire. Dans ces conditions, les fonctionnalités du moniteur Réseau ne sont pas suffisantes. En effet, s'il permet bien de consulter la réponse, il affiche cette dernière sous forme de texte, après donc une conversion des octets de la réponse qu'il est impossible de renverser.
Pas de panique, il existe des moyens pour s'en sortir !

Récupérer le binaire d'une réponse d'une requête qui peut être rejouée

Dans ce cas, le plus simple est de rejouer la requête dans la console. Il faut cliquer du bouton droit sur la requête, et sélectionner Utiliser en tant que requête Fetch dans la console :
Firefox génère le code d'un appel asynchrone à fetch () :
Il suffit de modifier légèrement ce code en faisant sauter async au début et en complètant la promesse qui est retournée par fetch () :
fetch ( ... ).then (response => response.blob ()).then (data => data.arrayBuffer ().then (result => console.log (Array.from (new Uint8Array (result)).map (b => b.toString (16).padStart (2, '0')).join (' '))));
Après avoir pressé Entrée pour exécuter ce code... :
...il suffit de copier-coller le résultat dans la colonne des codes hexadécimaux de HxD et de sauvegarder le binaire résultant dans un fichier :

Récupérer le binaire d'une réponse d'une requête qui ne peut être rejouée

Ce cas s'est posé pour récupérer le binaire de la réponse à la seconde requête pour obtenir une licence DRM : une première requête demande au serveur d'envoyer un challenge, une seconde requête lui retourne le challenge résolu et reçoit la licence. Visiblement, la seconde requête ne peut être rejouée sans rejouer la première, sans doute car le challenge dépend du contenu ou du moment de la première.
Dans le débogueur, le moniteur Réseau permet de visualiser la liste des requêtes. Si l'on clique sur un requête, le volet qui apparaît à droite contient un onglet Réponse qui contient la réponse. Quand cette dernière est binaire, ce contenu ne peut pas être récupéré sous cette forme : il est affiché sous forme de texte, et le copier-coller dans HxD (y compris à partir de sa forme brute après avoir activé Brut) ne permet pas de revenir au binaire. Impossible non plus de le récupérer en cliquant du bouton droit sur la requête puis en sélectionnant Copier la valeur / Copier la réponse car la copie est alors partielle.
Une solution consiste à partir d'une exportation de la réponse dans un fichier HAR, qu'il est possible de faire en cliquant du bouton droit dans la liste des requêtes puis en sélectionnant Tout en enregistrer en tant que HAR. Il faut alors y retrouver le contenu de la réponse, soit par exemple :
Le problème est que ce contenu est encodé. La solution consiste à le copier-coller dans un nouveau document dans Notepad++... :
...puis à utiliser Encoding / Convert to ANSI, et enregistrer le document dans un fichier, par exemple licence.bin :
Quelques lignes de Python permettent alors de décoder le contenu du fichier pour retrouver le binaire :
file = open ('licence.bin','rb')
data = file.read ()
file.close ()
file = open ('licence_decoded.bin', 'wb')
file.write (bytearray ([ord(b) for b in data.decode ('unicode_escape')]))
file.close ()