<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Segmentation fault &#187; Développement</title>
	<atom:link href="http://www.segmentationfault.fr/categories/dev/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.segmentationfault.fr</link>
	<description>Projets d’un consultant en sécurité informatique</description>
	<lastBuildDate>Fri, 15 Feb 2019 08:02:10 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.4.2</generator>
		<item>
		<title>Problèmes liés aux interruptions</title>
		<link>http://www.segmentationfault.fr/securite-informatique/problemes-lies-aux-interruptions/</link>
		<comments>http://www.segmentationfault.fr/securite-informatique/problemes-lies-aux-interruptions/#comments</comments>
		<pubDate>Tue, 21 Apr 2009 18:52:31 +0000</pubDate>
		<dc:creator>Emilien Girault</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[Reverse Engineering]]></category>
		<category><![CDATA[Sécurité informatique]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[drivers]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[kernel]]></category>
		<category><![CDATA[ring 0]]></category>
		<category><![CDATA[x86]]></category>

		<guid isPermaLink="false">http://www.segmentationfault.fr/?p=609</guid>
		<description><![CDATA[Dans le cadre de mon stage, je m&#8217;intéresse au fonctionnement des interruptions de l&#8217;architecture x86. Il s&#8217;agit d&#8217;un mécanisme complexe mais extrêmement important pour comprendre comment un système d&#8217;exploitation arrive à fonctionner. Si j&#8217;écris ce post, c&#8217;est parce que je me suis pris la tête sur des problèmes qui y sont liés&#8230;  Je viens d&#8217;en [...]]]></description>
			<content:encoded><![CDATA[<p>Dans le cadre de mon stage, je m&rsquo;intéresse au fonctionnement des interruptions de l&rsquo;architecture x86. Il s&rsquo;agit d&rsquo;un mécanisme complexe mais extrêmement important pour comprendre comment un système d&rsquo;exploitation arrive à fonctionner. Si j&rsquo;écris ce post, c&rsquo;est parce que je me suis pris la tête sur des problèmes qui y sont liés&#8230;  Je viens d&rsquo;en trouver les causes, et je pense que cela pourra en intéresser plus d&rsquo;un.<span id="more-609"></span></p>
<h3>Généralités sur les interruptions</h3>
<p>Une interruption est un événement particulier qui peuvent se produire lors de l&rsquo;exécution d&rsquo;un programme. A chaque type d&rsquo;interruption est associé un numéro appelé <em>vecteur d&rsquo;interruption</em>, connu du ou des processeur(s). Pour simplifier, les interruptions peuvent provenir de deux sources : le logiciel et le matériel. Les interruptions matérielles sont générées par les périphériques (clavier, souris, cartes, timers, disques durs&#8230;) et sont transmises au processeur par l&rsquo;APIC (<em>Advanced Programmable Interrupt Controller</em>).  Les interruptions logicielles peuvent être quant à elles déclenchées volontairement par une instruction (<em>int</em>) ou de façon accidentelle par une erreur arithmétique, logique, de protection, etc. Dans ce cas, on parle souvent d&rsquo;<em>exception</em> et de <em>fautes</em>.</p>
<p>Généralement, les interruptions (aussi bien matérielles que logicielles) sont susceptibles de se déclencher à n&rsquo;importe quel moment dans l&rsquo;exécution d&rsquo;un programme, et chaque processeur doit savoir comment traiter chacune d&rsquo;entre elles. A chaque vecteur d&rsquo;interruption on associe alors un <em>handler d&rsquo;interruption</em>, qui est une fonction qui sera appelée automatiquement quand l&rsquo;interruption sera générée.  On place ces fonctions dans une table, l&rsquo;IDT, pour <em>Interrupt Descriptor Table</em>. Il est important de noter qu&rsquo;il y a une IDT par processeur, afin que chacun puisse avoir si besoin un comportement différent pour chaque interruption.</p>
<p>Il existe deux types d&rsquo;interruptions matérielles, les masquables (les IRQ) et les non masquables (la NMI et la SMI) qu&rsquo;on ne traitera pas ici en raison de leur grande particularité. Chaque interruption matérielle possède une priorité, qui est gérée par l&rsquo;APIC. Pour faire simple, ce composant est relié aux périphériques par des lignes d&rsquo;IRQ (Interrupt Requests) et se charge de faire le médiateur entre tous ces périphériques et le ou les processeur(s). Son rôle est en gros de transformer ces IRQ en demandes d&rsquo;interruptions avec le vecteur associé.  Comme plusieurs IRQ peuvent intervenir en même temps, l&rsquo;APIC définit des priorités afin de transmettre les plus urgentes d&rsquo;abord.</p>
<p>Dans certains cas, le processeur peut ne pas vouloir être dérangé par une interruption. C&rsquo;est le cas par exemple lorsqu&rsquo;il est en train de modifier des structures globales en mémoire. Il a alors la possibilité d&rsquo;ignorer les interruptions qu&rsquo;il va recevoir de deux manières. La première, que je ne détaillerai pas, est de ne masquer que celles dont la priorité est inférieure à un certain seuil (appelé IRQL sous Windows) en communiquant avec l&rsquo;APIC. La deuxième est de masquer la totalité des interruptions et c&rsquo;est celle que nous allons détailler.</p>
<h3>Subtilité sur le masquage</h3>
<p>C&rsquo;est le registre EFLAGS  et plus précisément son bit IF (bit 9) qui contrôle si les interruptions masquables sont activées ou non. Ce bit est modifiable par l&rsquo;intermédiaire des instructions <code>cli</code> pour masquage et <code>sti</code> pour démasquage, ou bien en utilisant <em>pushf</em> / <em>popf</em> associés à des masques.</p>
<p>Attention, le masquage des interruptions n&rsquo;affecte que les interruptions matérielles ! Les interruptions logicielles (ainsi que les interruptions NMI et SMI, très particulières) ne sont pas affectées par ces opérations. Autrement dit, vous aurez beau baisser l&rsquo;IRQL ou faire un <code>cli</code>, une exception due à une division par zéro ou à un défaut de page pourra toujours survenir.</p>
<h3>Problème n°1 : DbgPrint(), c&rsquo;est le mal</h3>
<p>J&rsquo;ai fait tous mes tests en machine virtuelle. Comme le développement de driver n&rsquo;est jamais sûr à 100% et que je voulais tout de même avoir quelque chose de fonctionnel, j&rsquo;ai réalisé un petit script qui charge le driver et le décharge 100 fois de suite, en lançant en plus des programmes divers pour solliciter l&rsquo;OS un maximum. Le tout étant de prouver que le driver n&rsquo;explose pas à la première interruption, bien entendu.</p>
<p>Dans mon cas, je devais hooker l&rsquo;interruption n°14 correspondant au défaut de page (<em>page fault</em>), en insérant du code avant de rappeler le handler par défaut de Windows. Je rappelle que cette exception (logicielle) se produit quand une page virtuelle n&rsquo;est mappée à aucune adresse physique (soit parce qu&rsquo;elle a été swappée sur disque, soit parce qu&rsquo;elle n&rsquo;existe tout simplement pas). Cela se produit quand on tente d&rsquo;accéder à une page dont le descripteur PTE a son premier bit (bit P) à 0.</p>
<p>J&rsquo;ai donc commencé par concevoir un handler minimal qui ne faisait rien à part empiler tous les registres, les dépiler puis appeler le handler de Windows, <code>KiTrap0E</code>. Jusqu&rsquo;ici, tout fonctionne, sauf que je n&rsquo;ai pas vraiment de preuve que ma routine est appelée (vu que je n&rsquo;ai aucune trace).</p>
<p>Je me décide donc à insérer des <code>DbgPrint()</code> dans le code de la routine. Et là, c&rsquo;est le drame : j&rsquo;obtiens des traces certes, mais j&rsquo;en obtiens tellement que la VM freeze ou affiche un écran bleu au bout de quelques secondes. Il faut croire que les défauts de page sont très nombreux sous Windows&#8230; Mais pourquoi ça plante maintenant et pas avant ? L&rsquo;explication est liée au visualisateur de traces (j&rsquo;utilise DebugView). Lorsque <code>DbgPrint()</code> est appelé, le message est récupéré par le noyau puis par DebugView. Je ne sais pas exactement pourquoi, mais apparemment quand il y a beaucoup de messages de récupérés, DebugView commence à provoquer des défauts de page (probablement à cause du fait qu&rsquo;il se fait swapper par l&rsquo;OS). Comme ces défauts de pages sont à leur tour catchés par mon handler, ils entraînent d&rsquo;autres appels à <code>DbgPrint()</code>&#8230; Bref, une belle boucle qui finit par exploser tôt ou tard.</p>
<p>Au final, je renonce donc  à afficher des traces, vu que cela perturbe plus le système qu&rsquo;autre chose. En plus j&rsquo;ai ma preuve que mon handler est appelé, vu que ça plante <img src='http://www.segmentationfault.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h3>Problème n°2 : sti, c&rsquo;est aussi le mal</h3>
<p>Le réel but de mon handler est de modifier une structure assez cruciale du noyau sous certaines conditions. Afin d&rsquo;éviter que cette modification entraîne des problèmes de concurrence, je décide de masquer les interruptions avant le traitement (<code>cli</code>), et de les démasquer ensuite à l&rsquo;aide de  et <code>sti</code>. Je lance le driver. Pas de crash. Je commence à crier victoire, et au moment ou je lance mon script de déchargement, j&rsquo;ai le droit à un écran bleu. Je regarde le code de déchargement, il ne fait absolument rien de méchant. Je relance, idem. Je finis par comprendre que ce n&rsquo;est pas le déchargement du driver qui foire, mais juste le fait de lancer un programme, car cela provoque un défaut de page&#8230; C&rsquo;est donc bien mon handler qui pose problème, mais où ?</p>
<p>Je supprime ma modification de variable globale, ça plante toujours. Pourtant je n&rsquo;ai plus que <code>cli</code> et <code>sti</code> dans mon handler (en plus de l&rsquo;appel au handler par défaut). Je retire <code>sti</code> et je constate que ça marche ! C&rsquo;est donc cette instruction qui est responsable du plantage du driver&#8230; mais pourquoi ? En fait, il se trouve que lors des appels au handler de défaut de page, les interruptions sont <em>déjà masquées</em>. C&rsquo;est dû au fait que l&rsquo;interruption correspondant au défaut de page possède un descripteur dans l&rsquo;IDT qui précise que l&rsquo;IF doit être mis à 0 lors de l&rsquo;appel du handler (c&rsquo;est une <em>interrupt gate</em>, selon Intel). Ainsi, lors de l&rsquo;appel au handler, l&rsquo;instruction <code>cli</code> ne fait absolument rien (le bit IF d&rsquo;EFLAGS est déjà à 0)&#8230; Le problème, c&rsquo;est que <code>sti</code> le passe à 1, ce qui autorise les interuptions ! Si jamais le défaut de page s&rsquo;est produit dans une zone critique de l&rsquo;OS et qu&rsquo;une interruption survient précisément à ce moment, le kernel se vautre. Cela ne se produit peut-être pas à tous les coups, mais croyez moi, ça arrive (faites le test pour vous en convaincre).</p>
<p>Comment patcher cela ? Ne pas masquer les interruptions dans un handler de défaut de page, puisqu&rsquo;elles le sont déjà. La solution, c&rsquo;est tout simplement de ne rien faire <img src='http://www.segmentationfault.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h3>Conclusion</h3>
<p>Morale de l&rsquo;histoire : utiliser <code>DbgPrint()</code> ou <code>sti</code> dans un handler de défaut de page est une mauvaise idée. Pour déboguer, préférez utiliser des variables globales plutôt que des fonctions à effet de bords incontrôlables. Et ne cherchez pas à masquer (et surtout à démasquer) les interruptions qui le sont déjà . J&rsquo;espère que ce post vous aura épargné un long moment de galère. En tout cas, j&rsquo;aurais aimé en lire un du même type plus tôt !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.segmentationfault.fr/securite-informatique/problemes-lies-aux-interruptions/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>XeeK, framework d&#8217;exploitation pour XSS</title>
		<link>http://www.segmentationfault.fr/projets/xeek-framework-exploitation-xss/</link>
		<comments>http://www.segmentationfault.fr/projets/xeek-framework-exploitation-xss/#comments</comments>
		<pubDate>Thu, 13 Nov 2008 21:27:15 +0000</pubDate>
		<dc:creator>Emilien Girault</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[Projets]]></category>
		<category><![CDATA[Sécurité informatique]]></category>
		<category><![CDATA[faille web]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[projet]]></category>
		<category><![CDATA[XeeK]]></category>
		<category><![CDATA[XSS]]></category>

		<guid isPermaLink="false">http://www.segmentationfault.fr/?p=307</guid>
		<description><![CDATA[La faille XSS, ou Cross-Site Scripting, est certainement la plus répandue sur le Web. Tous les débutants dans le domaine de la sécurité informatique ou du hacking la connaissent et savent comment voler un cookie ou afficher un message d&#8217;erreur, mais pensent trop souvent à tort que cette faille se limite à cela (j&#8217;ai déjà [...]]]></description>
			<content:encoded><![CDATA[<p>La faille XSS, ou <em>Cross-Site Scripting</em>, est certainement la plus répandue sur le Web. Tous les débutants dans le domaine de la sécurité informatique ou du hacking la connaissent et savent comment voler un cookie ou afficher un message d&rsquo;erreur, mais pensent trop souvent à tort que cette faille se limite à cela (j&rsquo;ai déjà posté un <a href="http://www.segmentationfault.fr/securite-informatique/la-xss-cette-faille-meconnue/">article</a> sur le sujet). D&rsquo;un autre côté, ceux qui programment un minimum en JavaScript/Ajax savent que ce langage permet de faire des merveilles en matière de pages dynamiques et contrôle de navigateur, mais ignorent souvent les possibilités offertes pour une personne malveillante. C&rsquo;est à partir de ces deux constats que m&rsquo;est venue une idée qui est en train de se concrétiser, et qui tient en un mot : XeeK.<span id="more-307"></span></p>
<h3>[EDIT]</h3>
<p>Le projet a subit de nombreux changements depuis la publication de ce billet. J&rsquo;ai publié la première version du projet <a href="http://www.segmentationfault.fr/projets/release-de-xeek-v0-1b/">ici</a> ; en attendant un tutorial vous pouvez retrouver des informations plus à jour <a href="http://www.segmentationfault.fr/projets/conference-sur-xeek-a-la-ndh-2010/">dans ce billet</a>. Gardez à l&rsquo;esprit que les informations qui suivent (et particulièrement le jargon associé à l&rsquo;outil ainsi que les fonctionnalités) ne sont plus complétement valides&#8230;</p>
<h3>Le projet</h3>
<p>XeeK, pour <em>XSS Easy Exploitation Kernel</em>, est un projet dont l&rsquo;objectif est le suivant : démontrer la puissance de la XSS en proposant un outil pour exploiter facilement ce type de faille. Les premières idées qui ont engendré ce projet me sont venues cet été, mais c&rsquo;est uniquement depuis quelques semaines que j&rsquo;ai vraiment commencé à y travailler.</p>
<h3>Un noyau et des modules</h3>
<p>Certains me trouveront peut-être un peu ambitieux, mais mon but serait de faire de XeeK une sorte de <em>Metasploit</em> pour la XSS. Pour dire les choses autrement, l&rsquo;objectif serait de proposer un framework, c&rsquo;est à dire un ensemble de classes, ou de modules capables d&rsquo;interagir ensemble. En fait, si le K de XeeK signifie <em>kernel</em> (noyau) c&rsquo;est parce qu&rsquo;il sera effectivement composé d&rsquo;un noyau proposant les fonctionnalités génériques de base et d&rsquo;une suite de modules qui pourront s&rsquo;y greffer. Dans l&rsquo;idéal, ces modules pourront être développés par n&rsquo;importe qui. A titre de comparaison, considérez le noyau Linux et ses modules, ou bien Firefox et ses extensions.</p>
<h3>Architecture</h3>
<p>Concrètement, XeeK se composera d&rsquo;une interface Web déployée sur un serveur appartenant à un attaquant, disons hacker.com. XeeK étant censé faciliter l&rsquo;exploitation des failles XSS, il appartient à l&rsquo;attaquant de découvrir ces failles ; je n&rsquo;envisage pour le moment pas d&rsquo;intégrer un scanner de ce type dans l&rsquo;outil. Une fois une XSS trouvée sur un site quelconque, disons victime.com, l&rsquo;attaquant pourra utiliser l&rsquo;interface de XeeK afin de générer un exploit personnalisé et paramétrable. Après avoir défini l&rsquo;exploit, celui-ci pourra être intégré à un lien piégé exploitant la XSS sur victime.com. Il ne restera plus à l&rsquo;attaquant qu&rsquo;à faire cliquer la victime sur ce lien&#8230;</p>
<p>Dans le jargon XeeK, l&rsquo;attaquant commencera par créer une <em>session</em>, choisira sa ou ses <em>victimes</em>, et sélectionnera un <em>scheduler</em>, ou ordonnanceur. C&rsquo;est ce composant qui déterminera comment les actions de l&rsquo;exploit seront exécutées sur le navigateur de la victime. J&rsquo;envisage pour le moment deux types de schedulers :</p>
<ul>
<li><em>Statique</em> — toutes les actions de l&rsquo;exploit seront définies à l&rsquo;avance et intégrées &laquo;&nbsp;en dur&nbsp;&raquo; de façon définitive.</li>
<li><em>Dynamique</em> — l&rsquo;exploit chargé sur le navigateur de la victime ne contiendra pas les actions proprement dit, mais un loader qui sera chargé de récupérer les actions sur le serveur XeeK (hacker.com) de façon dynamique et transparente. Ainsi, l&rsquo;attaquant pourra modifier l&rsquo;exploit et suivre la progression de la victime en temps réel.</li>
</ul>
<p>Les actions exécutées chez les victimes seront susceptibles de retourner des résultats qui seront visualisables directement par le biais de l&rsquo;interface. En fait, XeeK cachera l&rsquo;aspect technique de l&rsquo;exploitation et sera conçu pour simplifier au maximum les choses à l&rsquo;attaquant. Plus précisément, l&rsquo;attaquant aura devant lui une interface ressemblant à un debugger, à partir de laquelle il lance son exploit, observe sa progression et visualise les résultats. La différence avec un vrai debugger est que cet exploit sera exécuté sur les victimes et non sur sa propre machine&#8230;</p>
<h3>Une application : BotNet</h3>
<p>Puisque XeeK supportera plusieurs sessions en simultanée, chacune supportant elle-même plusieurs victimes, on en arrive à une des applications potentielles de l&rsquo;outil : faire office de BotNet. Pour ceux qui l&rsquo;ignorent, un botnet est un réseau de machines zombies contrôlable par un attaquant via un protocole quelconque. Ici, il s&rsquo;agira de simples requêtes HTTP. La différence avec les &laquo;&nbsp;vrais&nbsp;&raquo; botnets est qu&rsquo;ici, le code malveillant s&rsquo;exécutera uniquement lorsque la victime aura son navigateur d&rsquo;ouvert sur la page piégée.</p>
<p>Pour aider à la propagation du botnet, la possibilité la plus simple est d&rsquo;utiliser une XSS permanente, c&rsquo;est à dire quand l&rsquo;injection de code est enregistrée en dur sur le site et affecte tous les visiteurs. Ainsi chaque visiteur tombant sur la page piégée rejoindra automatiquement le botnet à son insu et exécutera le même exploit que ses collègues. Tout cela grâce à une malheureuse petite XSS&#8230;</p>
<p>Imaginez qu&rsquo;un site très connu et utilisé par des milliers de visiteurs soit vulnérable à une XSS permanente. Avec XeeK, il devient possible de lancer une attaque de masse contre tous les visiteurs de la page.</p>
<h3>Fonctionnalités</h3>
<p>Qu&rsquo;est-ce que XeeK saura faire ? A vrai dire, les fonctionnalités définitives ne sont pas encore décidées (vu que les modules seront extensibles), mais voici un aperçu de ce que j&rsquo;envisage.</p>
<ul>
<li>Furtivité du point de vue du visiteur (le site exploité continue à fonctionner sans problèmes).</li>
<li>Exécution de code JavaScript arbitraire.</li>
<li>Envoi de requêtes asynchrones (Ajax) vers le site vulnérable. Une des applications pourraît être d&rsquo;exploiter des éventuelles failles XSRF (<em>Cross Site Request Forgery</em>).</li>
<li>Envoi de requêtes asynchrones vers d&rsquo;autres sites.</li>
<li>Détournement de formulaire. Exemple : lorsque la victime remplit un des formulaires de la page, tout son contenu est envoyé sur hacker.com de façon transparente.</li>
<li>Récupération de cookies.</li>
<li>Récupération du contenu de la page (code HTML vu par la victime).</li>
<li>Plus généralement, récupération de n&rsquo;importe quelle variable accessible par JavaScript et DOM.</li>
<li>Traceur de visiteur. L&rsquo;exécution de l&rsquo;exploit continue même si le visiteur change de page, chaque nouvelle page visitée étant loguée et accessible directement par l&rsquo;attaquant.</li>
<li>Simulation de clic sur des liens / boutons / n&rsquo;importe quel élément graphique des pages.</li>
<li>Fonctionne aussi bien en HTTPS qu&rsquo;en HTTP ; cela ne change absolument rien.</li>
</ul>
<h3>Technologies</h3>
<p>XeeK est pour le moment développé à l&rsquo;aide de PHP, JavaScript, Ajax et MySQL. Bien entendu, les langages liés tels que CSS et HTML sont également utilisés à foison. Pour ce qui est de la compatibilité des navigateurs, pour être sincère je n&rsquo;ai encore utilisé que Firefox. Soyons honnête ; je ne suis ni designer ni un pros des subtilités de chaque navigateur. Mais je tiens à préciser qu&rsquo;avant d&rsquo;effectuer une release, je ferais mon possible pour au moins que la partie &laquo;&nbsp;victime&nbsp;&raquo; de l&rsquo;outil fonctionne sur IE qui est toujours, il faut le rappeler, le navigateur le plus utilisé. Je vise au moins IE7, peut-être IE6 mais il ne faut peut-être pas trop en demander pour une 1ère release <img src='http://www.segmentationfault.fr/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<h3>Release</h3>
<p>Je sens venir la question &laquo;&nbsp;<em>Quand XeeK sera-t-il publié ?</em>&laquo;&nbsp;. Je n&rsquo;ai malheureusement pas encore de réponse pour le moment. XeeK est encore au stade de prototype même si plusieurs fonctionnalités marchent déjà bien. Il me reste à concevoir la partie interface de l&rsquo;outil, améliorer deux/trois petites choses, tester la partie exploitation sous IE&#8230; Comme vous pouvez vous en douter je ne travaille pas sur ce projet à plein temps, j&rsquo;ai aussi des études. Pour donner une estimation, j&rsquo;espère pouvoir publier une première release avant 2009. Mais cela ne constitue pas une garantie&#8230; En effet, je préfère prendre mon temps pour bien faire les choses, plutôt que de sortir quelque chose de bancal le plus vite possible. Au pire, je sortirais une alpha ou béta avant sa vraie sortie.</p>
<p>XeeK sera publié sous license GPL (2 ou 3). En d&rsquo;autres termes, n&rsquo;importe qui pourra utiliser, développer et améliorer l&rsquo;outil à condition qu&rsquo;il publie ses travaux également sous GPL.</p>
<h3>Click and hack</h3>
<p>Certains me reprocheront peut-être :</p>
<blockquote><p><em>Tu n&rsquo;as pas honte, de mettre à disposition des scripts kiddies un outil aussi dangereux, où il suffit de cliquer pour pirater ?</em></p></blockquote>
<p>Je leur répondrai tout simplement non pour plusieurs raisons :</p>
<ul>
<li>Il existe des outils similaires encore lus puissants et plus simples à utiliser. Exemple : Metasploit. Personne ne se plaint de cet outil (enfin pas à ma connaissance) alors qu&rsquo;il permet de rooter une machine sans aucune connaissance technique. C&rsquo;est un outil utilisé par des professionnel pour le <em>penetration testing</em>.</li>
<li>Cet outil n&rsquo;est pas plus &laquo;&nbsp;dangereux&nbsp;&raquo; que les possibilités offertes par la faille XSS. Il essaye juste d&rsquo;utiliser ces possibilités au maximum.</li>
<li>En sortant cet outil et en le faisant connaître, j&rsquo;espère faire prendre conscience à plus d&rsquo;un que les failles XSS sont vraiment dangereuses, ce qui semble ne vraiment pas encore être le cas.</li>
</ul>
<p>Sur ce, je crois que j&rsquo;ai tout dit&#8230; Je vais continuer le développement de ce projet en espérant ne pas mettre trop de temps à le publier. Si vous avez des questions ou suggestions, les commentaires sont là pour ça !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.segmentationfault.fr/projets/xeek-framework-exploitation-xss/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Loguer l&#8217;entrée et la sortie standard d&#8217;un programme sous Linux</title>
		<link>http://www.segmentationfault.fr/dev/loguer-stdin-stdout/</link>
		<comments>http://www.segmentationfault.fr/dev/loguer-stdin-stdout/#comments</comments>
		<pubDate>Sat, 05 Apr 2008 12:12:20 +0000</pubDate>
		<dc:creator>Emilien Girault</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://www.segmentationfault.fr/?p=25</guid>
		<description><![CDATA[Voici un petit script Bash qui permet de loguer très facilement l&#8217;entrée (stdin) et la sortie standard (stdout) d&#8217;un programme, et ce sans le modifier. #!/bin/bash LOG_STDIN=/path/du/log/stdin.log LOG_STDOUT=/path/du/log/stdout.log PROG="/path/du/prog avec parametres eventuels" tee $LOG_STDIN &#124; $PROG &#124; tee $LOG_STDOUT Comme vous pouvez le voir, ce script repose sur la commande tee qui permet de dupliquer [...]]]></description>
			<content:encoded><![CDATA[<p>Voici un petit script Bash qui permet de loguer très facilement l&rsquo;entrée (stdin) et la sortie standard (stdout) d&rsquo;un programme, et ce sans le modifier.</p>
<pre>#!/bin/bash

LOG_STDIN=/path/du/log/stdin.log
LOG_STDOUT=/path/du/log/stdout.log
PROG="/path/du/prog avec parametres eventuels"

tee $LOG_STDIN | $PROG | tee $LOG_STDOUT</pre>
<p>Comme vous pouvez le voir, ce script repose sur la commande tee qui permet de dupliquer un flux.Il suffit de lancer ce script à la place du programme que vous souhaitez espionner. Cette astuce pourra être utile aussi bien au développeur qu&rsquo;au <em>reverse-engineer</em>&#8230;</p>
<p>Pour la petite histoire, j&rsquo;ai développé ce petit script dans le cadre d&rsquo;un projet d&rsquo;intelligence artificielle. Le but est de réaliser un joueur artificiel de Jeu de Go. Notre équipe a choisis d&rsquo;utiliser le protocole <a href="http://www.segmentationfault.fr/wp-admin/www.lysator.liu.se/~gunnar/gtp" target="_blank">GTP</a> qui permet de faire communiquer des joueurs avec des interfaces graphiques. Ce script nous permet donc de déboguer plus facilement notre joueur car il permet de garder une trace des trames GTP échangées. Nous l&rsquo;avons également utiliser pour avoir une idée des commandes GTP échangées entre une interface comme <a href="http://qgo.sourceforge.net" target="_blank">qGo</a> et un joueur déjà existant tel que <a href="http://www.gnu.org/software/gnugo/gnugo.html" target="_blank">GNUGo</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.segmentationfault.fr/dev/loguer-stdin-stdout/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Injecteur de fautes pour application distribuée</title>
		<link>http://www.segmentationfault.fr/projets/injecteur-fautes-parallele/</link>
		<comments>http://www.segmentationfault.fr/projets/injecteur-fautes-parallele/#comments</comments>
		<pubDate>Mon, 24 Mar 2008 13:10:43 +0000</pubDate>
		<dc:creator>Emilien Girault</dc:creator>
				<category><![CDATA[Applications]]></category>
		<category><![CDATA[Développement]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Projets]]></category>
		<category><![CDATA[Sécurité informatique]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[calcul distribué]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[projet]]></category>

		<guid isPermaLink="false">http://www.segmentationfault.fr/projets/injecteur-fautes-parallele/</guid>
		<description><![CDATA[Dans le cadre d&#8217;un projet scolaire, je travaille sur un projet concernant la sécurité des grilles de calcul. Rappelons qu&#8217;une grille de calcul désigne un ensemble d&#8217;ordinateurs interconnectés et qui ne sont pas nécessairement homogènes. Ce type d&#8217;architecture est utilisé majoritairement pour faire tourner des applications nécessitant une très grande puissance de calculs. Avec le [...]]]></description>
			<content:encoded><![CDATA[<p>Dans le cadre d&rsquo;un projet scolaire, je travaille sur un projet concernant la sécurité des grilles de calcul. Rappelons qu&rsquo;une grille de calcul désigne un ensemble d&rsquo;ordinateurs interconnectés et qui ne sont pas nécessairement homogènes. Ce type d&rsquo;architecture est utilisé majoritairement pour faire tourner des applications nécessitant une très grande puissance de calculs. Avec le temps, la taille de ces application tend à augmenter, donc les besoins en matière de sécurité également. Le but du projet sur lequel je travaille en ce moment est de concevoir un injecteur de fautes pour application distribuée. Cet injecteur doit permettre en quelque sorte de faire planter une application tournant en parallèle sur plusieurs machines, afin de mettre à l&rsquo;épreuve sa tolérance aux fautes. Ce billet présente rapidement l&rsquo;architecture de notre logiciel, qui est toujours en développement.</p>
<p>Pour concevoir une application parallèle, on utilise assez souvent la programmation par messages. Dans le cadre de notre projet, nous utilisons la bibliothèque <strong>LAM/MPI</strong> qui fournit toute une API permettant d&rsquo;envoyer des messages à des processus tournant sur des machines distantes. De plus, le but étant d&rsquo;injecter des fautes, nous avons choisit de provoquer ces fautes lors des envois et réceptions de messages. Ainsi nous pouvons facilement simuler aussi bien les pannes logicielles (déni de service) et matérielles (coupure de lien d&rsquo;un réseau, paquet perdu ou corrompu). Pour détourner les fonctions fournies par la bibliothèque LAM/MPI, nous utilisons la variable d&rsquo;environnement <strong>LD_PRELOAD</strong>. Cette variable des systèmes UNIX/Linux permet de charger dynamiquement une bibliothèque au lancement d&rsquo;une application. Le point intéressant est que cette bibliothèque peut redéfinir des fonctions qui existent déjà dans les autres bibliothèques, donc peut potentiellement les appeler tout en modifiant leur comportement.</p>
<p>LD_PRELOAD permet alors de modifier le comportement d&rsquo;une application tout en n&rsquo;ayant pas besoin de la recompiler ! Il est toutefois important de préciser que cette technique ne permet de détourner (<em>hooker</em>) que les fonctions définies dans des librairies dynamiques. C&rsquo;est un point crucial et qui nous a posé quelques problèmes. En effet nous utilisions au départ la librairie MPICH 1, et il se trouve que lorsqu&rsquo;une application est compilée avec, les appels MPI sont liés de manière statique. Un simple appel à la commande ldd permet de le voir. C&rsquo;est pourquoi nous avons choisis d&rsquo;utiliser LAM/MPI à la place.</p>
<p>Ainsi, nous avons développé une bibliothèque dynamique (fichier .so) dont le but est de venir d&rsquo;interposer entre l&rsquo;application parallèle et LAM/MPI. Cette bibliothèque (que nous avons nommé bibliothèque d&rsquo;interposition) redéfinit les fonctions MPI_Send() et MPI_Recv() en injectant des fautes comme des corruptions de données et des dénis de service. Les fautes ne sont pas générées de manière permanentes ; nous utilisons en plus un processus qui tourne en tâche de fond (démon) qui communique avec la librairie par l&rsquo;intermédiaire d&rsquo;un segment de mémoire partagé. Ce démon est en réalité un serveur utilisant CORBA. Son rôle est de rester en attente de requêtes et de dialoguer avec la librairie pour déclencher l&rsquo;injection de fautes. Il surveille également l&rsquo;application ainsi que le système par l&rsquo;intermédiaire de sondes logicielles afin de suivre en temps réel les valeurs de quelques variables, comme la charge CPU, l&rsquo;occupation mémoire, etc. Ces valeurs sont sauvegardées dans une base de données pour être retraitées plus tard par un module de statistiques.</p>
<p>Sur chaque machine tournent donc : une instance de l&rsquo;application distribuée, une instance de la bibliothèque d&rsquo;interposition, et une instance du démon. Mais en plus de tout cela, il faut être capable de déployer l&rsquo;application parallèle. Nous avons donc conçu un module dédié à cela, le simulateur. Il est contrôlable en ligne de commande ou via une interface graphique. Son but est de lancer l&rsquo;application parallèle, les démons et activer le détournement de fonction en exportant la variable LD_PRELOAD sur toutes les machines.</p>
<p>Ce projet, bien que relativement complexe, se révèle très intéressant. Cela nous a permis de découvrir et d&rsquo;utiliser des libraires et des technologies très utiles, comme CORBA, MPI, Boost, MySQL++. Nous utilisons également Flex et Bison pour la conception de l&rsquo;interpréteur de commandes du simulateur.</p>
<p>Au fut et à mesure du développement, je mettrai sans doute en ligne quelques billets exposant de façon plus détaillée la conception de certains des modules.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.segmentationfault.fr/projets/injecteur-fautes-parallele/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Faille dans Apache : Contourner les .htaccess avec &#171;&#160;Limit GET POST&#160;&#187;</title>
		<link>http://www.segmentationfault.fr/securite-informatique/contourner-htaccess-limit-get-post/</link>
		<comments>http://www.segmentationfault.fr/securite-informatique/contourner-htaccess-limit-get-post/#comments</comments>
		<pubDate>Tue, 26 Feb 2008 14:10:59 +0000</pubDate>
		<dc:creator>Emilien Girault</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[Sécurité informatique]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[faille web]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.segmentationfault.fr/secu-info/contourner-htaccess-limit-get-post/</guid>
		<description><![CDATA[Le week-end dernier, j&#8217;ai reçu un coup de fil d&#8217;un ami (Geo). Il m&#8217;annonçait qu&#8217;il avait réussi à contourner le .htaccess que j&#8217;avais placé pour sécuriser la zone admin de Ghosts In The Stack. Perplexe, je lui ai demandé comment il avait fait&#8230; et il s&#8217;avère que cela serait du à Apache, qui a tendance [...]]]></description>
			<content:encoded><![CDATA[<p>Le week-end dernier, j&rsquo;ai reçu un coup de fil d&rsquo;un ami (Geo). Il m&rsquo;annonçait qu&rsquo;il avait réussi à contourner le .htaccess que j&rsquo;avais placé pour sécuriser la zone admin de <a href="http://www.ghostsinthestack.org" target="_blank">Ghosts In The Stack</a>. Perplexe, je lui ai demandé comment il avait fait&#8230; et il s&rsquo;avère que cela serait du à Apache, qui a tendance à exécuter les requêtes qu&rsquo;il ne comprend pas comme étant des requêtes GET. Concernant les autres serveurs Web, je n&rsquo;ai pas pu tester car je n&rsquo;en ai pas d&rsquo;autres sous la main. Voici quelques éléments pour comprendre comment tirer profit de la faille, et comment éviter de se faire avoir.<span id="more-18"></span></p>
<h3>Mise en évidence de la faille</h3>
<p>Supposons que nous disposons d&rsquo;un serveur Apache local et que nous avons une page index.php très simple comme ceci :</p>
<pre>&lt;h1&gt;Bonjour !&lt;/h1&gt;</pre>
<p>Pour accéder à la page, nous accédons à l&rsquo;URL http://127.0.0.1/~trance/vuln/ avec un navigateur Web. La requête envoyée est grossièrement la suivante :</p>
<pre>GET http://127.0.0.1/~trance/vuln/ HTTP/1.1
Host: 127.0.0.1</pre>
<p>La réponse reçue comporte alors le code HTML de la page Web. Jusqu&rsquo;ici, tout est normal : Apache n&rsquo;a fait qu&rsquo;interpréter la requête GET qu&rsquo;on lui a envoyé. Maintenant, imaginez que nous envoyons une requête mal formée qui n&rsquo;est pas de type GET, comme :</p>
<pre>n1Mp0rTeKwa http://127.0.0.1/~trance/vuln/ HTTP/1.1
Host: 127.0.0.1</pre>
<p>Et là, nous constatons qu&rsquo;Apache ne fait absolument aucune différence entre cette et la requête précédente ! Il n&rsquo;y a aucune erreur ; il renvoie la même chose. A première vue, cela ne choque pas forcément, mais on s&rsquo;aperçoit assez vite que l&rsquo;on peut tirer profit de cette faille pour contourner certaines protections .htaccess.</p>
<h3>Contourner le &laquo;&nbsp;Limit GET POST&nbsp;&raquo;</h3>
<p>Dans de nombreux cas, un webmaster peut souhaiter restreindre l&rsquo;accès à un fichier ou à un dossier sur son site Web. Pour cela, il place des fichiers .htaccess. Ces fichiers modifient localement la configuration d&rsquo;Apache et utilisent une certaine syntaxe qui permet de faire des choses assez puissantes. La description de cette syntaxe est connue, et beaucoup de sites Web l&rsquo;illustrent. Certains proposent une solution simple pour protéger l&rsquo;accès à un fichier par un mot de passe. Il suffit, selon eux, de créer un .htaccess selon ce modèle :</p>
<pre>&lt;Files fichierAProteger.php&gt;

AuthUserFile /chemin/vers/.htpasswd
AuthName "Zone à accès restreint"
AuthType Basic
    &lt;Limit GET POST&gt;
    require valid-user
    &lt;/Limit&gt;
&lt;/Files&gt;</pre>
<p>Ce fichier permet d&rsquo;indiquer à Apache de refuser toute requête POST ou GET si l&rsquo;utilisateur n&rsquo;est pas identifié avec un login et un mot de passe apparaissant dans le fichier .htpasswd correspondant. En fait, peu importe qu&rsquo;il y ait de .htpasswd ; la faille ne se situe pas à ce niveau.</p>
<p>Souvenez-vous de ce que nous avons vu plus haut. Nous avons vu qu&rsquo;Apache interprétait toutes les requêtes qu&rsquo;il ne comprenait pas comme des requêtes GET. Ainsi, nous pouvons utiliser cela à notre avantage pour accéder à la page protégée sans s&rsquo;authentifier !</p>
<p>Exemple : imaginons que nous avons un .htaccess rudimentaire de ce type dans le même dossier :</p>
<pre>&lt;Limit GET POST&gt;
Deny from all
&lt;/Limit&gt;</pre>
<p>Logiquement, ce fichier est censé interdire tout accès aux pages du dossier. Le hic, c&rsquo;est que seules les requêtes GET ou POST sont concernées&#8230; Tentez d&rsquo;accéder à la page avec le navigateur : vous obtenez une erreur 403, puisque votre navigateur envoie implicitement un GET. Maintenant, envoyez une requête incorrecte avec un outil comme Netcat :</p>
<pre>n1Mp0rTeKwa  http://127.0.0.1/~trance/vuln/ HTTP/1.1</pre>
<pre>Host: 127.0.0.1</pre>
<p>Et vous obtiendrez la réponse suivante :</p>
<pre>&lt;h1&gt;Bonjour !&lt;/h1&gt;</pre>
<p>Voila donc comment contourner la protection&#8230; Simple, n&rsquo;est-ce pas ? Le pire, dans tout cela, c&rsquo;est que la majorité des webmasters protègent leurs sites de cette façon. Et j&rsquo;en faisais partie, jusqu&rsquo;à ce qu&rsquo;on me le signale <img src='http://www.segmentationfault.fr/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<h3>Correction</h3>
<p>La correction est ultra-simple : n&rsquo;utilisez pas l&rsquo;instruction &laquo;&nbsp;limit&nbsp;&raquo; quand vous voulez restreindre l&rsquo;accès à un fichier ou dossier ! Bannissez les lignes &laquo;&nbsp;&lt;Limit GET POST&gt;&nbsp;&raquo; et &laquo;&nbsp;&lt;/Limit&gt;&nbsp;&raquo; de vos fichiers .htaccess et vous éviterez ce genre de problèmes.</p>
<p>D&rsquo;ailleurs, la <a href="http://httpd.apache.org/docs/2.2/mod/core.html#limit" target="_blank">documentation d&rsquo;Apache</a> précise bien qu&rsquo;en général, il ne faut pas utiliser &lt;Limit&gt; lorsque l&rsquo;on cherche à restreindre l&rsquo;accès. Je cite : &laquo;&nbsp;<strong>In the general case, access control     directives should not be placed within a     <code class="directive">&lt;Limit&gt;</code> section.</strong>&nbsp;&raquo;</p>
<h3>Limites</h3>
<p>Un petit bémol cependant : pour le moment, nous n&rsquo;avons pas trouvé le moyen de fausser les requêtes POST en injectant des données. Ainsi, si vous avez des formulaires POST protégés par des .htaccess, ils sont <em>à priori</em> sûrs. Mais je vous conseille quand même de patcher vos .htaccess en retirant les lignes &laquo;&nbsp;&lt;Limit&gt;&nbsp;&raquo; un peu trop dangereuses&#8230;</p>
<p>D&rsquo;autre part, je suis loin d&rsquo;être un expert en configuration Apache. Il est possible qu&rsquo;il existe une option demandant à Apache de refuser systématiquement toutes les requêtes qui ne sont pas comprises. Si vous la connaissez, vous pouvez laissez un commentaire, cela m&rsquo;intéresse&#8230;</p>
<p>Merci encore à Geo pour m&rsquo;avoir averti de la présence de la faille sur GITS !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.segmentationfault.fr/securite-informatique/contourner-htaccess-limit-get-post/feed/</wfw:commentRss>
		<slash:comments>32</slash:comments>
		</item>
		<item>
		<title>#include is evil : Comment démêler un graphe d&#8217;inclusions en C++ ?</title>
		<link>http://www.segmentationfault.fr/applications/include-is-evil/</link>
		<comments>http://www.segmentationfault.fr/applications/include-is-evil/#comments</comments>
		<pubDate>Tue, 05 Feb 2008 13:46:15 +0000</pubDate>
		<dc:creator>Emilien Girault</dc:creator>
				<category><![CDATA[Applications]]></category>
		<category><![CDATA[Développement]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[développement]]></category>

		<guid isPermaLink="false">http://www.segmentationfault.fr/divers/include-is-evil/</guid>
		<description><![CDATA[Récemment, alors que je développais un projet C++ / OpenGL d&#8217;une ampleur relativement importante, j&#8217;ai du faire face à certains problèmes liés à l&#8217;utilisation du préprocesseur des langages C et C++. Qui ne connaît pas la directive #include ? Cette instruction bien que très pratique peut très vite devenir un véritable calvaire pour le développeur [...]]]></description>
			<content:encoded><![CDATA[<p>Récemment, alors que je développais <a href="dev/teapot-colony-wars/">un projet C++ / OpenGL</a> d&rsquo;une ampleur relativement importante, j&rsquo;ai du faire face à certains problèmes liés à l&rsquo;utilisation du préprocesseur des langages C et C++. Qui ne connaît pas la directive #include ? Cette instruction bien que très pratique peut très vite devenir un véritable calvaire pour le développeur lorsque le projet commence à prendre certaines proportions.</p>
<p>Ceux qui ont déjà eu des problèmes liés à #include savent de quoi je parle&#8230; Qu&rsquo;y a-t-il de plus énervant que de voir tout un projet se recompiler alors que l&rsquo;on vient juste de toucher à un seul fichier d&rsquo;en-tête ? J&rsquo;entends déjà certains me répondre sans hésiter : «Quand ça ne compile plus à cause d&rsquo;inclusions et de dépendances circulaires !», et ils ont probablement raison&#8230; Le but de ce billet est d&rsquo;illustrer les problèmes les plus courants que l&rsquo;on peut rencontrer en C++ et de proposer des solutions plus ou moins automatiques pour s&rsquo;en sortir. Je vais commencer par illustrer les problèmes de base et leurs solutions respectives, pour finalement converger vers une solution globale, comportant certaines règles à suivre qui permettent de résoudre les problèmes de ce style.  Notez que l&rsquo;approche de ce billet est progressive et que la solution  optimale est donnée à la fin.<span id="more-15"></span></p>
<p>En fait, après avoir été confronté à des problèmes de ce type et après avoir galéré à les résoudre, je me suis rendu compte que je ne maîtrisais pas comme il le fallait les actions du préprocesseur. Ce qui est plutôt gênant, quand arrivé à plusieurs milliers de lignes de code le projet refuse de compiler. En effet, dès que les projets atteignent une taille conséquente, la prise de tête peut rapidement commencer. Voici les principaux problèmes liés à l&rsquo;inclusion :</p>
<h3>Inclusion multiple</h3>
<p>Le premier type de problème se produit quand un fichier se retrouve inclus plusieurs fois. Il est tellement classique que tout le monde le connaît par coeur, et place donc des directives pour se protéger des inclusions multiples (les traditionnels #ifndef, #define et #endif). Je ne m&rsquo;éternise pas là dessus, j&rsquo;imagine que je ne vous apprends rien.</p>
<h3>Inclusion circulaire (agrégation, composition, utilisation&#8230;)</h3>
<p>Un problème plus vicieux peut néanmoins apparaître lorsqu&rsquo;un fichier se retrouve inclus avant un autre, ce dernier ayant besoin du premier. Ce genre de problème arrive lorsqu&rsquo;on déclare par exemple des classes possédant chacune une référence ou un pointeur vers l&rsquo;autre. Le compilateur étant par définition bête, il inclura comme il se doit les deux fichiers, mais inéluctablement, la définition d&rsquo;une classe se retrouvera avant celle de l&rsquo;autre. Et ça, le compilateur n&rsquo;aime pas, puisqu&rsquo;il tient absolument à ce que tous les symboles aient été déclarés à priori. Pour contourner ce genre de problèmes, on place simplement une directive non pas du préprocesseur, mais du langage C++ :</p>
<blockquote>
<pre>class MaClass;</pre>
</blockquote>
<p>Cette directive précise juste qu&rsquo;il sera question d&rsquo;une classe nommée MaClass dans la suite, et que le compilateur finira par trouver sa définition avant la fin de l&rsquo;analyse syntaxique. On nomme cette directive la &laquo;&nbsp;forward declaration&nbsp;&raquo;. Elle doit bien évidemment être placée <strong>avant</strong> chaque classe et doit être répétée autant de fois qu&rsquo;il le faut pour être certain que chaque symbole utilisé dans la définition de la classe ait bien été déclaré au préalable.</p>
<p>Il est important de noter que cette solution n&rsquo;est valable que lorsque l&rsquo;on utilisera des pointeurs ou des références sur des objets, qu&rsquo;ils soient des paramètres de méthodes ou des types de retours. Dans ces cas là, la directive #include n&rsquo;est même plus nécessaire. Ce point sera détaillé plus loin.</p>
<h3>Dépendance et inclusion circulaire</h3>
<p>Il s&rsquo;agit d&rsquo;un cas particulier de l&rsquo;inclusion circulaire que nous venons de voir, mais il faut comprendre qu&rsquo;il y a une nuance supplémentaire par rapport à la simple inclusion. Il y a en effet la notion de dépendance ; j&rsquo;entends par là qu&rsquo;une classe nécessite absolument la déclaration d&rsquo;une autre, et que cette déclaration doit avoir eu lieu <strong>avant</strong>. Dans le problème précédent, peu importe l&rsquo;ordre dans lequel le préprocesseur inclut les fichiers, l&rsquo;un sera placé avant l&rsquo;autre et cela ne gênera pas le compilateur. Cependant, il existe certains cas de force majeur, où le compilateur nécessite absolument la définition préalable d&rsquo;une classe ; c&rsquo;est notamment le cas de l&rsquo;<strong>héritage,</strong> mais également des <strong>constantes (#define) </strong>et des <strong>structures</strong>. Imaginez qu&rsquo;une classe B, définie dans un fichier B.h hérite d&rsquo;une classe A définie dans A.h. Naturellement, B.h inclut A.h, et cette inclusion est absolument nécessaire pour que le code soit compilable. Si vous aviez fait l&rsquo;inverse, c&rsquo;est à dire inclure B à partir de A, cela n&rsquo;aurais pas marché, même avec la directive &laquo;&nbsp;class&nbsp;&raquo;.</p>
<p>Supposez un instant que dans B.h vous ayez inclus le fichier A.h dans le bon sens, mais que A.h inclut un certain nombre de classes, chacune incluant une autre pour finalement former une chaîne d&rsquo;inclusion qui finirait par inclure B.h&#8230; Ce serait très gênant, car la compilation de B aurait beau aboutir, celle de A bloquerait. En effet, Lorsque le préprocesseur inspectera A.h en dépliant le code inclus par les #include, il finira par inclure B.h. Or B.h définit la classe B qui hérite de A&#8230; alors que la classe A n&rsquo;a finalement jamais été trouvée jusqu&rsquo;ici ! Et là, c&rsquo;est le drame&#8230;</p>
<p>Je n&rsquo;en vois que deux solutions pour se sortir de ce pétrin. La première, que je qualifierais de &laquo;&nbsp;pas propre&nbsp;&raquo; consiste à déporter le 1er #include gênant de A.h <strong>après</strong> la définition de la classe A ; autrement dit le mettre en fin de fichier. Cette solution est sale car non seulement elle oblige à séparer certaines directives ou inclusions qui doivent absolument être au début du fichier des autres qui posent problème. C&rsquo;est une solution qui peut marcher&#8230; Mais je pense que ce n&rsquo;est vraiment pas la bonne méthode à prendre, et qu&rsquo;elle risque même de reporter le problème à plus tard, quand le projet aura encore grandi et que la complexité du graphe d&rsquo;inclusions sera devenu inextricable. Je préfère nettement la 2ème que voici&#8230;</p>
<h3>LA solution</h3>
<p>Quelle est donc la solution miracle ? En fait, il s&rsquo;agit simplement de limiter au maximum les inclusions entre les fichiers d&rsquo;en-tête, en revenant aux principes de base de la compilation C/C++. Considérez un cas simple : A.cpp qui inclut A.h dans lequel se trouve la définition d&rsquo;une classe. Imaginez qu&rsquo;A.h nécessite d&rsquo;autres classes, qui sont incluses par A.h. Pour fixer les idées, nommons C.h un des fichiers inclus par A.h Finalement, A.cpp et A.h vont être compilés ensemble pour produire le même fichier objet ; il semble donc équivalent d&rsquo;inclure C.h à partir de A.h ou de A.cpp, puisque le résultat sera le même. Et pourtant, c&rsquo;est là que se situe toute la différence&#8230; En effet, si l&rsquo;on déplace le #include &laquo;&nbsp;C.h&nbsp;&raquo; de A.h dans A.cpp, on a réussi à éliminer une inclusion de A.h. Du coup, il faudra probablement mettre une directive &laquo;&nbsp;class C;&nbsp;&raquo; en tête de A.h, mais c&rsquo;est tout de même nettement mieux que d&rsquo;introduire une inclusion qui risque de provoquer des problèmes du style de ceux que l&rsquo;on vient de voir ! Ainsi, la règle à suivre est la suivante :</p>
<p><strong>Réduire au minimum vital les inclusions dans les fichiers d&rsquo;en-tête (.h) en les déportant dans les fichiers d&rsquo;implémentation (.cpp).</strong></p>
<p>C&rsquo;est une règle toute bête,mais qui simplifie énormément la vie lorsque l&rsquo;on développe un projet C ou C++. Le but est ainsi de supprimer le maximum (voire toutes) les directives #include des headers pour éviter les inclusions circulaires. Pour que cela compile, il sera nécessaire de rajouter les directives du type &laquo;&nbsp;class X;&nbsp;&raquo; en tête des fichiers d&rsquo;en-têtes, mais qu&rsquo;importe ! Ces directives sont &laquo;&nbsp;gratuites&nbsp;&raquo;, dans le sens où elles ne risquent pas d&rsquo;introduire des problèmes.</p>
<p>Concernant l&rsquo;héritage, nous avons vu qu&rsquo;il était absolument nécessaire qu&rsquo;une classe mère soit définie avant une de ses classes filles. C&rsquo;est pourquoi dans ce cas, on pourra se permettre de conserver la directive #include dans le fichier d&rsquo;en-tête, afin d&rsquo;éviter d&rsquo;avoir à inclure la classe mère dans chaque fichier .cpp utilisant cet en-tête. Mais à ma connaissance, c&rsquo;est le seul cas où la règle précédente ne s&rsquo;applique pas.</p>
<p>Et finalement, on s&rsquo;aperçoit que l&rsquo;on peut encore mieux faire, en élaguant au maximum le graphe d&rsquo;inclusions. En effet, il est possible de supprimer les inclusions de classes (qui se trouvent désormais dans les .cpp) lorsque la classe n&rsquo;est utilisée qu&rsquo;en tant que pointeur, référence, et qu&rsquo;aucune méthode n&rsquo;est utilisée. Autrement dit, si une classe A possède une méthode qui prend un paramètre un pointeur vers un objet de type B, et que cette méthode n&rsquo;utilise ni les méthodes ni les attributs de B, alors il n&rsquo;y a pas besoin d&rsquo;inclure B.h dans A.cpp. Un simple &laquo;&nbsp;class B;&nbsp;&raquo; suffira, et il sera du coup placé dans A.h vu que le prototype de la méthode y sera déclaré. Et en fait, c&rsquo;est tout à fait logique : si l&rsquo;on n&rsquo;utilise pas les membres de B, et qu&rsquo;il ne s&rsquo;agit que d&rsquo;un pointeur ou d&rsquo;une référence, le compilateur n&rsquo;a aucunement besoin de connaître la définition précise de B, puisque pointeurs et références occupent tous la même place en mémoire.</p>
<p>Pour résumer la méthode, voici la solution générale pour résoudre la grande majorité des problèmes d&rsquo;inclusions :</p>
<ul>
<li>Avant tout, chaque fichier d&rsquo;en-tête doit comporter les classique directives #ifndef, #define et #endif pour s&rsquo;assurer qu&rsquo;il ne sera pas inclus plusieurs fois.</li>
<li><strong>Aucune</strong> directive #include ne doit apparaître dans un .h, <strong>sauf</strong> si une de ces conditions est satisfaite :
<ul>
<li>ce fichier .h déclare une classe qui <strong>hérite</strong> d&rsquo;une autre classe</li>
<li>il nécessite la définition de <strong>constantes</strong> (au sens #define) ou de <strong>structures</strong> définies dans un autre .h.</li>
<li>la classe qu&rsquo;il déclare comporte comme attribut un objet d&rsquo;autre classe (et non pas un pointeur ou une référence vers celui-ci)</li>
</ul>
</li>
<li>Hormis ces 3 cas, il faut déporter les inclusions dans les fichiers .cpp.</li>
<li>Pour permettre la compilation du projet, il faut placer en tête des fichiers .h (avant la déclaration de la classe) autant de directives &laquo;&nbsp;class X;&nbsp;&raquo; que nécessaire, où X est le nom d&rsquo;une classe utilisée dans les méthodes du .h.</li>
<li>Si certaines méthodes d&rsquo;une classe A utilisent uniquement <strong>références</strong> ou des <strong>pointeurs</strong> sur des objets de type B, sans accéder aux membres (attributs ou méthodes) de B, il n&rsquo;est pas nécessaire de placer une directive #include dans A.cpp. Un simple &laquo;&nbsp;class B;&nbsp;&raquo; suffit dans A.h.</li>
</ul>
<p>En fait, on peut se souvenir simplement de ces règles en réfléchissant un minimum. Mettez-vous à la place d&rsquo;un compilateur : quelles informations vous faut-il pour pouvoir compiler une classe ? Comme un des rôles capitaux d&rsquo;un compilateur est d&rsquo;allouer la mémoire, il faut nécessairement toutes les informations concernant la taille des objets. Si un objet A agrège (contient) un objet de type B, on comprend facilement que la taille de l&rsquo;objet A sera calculée en fonction de la taille de B, donc l&rsquo;inclusion de la classe de B est inévitable. Idem pour les héritage. Mais quand il s&rsquo;agit de simples pointeurs et références, pas besoin de la définition complète, puisque tous les pointeurs et références occupent la même place en mémoire (celle du bus d&rsquo;adresse de la machine).</p>
<p>Au final, l&rsquo;application de cette méthode permet de démêler le graphe d&rsquo;inclusions de son projet de façon relativement simple et automatique. Il s&rsquo;agit de respecter ces règles de développement dans le but de limiter au maximum les dépendances entre fichiers. Les adeptes des gros projets savent combien il est pénible de voir tous les modules d&rsquo;un projet se recompiler lorsqu&rsquo;ils viennent de changer une constante dans un fichier d&rsquo;en-tête&#8230; Ce genre de problème est très souvent du à une mauvaise organisation des inclusions entre fichiers sources, ce qui induit une chaîne de dépendance énorme, provoquant la recompilation quasi-totale des sources. Dommage, quand on utilise les outils du style &laquo;&nbsp;Makefile&nbsp;&raquo; dont le but est justement de ne recompiler que ce qui est nécessaire.</p>
<p>J&rsquo;espère que cette technique permettra d&rsquo;en aider plus d&rsquo;un. En y réfléchissant, elle paraît évidente, mais l&rsquo;expérience montre le contraire&#8230; Une chose est sûre : si je l&rsquo;avais apprise dès le début, j&rsquo;aurais économisé un certain temps de débogage. Mais d&rsquo;un autre côté, le fait de s&rsquo;être arraché les cheveux dessus me garantit que je ne suis pas prêt de l&rsquo;oublier&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.segmentationfault.fr/applications/include-is-evil/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Teapot Colony Wars : Le premier simulateur de stratégies comportementales pour théières</title>
		<link>http://www.segmentationfault.fr/projets/teapot-colony-wars/</link>
		<comments>http://www.segmentationfault.fr/projets/teapot-colony-wars/#comments</comments>
		<pubDate>Mon, 04 Feb 2008 20:47:56 +0000</pubDate>
		<dc:creator>Emilien Girault</dc:creator>
				<category><![CDATA[Applications]]></category>
		<category><![CDATA[Développement]]></category>
		<category><![CDATA[Projets]]></category>
		<category><![CDATA[3D]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[projet]]></category>

		<guid isPermaLink="false">http://www.segmentationfault.fr/dev/teapot-colony-wars-le-premier-simulateur-de-strategies-comportementales-pour-theieres/</guid>
		<description><![CDATA[Dans le cadre de mes cours de programmation et de modélisation orientée objets, il nous a récemment été demandé de réaliser un projet en binôme. A vrai dire, nous l&#8217;avons rendu aujourd&#8217;hui&#8230; Le but était de modéliser et de concevoir une application simulant l&#8217;évolution de colonies d&#8217;individus sur un terrain. Le sujet décrivait les règles [...]]]></description>
			<content:encoded><![CDATA[<p>Dans le cadre de mes cours de programmation et de modélisation orientée objets, il nous a récemment  été demandé de réaliser un projet en binôme. A vrai dire, nous l&rsquo;avons rendu aujourd&rsquo;hui&#8230; Le but était de modéliser et de concevoir une application simulant l&rsquo;évolution de colonies d&rsquo;individus sur un terrain. Le sujet décrivait les règles de la simulation et de fonctionnement du monde dans lequel les colonies seraient amenées à évoluer. L&rsquo;objectif n&rsquo;était pas tant de coder une belle interface avec une intelligence artificielle hors du commun, mais plutôt de s&rsquo;attacher à bien concevoir l&rsquo;application, en utilisant les techniques habituelles comme le langage UML et les Designs Patterns.</p>
<p><img src="http://sourceforge.net/dbimage.php?id=158263" alt="Screenshot du projet" hspace="10" vspace="10" width="237" height="148" align="right" /></p>
<p>Avec un ami, nous avons eu une idée commune : tant qu&rsquo;à faire une application de simulation, autant se faire plaisir et la réaliser en 3D. Fans des technologies libres, nous avons donc choisi OpenGL et Glut. Nous avions tous les deux une petite expérience en OpenGL, pour ma part ce fut mon deuxième projet C++/OpenGL, bien que je trouve bien plus complexe que le 1er. Étant donné que nous n&rsquo;avions pas des talents d&rsquo;artistes, nous avons choisi de faire simple pour ce qui était de la représentation du monde et des individus. Les adeptes de Glut ou plus généralement de la 3D connaissent probablement la fameuse <a href="http://fr.wikipedia.org/wiki/Th%C3%A9i%C3%A8re_de_l'Utah">Théière de l&rsquo;Utah</a> utilisée dans un certain nombre d&rsquo;applications 3D. Ce modèle étant déjà présent par défaut dans la bibliothèque GLUT, nous avons décidé de l&rsquo;utiliser pour représenter les individus de nos colonies. Et nous en avons profité pour baptiser notre projet «Teapot Colony Wars».<span id="more-14"></span></p>
<p>Nous avions le choix du langage, et nous avons choisi le C++ non seulement pour sa rapidité, sa portabilité, mais aussi parce que nous souhaitions progresser dans ce domaine. Et tant qu&rsquo;à faire, nous l&rsquo;avons développé dans le but de le diffuser sous licence GPL 2, pour qu&rsquo;il continue à vivre et évoluer si certains veulent le reprendre. De plus, nous avons vraiment eu la volonté de développer un projet en nous rapprochant du monde professionnel, tout en n&rsquo;utilisant que des logiciels libres. Nous avons utilisé Subversion, un excellent outil de gestion de versions qui nous a bien simplifié la tâche pour le développement, ainsi que Doxygen, pour la génération de la documentation. Le rapport de conception a été réalisé en LaTeX, et la compilation de l&rsquo;exécutable a été grandement facilité par l&rsquo;emploi des Autotools (AutoConf, AutoMake, &#8230;).</p>
<p>Au final, Teapot Colony Wars, c&rsquo;est :</p>
<ul>
<li><strong> 96 fichiers sources</strong> (uniquement les .h et .cpp)</li>
<li>Un diagramme de <strong>45 classes</strong></li>
<li>Plus de <strong>9600 lignes</strong> de code C++</li>
<li>Un délai de <strong>6 semaines</strong> pour réaliser le projet (pendant lesquelles nous avons eu des examens&#8230;)</li>
<li>Plus de <strong>280 heures</strong> de travail</li>
<li><strong>268 révisions</strong> dans le dépot Subversion</li>
<li>Une documentation PDF de <strong>449 pages</strong> générée par Doxygen</li>
<li>Un rapport de <strong>28 pages</strong> décrivant la modélisation et nos choix conceptuels</li>
</ul>
<p>Nous avons profité de la livraison du projet pour publier la version 1 sur Sourceforge.net. Voici quelques unes des caractéristiques de l&rsquo;application :</p>
<ul>
<li>Le monde est composé de plusieurs colonies, chacune ayant sa couleur.</li>
<li>Chaque colonie peut créer des individus qui possèdent des caractéristiques propres comme sa taille. Une colonie consomme de la nourriture pour créer un individu.</li>
<li>Le monde est composé d&rsquo;une grille de cellules qui ont chacune des propriétés. Certaines sont inaccessibles (murs), d&rsquo;autres contiennent de la nourriture qui se renouvelle au fur et à mesure de la simulation (certaines sont à renouvellement instantané, mais pas d&rsquo;autres). Certaines cases sont des couloirs et inaccessibles aux individus trop grands.</li>
<li>Les individus évoluent selon certaines stratégies comportementales que la colonie leur impose. Leur but est de trouver de la nourriture et de la ramener à la colonie. Mais à chaque pas, un individu consomme de la nourriture proportionnellement à sa taille.</li>
<li>Chaque individu ne peut voir que les 8 cases adjacentes et a une très petite mémoire : il ne peut se souvenir que de la dernière case qu&rsquo;il a franchie. Mais pour l&rsquo;aider, il peut déposer des phéromones sur son passage. Chaque colonie définit ainsi 3 phéromones qui ne peuvent être comprises que par ses individus. Chaque phéromone a une durée de vie et se dégrade au fur et à mesure, jusqu&rsquo;à disparaître.</li>
<li>Quand deux individus ennemis se croisent, il y a combat. C&rsquo;est le plus fort qui gagne ! Le vainqueur peut alors se nourrir du cadavre de ses adversaires.</li>
<li>L&rsquo;utilisateur peut à sa guise faire une offrande en déposant une source de nourriture sur le terrain.</li>
<li>Il était demandé de tester deux stratégies différentes pour les individus. Les algorithmes heuristiques, qui peuvent être simples mais souvent imparfaits, et les algorithmes génétiques, consistant à définir des gènes pour les individus et effectuer un brassage génétique de la population en sélectionnant les meilleurs.</li>
</ul>
<p>Les commandes souris et clavier du simulateur sont les suivantes :</p>
<ul>
<li> Pavé numérique (4, 6 8, 2) : déplacements horizontaux et verticaux</li>
<li>Molette ou touches + et &#8211; : zoom</li>
<li>Maintien de Ctrl et défilement de la molette (ou + et -) : inclinaison verticale</li>
<li>Maintien de Ctrl + Clic gauche ou droit : rotation à gauche ou à droite</li>
<li>Espace : Activer / enlever le mode pause</li>
<li>Clic gauche : effectuer une itération</li>
<li>Étoile (*) : donner une offrande aux individus, qui apparaîtra sur le curseur de sélection (tore en bleu clair)</li>
</ul>
<p><img src="http://sourceforge.net/dbimage.php?id=158255" alt="Screenshot du projet" hspace="10" vspace="10" width="248" height="155" align="left" />Nous sommes globalement très satisfaits de ce projet, car nous avons pu finir dans les temps, même si nous aurions aimé rajouter quelques fonctionnalités supplémentaires. Mais cela restera tout à fait possible étant donné la grande extensibilité de notre application. En effet, grâce à un usage intensif de toutes les techniques propres à la modélisation orientée objet, comme le polymorphisme et les designs patterns, nous avons construit un ensemble de classes génériques, qui peuvent s&rsquo;apparenter à un framework. Il est ainsi tout à fait possible de rajouter à moindre coût des nouvelles cases, des nouveaux types d&rsquo;individus, changer leur représentation (pour ceux qui n&rsquo;aiment pas les théières&#8230;), changer le système de combat, et même pourquoi pas rajouter de nouveaux mouvements (comme le saut ou la téléportation).</p>
<p>Si cela vous intéresse, vous pouvez télécharger la version 1.0 du projet, tel que nous l&rsquo;avons rendu à nous professeurs. Les sources sont disponibles, ainsi que les exécutables pour Linux et Windows. Attention toutefois pour ce dernier, il semble que la portabilité soit encore un tout petit peu imparfaite ; en effet nous n&rsquo;avons pas encore eu le temps de changer quelques détails qui peuvent bloquer la génération de l&rsquo;exécutable selon le compilateur utilisé. Mais nous allons bientôt remédier à cela&#8230;</p>
<p>Voici les liens pour accéder aux ressources du projet :</p>
<ul>
<li><a href="http://sourceforge.net/projects/colonywars/">Site du projet sur Sourceforge.net</a></li>
<li><a href="http://sourceforge.net/project/showfiles.php?group_id=213004">La page de téléchargement</a></li>
<li><a href="http://colonywars.svn.sourceforge.net/viewvc/colonywars/">Le dépot SVN accessible en ligne</a></li>
<li><a href="http://sourceforge.net/svn/?group_id=213004">Les détails pour effectuer un check-out du SVN</a></li>
<li><a href="http://colonywars.sourceforge.net/doc/">La documentation HTML en ligne</a></li>
</ul>
<p>Pour lancer l&rsquo;application sous Windows, vous avez juste à lancer l&rsquo;exécutable. Sous Linux, pensez toutefois à lancer l&rsquo;application en mode console pour éviter les surprises ; en effet, il faut que le dossier de textures se trouve dans le dossier courant.</p>
<p>Pour compiler le projet sous Linux, assurez-vous de disposer des bibliothèques pour le développement d&rsquo;application graphiques, en particulier Glut. Décompressez l&rsquo;archive dans un répertoire, puis tapez les instructions suivantes :</p>
<blockquote>
<pre>$ ./configure --prefix=$HOME</pre>
<pre>$ make</pre>
<pre>$ make install</pre>
</blockquote>
<p>L&rsquo;application s&rsquo;installera automatiquement dans votre homedir, dans le dossier bin. Si la documentation vous tente, vous pouvez générer le HTML et les fichiers LaTeX en tapant :</p>
<blockquote>
<pre>$ doxygen Doxyfile</pre>
</blockquote>
<p>Ensuite, placez-vous dans le dossier doc/latex et tapez simplement :</p>
<blockquote>
<pre>$ make</pre>
</blockquote>
<p>Le PDF résultat se nomme  «refman.pdf» et sera généré dans le dossier courant. Bonne lecture&#8230;</p>
<p>Un site internet du projet verra peut-être le jour au courant de l&rsquo;année, si je trouve un peu de temps à y consacrer. N&rsquo;hésitez pas à me faire part de tous vos commentaires sur ce projet. Profitez de sa licence et faites le vivre !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.segmentationfault.fr/projets/teapot-colony-wars/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Deux outils pour faciliter le développement en PHP5</title>
		<link>http://www.segmentationfault.fr/dev-web/deux-outils-pour-faciliter-le-developpement-en-php5/</link>
		<comments>http://www.segmentationfault.fr/dev-web/deux-outils-pour-faciliter-le-developpement-en-php5/#comments</comments>
		<pubDate>Fri, 11 Jan 2008 12:09:50 +0000</pubDate>
		<dc:creator>Emilien Girault</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[développement]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[UML]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.segmentationfault.fr/divers/deux-outils-pour-faciliter-le-developpement-en-php5/</guid>
		<description><![CDATA[Je viens récemment de découvrir deux outils pour PHP5. Ces outils sont conçus pour faciliter la conception et le développement d&#8217;applications en PHP5, et risquent d&#8217;en intéresser plus d&#8217;un. Le premier s&#8217;appelle PHiMX et est un outil en ligne de commande pour reverser une application PHP et générer son diagramme de classes UML au format [...]]]></description>
			<content:encoded><![CDATA[<p>Je viens récemment de découvrir deux outils pour PHP5. Ces outils  sont conçus pour faciliter la conception et le développement d&rsquo;applications en PHP5, et risquent d&rsquo;en intéresser plus d&rsquo;un.<span id="more-12"></span></p>
<p>Le premier s&rsquo;appelle PHiMX et est un outil en ligne de commande pour reverser une application PHP et générer son diagramme de classes UML au format XMI. C&rsquo;est particulièrement intéressant quand on a développé une application sans prendre le temps de faire un diagramme de classes et qu&rsquo;on souhaite s&rsquo;y retrouver, ou bien quand on a généré le code PHP mais que l&rsquo;on souhaite changer d&rsquo;outil de modélisation pour migrer par exemple vers un outil libre. Le logiciel est disponible en LGPL et est installable via Pear en tapant la commande suivante :</p>
<blockquote>
<pre>pear install http://phimx.sourceforge.net/PHiMX-1.0b1.tgz</pre>
</blockquote>
<p>Rappelons que si vous n&rsquo;avez pas Pear, vous pouvez l&rsquo;installer sur la plupart des distributions Linux via le système de paquets habituel, par exemple sur Debian/Ubuntu :</p>
<blockquote>
<pre>sudo apt-get install pear</pre>
</blockquote>
<p>Le fichier XMI produit sera alors utilisable par les outils courants de modélisation UML. Pour ne citer que les libres et gratuits : Umbrello, BOUML, et StarUML.</p>
<ul>
<li><a href="http://phimx.sourceforge.net/" target="_blank">Site officiel de PHiMX</a></li>
<li><a href="http://www.aquitaine-libre.fr/phimx-doc/index.php" target="_blank">Manuel en Français</a></li>
<li><a href="http://linuxfr.org/2008/01/02/23525.html" target="_blank">Source : La dépèche sur Linuxfr.org</a></li>
</ul>
<p>Le deuxième, baptisé Jelix,  est en fait un framework conçu pour PHP &gt;= 5.2. Ce framework respecte l&rsquo;architecture Modèle &#8211; Vue &#8211; Contrôleur, supporte les templates, implémente la correspondance directe entre les objets et les tables d&rsquo;une base de données relationnelle, et contient entre autres un générateur de formulaires automatique à partir d&rsquo;un fichier XML. Mais sa spécifié la plus intéressante (à mes yeux) est qu&rsquo;il est très rapide car volontairement axé sur l&rsquo;optimisation des performances. La version Gold contient à cet effet une extension PHP spécialement concue pour augmenter encore la rapidité de l&rsquo;application. En fait, il est disponible en 3 versions plus ou moins optimisées, toutes sous LGPL. Le site officiel, en Français, contient entre autre une FAQ, une présentation du framework ainsi qu&rsquo;un mini tutoriel pour apprendre à s&rsquo;en servir.</p>
<ul>
<li><a href="http://jelix.org/articles/presentation" target="_blank">Présentation de Jelix sur le site officiel</a></li>
<li><a href="http://linuxfr.org/2008/01/10/23555.html" target="_blank">Source : La dépèche sur Linuxfr.org</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.segmentationfault.fr/dev-web/deux-outils-pour-faciliter-le-developpement-en-php5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
