Cracker Wingdis 2.12
par +Alt-F4 , 9 Janvier 1998
 

f

Merci à la page de reverse engineering de Fravia

Intro


Dernièrement j'ai téléchargé ICQ version java, car je voulais le 
decompiler (Imaginez les possibilitées!)

J'ai essayé de le décompiler avec Mocha, mais malheureusement ça n'a pas

marché (Mocha est une Beta,et il le sera toujours, c'est triste, l'auteur 

est mort)

En cherchant d'autres désassembleurs j'ai trouvé WingDis

Le rendu est un peu inférieur à celui de Mocha, mais il peut désassembler

tous les programmes java que j'ai essayé, et il est sans cesse amélioré 
Ce programme est limité à 5 jours d'utilisation!

Dans ce cours je montrerai comment j'ai patché WingDis.

Outils Requis

IDA
Hex Editor(Puis-je suggérer UltraEdit?)

~
Cible: WingDis, disponible à http://www.wingsoft.com

Historique du prog

Sans intérêt (Je n'étudie l'historique que des cibles difficiles...)

L
'
E
S
S
A
I


                                

Cherchez le texte "trial" dans toutes les classes du répertoire de 
wingdis.

Le seul fichier contenant ce texte est, ClassReader.class,

c'est donc notre première cible.

Evidemment la première chose à essayer est d'utiliser Wingdis sur lui
même afin de décompiler ClassReader.



"Sorry, WingDis is not allowed to decompile itself."

(N.d.T : "Désolé, WingDis n'est pas autorisé à se décompiler" )

Chouette! Une autre chose à cracker! Cracker une limite de temps est
toujours ennuyeux, donc crackons cela d'abord!

Permettre WingDis de se décompiler




Mocha ne fonctionne pas, alors utilisez IDA avec ClassReader.class, et
cherchez "trial" à nouveau.





021 004         iload var020_4

006             iconst_3

159 000 076     if_icmpeq met020_355	:Si Bon sauter hors d'ici

042             aload_0 # var020_0

180 001 027     getfield 283

018 096         ldc1 "javadis"

182 000 201     invokevirtual int

		java.lang.String.indexOf(java.lang.String)

156 000 027     ifge met020_318		:Si Mauvais sauter vers Erreur

042             aload_0 # var020_0

180 001 027     getfield 283

018 095         ldc1 "WingSoft"

182 000 201     invokevirtual int

		java.lang.String.indexOf(java.lang.String)

156 000 015     ifge met020_318		:Si Mauvais sauter vers Erreur

042             aload_0 # var020_0

180 001 027     getfield 283

018 094         ldc1 "wingsoft"

182 000 201     invokevirtual int

		java.lang.String.indexOf(java.lang.String)

155 000 040     iflt met020_355		:Si Bon sauter hors d'ici

met020_318:Mauvais Garçon

042             aload_0

187 000 131     new java.lang.StringBuffer

089             dup

183 000 130     invokenonvirtual void java.lang.StringBuffer.()

178 000 121     getstatic java.lang.String NEWLINE

182 000 129     invokevirtual java.lang.StringBuffer

		java.lang.StringBuffer.append(java.lang.String)

018 093         ldc1 "Sorry, WingDis is not"

{Code non important}

met020_355:Bon Garçon

{Code non important}





(Etes-vous sure que vous avez dit à IDA d'afficher les 'op codes')



Un crack simple! Changez la première condition afin de toujours sauter 

vers Bon Garçon.



Cherchez dans le code un "goto", 

et écrivez le code de cette opération.



C'est  167, ou 0xA7

Cherchez alors les bons octets, et changez le 

159(0x9F) en 0xA7.



Essayez maintenant de décompiler Wingdis, et ça marche!



Virer la limite de temps


Exécutez WingDis sur lui-même, et cherchez dans le code source où 
s'effectue la vérification de la date:





Long long13	= new Long(string11);

long14		= long13.longValue();

date3		= new Date();

long16		= date3.getTime() - long14;

if ((long16 <(long)0)) { throw new ioexception("sorry, the trial version has expired"); } if (((long16 / long8)>= 5L))

{

   throw new IOException("Sorry, the trial version has expired");

}

if ((boolea1 == false))

{                

	.......

}





Tout ce que nous avons à faire est de changer le premier if, 
afin de toujours sauter vers le troisième if.

Cherchez dans IDA "sorry", et vous arrivez ici:







182 000 147     invokevirtual long java.util.Date.getTime()

022 014         lload var083_14

101             lsub

055 016         lstore var083_16

022 016         lload var083_16

009             lconst_0

148             lcmp

156 000 013     ifge met083_241		//if ((long16 < (long)0)) <(long)0))

187 000 146     new java.io.IOException

089             dup

018 010         ldc1 "Sorry, the trial version has expired"

183 000 145     invokenonvirtual void

java.io.IOException.(java.lang.String)

191             athrow

met083_241:	//if (((long16 / long8) >= 5L))

022 016         lload var083_16

022 008         lload var083_8

109             ldiv

020 000 160     ldc2w 5

148             lcmp

155 000 013     iflt met083_263

187 000 146     new java.io.IOException

089             dup

018 010         ldc1 "Sorry, the trial version has expired"

183 000 145     invokenonvirtual void

java.io.IOException.(java.lang.String)

191             athrow

met083_263:	//if ((boolea1 == false))





Ok, changons 156 000 013     ifge met083_241 

afin qu'il saute toujours vers met083_263.



L' Offset pour le goto se calcule du début du goto 

au début de l'instruction vers laquelle on saute.

En additionnant les octets listés ci-dessus, vous verrez que nous devons 

sauter 35 octets.

On le fait en changeant:

156 000 013 ifge jump 13 bytes

en

167 000 035 jump 35 bytes



Comme d'habitude, le crackage de la limite du temps était simple à
pleurer!

Quand est-ce-que les programmeurs apprendront?

Changer les commentaires du début de chaque page



Au début de chaque page désassemblée, il y a un commentaire:



// This program is generated by WingDis 2.12 Trial Version, 

                                    a product from WingSoft

// For more information about WingSoft, please visit 

                                    http://www.wingsoft.com



Je voulais garder un commentaire ici(Ainsi je peux savoir ce que j'ai, 

écris et ce que j'ai décompiler), mais je n'aime pas être ennuyé par 

des stupidités.



C'est simple à arranger, éditer ClassReader.class avec un éditeur  

hexadécimal et changez le texte (Les programmeurs sont sympas de mettre
toute leur protection dans un seul fichier pour nous!) 
Pour rendre les chose faciles, ne changer pas la longueur des 
commentaires, changez seulement le texte :



// This source code was decompiled using WingDis 2.12 ALT-F4_HCU Version

//**********************************************************************









Appendix A:Java Opcodes



Voici un court listing des Java Opcodes que j'ai trouvés en parcourant 

le source.



Cmnd	Opcode		Hex

ifge	156 xxx xxx	:9c

iflt	155 xxx xxx	:9b

Goto	167 xxx xxx	:a7

ifieq	159 xxx xxx	:9f

Call	182 xxx xxx	:b6



Pour un listing plus complet, allez à : 

http://www.palenaka.com/~palenaka/que/quebooks/sej2e/36javafi.htm





 (c) +Alt-F4 9 Jan 1998 All rights reversed.
Traduit par Jordan_Jr (Jordan_Jr@nym.alias.net)