<?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 Explications - Custom Protocol</title>
	<atom:link href="https://www.customprotocol.com/programmation-categorie/explications/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.customprotocol.com/programmation-categorie/explications/</link>
	<description>Site d&#039;hack-tualité et de tutoriels sur la customisation de consoles et appareils (homebrews, plugins, émulation...)</description>
	<lastBuildDate>Sun, 20 Dec 2015 14:16:51 +0000</lastBuildDate>
	<language>fr-CA</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	
	<item>
		<title>[PS4] Les explications de CTurt sur son exploit kernel</title>
		<link>https://www.customprotocol.com/programmation/ps4-explications-cturt-sur-exploit-kernel/</link>
					<comments>https://www.customprotocol.com/programmation/ps4-explications-cturt-sur-exploit-kernel/#respond</comments>
		
		<dc:creator><![CDATA[Wirus]]></dc:creator>
		<pubDate>Sun, 20 Dec 2015 14:16:51 +0000</pubDate>
				<category><![CDATA[News Programmation]]></category>
		<category><![CDATA[Programmation]]></category>
		<guid isPermaLink="false">https://www.customprotocol.com/?post_type=it_programmation&#038;p=8051</guid>
					<description><![CDATA[<p>Voici quelques brefs éclaircissements en français des explications détaillées de CTurt (en anglais).</p>
<p>L’article <a rel="nofollow" href="https://www.customprotocol.com/programmation/ps4-explications-cturt-sur-exploit-kernel/">[PS4] Les explications de CTurt sur son exploit kernel</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;"><a href="https://www.customprotocol.com/underground/ps4-cturt-livre-details-exploit-kernel-quitte-scene/" target="_blank" rel="noopener noreferrer">Malgré le départ tragique de <em>CTurt</em></a>, tout espoir n'est pas encore perdu pour la scène du <strong>hack PS4</strong>. En effet, le développeur a partagé récemment des <a href="http://cturt.github.io/ps4-3.html" target="_blank" rel="noopener noreferrer"><strong>explications très détaillées</strong> de ses recherches</a> sur le noyau de la console et sur son fameux <strong>exploit kernel</strong> pour <em>firmwarae</em> 1.76. Voilà les bases qu'il faut connaître avant d'aller lire les (longs) billets de notre cher camarade.</p>
<p style="text-align: justify;"><a href="https://www.customprotocol.com/medias/2015/12/Exploit-kernel-PS4-CTurt-explications.png" rel="attachment wp-att-8052"><img fetchpriority="high" decoding="async" class="aligncenter size-full wp-image-8052" src="https://www.customprotocol.com/medias/2015/12/Exploit-kernel-PS4-CTurt-explications.png" alt="Exploit kernel PS4 CTurt explications" width="768" height="432" srcset="https://www.customprotocol.com/medias/2015/12/Exploit-kernel-PS4-CTurt-explications.png 768w, https://www.customprotocol.com/medias/2015/12/Exploit-kernel-PS4-CTurt-explications-300x169.png 300w, https://www.customprotocol.com/medias/2015/12/Exploit-kernel-PS4-CTurt-explications-370x208.png 370w, https://www.customprotocol.com/medias/2015/12/Exploit-kernel-PS4-CTurt-explications-270x152.png 270w, https://www.customprotocol.com/medias/2015/12/Exploit-kernel-PS4-CTurt-explications-570x321.png 570w, https://www.customprotocol.com/medias/2015/12/Exploit-kernel-PS4-CTurt-explications-740x416.png 740w, https://www.customprotocol.com/medias/2015/12/Exploit-kernel-PS4-CTurt-explications-300x169@2x.png 600w" sizes="(max-width: 768px) 100vw, 768px" /></a></p>
<hr />
<p style="text-align: justify;">L'<strong>exploit kernel</strong> se repose en fait sur un accès au compilateur JIT (<em><a href="https://fr.wikipedia.org/wiki/Juste-%C3%A0-temps" target="_blank" rel="noopener noreferrer">Just-in-time</a></em>) pour exécuter du code via <em>WebKit</em>, puis utilise la vulnérabilité <em><a href="http://seclists.org/oss-sec/2015/q3/66" target="_blank" rel="noopener noreferrer">BadIRET</a></em> (Linux)/<em>FreeBSD</em> afin de parvenir à ses fins&nbsp;: se frayer un passage vers le noyau. C'est un très court résumé de tout le processus bien plus complexe, qui implique en réalité des tas de manipulations issus de votre boîte à outils créée via rétro-ingénierie, incluant par exemple une corruption des pointeurs du <em>kernel</em> ou une luge sans opérations (plus communément appelée <em>NOP sled</em>).</p>
<p style="text-align: justify;">Pour en revenir au compilateur JIT&nbsp;: il est utilisé par le noyau <em>javascript</em> de <em>WebKit </em>et c'est lui qui permet de compiler dynamiquement du code en <em>javascript</em>, par soucis de performance contrairement aux interpréteurs tels que le <a href="https://www.customprotocol.com/underground/ps4-portage-de-cinoop-lemulateur-gameboy-multi-plates-formes/" target="_blank" rel="noopener noreferrer">portage de l'émulateur GBA <em>Cinoop</em> sur PS4</a>, que <em>CTurt</em> avait montré en septembre dernier. Pour ce faire, il faut donc une zone de mémoire à la fois accessible et écriture et en exécution.</p>
<p style="text-align: center;"><a href="https://www.customprotocol.com/medias/2015/12/PS4-depart-CTurt-details-exploit-kernel.png" rel="attachment wp-att-8025"><img decoding="async" class="aligncenter wp-image-8025 size-medium" src="https://www.customprotocol.com/medias/2015/12/PS4-depart-CTurt-details-exploit-kernel-500x282.png" alt="PS4 départ CTurt détails exploit kernel" width="500" height="282" /></a></p>
<p style="text-align: justify;"><em>Sony</em> s'est chargé de cela en créant 2 fonctions d'<a href="https://fr.wikipedia.org/wiki/Appel_syst%C3%A8me" target="_blank" rel="noopener noreferrer">appel système</a>&nbsp;: <em>sys_jitshm_create</em> et <em>sys_jitshm_alias</em>. Il est possible de les utiliser directement, ou bien d'utiliser les enveloppes dans le <em>libkernel</em> (<em>sceKernelJitCreateSharedMemory et al.</em>). Pour identifier exactement la manière dont sont utilisées ces fonctions, il faudra charger, <em>dumper</em> et <em>reverser</em> le <em>libSceJitBridge.sprx</em>.</p>
<p style="text-align: justify;">L'idée de base, c'est qu'il n'y a aucun moyen de cartographier directement une page virtuelle RWX (droits de lecture, écriture et exécution). Au lieu de faire cela, on va donc avoir besoin d'allouer de la mémoire et de créer un <em><a href="https://fr.wikipedia.org/wiki/Alias_%28informatique%29" target="_blank" rel="noopener noreferrer">alias</a></em> de cette cartographie. On va cartographier le premier <em>handle </em>comme un RX (droits de lecture et exécution), et l'<em>alias</em> comme un RW (droits de lecture et d'écriture). Résultat&nbsp;: on aura deux applications virtuelles séparées qui pointeront vers la même mémoire physique.</p>
<p style="text-align: justify;">Le code peut maintenant être écrit par le biais du RW cartographié et exécuté à partir du RX cartographié de cette façon&nbsp;:</p>
<pre class="lang:default decode:true">unsigned char loop[]&nbsp;=&nbsp;{ 0xeb, 0xfe };
memcpy(writableAddress, loop, sizeof(loop));
((void (*)())executableAddress)();</pre>
<p style="text-align: justify;">La chaîne <em>ROP</em> liée à la mémoire de configuration (<em>setup memory</em>), copie le <em>Wi-Fi Loader</em>, et l'exécute. Vu que c'est un peu trop long pour être fait en une seule étape, on doit donc stocker l'étape dans un <em>cookie</em>, et recharger la page après chaque étape pour démarrer la suivante&nbsp;:</p>
<pre class="lang:default decode:true">var codeExecutionStage&nbsp;=&nbsp;getCookie("codeExecutionStage");
if(codeExecutionStage == "1") {
	allocateSharedMemory();
	document.getElementById("codeExecutionStage").innerHTML&nbsp;=&nbsp;"Stage: Mapping shared memory...";
	setTimeout(function() { document.cookie&nbsp;=&nbsp;"codeExecutionStage=2"; location.reload(); }, 10);
}
else if(codeExecutionStage == "2") {
	mapSharedMemory();
	document.getElementById("codeExecutionStage").innerHTML&nbsp;=&nbsp;"Stage: Waiting for payload...";
	setTimeout(function() { document.cookie&nbsp;=&nbsp;"codeExecutionStage=3"; location.reload(); }, 10);
}
else if(codeExecutionStage == "3") {
	payload();
	document.getElementById("codeExecutionStage").innerHTML&nbsp;=&nbsp;"Stage: Executing...";
	setTimeout(function() { document.cookie&nbsp;=&nbsp;"codeExecutionStage=4"; location.reload(); }, 10);
}
else if(codeExecutionStage == "4") {
	copy();
	document.getElementById("codeExecutionStage").innerHTML&nbsp;=&nbsp;"Stage: Done!";
	setTimeout(function() { document.cookie&nbsp;=&nbsp;"codeExecutionStage=0"; location.reload(); }, 10);
}</pre>
<p style="text-align: justify;">Vu qu'on utilise simplement les appels système <em>JIT</em> vers leur destination définie, il s'agit davantage d'une astuce que d'un <strong>exploit</strong>. Malheureusement, très peu d'applications ont accès à ce fameux compilateur, <em>Sony</em> ayant ajouté des contrôles de privilèges dans le <em>kernel</em>. Ainsi, seuls les processus qui passent ces contrôles peuvent y avoir accès. Tant que l'on ne trouvera pas d'autre façon d'exécuter du code non-signé, nos <strong>exploits</strong> via des jeux ou des applis <em>web</em> resteront cantonnés au <em>ROP</em>...</p>
<p style="text-align: justify;"><div align="justify" class="signoff"><i class="fa fa-fw fa-folder-open"></i>Lire la <a href="http://cturt.github.io/ps4-3.html" target="_blank" rel="noopener noreferrer">suite de ces explications (en anglais) sur le blog <em>GitHub</em> de CTurt</a></div>
<p>L’article <a rel="nofollow" href="https://www.customprotocol.com/programmation/ps4-explications-cturt-sur-exploit-kernel/">[PS4] Les explications de CTurt sur son exploit kernel</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/ps4-explications-cturt-sur-exploit-kernel/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>[PSP] [Vita] Le ONELua de nouveau mis à jour</title>
		<link>https://www.customprotocol.com/programmation/psp-vita-le-onelua-de-nouveau-mis-a-jour/</link>
					<comments>https://www.customprotocol.com/programmation/psp-vita-le-onelua-de-nouveau-mis-a-jour/#respond</comments>
		
		<dc:creator><![CDATA[Applelo]]></dc:creator>
		<pubDate>Sun, 12 Jul 2015 15:36:21 +0000</pubDate>
				<category><![CDATA[Programmation]]></category>
		<category><![CDATA[Top Articles]]></category>
		<category><![CDATA[Tutoriels]]></category>
		<category><![CDATA[Tutoriels Programmation]]></category>
		<category><![CDATA[OneLua]]></category>
		<guid isPermaLink="false">https://www.customprotocol.com/?post_type=it_programmation&#038;p=5423</guid>
					<description><![CDATA[<p>Découvrons ensemble les nouveautés de cette nouvelle version du ONELua&#8239;!</p>
<p>L’article <a rel="nofollow" href="https://www.customprotocol.com/programmation/psp-vita-le-onelua-de-nouveau-mis-a-jour/">[PSP] [Vita] Le ONELua de nouveau mis à jour</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;"><div align="center" class="alert alert-info "><b><u>Note</u></b> : cet article est très long et il s'adresse aux développeurs à devenir ou bien ceux maîtrisant déjà le langage <em>Lua</em> souhaitant découvrir ce que la PSP a dans le ventre. La quantité de travail fourni dans cet article est considérable et j'espère que vous l'apprécierez car j'y ai consacré beaucoup de mon temps libre. Je tiens à remercier notamment <em>gdljjrod</em> ainsi que<em> Davis Nuñez</em> pour leur patience et leur aide à la rédaction de cet article.</div>
<p style="text-align: justify;"><a href="https://www.customprotocol.com/underground/version-3-onelua-arrive-tres-bientot/" target="_blank" rel="noopener noreferrer">Nous vous l'avions annoncé</a>, <em>gdljjrod</em> et <em>Rober Galarga</em> ont mis à jour leur interpréteur Lua pour PSP dénommé <strong>ONELua</strong>. Après deux versions réussies, les deux développeurs reviennent aujourd'hui avec une nouvelle version contenant encore une flopée de nouveautés que nous allons <strong>découvrir et décortiquer ensemble</strong> pour vous permettre de comprendre leur utilisation via des explications, des exemples et des captures d'écran&nbsp;: bref un article signé <strong>Custom Protocol</strong>.</p>
<figure id="attachment_5173" aria-describedby="caption-attachment-5173" style="width: 480px" class="wp-caption aligncenter"><a href="https://www.customprotocol.com/medias/2015/06/vignette-ONELua-v3.png"><img decoding="async" class="wp-image-5173 size-full" src="https://www.customprotocol.com/medias/2015/06/vignette-ONELua-v3.png" alt="vignette-ONELua-v3" width="480" height="272" srcset="https://www.customprotocol.com/medias/2015/06/vignette-ONELua-v3.png 480w, https://www.customprotocol.com/medias/2015/06/vignette-ONELua-v3-300x170.png 300w, https://www.customprotocol.com/medias/2015/06/vignette-ONELua-v3-370x210.png 370w, https://www.customprotocol.com/medias/2015/06/vignette-ONELua-v3-270x153.png 270w" sizes="(max-width: 480px) 100vw, 480px" /></a><figcaption id="caption-attachment-5173" class="wp-caption-text">Le <b>ONELua</b> Version 3</figcaption></figure>
<hr />
<h4 style="text-align: justify;"><span style="text-decoration: underline;"><strong>Optimisations</strong></span></h4>
<p style="text-align: justify;">Commençons tout d'abord par les nouveautés au niveau des optimisations. Le <strong>ONELua</strong> en version 3 supporte maintenant les PS Vita utilisant le <strong>VHBL</strong>, pratique pour lancer des <em>homebrews</em> si on possède le jeu (et sa démo) <a href="https://www.customprotocol.com/underground/vita-nouvel-exploit-disponible-demo/">Toukiden: Kiwami</a> (dispo uniquement sr le <em>Store</em> JP) possédant un exploit en 3.51, ou encore l'<a href="https://www.customprotocol.com/underground/tuto-utiliser-exploit-impatchable-qwikrazor87-firmware-3-36-3-50/" target="_blank" rel="noopener noreferrer"><em>exploit World of Pool</em></a>. Ainsi le <em>Lua Player</em> devient pleinement compatible pour tourner sur toutes les PSP mais également sur les PS Vita. Les développeurs ont également ajouté une nouvelle bibliothèque nommée <strong>BitOp</strong> qui ajoute des opérations binaires sur les nombres. Vous pouvez regarder les fonctions disponibles avec des exemples à <a href="http://bitop.luajit.org/api.html">cette adresse</a>.</p>
<figure id="attachment_2311" aria-describedby="caption-attachment-2311" style="width: 300px" class="wp-caption aligncenter"><a href="https://www.customprotocol.com/medias/2015/02/health-psvita.png"><img decoding="async" class="wp-image-2311 size-medium" src="https://www.customprotocol.com/medias/2015/02/health-psvita-300x210.png" alt="N'oubliez pas de consulter notre tutoriel pour garder votre PS Vita en firmware 3.36 et empêcher la mise à jour automatique" width="300" height="210" srcset="https://www.customprotocol.com/medias/2015/02/health-psvita-300x210.png 300w, https://www.customprotocol.com/medias/2015/02/health-psvita-370x259.png 370w, https://www.customprotocol.com/medias/2015/02/health-psvita-270x189.png 270w, https://www.customprotocol.com/medias/2015/02/health-psvita-570x399.png 570w, https://www.customprotocol.com/medias/2015/02/health-psvita.png 720w, https://www.customprotocol.com/medias/2015/02/health-psvita-300x210@2x.png 600w" sizes="(max-width: 300px) 100vw, 300px" /></a><figcaption id="caption-attachment-2311" class="wp-caption-text">Le <b>ONELua</b> version 3 pleinement compatible avec la PS Vita</figcaption></figure>
<p style="text-align: justify;">Cette bibliothèque n'a pas été implémentée au <strong>ONELua</strong> par hasard, en effet, vous trouverez dans l'archive contenant l'interpréteur un exemple vous démontrant comment utiliser une nouvelle fonction permettant de créer des maps avec un simple fichier texte. Il y a seulement deux fonctions mais aux fonctionnalités intéressantes.</p>
<pre class="lang:lua decode:true" title="Fonction Map">map.new(IMAGE tileset, TABLE mapData, NUMBER TileX, NUMBER TileY)
--IMAGE tileset&nbsp;: Image généré via GBA Graphics contenant les textures pour la map
--TABLE mapdata&nbsp;: Map créé via GBA Graphics contenant les informations de la map
--NUMBER TileX&nbsp;: Taille largeur en pixel des textures à découper
--NUMBER TileY&nbsp;: Taille longueur en pixel des textures à découper
--Retourne la map (à stocker dans une variable)
map.blit(MAP map, NUMBER x, NUMBER y)
--MAP map&nbsp;: Map à afficher généré via la fonction map.new
--NUMBER x&nbsp;: Placement sur l'écran en x
--NUMBER y&nbsp;: Placement sur l'écran en y
--Ne retourne rien</pre>
<p style="text-align: justify;">On peut soit dans l'exemple fourni créer une map en vue de face mais également en vue de côté. Comme cité dans les fonctions, il vous faudra obligatoirement utiliser le logiciel <a href="http://www.mobile-dev.ch/dl/pc/GBA%20Graphics%201.09.7z">GBA Graphics 1.09</a> disponible certes en anglais mais aussi en français&#8239;!</p>
<p style="text-align: justify;">Voici quelques exemples postés par plusieurs développeurs des possibilités de ces fonctions.</p>
<div align="center">
<blockquote class="twitter-tweet" lang="fr">
<p dir="ltr" lang="en" style="text-align: center;">Peace in <a href="https://twitter.com/hashtag/An%C3%A9sidor?src=hash">#Anésidor</a> but for how long&#8239;? Powered by <a href="https://twitter.com/hashtag/ONELuav3?src=hash">#ONELuav3</a> developed by <a href="https://twitter.com/gdljjrod">@gdljjrod</a> and Rober Galarga. <a href="http://t.co/J28FzCronr">pic.twitter.com/J28FzCronr</a></p>
<p>— Applelo (@Applelo1) <a href="https://twitter.com/Applelo1/status/614709397776900096">27 Juin 2015</a></p>
</blockquote>
<blockquote class="twitter-tweet" lang="fr">
<p dir="ltr" lang="en"><a href="https://twitter.com/gdljjrod">@gdljjrod</a><a href="https://twitter.com/Applelo1">@Applelo1</a><a href="https://twitter.com/CustomProtocol">@CustomProtocol</a> Trying to create my own Super Mario world test <a href="https://twitter.com/hashtag/Tilesets?src=hash">#Tilesets</a><a href="https://twitter.com/hashtag/Onelua?src=hash">#Onelua</a><a href="https://twitter.com/hashtag/2D?src=hash">#2D</a><a href="http://t.co/TpY61PCLGy">pic.twitter.com/TpY61PCLGy</a></p>
<p>— Davis Nuñez (@DevDavisNunez) <a href="https://twitter.com/DevDavisNunez/status/611610696652959744">18 Juin 2015</a></p>
</blockquote>
</div>
<p style="text-align: justify;">En exemple, pour utiliser cette fonction, vous pouvez vous référer au contenu de l'archive du <strong>ONELua </strong>où le code a été commenté par @applelo1 (moi même) en français.</p>
<h4 style="text-align: justify;"><span style="text-decoration: underline;"><strong>Fonctions images</strong></span></h4>
<p style="text-align: justify;">Passons ensuite aux fonctions images, où nous avons le droit à une ribambelle de nouveautés. Nous avons enfin la possibilité de charger les images dans la VRAM (mémoire vidéo) via la fonction <em>image.loadv()</em> pour un affichage plus rapide de celles-ci (pour des <em>sprites</em> par exemple) mais plus limité en mémoire que la RAM (mémoire vive). Il est aussi possible de "déplacer" une image de la VRAM à la RAM et inversement en utilisant la fonction <em>image.move()</em>.</p>
<p style="text-align: justify;">Désormais, via la fonction <em>image.loadfromdata()</em>, les images converties en données binaires peuvent être chargées, utile pour charger les images disponibles sur internet permettant un gain de rapidité. Un petit exemple s'impose pour vous montrer&nbsp;:</p>
<pre class="lang:lua decode:true" title="Exemple image.loadfromdata">local fp&nbsp;=&nbsp;io.open("monimg.png","rb")--J'ouvre l'image comme si s'était un fichier
local databin&nbsp;=&nbsp;fp:read("*a")--Je lis le contenu du fichier
fp:close()--Je ferme la lecture du fichier
monimg&nbsp;=&nbsp;image.loadfromdata(databin,__PNG)--La fonction charge et transforme les données binaires en fichiers
while true do--J'ouvre ma boucle
image.blit(monimg,0,0) --J'affiche mon image
screen.flip()--Je rafraichie l'écran
end--Je ferme la boucle</pre>
<p style="text-align: justify;">Et c'est pas fini, puisqu'on peut également modifier ses images via trois nouvelles fonctions&#8239;! La première,<em> image.blitadd()</em>, permet d'afficher l'image en y ajoutant un effet de couleur alors que la deuxième, <em>image.blitsub()</em>, au contraire, permet de supprimer la couleur. La dernière quant à elle, <em>image.blittint()</em>, permet d'afficher une image et de la teindre également d'une couleur.</p>
<a class="gridlove-popup" href='https://www.customprotocol.com/medias/2015/07/custom_protocol_red_onelua.png'><img decoding="async" width="480" height="272" src="https://www.customprotocol.com/medias/2015/07/custom_protocol_red_onelua.png" class="attachment-gridlove-single size-gridlove-single" alt="" srcset="https://www.customprotocol.com/medias/2015/07/custom_protocol_red_onelua.png 480w, https://www.customprotocol.com/medias/2015/07/custom_protocol_red_onelua-300x170.png 300w, https://www.customprotocol.com/medias/2015/07/custom_protocol_red_onelua-370x210.png 370w, https://www.customprotocol.com/medias/2015/07/custom_protocol_red_onelua-270x153.png 270w" sizes="(max-width: 480px) 100vw, 480px" /></a>
<a class="gridlove-popup" href='https://www.customprotocol.com/medias/2015/07/custom_protocol_imageadd_onelua.png'><img decoding="async" width="480" height="272" src="https://www.customprotocol.com/medias/2015/07/custom_protocol_imageadd_onelua.png" class="attachment-gridlove-single size-gridlove-single" alt="" srcset="https://www.customprotocol.com/medias/2015/07/custom_protocol_imageadd_onelua.png 480w, https://www.customprotocol.com/medias/2015/07/custom_protocol_imageadd_onelua-300x170.png 300w, https://www.customprotocol.com/medias/2015/07/custom_protocol_imageadd_onelua-370x210.png 370w, https://www.customprotocol.com/medias/2015/07/custom_protocol_imageadd_onelua-270x153.png 270w" sizes="(max-width: 480px) 100vw, 480px" /></a>
<p style="text-align: justify;">Voici le récapitulatif de toute les nouvelles fonctions concernant les images retranscrit ici.</p>
<pre class="lang:lua decode:true" title="Fonctions Image">image.loadv(STRING path)
image.loadv(STRING path, COLOR mask)
image.loadv(STRING path, NUMBER w, NUMBER h)
image.loadv(STRING path, NUMBER w, NUMBER h, COLOR mask)
--STRING path&nbsp;: Chemin de l'image
--COLOR mask&nbsp;: Masque de couleur à appliquer à l'image
--NUMBER w&nbsp;: Largeur pour couper les sprites
--NUMBER h&nbsp;: Hauteur pour couper les sprites
--Retourne une image, prête à être utiliser.
image.move(IMAGE img)
--IMAGE img&nbsp;: Variable de l'image
--Ne retourne rien
image.loadfromdata(STRING data, NUMBER type)
--STRING data&nbsp;: Donnée de l'image en fichier binaire
--NUMBER type&nbsp;: 
---------------__PNG (0) pour image en .png
---------------__JPG (1) pour image en .jpg
---------------__GIF (2) pour image en .gif
image.blitadd(IMAGE img,NUMBER x,NUMBER y,NUMBER coef)
--IMAGE img&nbsp;: Variable de l'image
--NUMBER x&nbsp;: Placement sur l'écran en x
--NUMBER Y&nbsp;: Placement sur l'écran en y	
--NUMBER coef&nbsp;: Niveau d'ajout de couleur (entre 0 et 255)
--Ne retourne rien
image.blitsub(IMAGE img,NUMBER x,NUMBER y,NUMBER coef)
--IMAGE img&nbsp;: Variable de l'image
--NUMBER x&nbsp;: Placement sur l'écran en x
--NUMBER Y&nbsp;: Placement sur l'écran en y	
--NUMBER coef&nbsp;: Niveau de suppression de couleur (entre 0 et 255)
--Ne retourne rien
image.blittint(IMAGE img,NUMBER x,NUMBER y,COLOR color)
--IMAGE img&nbsp;: Variable de l'image
--NUMBER x&nbsp;: Placement sur l'écran en x
--NUMBER Y&nbsp;: Placement sur l'écran en y	
--COLOR color&nbsp;: Couleur pour teindre l'image
--Ne retourne rien</pre>
<p style="text-align: justify;">Le <strong>ONELua</strong> se montre aussi très performant comme gestionnaire des <em>EBOOT.PBP</em>, 3 nouvelles fonctions font ainsi leur entrée avec cette troisième version par ce que l'on appelle leurs <em>callbacks</em>. La fonction <em>game.pack()</em> permet de créer un <em>EBOOT</em> si vous disposez d'un dossier contenant toutes les ressources nécessaires (PARAM.SFO, ICON0.PNG...). Ensuite, <em>game.add()</em> permet d'ajouter ou remplacer un fichier alors que la fonction <em>game.remove()</em> permet finalement de supprimer un fichier contenu dans l'<em>EBOOT.PBP</em>.</p>
<h4 style="text-align: justify;"><span style="text-decoration: underline;"><strong>Fonctions TV</strong></span></h4>
<p style="text-align: justify;">Vous devriez savoir, puisque nous vous l'avions déjà <a href="https://www.customprotocol.com/underground/version-3-onelua-arrive-tres-bientot/">annoncé</a>, que le <strong>ONELua</strong> intègre désormais des fonctions liées à la télévision, la première étant de pouvoir retransmettre l'écran de la PSP vers l'écran d'une télé si vous disposez d'un adaptateur. Il est possible notamment de régler via cette fonction la qualité de la retransmission. Attention, il vous faudra impérativement le <em>dvemgr.prx </em><i>contenu dans l'archive pour pouvoir faire fonctionner la fonction. La deuxième, </i><em>os.cabletv()</em><i>, permet de </i>reconnaître si votre PSP est branchée à un écran externe ainsi que le type de câble utilisé.</p>
<pre class="lang:lua decode:true" title="Fonctions Télévisions">os.modetv(NUMBER quality)	
--Active la retransmission
--NUMBER quality&nbsp;: La qualité de retransmission
--------------------__8888 (32 bits RGBA)
--------------------__4444 (16 bits R4G4B4A4)
--------------------__5551 (16 bits R5G5B5A1)
--------------------__5650 (16 bits R5G5B5, pas de chaîne alpha)
--Ne retourne rien
os.modetv()
--Désactive la retransmission
--Ne retourne rien
os.cabletv()	
--Reconnait le cable utilisé
--Retourne un nombre
--0 si aucun cable n'est connecté
--1 si c'est un cable S-Video/AV (composite)
--2 si c'est un cable D Terminal Cable/Component Cable
</pre>
<h4 style="text-align: justify;"><span style="text-decoration: underline;"><strong>Fonction windows</strong></span></h4>
<p style="text-align: justify;">En plus de cela, une nouvelle fonction vient de faire son apparition, et nommée <em>os.messagebox()</em>. Elle permet d'afficher une boîte de dialogue (ressemblant beaucoup à celle de <em>Windows</em>) avec des possibilités de personnalisation. On peut par exemple entrer le titre et le message de son choix, ainsi que choisir entre 1 à 4 boutons associés à des actions simples (Oui, Non, Quitter, Annuler, Ok) mais malheureusement qui ne sont pas paramétrables et en anglais. Voici l'exemple fourni par les auteurs avec les commentaires traduits en français&nbsp;:</p>
<pre class="lang:lua decode:true" title="Exemple os.messagebox()">option&nbsp;=&nbsp;{"OK","CANCEL","YES","NO",""}--Table des réponses
--La variable ou est reçu les réponses de la fonction os.messagebox()
local response&nbsp;=&nbsp;5
local title&nbsp;=&nbsp;"Test Of Box" -- Titre
local msg&nbsp;=&nbsp;"Hello From Box...\nOK&nbsp;=&nbsp;1\nCANCEL&nbsp;=&nbsp;2\nYES&nbsp;=&nbsp;3\nNO&nbsp;=&nbsp;4\nEXIT&nbsp;=&nbsp;5" -- Message
while true do
    buttons.read() -- Lecture des touches pressés
    if buttons.triangle then -- Pressez /\
	-- Montre deux boutons X:OK, O:CANCEL par défaut
		response&nbsp;=&nbsp;os.messagebox(title,msg)
    elseif buttons.circle then --Pressez O
	-- Montre le bouton 0:EXIT
        response&nbsp;=&nbsp;os.messagebox(title,msg,__CIRCLE,__EXIT)
    elseif buttons.cross then--Pressez X
	-- Montre deux boutons avec L: No, R: Yes
		response&nbsp;=&nbsp;os.messagebox(title,msg,__L,__NO,__R,__YES)
    elseif buttons.square then -- Pressez []
	-- Montre trois boutons avec L: No, R: Yes X: YES, O: NO, /\: Exit
		response&nbsp;=&nbsp;os.messagebox(title,msg,__CROSS,__YES,__CIRCLE,__CANCEL,__TRIANGLE,__EXIT)
    end
    screen.print(10,5,"Example Message Box")
	
	screen.print(10,17,"Presez triangle pour un simple Message Box (X:OK, O:CANCEL)",0.6)
	screen.print(10,32,"Pressez rond pour un Message Box (O:EXIT)",0.6)
	screen.print(10,47,"Pressez croix pour un Message Box (L:NO, R:YES)",0.6)
	screen.print(10,62,"Pressez carré pour un Message Box (X:YES, O:CANCEL, triangle:EXIT)",0.6)
    -- Nous affichons la valeur pour telle action&nbsp;:)
	screen.print(10,200,"Résultat: "..response.." Selection: "..option[response])
    screen.flip() -- Rafraîchissement de l'écran
end
	</pre>
<figure id="attachment_5367" aria-describedby="caption-attachment-5367" style="width: 480px" class="wp-caption aligncenter"><a href="https://www.customprotocol.com/medias/2015/07/ONELua_messagebox.png"><img decoding="async" class="wp-image-5367 size-full" src="https://www.customprotocol.com/medias/2015/07/ONELua_messagebox.png" alt="ONELua_messagebox" width="480" height="272" srcset="https://www.customprotocol.com/medias/2015/07/ONELua_messagebox.png 480w, https://www.customprotocol.com/medias/2015/07/ONELua_messagebox-300x170.png 300w, https://www.customprotocol.com/medias/2015/07/ONELua_messagebox-370x210.png 370w, https://www.customprotocol.com/medias/2015/07/ONELua_messagebox-270x153.png 270w" sizes="(max-width: 480px) 100vw, 480px" /></a><figcaption id="caption-attachment-5367" class="wp-caption-text">La boîte de dialogue sympathique mais qui reste limitée...</figcaption></figure>
<p style="text-align: justify;">De plus, impossible de personnaliser l'apparence des boutons et de la boîte de dialogue. Espérons une mise à jour pour pouvoir personnaliser d'avantage cette petite fonction bien sympathique.</p>
<pre class="lang:lua decode:true" title="Fonction os.messagebox()">os.messagebox(STRING title,STRING mje)
--STRING title&nbsp;: Le titre de la boîte de dialogue
--STRING mje&nbsp;: Le message à mettre dans la boîte de dialogue
--Retourne 1 si la réponse est OK (quand vous pressez X) ou bien 2 quand vous choisissez CANCEL (quand vous pressez O)
os.messagebox(STRING title,STRING mje,NUMBER button1,NUMBER assigned1)
--STRING title&nbsp;: Le titre de la boîte de dialogue
--STRING mje&nbsp;: Le message à mettre dans la boîte de dialogue
--NUMBER button1&nbsp;: Le bouton à inscrire (par exemple __CIRCLE, __UP, __L)
--NUMBER assigned1&nbsp;: L'action à assigner __OK, __CANCEL, __YES, __NO, __EXIT
--Retourne 1 si l'action est __OK, 2 si __CANCEL, 3 si __YES, 4 si __NO et 5 si __EXIT
os.messagebox(STRING title,STRING mje,NUMBER button1,NUMBER assigned1,NUMBER button2,NUMBER assigned2)
--STRING title&nbsp;: Le titre de la boîte de dialogue
--STRING mje&nbsp;: Le message à mettre dans la boîte de dialogue
--NUMBER button1&nbsp;: Le bouton à inscrire (par exemple __CIRCLE, __UP, __L)
--NUMBER assigned1&nbsp;: L'action à assigner __OK, __CANCEL, __YES, __NO, __EXIT
--NUMBER button2&nbsp;: Le bouton à inscrire (par exemple __CIRCLE, __UP, __L)
--NUMBER assigned2&nbsp;: L'action à assigner __OK, __CANCEL, __YES, __NO, __EXIT
--Retourne 1 si l'action est __OK, 2 si __CANCEL, 3 si __YES, 4 si __NO et 5 si __EXIT
os.messagebox(STRING title,STRING mje,NUMBER button1,NUMBER assigned1,NUMBER button2,NUMBER assigned2,NUMBER button3,NUMBER assigned3)
--STRING title&nbsp;: Le titre de la boîte de dialogue
--STRING mje&nbsp;: Le message à mettre dans la boîte de dialogue
--NUMBER button1&nbsp;: Le bouton à inscrire (par exemple __CIRCLE, __UP, __L)
--NUMBER assigned1&nbsp;: L'action à assigner __OK, __CANCEL, __YES, __NO, __EXIT
--NUMBER button2&nbsp;: Le bouton à inscrire (par exemple __CIRCLE, __UP, __L)
--NUMBER assigned2&nbsp;: L'action à assigner __OK, __CANCEL, __YES, __NO, __EXIT
--NUMBER button3&nbsp;: Le bouton à inscrire (par exemple __CIRCLE, __UP, __L)
--NUMBER assigned3&nbsp;: L'action à assigner __OK, __CANCEL, __YES, __NO, __EXIT
--Retourne 1 si l'action est __OK, 2 si __CANCEL, 3 si __YES, 4 si __NO et 5 si __EXIT
</pre>
<h4 style="text-align: justify;"><span style="text-decoration: underline;"><strong>Fonctions écran</strong></span></h4>
<p style="text-align: justify;">Continuons sur une nouvelle fonction qui ravira toute personne qui ne souhaiterait pas utiliser le <del>grand</del> écran de la PSP&nbsp;: la fonction <em>screen.clip()</em>. Vous l'aurez deviné, elle permet de n'afficher qu'une partie de l'écran déterminable avec la fonction.</p>
<pre class="lang:lua decode:true" title="Fonction screen.clip()">screen.clip(NUMBER x,NUMBER y, NUMBER w, NUMBER h)
--Active la délimitation d'affichage à l'écran
--NUMBER x&nbsp;: Position sur l'axe x 
--NUMBER y&nbsp;: Position sur l'axe y
--NUMBER w&nbsp;: Largeur
--NUMBER h&nbsp;: Hauteur
--Ne retourne rien
screen.clip()
--Désactive la délimitation d'affichage à l'écran
--Ne retourne rien</pre>
<figure id="attachment_5369" aria-describedby="caption-attachment-5369" style="width: 480px" class="wp-caption aligncenter"><a href="https://www.customprotocol.com/medias/2015/07/ONELua_screen.clip_.png"><img decoding="async" class="wp-image-5369 size-full" src="https://www.customprotocol.com/medias/2015/07/ONELua_screen.clip_.png" alt="ONELua_screen.clip()" width="480" height="272" srcset="https://www.customprotocol.com/medias/2015/07/ONELua_screen.clip_.png 480w, https://www.customprotocol.com/medias/2015/07/ONELua_screen.clip_-300x170.png 300w, https://www.customprotocol.com/medias/2015/07/ONELua_screen.clip_-370x210.png 370w, https://www.customprotocol.com/medias/2015/07/ONELua_screen.clip_-270x153.png 270w" sizes="(max-width: 480px) 100vw, 480px" /></a><figcaption id="caption-attachment-5369" class="wp-caption-text">Le logo <strong>Custom Protocol</strong> un peu coupé&nbsp;:p</figcaption></figure>
<p>&nbsp;</p>
<h4 style="text-align: justify;"><span style="text-decoration: underline;"><strong>Fonctions texte</strong></span></h4>
<p style="text-align: justify;">Le développeur a également ajouté une fonctionnalité déjà présente dans plusieurs <em>Lua Players</em>&nbsp;: la fonctionnalité permettant de faire défiler un texte. Disponible maintenant avec la fonction screen.print(), il est ainsi possible de réaliser "un scroll" du texte de gauche à droite, de droite à gauche, de droite à gauche puis de gauche à droite et...</p>
<pre class="lang:lua decode:true" title="Example Défilement de Texte">-- ## Example Scroll Print ##
-- Nous assignors des variables pour les valeurs X permettrons le daplacement du texte
scrollx1&nbsp;=&nbsp;10 -- axe pour déplacement vers la gauche (droite vers gauche)
scrollx2&nbsp;=&nbsp;450 -- axe pour déplacement vers la droite (gauche vers droite)
scrollx3&nbsp;=&nbsp;240 -- axe pout déplacement de la droite vers la gauche (droite vers la gauche sans disparition)
scrollx4&nbsp;=&nbsp;240 -- gauche droite puis droite gauche (centré)
--Charge la palette de couleur
color.loadpalette()
while true do--On ouvre la boucle
	draw.line(240,0,240,272,color.red) --Nous traçons une ligne vertical rouge au milieu de l'écran
	--[[La variable précédente assigné à l'axe x est passé comme un argument et ergot le résultat de la fonction et s'ajoute à cela l'argument "w" pour régler l'affichage de la zone de texte.]]
	--__SLEFT est comme un alignement vers la gauche affiché à partir de l'axe x vers la droite avec un espace d'affichage de 90.
	scrollx1&nbsp;=&nbsp;screen.print(scrollx1,10,"test scroll gauche",0.7,color.white,color.black,__SLEFT,90)
	--__SRIGHT est comme un alignement vers la droite affiché à partir de l'axe x vers la gauche avec un espace d'affichage de 100.
	scrollx2&nbsp;=&nbsp;screen.print(scrollx2,25,"test scroll right",0.7,color.white,color.black,__SRIGHT,100)
	-- __STHROUGH est comme un alignement vers la gauche qui est affiché à partir de l'axe x vers la droite avec un espace d'affichage de 100. 
	scrollx3&nbsp;=&nbsp;screen.print(scrollx3,50,"test scroll throuh",0.7,color.white,color.black,__STHROUGH,100)
	--[[__SSEESAW est un alignement au centre affiché sur l'axe x - moitié de l'espace pour l'afficher,
du droite centrer à gauche centré avec un espace d'affichage de 100
	Note: Si ce mode n'a pas d'effet, c'est pour les raison précedemment cité, alors il effete normalement un texte aligné à gauche.]]
	scrollx4&nbsp;=&nbsp;screen.print(scrollx4,70,"test scroll seesaw",0.7,color.white,color.black,__SSEESAW,100)
	screen.flip() --Rafraichissement de l'écran
end--Fin de la boucle
	</pre>
<figure id="attachment_5420" aria-describedby="caption-attachment-5420" style="width: 480px" class="wp-caption aligncenter"><a href="https://www.customprotocol.com/medias/2015/07/ONELuav3_scroll.png"><img decoding="async" class="wp-image-5420 size-full" src="https://www.customprotocol.com/medias/2015/07/ONELuav3_scroll.png" alt="ONELuav3_scroll" width="480" height="272" srcset="https://www.customprotocol.com/medias/2015/07/ONELuav3_scroll.png 480w, https://www.customprotocol.com/medias/2015/07/ONELuav3_scroll-300x170.png 300w, https://www.customprotocol.com/medias/2015/07/ONELuav3_scroll-370x210.png 370w, https://www.customprotocol.com/medias/2015/07/ONELuav3_scroll-270x153.png 270w" sizes="(max-width: 480px) 100vw, 480px" /></a><figcaption id="caption-attachment-5420" class="wp-caption-text">La fonction <i>screen.print()</i> fait maintenant défiler le texte.</figcaption></figure>
<p style="text-align: justify;">Concernant toujours la fonction gérant l'affichage de texte, il est maintenant possible de pouvoir justifier le texte en plus d'aligner à droite, à gauche ou bien au centre.</p>
<h4 style="text-align: justify;"><span style="text-decoration: underline;"><strong>Fonction contrôle</strong></span></h4>
<p style="text-align: justify;">L'une des dernières principales nouveautés dont nous allons vous parler concerne les contrôles&nbsp;: qui n'a jamais trouvé cela fatigant dans un <em>homebrew</em> de devoir appuyer plusieurs fois sur "Haut" ou "Bas" pour naviguer dans un long menu&#8239;? Ce n'est clairement pas pratique, mais <em>gdljjrod</em> et <em>Rober Galarga </em>ont trouvé une solution&nbsp;: la fonction <em>buttons.interval(). </em>Elle permet tout simplement de simuler le fait de rappuyer sur une touche, tout cela étant paramétrable que ce soit le temps d'activation ou le temps entre chaque répétition. Cette fonction ne fonctionne évidemment pas si vous avez choisi que l'action effectuée doit être "maintenir appuyer le bouton".</p>
<pre class="lang:lua decode:true" title="Fonction buttons.interval()">buttons.interval(NUMBER delay,NUMBER interval)
--Active la fonction
--NUMBER delay&nbsp;: Le délai en cycle avant l'activation (valeur conseillé 40)
--NUMBER interval&nbsp;: L'interval de répétition en cycle (valeur conseillé 10)
--Ne retourne rien
buttons.interval()
--Désactive la fonction
--Ne retourne rien</pre>
<h4 style="text-align: justify;"><span style="text-decoration: underline;"><strong>Autres fonctions</strong></span></h4>
<p style="text-align: justify;">Dans les ajouts mineurs, on retrouve plusieurs petites nouveautés. Tout d'abord, la fonction<em> amg.screenshot()</em> a été ajoutée et permet, comme vous l'aurez sans doute deviné, de prendre une capture d'écran lorsque vous utilisez la librairie AMG spécialisée dans la 3D. Ensuite, les fonctions <em>timers.new</em> et <em>timer.reset</em> retournent la valeur initiale, et la fonction <em>os.cfw() </em>reconnait si l'utilisateur utilise le <strong>VHBL</strong>. Enfin, la fonction <em>ini.read()</em> peut maintenant lire jusqu'à 1024 caractères. Le développeur a amélioré par ailleurs les performances et corrigé des <em>bugs</em> notamment celui concernant la fonction <em>screen.textheight()</em>.</p>
<p style="text-align: justify;">Comme vous pouvez le constater, le <strong>ONELua</strong> version 3 est l'aboutissement d'un long travail de ces développeurs qui incluent des nouveautés de plus en plus ambitieuses. En espérant qu'ils ne s'arrêtent pas de si tôt&#8239;!</p>
<figure id="attachment_5235" aria-describedby="caption-attachment-5235" style="width: 300px" class="wp-caption aligncenter"><a href="https://www.customprotocol.com/medias/2015/06/ONEluav3.zip"><img decoding="async" class="wp-image-5235 size-medium" src="https://www.customprotocol.com/medias/2015/06/bouton-telecharger-v2-300x91.png" alt="Bouton télécharger" width="300" height="91" srcset="https://www.customprotocol.com/medias/2015/06/bouton-telecharger-v2-300x91.png 300w, https://www.customprotocol.com/medias/2015/06/bouton-telecharger-v2-370x112.png 370w, https://www.customprotocol.com/medias/2015/06/bouton-telecharger-v2-270x82.png 270w, https://www.customprotocol.com/medias/2015/06/bouton-telecharger-v2.png 528w" sizes="(max-width: 300px) 100vw, 300px" /></a><figcaption id="caption-attachment-5235" class="wp-caption-text"><b>ONELua v3</b> pour PSP/PS Vita</figcaption></figure>
<p style="text-align: justify;">Pour finir ce long article en beauté, on va conclure comme dans notre dernier article sur une superbe vidéo montrant les capacités de ce <em>Lua Player</em>. Mise en ligne par <em>gljjrod</em>, il s'agit d'une capture vidéo de la démo réalisée par <em>Mills</em> (développeur connu notamment pour son jeu <strong><a href="https://www.customprotocol.com/underground/space-ball-un-jeu-de-golf-en-3d-utilisant-le-onelua/">Space Ball</a></strong>) baptisée <strong>Fruit Explosion</strong>, que nous vous conseillons de télécharger que vous soyez développeur ou pas pour admirer les capacités de notre bonne vielle PSP.</p>
<figure id="attachment_5235" aria-describedby="caption-attachment-5235" style="width: 300px" class="wp-caption aligncenter"><a href="https://dl.dropboxusercontent.com/u/48796093/Onelua/Demo3D/ONEDEMO_(F_EXPLOSION).rar"><img decoding="async" class="wp-image-5235 size-medium" src="https://www.customprotocol.com/medias/2015/06/bouton-telecharger-v2-300x91.png" alt="Bouton télécharger" width="300" height="91" srcset="https://www.customprotocol.com/medias/2015/06/bouton-telecharger-v2-300x91.png 300w, https://www.customprotocol.com/medias/2015/06/bouton-telecharger-v2-370x112.png 370w, https://www.customprotocol.com/medias/2015/06/bouton-telecharger-v2-270x82.png 270w, https://www.customprotocol.com/medias/2015/06/bouton-telecharger-v2.png 528w" sizes="(max-width: 300px) 100vw, 300px" /></a><figcaption id="caption-attachment-5235" class="wp-caption-text"><b>Fruit Explosion</b> pour PSP/PS Vita</figcaption></figure>
<div class="inserervideo"><iframe loading="lazy" width="560" height="315" src="https://www.youtube.com/embed/Mcl6zDHoeLc" frameborder="0" allowfullscreen="allowfullscreen"></iframe></div>
<p>L’article <a rel="nofollow" href="https://www.customprotocol.com/programmation/psp-vita-le-onelua-de-nouveau-mis-a-jour/">[PSP] [Vita] Le ONELua de nouveau mis à jour</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/psp-vita-le-onelua-de-nouveau-mis-a-jour/feed/</wfw:commentRss>
			<slash:comments>0</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>
	</channel>
</rss>

