Activer gratuitement Monokai pro sur VSCode


Il existe énormément de thème pour VSCode. J’en ai essayé plusieurs, il y en a qui sont vraiment pas mal mais le meilleur pour moi est actuellement Monokai Pro.

Malheureusement, j’ai eu la surprise de constater que celui-ci est payant et nous embêtera avec des popups tant que l’on n’a pas payé la licence à 12.50€ (mdr).

Cependant, il est assez simple de faire un peu de reverse-engineering pour activer l’extension sans débourser un centime.

Si vous voulez la solution rapide, la voici:

(Spoiler: la vrai solution la plus rapide est tout en bas)

1) Ouvrir le fichier source de l’extension

Sur windows, c’est le chemin suivant

C:\Users\votre-user\.vscode\extensions\monokai.theme-monokai-pro-vscode-1.x.x\js\main.js

2) Rechercher et remplacer la condition de vérification

Un petit coup de CTRL+H, et on fait un rechercher->remplacer avec les valeurs suivantes:

Rechercher:

n.slice(0, 5).join(”-”);return t===o

Remplacer par:

n.slice(0, 5).join(”-”);return true

3) On sauvegarde et on relance

Un petit CTRL+S pour sauvegarder la modification puis on relance VSCode.

C’est bon !

Nous venons de modifier la fonction de vérification afin qu’elle retourne systématiquement “vrai”.”

Vous devriez avoir une pop-up qui vous remercie d’avoir acheté Monokai pro.

Pour aller plus loin…

Pour les curieux, voici la fonction complète qui vérifie la clé de licence:

{
            key: "isValidLicense",
            value: function() {
                var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : "",
                    t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : "";
                if (!e || !t) return !1;
                var r = ou("".concat(cs.APP.UUID).concat(e)),
                    n = r.match(/.{1,5}/g),
                    o = n.slice(0, 5).join("-");
                return true//t === o
}

Le code à bien évidemment été obfusqué et ce que vous voyez la est le code après un passage de Beautify, qui ne peut pas faire de miracle.

En analysant le code, on comprend le fonctionnement suivant:

  • Cette fonction prend 2 chaines de caractères en paramètres: l’email, et la clé de licence
  • Elle concatène l’UUID de l’extension avec l’email (avec la méthode “concat”)
  • Ce résultat est passé dans une fonction mystérieuse, on y reviendra plus tard
  • Puis elle génère un tableau de sous-chaînes de 5 caractères (avec la méthode regex “match”)
  • Puis elle tronque à 5 éléments maximum (méthode “slice”)
  • Puis elle regroupe les éléments du tableau en une seule chaîne, avec des tirets (méthode “join”).

Le résultat est la clé de licence attendue, qui est comparé avec celle qu’on lui donne.

Il nous manque juste à comprendre ce que fait la fonction “ou” (qui a été renommé par un compilateur afin d’obfusquer le code et réduire la taille du fichier).

Il existe plusieurs moyens pour parvenir à déchiffrer son fonctionnement, dont 2 que j’ai envisagé:

  • Fouiner le code pour retrouver la déclaration de cette fonction et essayer de la comprendre. Lorsque celui ci est compilé/obfusqué, ce n’est pas évident.
  • Modifier le code de l’extension pour qu’elle nous sorte la chaîne de caractère avant/après le passage à la fonction “ou”, et essayer de comprendre ce qui s’est passé

On commence par la première mais rapidement on retombe sur de la fonction cryptique qui ne donne pas envie de pousser les choses directement.

On passe à la 2ème technique.

Il suffit d’ajouter des console.log:

{
            key: "isValidLicense",
            value: function() {
                var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : "",
                    t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : "";
                if (!e || !t) return !1;
                var r = ou("".concat(cs.APP.UUID).concat(e)),
                    n = r.match(/.{1,5}/g),
                    o = n.slice(0, 5).join("-");

                console.log("".concat(cs.APP.UUID).concat(e))
                console.log(r)
                
                return true//t === o
}

On sauvegarde et relance VSCode et on ouvre la console de debug. Et on voit les 2 lignes suivantes:

fd330f6f-3f41-421d-9fe5-de742d0c54c0me@me.fr
7b96f8e605bc75fc2441cd9d0f8f78cb

On comprend donc que notre chaîne de départ semble avoir été hashé. Par quel algo? pour le savoir on peut essayer de rentrer notre chaîne sur ce site et voir si on retrouve le hash attendu.

Bingo, c’est simplement un HASH MD5, d’où la fonction cryptique que l’on avait la flemme de comprendre en premier lieu (et on a bien fait).

Finalement, juste avec l’email et l’UUID, on peut générer une clé valide.

Actuellement, l’UUID de l’extension est “fd330f6f-3f41-421d-9fe5-de742d0c54c0”

Je vous ai préparé un petit keygen version one-liner avec PowerShell:

[string]::Join("-",(([System.BitConverter]::ToString((New-Object -TypeName System.Security.Cryptography.MD5CryptoServiceProvider).ComputeHash([System.Text.Encoding]::UTF8.GetBytes("fd330f6f-3f41-421d-9fe5-de742d0c54c0"+(Read-Host "Please enter your email")))).Replace("-", "").ToLower()) | Select-String ".{1,5}" -AllMatches | ForEach-Object { $_.Matches.Value })[0..4])

Il suffit de copier-coller le code dans votre terminal, et d’entrer votre email

Par exemple, la clé de licence valide pour l’email “vivelopen@source.net” est “68993-b4f9e-d3960-55dc8-57565”.

Vous pouvez d’ailleurs vous en servir directement plutôt que de modifier le code comme expliqué au début de l’article.

Et n’oubliez pas, si vous en avez les moyens et que vous aimez ce thème, il est préférable de payer une licence.

Même si le tarif est complétement déraisonnable et qu’il ne faut pas encourager la monétisation à outrance (surtout dans un éco-système open-source)