Analyse forensique AS/400 : Récupérer vos clés de licence depuis les images disque
DISCLAIMER:
Cet article est un guide technique décrivant des méthodes de forensic permettant de récupérer des clés de licence perdues ou oubliées depuis votre propre IBM AS/400, iSeries ou Power Systems.
Il n’explique pas comment générer des clés de licence ni comment contourner les mécanismes de validation des licences. Les clés de licence originales doivent déjà être présentes sur les disques du système.
Toutes les clés de licence et numéros de série système présentés ci-dessous sont fictifs et utilisés uniquement à des fins de démonstration.
Introduction
Il y a deux ans, j’ai acquis un IBM iSeries 9406-810 qui, malheureusement, refusait d’effectuer un IPL en raison d’un ASP sévèrement corrompu.
Plusieurs disques étaient absents de l’ASP, tandis que d’autres apparaissaient en double dans la configuration. Cet état incohérent rendait le système impossible à démarrer et me laissait dans une impasse. Pour aggraver la situation, je n’avais ni sauvegardé ni imprimé les clés de licence du système auparavant, ce qui excluait toute réinstallation complète comme option viable.
Cet article explore une méthode pratique pour extraire des clés de licence existantes depuis des systèmes IBM AS/400, iSeries et Power Systems.
Un environnement de test simple
Étant donné que mon 9406-810 était non fonctionnel, j’ai mis en place un 9401-170 comme système de test, sur lequel je disposais de toutes les clés de licence nécessaires.
J’ai commencé par effacer un disque SCSI de 17 Go (Type 6718, Modèle 050) et installer OS/400 V5R1M0 à partir des CD d’installation d’origine. Une fois l’installation initiale terminée, j’ai laissé le premier IPL se dérouler jusqu’au bout, mais j’ai volontairement choisi de ne saisir aucune clé de licence à ce stade. J’ai ensuite laissé le système tourner toute la nuit pendant la décompression des objets. Le lendemain matin, je l’ai arrêté à l’aide de la commande PWRDWNSYS *IMMED.
J’ai retiré le disque et l’ai connecté à ma station SCSI afin de créer un dump brut de son contenu.
Ensuite, j’ai réinstallé le disque dans l’AS/400 9401-170 et j’ai de nouveau effectué un IPL du système. Après m’être connecté en tant que QSECOFR, j’ai ajouté l’une de mes clés de licence à l’aide de la commande ADDLICKEY :
ADDLICKEY PRDID(5722SS1) LICTRM(V5R1M0) FEATURE(5050) SERIAL(*LOCAL) PRCGRP(*ANY) LICKEY(14776E 9C1D2B 587C57) USGLMT(*NONE) EXPDATE(*NONE) VNDDTA(*NONE)
Une fois la clé de licence appliquée, j’ai de nouveau arrêté le système avec PWRDWNSYS *IMMED, retiré le disque une seconde fois et l’ai reconnecté à ma station SCSI afin de produire un second dump disque pour comparaison.
Analyse différentielle des deux images disque
Maintenant que nous disposons de deux versions du même disque, l’une capturée avant et l’autre après l’ajout d’une clé de licence, l’étape suivante consiste à les comparer et à identifier les différences.
Pour ce faire, j’ai testé plusieurs outils, mais seuls quelques-uns étaient capables de gérer efficacement une image disque de 17 Go. Mon choix c’est finalement arrêté sur vbindiff, qui s’est révélé être l’option la plus fiable et la plus réactive pour travailler avec des fichiers de cette taille.
vbindiff propose plusieurs fonctionnalités particulièrement utiles pour ce type d’analyse. La première est la fonction de recherche (touche F), qui permet de rechercher des données hexadécimales (touche H) ou du texte en clair (touche T). La seconde est la possibilité de basculer entre le décodage EBCDIC et ASCII (touche C). Cette fonctionnalité est particulièrement précieuse lorsqu’on travaille avec des systèmes IBM, où les données sont généralement stockées en EBCDIC.
Ci-dessous, un exemple de l’interface de vbindiff mettant en évidence une différence dans un fichier binaire après la modification d’une section pour y contenir la chaîne PODALIRIUS :

