Récemment, j’ai travaillé avec un plugin sous PHP Storm qui me facilitait beaucoup le développement Magento. Mon administration ayant mis pas mal de temps à me valider la licence, j’ai décompilé la chose pour voir si je pouvais en sortir un crack. Il n’y a pas beaucoup de documentation sur le net sur la décompilation de jar, on va donc voir ensemble comment ça fonctionne.
Pour commencer, il faut savoir qu’un fichier jar, c’est un fichier zip. Donc on le renomme en zip, et on regarde l’intérieur. On voit qu’il est rempli de fichier .class qui sont compilés et donc illisibles. En regardant vite fait, on se doute déjà dans quel répertoire il faudra chercher, non ?
Pour continuer, il nous faut un outil de reverse engineering tel que JD-Gui. On ouvre le fichier .jar avec l’éditeur, et on voit alors son contenu. On peut alors lire le code qui se cache dans le répertoire « license » et vraiment comprendre comment ca fonctionne.
On peut supposer que la fonction isValid permet de valider ou non la licence, et que la modification d’un simple return false en return true pourrait suffire.
Malheureusement JD Gui ne permet pas de manipuler le code source comme on le voudrait. Il faut passer par une modification du code compilé via Java Bytecode Editor. Là, les choses se compliquent car le code est traduit en code machine (assembleur). Je n’y connais pas grand chose, mais suffisamment pour comprendre que true et false se traduisent par iconst_1 et iconst_0. Le screenshot ci dessous est assez parlant.
L’assembleur:
Après avoir parcouru le code, il apparait qu’il faut modifier AppLicence et RemoteLicence.
On écrase la classe avec notre sauvegarde et on rezippe le tout. On le renomme en .jar , et on l’installe à nouveau dans PHP Storm. Ca fonctionne, enfin presque.
On y est preque !
Par malchance, une fonction regarde quelque chose à intervalle régulier et désactive alors régulièrement notre extension. Ca se passe dans ce fichier:
com/magicento/model/magicento/MagicentoLocalUser.java
Dans la fonction requestSecretCode, il y a bien ce texte: « Please set your private code in Magicento settings to enable Magicento » qui revient sans cesse. On voit aussi dans la fonction loadComplete le code isInvalidSecretCode = true;
Pour bypasser cette désactivation, il faut modifier, le test sur l’égalité en différent. Egalité se dit « je », et différent « jne » (note equal). On sauvegarde , et ca marche ! Maintenant que j’ai ma licence, on pourrait même étudier le code qui génère le serial, et déterminer un keygen, car toutes les clés de chiffrement sont accessibles en claires. Mais bon, ce plugin m’a déjà tellement aidé, que je ne veux pas nuire à son auteur.