======*===========*====*==========*============*=====*==*=======
* 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.