Identification d’une première structure de clé de licence (LICENCEINFO1)
Sur une image disque de 17 Go, les chaînes courtes ont de fortes chances d’apparaître de nombreuses fois simplement par hasard. Pour identifier de manière fiable la structure d’une clé de licence, il est donc nécessaire de rechercher une séquence de données suffisamment longue et distinctive.
La première étape consiste à basculer le mode de décodage dans vbindiff d’ASCII vers EBCDIC en appuyant sur la touche C, afin d’afficher les données sous une forme lisible par un humain.
En revenant sur la commande ADDLICKEY utilisée précédemment, on peut identifier plusieurs éléments d’information qui devraient être présents sur le disque et qui peuvent servir de points d’ancrage utiles pour la recherche :
PRDID(5722SS1)
LICTRM(V5R1M0)
FEATURE(5050)
LICKEY(14776E 9C1D2B 587C57)
L’élément de donnée le plus long et le plus distinctif dont nous disposons est la valeur LICKEY. Nous allons donc commencer notre recherche à partir de celle-ci. La recherche de 14776E 9C1D2B 587C57 (avec des espaces) ne renvoie aucun résultat. En revanche, la recherche de la même valeur sans espaces, 14776E9C1D2B587C57, retourne bien un résultat et nous amène à l’emplacement suivant :
06F51 DFB0: 01 18 F0 E5 1E 00 12 10 F0 F2 F3 00 00 00 01 10 ..0V.... 023.....
06F51 DFC0: 00 00 00 00 F5 F7 F2 F2 E2 E2 F1 E5 F5 D9 F1 D4 ....5722 SS1V5R1M
06F51 DFD0: F0 F5 F0 F5 F0 00 00 00 FF FF FF FF FF FF FF FF 05050... ........
06F51 DFE0: 00 00 00 00 00 00 00 00 00 00 40 40 40 40 40 40 ........ ..
06F51 DFF0: 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40
06F51 E000: 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40
06F51 E010: 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40
06F51 E020: 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40
06F51 E030: 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40
06F51 E040: 40 40 40 40 40 40 40 40 40 40 40 40 40 40 D5 00 N.
06F51 E050: AE 28 76 51 C5 9F 00 00 00 00 00 00 00 00 00 00 ....E... ........
06F51 E060: F1 F4 F7 F7 F6 C5 F9 C3 F1 C4 F2 C2 F5 F8 F7 C3 14776E9C 1D2B587C
06F51 E070: F5 F7 FF FF FF FF FF FF FF FF 40 40 40 40 40 40 57...... ..
06F51 E080: 40 40 40 F2 F3 F7 C2 C4 F8 C6 F9 F9 F9 AE 27 72 237BD 8F999...
06F51 E090: 3F 4E C7 00 00 AE 28 76 CE A5 C4 00 00 00 00 00 .+G..... .vD.....
06F51 E0A0: 00 00 01 10 00 1A 00 4C 00 00 00 00 00 00 00 00 .......< ........
Cette occurrence de la chaîne 14776E9C1D2B587C57 apparaît à l’intérieur d’une structure qui stocke des informations liées aux licences, dans laquelle on peut clairement reconnaître les données précédemment saisies via la commande ADDLICKEY.
| Name | Data |
|---|---|
| Product ID | 5722SS1 |
| Licence Term | V5R1M0 |
| Feature | 5050 |
| Licence Key | 14776E9C1D2B587C57 |
| Serial | 237BD8F |
Nous pouvons mettre en évidence les différents champs en colorant les sections de la structure, ce qui permet d’identifier et d’interpréter plus facilement les données stockées :

