======*===========*====*==========*============*=====*==*======= * Les dessous du Java * * par GonE * ==*====*========*=====*====*=*=Beef13 Editions=*===*=========*== I Oh ! Le java ! Mais qu'est-ce que ca peut bien etre ??? --------------------------------------------------------- Ah ! Le java, le java ! C'est genial, le java ! Mais a quoi qu'ca peut bien servir ? Eh bien c'est (pour l'instant) l'un des seuls languages qui est a l'abri des decompileurs. Eh ben alors on y va. Le Java est compile (et pas le javascript), et il peut etre appele a partir d'une page html qui peut lui passer des parametres. Le code html est tout simple : Bon, voila, c'est tout pour la page html. Note : pour downloader le .class c'est tout bete. Il suffit de mettre son url dans la zone url de ton navigateur (et de desactiver le java, ptet aussi...) Une fois downloade, on peut l'analyser !!! PS : l'extension .class => java compile et l'extens .java => java en sources II Mais au fait, d'ou vient le mot "java" ? ------------------------------------------- On s'en fou III Mais comment k'sety qu'on peut compiler en Java ? ------------------------------------------------------ Quand on a telecharge le java sdk (ou le JDK, comme ils l'appellent), on a dans le repertoire \bin javac.exe, eh bien c'est le compilateur. Note : moi j'ai pris le JDK 1.1.6 pour couine-daube95, et je garantis pas que les autres soient pareil. A la rigueur on n'a besoin que de ca. Syntaxe : use: javac [-g][-O][-debug][-depend][-nowarn][-verbose][-classpath path] [-nowrite][-deprecation][-d dir][-J] file.java... Euh, bon, en gros on tape javac et_le_nom_du_fichier.java La compilation est un peu lente, d'autant plus qu'il n'y a ni jauge ni rien qui indique ou on en est :( mais au moins ca marche sous 95 (pas besoin de mode sans meuseu-doce), mais je tiens a remarquer que le compilateur est TRES capricieux (pour les noms de fichiers longs surtout) et, disons-le, TRES mal foutu. Mais tant pis, moi j'ai pas J++ ou un truc de ce genre alors soyons contents :) III NOTIONS de programmation en Java ------------------------------------ Disclaimer : y'a que des NOTIONS, ici ! En Java on peut faire enormement de choses (d'envoyer un mail a un doomlike rate). D'ailleurs j'ai ete tres decu par les bouquins qui traitent de java car ils sont vraiment mal foutus, surtout les poches : on nous apprend pendant 300 pages a utiliser les variables comme en C, et autant pour le reste ! Bon, voici le corps d'un programme (il en existe d'autres mais voici toujours ca) import java.applet.*; import java.lang.*; // d'autres imports si tu veux... public class €nom de la classe€ extends Applet { public €evenement()€ { // fait divers trucs } // gere d'autres evenements... } note : les trucs entre € sont a remplacer par des valeurs correctes. Le nom du fichier doit etre imperativement nom de la classe.java !! Sinon, ca foire. Voici les evenements (enfin, quelques uns) : void init() // tu l'initialise void paint(Graphics g) // tu dois afficher ta fenetre boolean action(Event e,Object e) // on a clique sur un controle et dans "fait divers trucs", tu peux mettre des fonctions par exemple. par ex : showStatus("ok"); Mais... si tu veux en savoir plus, va voir ailleurs (sur d'autres pages, j'entends :)) IV Le fichier java compile -------------------------- Attention, il est pas en language machine (mais alors pas du tout). Il est juste... transforme en codes qui font chier car ils sont pas tres lisibles... :) Voici un .class d'un .java qui fait rien (ne gere pas d'evenements) 00000000 CA FE BA BE 00 03 00 2D -_¦+  - 00000008 00 10 07 00 0D 07 00 0E    00000010 0A 00 01 00 04 0C 00 06    00000018 00 05 01 00 03 28 29 56  ()V 00000020 01 00 06 3C 69 6E 69 74   Code 00000030 01 00 0D 43 6F 6E 73 74  Const 00000038 61 6E 74 56 61 6C 75 65 antValue 00000040 01 00 0A 45 78 63 65 70  Excep 00000048 74 69 6F 6E 73 01 00 0F tions ¤ 00000050 4C 69 6E 65 4E 75 6D 62 LineNumb 00000058 65 72 54 61 62 6C 65 01 erTable 00000060 00 0E 4C 6F 63 61 6C 56 LocalV 00000068 61 72 69 61 62 6C 65 73 ariables 00000070 01 00 0A 53 6F 75 72 63  Sourc 00000078 65 46 69 6C 65 01 00 12 eFile  00000080 6A 61 76 61 2F 61 70 70 java/app 00000088 6C 65 74 2F 41 70 70 6C let/Appl 00000090 65 74 01 00 05 70 72 6F et pro 00000098 67 30 01 00 0A 70 72 6F g0 pro 000000A0 67 30 2E 6A 61 76 61 00 g0.java 000000A8 21 00 02 00 01 00 00 00 !   000000B0 00 00 01 00 01 00 06 00    000000B8 05 00 01 00 07 00 00 00    000000C0 1D 00 01 00 01 00 00 00    000000C8 05 2A B7 00 03 B1 00 00 *+ _ 000000D0 00 01 00 0A 00 00 00 06   000000D8 00 01 00 00 00 03 00 01    000000E0 00 0C 00 00 00 02 00 0F  ¤ Note : pour ceux qui ne comprennent rien a l'hexadecimal et qui ont aucune idee de ce qui est ci dessus, eh ben ils peuvent se barrer car c'est pas le CP ici (quoi que...) Alors !! Ben on va un peu organiser ça. En le comparant a d'autres .class (qui sont un peu plus complexes :)), les 8 premiers octets constituent la signature d'une applet java. 00000000 CA FE BA BE 00 03 00 2D -_¦+  - <--- SIGNATURE JAVAPPLET PS : pour moi applet ou code java compile c'est presque la meme chose. Je crois que applet s'emploie que lorsqu'on utilise un carre d'ecran pour s'afficher (comme dans les pages web). ON PEUT REMARQUER TOUT DE SUITE QUELQUE CHOSE : Les chaines de caracteres sont de type pascal (et non C), car elles commencent par le nombre de caracteres qu'il y a dans la chaine et finissent pas forcement par 0 (en C, oui) ; ici elles ont l'air de finir par 1 puis 0, ou par 0 seulement (pour la derniere chaine). 00000008 00 10 07 00 0D 07 00 0E    <-- J'en sais rien du tout :) 00000010 0A 00 01 00 04 0C 00 06    (ptet un header inconnu...) 00000018 00 05 01 00  On a ensuite quelques chaines : "()V" <-- ??? "" <-- un evenement ? "Code" <-- ma foi... "ConstantValue" <-- parametre de ... koi ?? "Exceptions" <-- mouais, les bugs, koi ! "LineNumberTable" <-- ouais quoi ?? "LocalVariables" "SourceFile" "java/applet/Applet" <-- on reconnait les / qui correspondent aux repertoires sous unix c'est donc les librairies demandees "prog0" <-- le nom de la classe "prog0.java" <-- le nom du fichier source Bon, ca devait etre la table des chaines comme y'a dans les .exe ET PUIS... 000000A8 21 00 02 00 01 00 00 00 !   000000B0 00 00 01 00 01 00 06 00    000000B8 05 00 01 00 07 00 00 00    000000C0 1D 00 01 00 01 00 00 00    000000C8 05 2A B7 00 03 B1 00 00 *+ _ 000000D0 00 01 00 0A 00 00 00 06   000000D8 00 01 00 00 00 03 00 01    000000E0 00 0C 00 00 00 02 00 0F  ¤ <--- et ça j'en sais rien du tou :((( Bon. Si on veut l'analyser mieux, il faut : 1 - modifier un chouya (ca c'ecrit comme ca?) le code source 2 - compiler (si ca foire pas encore avec ce !©§ de javac) 3 - comparer CA c'est de la technique, hein :) Mais d'abord un petit util pour extraire les chaines du .class : // CLASS2TXT.C #include #include #include void main(void) { FILE *fin,*fout; unsigned char b; int i=0,j; printf("\nDECODER DE CLASS\n"); fin = fopen("CLASS~1.CLA","rb"); // rentrez vous meme le nom, faignant ! fout = fopen("CLASS.TXT","wb"); do { j = getc(fin); for (i=0;i ////////////////////////////////////////// // CHAINES RENTREES DANS LE CODE SOURCE // ////////////////////////////////////////// Acces autorise Acces refuse Arial Code ConstantValue Couleur de fond en valeur hexadecimale, par defaut: 000000 (i.e. noir) Couleur de ligne en valeur hexadecimale, par defaut: C0C0C0 D EFFACER Entrez la cle (de 3 a 12) : Entrez le mot de passe : Exceptions Fichier de mot de passe corrompu. I Il faut preciser une URL dans le fichier des mots de passe en cas de succes Il vous reste Il vous reste essais Il vous reste 0 essais LMD5; LMonButton; La couleur de fond doit etre un entier au format hexadAccimal. La couleur de ligne doit etre un entier au format hexadAccimal. La taille de la fonte doit etre un entier. Le contenu du fichier des mots de passe est corrompu. Le nom du fichier des mots de passe est incorrect. Le style de la fonte doit etre un entier. LineNumberTable ////////////////////////////////// // INTERLUDE DE LIBS UTILISEES // ////////////////////////////////// Ljava/awt/Color; Ljava/awt/Font; Ljava/awt/Insets; Ljava/awt/Label; Ljava/awt/TextField; Ljava/io/PrintStream; Ljava/lang/Object; Ljava/lang/String; Ljava/net/URL; LocalVariables MD5 MonButton Nom de la fonte a utiliser, par defaut: Arial Nom de la frame dans laquelle afficher l'URL de succes ou d'echec, par defaut: _self Nombre d'essai avant echec, par defaut: 10 Parametre essais corrompu: Ce parametre doit A¦tre un entier Password Password v. 0.2 Ecrit by Olivier Thomann le 28/08/1998. Password.java ResizableLabel SourceFile String Style de la fonte A utiliser, par defaut: PLAIN (0), ITALIC = 2 et BOLD = 1 Taille de la fonte A utiliser, par defaut: 12 Tentative d'intrusion detectee Texte pour le bouton effacer, par defaut: EFFACER Texte pour le bouton valider, par defaut: VALIDER Texte pour le label devant la cle, par defaut: Entrez la cle (de 3 A 12) : Texte pour le label devant le mot de passe, par defaut: Entrez le mot de passe : Texte A afficher devant le message compteur_texte lorsque le compteur arrive A 0, par defaut: Transfert des donnees... Texte A afficher en cas d'echec, par defaut: Acces refuse Texte A afficher en cas de succes, par defaut: Acces autorise Texte A afficher lorsque le compteur arrive A 0, par defaut: Transmission des donnees aux autorites federales... Transmission des donnees... URL mal formee. URL oA1 aller en cas d'echec, pas de valeur par defaut VALIDER [Ljava/lang/String; [[Ljava/lang/String; ///////////////////////////////// // NOMS DES FUNCS ET VARIABLES // ///////////////////////////////// _self add append backgroundColor black check clear compteurLabel computeDigest cookies.txt // <-------- tres interressant ... couleur_fond couleur_ligne disable effacer effacer_texte encoder equals essais essaisRestantsDefinitif essais_restant_definitif essais_texte failedURL fichierPassord fichier_password fill font fontSize fontStyle foregroundColor getAppletContext getAppletInfo getChars getCodeBase getFontMetrics getMaxAscent getParameter getParameterInfo getText gridheight gridwidth handleEvent hasMoreTokens id info init insets int intValue //////////////////////////////////////////////////////// // NOMS DES CLASSES PREDEFINIES QUI ONT ETE UTILISEES // //////////////////////////////////////////////////////// java/applet/Applet java/applet/AppletContext java/awt/Color java/awt/Component java/awt/Container java/awt/Event java/awt/Font java/awt/FontMetrics java/awt/GridBagConstraints java/awt/GridBagLayout java/awt/GridLayout java/awt/Insets java/awt/Label java/awt/Panel java/awt/TextComponent java/awt/TextField java/io/DataInputStream java/io/IOException java/io/PrintStream java/lang/Integer java/lang/InterruptedException java/lang/Math java/lang/NumberFormatException java/lang/String java/lang/StringBuffer java/lang/System java/lang/Thread java/net/MalformedURLException java/net/URL java/util/NoSuchElementException java/util/StringTokenizer //////////////////// // NOMS DES FUNCS // //////////////////// key keyTexte key_texte length max nextToken nom_fonte nom_frame openStream out parseInt password passwordContents passwordTexte password_texte println readLine red repaint requestFocus resize setBackground setConstraints setEchoCharacter setFont setForeground setLabel setLayout setText showDocument sleep // <--- oue, c long en effet start statusEchec statusEchecDefinitif statusLabel statusSucces status_echec status_echec_definitif status_succes stop stringWidth style_fonte taille_fonte target targetFrame toString url_echec url_echec n'est pas une URL valide. validate valider valider_texte valueOf weightx weighty Bon, ct long mais ct aussi le seul moyen. cookies.txt est un fichier qui se presente comme ca : 3 030772286418daae1c000ddd16067bd7 http://www.mygale.org/08/jud/_private/bravo3.htm 4 66cb824d092f240a2746bcf778c2de60 http://www.mygale.org/08/jud/_private/bravo4.htm 5 3493d410039762d93df50189041126b5 http://www.mygale.org/08/jud/_private/bravo5.htm 6 65e1061f6742538a07e083b70e1ae1b6 http://www.mygale.org/08/jud/_private/bravo6.htm 7 426b298b2a377d4b0d1cc4036a621162 http://www.mygale.org/08/jud/_private/bravo7.htm 8 615ce2ee13c419de0304e1ae32888425 http://www.mygale.org/08/jud/_private/bravo8.htm 9 499b58942aca932a394ce448336dbe11 http://www.mygale.org/08/jud/_private/bravo9.htm 10 3efa6eb54efc3d4c5017a421415cd3bb http://www.mygale.org/08/jud/_private/bravo10.htm 11 39e98d43684556d21dd529275b32cf65 http://www.mygale.org/08/jud/_private/bravo11.htm 12 65b40df516417b72236c86f866493c15 http://www.mygale.org/08/jud/_private/bravo12.htm PS : bien sur il suffit d'aller sur un des .htm mais c plus marrant.. Bon, il serait ptet temps de vous dire la regle du jeu : on doit deviner un mot qui a de 3 a 12 lettres (genre mots croises) (en plus on a un indice !! c trop facile ! c honteux) pour les 3 lettres, l'indice etait "habitation". Un copain a pense a "nid". Je pense que c'est la seule solution. donc il faut a partir de 030772286418daae1c000ddd16067bd7 aller a "nid", ou aut'chose d'ailleurs... tiens ? et "nef" ?? ouais, pourquoi pas... bon, en attendant, j'ai quoi sous la main : il a utilise "java/lang/Math" donc je suis plutot dans la grosse bouze... "getChars" et "getCodeBase"... Ca doit servir pour trafiquer les chaines de caracteres... il n'a pas l'air de faire de grosses operations... enfin, non, j'en sais rien en fait... mais quand meme il n'a pas des chiees de variables. Je vais faire qq essais pour essayer de cracker les significations des codes hexa... Qu'est-ce qu'on peut remarquer sur cette sequence ? 030772286418daae1c000ddd16067bd7 66cb824d092f240a2746bcf778c2de60 3493d410039762d93df50189041126b5 65e1061f6742538a07e083b70e1ae1b6 426b298b2a377d4b0d1cc4036a621162 615ce2ee13c419de0304e1ae32888425 499b58942aca932a394ce448336dbe11 3efa6eb54efc3d4c5017a421415cd3bb 39e98d43684556d21dd529275b32cf65 65b40df516417b72236c86f866493c15 Ils ont chaqun 32 codes hexa, donc 16 octets et 128 bits. Si on fait la somme de chaque octet pour toute la serie, on obtient : 1308 1790 1580 1745 1209 1876 1697 1925 1738 1644 Euh... ouais, c'est pas tres convainquant. Ca n'augmente pas ni ne diminue pas globalement. Mais ils sont pas centres sur la moyenne logique, qui est de 2048 ! Ils sont plus bas... legerement plus bas... euh.. c'est difficile de trouver un motif la dedans... Bon ! Ca me fait chier, j'arrete. ------------------------------------------------------------------------------------------ - CONCLUSION - ------------------------------------------------------------------------------------------ Le point fort de securite en Java : + il est compile (enfin, traduit en language special) et non interprete (comme le javascript) Les points faibles en securite pour le java : - les chaines de caracteres qui sont dans le .class - on peut TOUJOURS telecharger un applet si il marche sur la page web (toujours) donc on peut le tester a fond en off-line, ce qui est impossible avec le cgi - y'a pas vraiment de securite avec le java. C'est comme un .exe a cracker. - il existe un dejavateur : le Java Class Decompiler (JCD). Je l'avais, mais je l'ai paume. Si je le retrouve, je le fous sur le pseudoftp de beef13.