Rien ne vaut un exemple concret pour illustrer ce qu'un décompilateur donne à voir. Nous prenons ici un « CrackMe » — un petit programme conçu comme défi de reverse engineering — et nous montrons comment VBReFormer met à nu son mécanisme de validation. L'objectif est pédagogique : comprendre comment lire du code décompilé.
Ce que révèle la décompilation
Une fois le binaire ouvert, l'analyse montre que la clé de validation est générée à partir de trois éléments : le nom de l'utilisateur, la date courante et l'heure courante. L'algorithme combine ces entrées pour produire une clé sensible au temps. On repère aussi un contrôle Label4 affichant « Registered user! » en cas de succès, et un Timer1 qui vérifie chaque seconde la présence d'un débogueur.
Le cœur de la logique
La fonction Command1_Click() contient toute la validation. Voici le code reconstruit par le décompilateur :
Private Sub Command1_Click()
var_pv10 = Text1.Text
var_pv13 = Date$ & " " & Time$
For var_pv14 = 1 To Len(var_pv13) Step 1
If IsNumeric(Mid$(var_pv13, CLng(var_pv14), 1)) Then
var_pv15 = Asc(Mid$(var_pv13, CLng(var_pv14), 1))
If var_pv14 <= Len(var_pv10) Then
var_pv16 = Str(Asc(Mid$(var_pv10, CLng(var_pv14), 1)))
var_pv16 = Right$(var_pv16, 1)
var_pv16 = Val(var_pv16)
End If
var_pv18 = var_pv18 & Chr$(CLng(var_pv15 + 17 + var_pv16))
var_pv18 = var_pv18 & Chr$(CLng(var_pv15 + 17 + var_pv16 * 2))
End If
Next var_pv14
For var_pv14 = 1 To 24 Step 4
var_pv19 = var_pv19 & Mid$(var_pv18, CLng(var_pv14), 4) & "-"
Next var_pv14
var_pv20 = Len(var_pv19) - 1
var_pv19 = Mid$(var_pv19, 1, var_pv20)
Text2.Text = var_pv19
End Sub
Les noms de variables comme var_pv10 sont générés par le décompilateur, faute de noms symboliques dans le binaire compilé — mais la structure logique, elle, est parfaitement lisible : on suit la construction caractère par caractère de la clé, puis son formatage par blocs de quatre séparés par des tirets.
La leçon de sécurité
L'analyse révèle aussi une faiblesse classique : la validation compare les chaînes avec l'opérateur Like de VB. Or cet opérateur interprète les caractères génériques. Saisir * comme clé satisfait donc le motif quel que soit le nom et à n'importe quel moment. C'est un rappel utile : une comparaison par motif n'est jamais un contrôle d'authentification fiable.
Ce que cet exemple démontre
Au-delà du défi, l'intérêt est de voir concrètement ce que la décompilation du Code Natif rend possible : reconstituer une logique métier complète, lisible et commentable, à partir du seul exécutable. C'est exactement ce dont ont besoin les entreprises qui doivent maintenir une application VB6 dont le code source a disparu.
Cet article est fourni à des fins éducatives, dans le cadre de l'analyse d'un programme conçu et publié pour l'exercice. Assurez-vous toujours de détenir les droits nécessaires sur les logiciels que vous analysez.