Nous appellerons cette première structure LICENCEINFO1 dans les parties suivantes.
Identification d’une seconde structure de clé de licence (LICENCEINFO2)
Dans une autre section de l’image disque, on peut trouver un autre format de structure contenant les mêmes informations de licence, mais sous une forme différente. Nous appellerons cette seconde structure LICENCEINFO2 dans les parties suivantes.
078FE 2039: 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40
078FE 2049: 40 40 40 40 40 40 40 40 40 40 40 40 40 40 80 F5 .5
078FE 2059: F7 F2 F2 E2 E2 F1 E5 F5 D9 F1 D4 F0 F5 F0 F5 F0 722SS1V5 R1M05050
078FE 2069: 40 F4 F4 F7 C3 C2 C1 C1 F9 F9 F9 F0 F0 F0 F0 F0 447CBAA 99900000
078FE 2079: D1 F9 F9 F9 F9 F9 F9 F9 40 40 40 40 40 40 40 40 J9999999
078FE 2089: F5 F1 C3 C1 F9 F9 F8 F7 F9 C6 C2 C4 C3 F9 C1 F3 51CA9987 9FBDC9A3
078FE 2099: F0 F1 F0 F0 F0 F0 F0 F0 F0 F0 F0 F0 F0 F0 F0 40 01000000 0000000
078FE 20A9: 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40
078FE 20B9: 40 40 40 40 40 40 40 40 40 40 40 40 40 80 F5 F7 .57
078FE 20C9: F2 F2 D8 E4 F1 E5 F5 D9 F1 D4 F0 F5 F0 F5 F0 40 22QU1V5R 1M05050
078FE 20D9: F4 F4 F7 C3 C2 C1 C1 D7 F0 F5 F0 F0 F0 F0 F0 D1 447CBAAP 0500000J
078FE 20E9: F9 F9 F9 F9 F9 F9 F9 40 40 40 40 40 40 40 40 C5 9999999 E
078FE 20F9: C4 F0 C1 C4 F2 F1 F0 F0 F2 F6 C2 F6 C5 F7 F7 F0 D0AD2100 26B6E770
078FE 2109: F1 F0 F0 F0 F0 F0 F0 F0 F0 F0 F0 F0 F0 F0 40 40 10000000 000000
078FE 2119: 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40
078FE 2129: 40 40 40 40 40 40 40 40 40 40 40 40 00 00 00 00 ....
Cette occurrence de la chaîne 14776E9C1D2B587C57 est présente dans une structure différente stockant les mêmes informations de licence, dans laquelle on reconnaît les données précédemment saisies via la commande ADDLICKEY.
| Name | Data |
|---|---|
| Product ID | 5722SS1 |
| Licence Term | V5R1M0 |
| Feature | 5050 |
| Licence Key | 14776E9C1D2B587C57 |
| Serial | 237BD8F |
Nous pouvons colorer les différentes sections de cette structure LICENCEINFO2 afin de mieux mettre en évidence les données qu’elle contient.

Écriture d’un outil pour extraire les clés de licence
Maintenant que nous avons identifié la structure et l’organisation des données de clés de licence au sein de l’image disque, nous pouvons automatiser le processus d’extraction.
Pour cela, j’ai écrit et open-sourcé un outil nommé ExtractAS400LickeysFromDisk. Cet utilitaire analyse des images disque provenant de systèmes AS/400, iSeries et Power Systems, et recherche des structures de clés de licence correspondant aux motifs et aux éléments mis en évidence précédemment dans cet article.
L’outil, ainsi que des instructions d’utilisation détaillées, est disponible ici :
Usage
$ ExtractAS400LickeysFromDisk -h
ExtractAS400LickeysFromDisk - by Remi GASCOU (Podalirius) @ TheManticoreProject - v1.0.0
Usage: ExtractAS400LickeysFromDisk [--debug] [--chunk-size <int>] [--workers <int>] --input <string> [--output-cl <string>] [--output-json <string>]
--debug Debug mode. (default: false)
Configuration:
-c, --chunk-size <int> Chunk size in bytes for reading the file (default: 100MB). (default: 104857600)
-w, --workers <int> Maximum number of worker threads (default: number of files). (default: 32)
Input:
-i, --input <string> Path(s) to the disk image file(s) to scan. Can be specified multiple times.
Output:
-c, --output-cl <string> Output file for control language ADDLICKEY commands (default: ./addlickey.cl). (default: "./addlickey.cl")
-j, --output-json <string> Output file for JSON output (default: ./lickeys.json). (default: "./lickeys.json")
Démonstration
Voici un exemple d’utilisation de l’outil pour extraire des clés de licence à partir d’une image disque brute issue du disque de 17 Go d’un IBM AS/400 9406-170 :
./ExtractAS400LickeysFromDisk --input "./disk.raw"
