<?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>Pentest, hacking, sécurité informatique &#187; Game Hacks</title>
	<atom:link href="http://www.indahax.com/category/game-hacks/feed" rel="self" type="application/rss+xml" />
	<link>http://www.indahax.com</link>
	<description></description>
	<lastBuildDate>Wed, 31 Mar 2010 12:35:18 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Le protocole COD4 et les clefs CD</title>
		<link>http://www.indahax.com/game-hacks/le-protocole-cod4-et-les-clefs-cd</link>
		<comments>http://www.indahax.com/game-hacks/le-protocole-cod4-et-les-clefs-cd#comments</comments>
		<pubDate>Fri, 02 Jan 2009 00:57:59 +0000</pubDate>
		<dc:creator>Pierre</dc:creator>
				<category><![CDATA[Game Hacks]]></category>
		<category><![CDATA[anticheat]]></category>
		<category><![CDATA[clef cd]]></category>
		<category><![CDATA[cod4]]></category>
		<category><![CDATA[cod4key2guid]]></category>
		<category><![CDATA[guid]]></category>
		<category><![CDATA[pb]]></category>
		<category><![CDATA[punkbuster]]></category>
		<category><![CDATA[serial]]></category>

		<guid isPermaLink="false">http://www.indahax.com/?p=7</guid>
		<description><![CDATA[Lors de mon précédent post j&#8217;avais expliqué comment était calculé le pb_guid à partir de la clef CD. Cela m&#8217;a donné envie d&#8217;examiner un peu plus en profondeur le protocole COD4 afin de voir de quelle façon sont vérifiées les clefs CD. Dans cet article je ferai un point sur : 1) Le protocole de [...]]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter" title="clanbase" src="http://www.indahax.com/images/cod4.jpg" alt="" /></p>
<p>Lors de mon précédent <a href="http://www.indahax.com/?p=4">post</a> j&#8217;avais expliqué comment était calculé le pb_guid à partir de la clef CD. Cela m&#8217;a donné envie d&#8217;examiner un peu plus en profondeur le protocole COD4 afin de voir de quelle façon sont vérifiées les clefs CD. Dans cet article je ferai un point sur :</p>
<p>1) Le protocole de validation de clef COD4<br />
2) S&#8217;il est possible de générer une clef valide à partir d&#8217;un keygen<br />
3) Les trojans key stealers et le vol de clef CD<br />
<span style="text-decoration: line-through;">4) Comment être TOP EU sur <a href="http://clanbase.ggl.com/rating.php?lid=5711">clanbase</a> </span>( blague de pgm désolé )</p>
<p><span id="more-7"></span></p>
<ul>
<li><span style="text-decoration: underline;"><strong>Le protocole </strong></span></li>
</ul>
<p>COD4 utilise en partie le protocole q3engine dont les sources sont disponibles <a href="http://svn.icculus.org/quake3/trunk/code/server/?pathrev=2">ici</a>. Ce protocole fonctionne avec un serveur principal (Master) qui s&#8217;occupe de recenser les serveurs en ligne et de vérifier la validité des clefs.</p>
<p>Voici un extrait de l&#8217;échange entre le Master et un serveur lors du démarrage de ce dernier :</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">server =&amp;gt; master:20810
heartbeat COD-4.
&nbsp;
master:20810 =&amp;gt; server
getchallenge -1523121167
&nbsp;
master:20810 =&amp;gt; server
getstatus -1523121167
&nbsp;
server =&amp;gt; master:20800
getIpAuthorize 611600408 63.146.124.21 &quot;&quot; 0
&nbsp;
server =&amp;gt; master:20810
statusResponse
g_compassShowEnemies?g_gametypewargamenameCall of Duty 4mapnamemp_backlotprotocol6shortversion1.7sv_allowAnonymous?sv_disableClientConsole?sv_floodprotect1sv_hostnameDiggysv_maxclients12sv_maxPing?sv_maxRate25000sv_minPing?sv_privateClients?sv_punkbuster1sv_pure1sv_voice?ui_maxclients32challenge-1523121167pswrd?mod?
&nbsp;
client =&amp;gt; server
getinfo xxx
&nbsp;
server =&amp;gt; client
infoResponse
challengexxxprotocol6hostnameDiggymapnamemp_backlotsv_maxclients12gametypewarpure1kc1hw2mod?voice?pb1
&nbsp;
server =&amp;gt; master
heartbeat flatline.</pre></div></div>

<p>Dès que le serveur démarre il envoie un message &laquo;&nbsp;<em>heartbeat</em>&nbsp;&raquo; pour informer le master que le serveur est en ligne. Il continuera d&#8217;envoyer le message &laquo;&nbsp;<em>heartbeat</em>&nbsp;&raquo; toutes les 5 minutes pour montrer sa présence en ligne. Lorsque le serveur s&#8217;arrête il envoie alors un message &laquo;&nbsp;<em>heartbeat flatline</em>&nbsp;&raquo; pour signaler au master son passage hors ligne.</p>
<p>Le master va alors répondre en envoyant le message &laquo;&nbsp;<em>getchallenge</em>&nbsp;&raquo; ainsi que le message &laquo;&nbsp;<em>getstatus</em>&nbsp;&raquo; . Le message getchallenge permet au Master d&#8217;authentifier le serveur de jeu, le master l&#8217;ajoutera à sa liste uniquement si le serveur répond avec le message &laquo;&nbsp;<em>getIpAuthorize</em>&nbsp;&raquo; suivie d&#8217;un numéro de challenge et de l&#8217;ip du Master.</p>
<p>Une fois le serveur de jeu identifié auprès du master, il peut recevoir 2 types de messages :<br />
_Les messages &laquo;&nbsp;connectionless&nbsp;&raquo; qui représente les messages envoyés par des clients ou des browsers de serveur de jeu (gamespy/All Seeing Eye), ces messages sont <em>getstatus</em>, <em>getinfo</em>, <em>getchallenge</em>, <em>connect</em>, <em>ipAuthorize</em>, <em>rcon </em>.<br />
_Les messages en rapport avec les clients connectés (les joueurs , les pgms et les noobs).</p>
<p><span style="text-decoration: underline;">Connexion d&#8217;un client : </span></p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">client =&amp;gt; master:20800
getKeyAuthorize 0 ABCD-0123-4567-89AB PB 1c8f2b0836a17b0186c8b207fd688e68
&nbsp;
client =&amp;gt; server
getchallenge 0 &quot;1c8f2b0836a17b0186c8b207fd688e68&quot;
&nbsp;
server =&amp;gt; master:20800
getIpAuthorize 1204470709 89.3.249.119 &quot;&quot; 0 PB &quot;1c8f2b0836a17b0186c8b207fd688e68&quot;
&nbsp;
master:20800 =&amp;gt; server
ipAuthorize 1204470709 accept KEY_IS_GOOD 541288 1c8f2b0836a17b0186c8b207fd688e68
&nbsp;
server =&amp;gt; client
challengeResponse 1204470709
&nbsp;
client =&amp;gt; server
connect &quot;cg_predictItems1cl_anonymous?cl_punkbuster1cl_voice?cl_wwwDownload1rate25000snaps30namepierzprotocol6challenge1204470709qport-5676&quot;
&nbsp;
server =&amp;gt; client
connectResponse</pre></div></div>

<p>On arrive à la partie qui nous intéresse : la connexion du client. Avant de se connecter à un serveur, le client envoie sa clef CD ainsi que son PB_GUID au serveur master via le message <em>getKeyAuthorize</em>. Cela permet au master d&#8217;associer l&#8217;adresse ip d&#8217;un client avec une clef CD et un GUID. Le client envoie ensuite au serveur un message <em>getchallenge</em> suivie de son pb_guid . Le serveur va alors demander au master si la clef correspondant à ce guid et cette ip est valide.</p>
<p>Le master va répondre au serveur avec le message &laquo;&nbsp;<em>ipAuthorize</em>&nbsp;&raquo; de différente façon :<br />
-&gt; KEY_IS_GOOD : la clef est valide, le client sera accepté par le serveur.<br />
-&gt; INVALID_CDKEY  : la clef est invalide, le client ne pourra pas se connecter au serveur.<br />
-&gt; CLIENT_UNKNOWN_TO_AUTH : le message <em>getKeyAuthorize</em> envoyé par le client n&#8217;a pas été reçu par le serveur ou bien il a été reçu mais à partir d&#8217;une autre ip, le client ne pourra pas se connecter (j&#8217;ai d&#8217;ailleurs remarqué que le message <em>getKeyAuthorize</em> était envoyé 2 fois par le client pour éviter les UDP packet loss).</p>
<p>Sur cod 1 et cod 2 il suffisait d&#8217;éditer le fichiers hosts en ajoutant la ligne: &laquo;&nbsp;<em>127.0.0.1	cod2master.activision.com</em>&nbsp;&raquo; pour créer un serveur cracké car le serveur refusait la connexion d&#8217;un client uniquement s&#8217;il recevait le message INVALID_CDKEY, s&#8217;il ne recevait pas de message le client était quand même autorisé à se connecter.</p>
<p>Sur cod4 le serveur attend obligatoirement une réponse au message &laquo;&nbsp;<em>getIpAuthorize</em>&nbsp;&raquo; c&#8217;est pourquoi il faut utiliser le &laquo;&nbsp;<em>no wait patch</em>&nbsp;&raquo; dispo sur <a href="http://m0008.gamecopyworld.com/games/pc_call_of_duty_4.shtml#Call%20of%20Duty%204%20v1.7%20PRIVATE%20WINDOWS%20SERVER%20&amp;%20NO-WAIT%20PATCH%201">gamecopyworld </a>, qui émule les autorisations de clefs CD.</p>
<p>S&#8217;ensuit l&#8217;échange de challenge pour authentifier le client et la confirmation de connexion au serveur avec les messages &laquo;&nbsp;<em>challengeResponse</em>&nbsp;&raquo; , &laquo;&nbsp;<em>connect</em>&nbsp;&raquo; et &laquo;&nbsp;<em>connectResponse</em>&nbsp;&raquo; . Ces messages ne nous intéresse pas vraiment car on a assez d&#8217;information pour réaliser notre vérificateur de clef CD.</p>
<ul>
<li><span style="text-decoration: underline;"><strong>Générer des clefs CD valides ?</strong></span></li>
</ul>
<p>Pour expérimenter tout çà j&#8217;ai réalisé un petit tool qui test des clefs CD, j&#8217;en ai générées + de 10 millions via l&#8217;algo du keygen razor. Résultat : &laquo;&nbsp;EPIC FAIL&nbsp;&raquo;, aucune n&#8217;était valide ! Donc n&#8217;essayez pas de générer plusieurs clefs avec un keygen dans l&#8217;espoir d&#8217;avoir un jour une clef valide <img src='http://www.indahax.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Je ne release pas le tool car il est inefficace et peu causer un DOS s&#8217;il est utilisé en masse.</p>
<p>Cependant voici un extrait du code qui résume bien le principe du programme :</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">//pour chaque clef CD</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//on calcule le GUID correspondant</span>
cod4key2guid<span style="color: #009900;">&#40;</span>formatkey<span style="color: #339933;">,</span>guid<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//on s'identifie auprès du serveur Master (émulation du client)</span>
sprintf<span style="color: #009900;">&#40;</span>l_buffer<span style="color: #339933;">,</span><span style="color: #ff0000;">&quot;ÿÿÿÿgetKeyAuthorize 0 %s PB %s&quot;</span><span style="color: #339933;">,</span>formatkey<span style="color: #339933;">,</span>guid<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
sendto<span style="color: #009900;">&#40;</span>listen_s<span style="color: #339933;">,</span>l_buffer<span style="color: #339933;">,</span>strlen<span style="color: #009900;">&#40;</span>l_buffer<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> sockaddr<span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;</span>masterAddr<span style="color: #339933;">,</span><span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>masterAddr<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>.
<span style="color: #202020;">Sleep</span><span style="color: #009900;">&#40;</span><span style="color: #0000dd;">250</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//on simule une connexion de ce même client sur un serveur (émulation du serveur)</span>
sprintf<span style="color: #009900;">&#40;</span>l_buffer<span style="color: #339933;">,</span><span style="color: #ff0000;">&quot;ÿÿÿÿgetIpAuthorize %d %s &quot;</span><span style="color: #ff0000;">&quot; 0 PB &quot;</span><span style="color: #339933;">%</span>s<span style="color: #ff0000;">&quot;&quot;</span><span style="color: #339933;">,</span>challenge<span style="color: #339933;">,</span>localIp<span style="color: #339933;">,</span>guid<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
sendto<span style="color: #009900;">&#40;</span>listen_s<span style="color: #339933;">,</span>l_buffer<span style="color: #339933;">,</span>strlen<span style="color: #009900;">&#40;</span>l_buffer<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> sockaddr<span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;</span>masterAddr<span style="color: #339933;">,</span><span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>masterAddr<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//On recoit la réponse</span>
recvfrom<span style="color: #009900;">&#40;</span>listen_s<span style="color: #339933;">,</span>l_buffer<span style="color: #339933;">,</span>BUFFERSIZE<span style="color: #339933;">,</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> sockaddr<span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;</span>fromAddr<span style="color: #339933;">,&amp;</span>amp<span style="color: #339933;">;</span>fromSize <span style="color: #009900;">&#41;</span>
&nbsp;
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> strstr<span style="color: #009900;">&#40;</span>l_buffer<span style="color: #339933;">,</span><span style="color: #ff0000;">&quot;KEY_IS_GOOD&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
<span style="color: #666666; font-style: italic;">//JACKPOT</span>
<span style="color: #009900;">&#125;</span><span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> strstr<span style="color: #009900;">&#40;</span>l_buffer<span style="color: #339933;">,</span><span style="color: #ff0000;">&quot;INVALID_CDKEY&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
<span style="color: #666666; font-style: italic;">//</span></pre></div></div>

<ul>
<li><span style="text-decoration: underline;"><strong>D&#8217;autres moyen pour obtenir des clefs cd</strong></span></li>
</ul>
<p>Obtenir une clef CD gratuitement est difficile,mais il reste encore un moyen : le vol. La clef CD cod4 est stocké dans le registre à cette adresse : <em>HKEY_LOCAL_MACHINESOFTWAREActivisionCall of Duty 4 codkey</em> .</p>
<p>Il est facile de la récupérer à partir du moment où on a accès à la machine, de nombreux trojan intègre cette fonctionnalité, c&#8217;est pourquoi certains développeurs ont pris des mesures : c&#8217;est le cas du jeux Battlefield 2 qui à partir du patch 1.03 chiffre la clef CD du registre en fonction du hardware (mais je suppose qu&#8217;avec un peu de reverse engineering ont doit pouvoir récupérer l&#8217;original).</p>
<p>Maintenant le problème est le vecteur d&#8217;infection : <span style="text-decoration: underline;">Comment avoir un accès à l&#8217;ordinateur d&#8217;un joueur de cod4 ?</span></p>
<p>Idée n°1 (La moins efficace) : Installer un serveur cod4 et se démerder pour avoir un maximum de joueurs, à partir de là vous pouvez récupérer les adresses ips des joueurs. L&#8217;inconvénient est que de nos jours exploiter un windows XP à distance de cette façon est difficile; principalement à causes des routeurs/firewall puis à cause des services désactivés par les AV, mais les pcs vulnérables existent toujours.</p>
<p>Idée n°2 (Ultra efficace) : Prendre le contrôle de sites relatifs à ces jeux, typiquement : les communautés de joueurs, les forums, ceux proposant des tournois/ladder ou encore les sites de cheats. Là on sait que les visiteurs ont quasiment tous cod4 installés, donc une fois le site hacké , on peut mettre en place un  mpack (exploiter ie est déjà beaucoup plus réaliste qu&#8217;exploiter une faille LSASS ; ) , binder les exécutables proposés par le site ou carrément forcer le téléchargement etc.</p>
<p>Il faut savoir que certain <a href="http://www.agerage.net/">site de cheat</a> vendent des clefs CD,  je n&#8217;ai aucune idée de leur origine, mais si elles ne proviennent pas d&#8217;Activision, il est fort probable qu&#8217;elles proviennent des key stealers&#8230;</p>
<p>En parlant de cheat, j&#8217;espère pouvoir vous expliquer prochainement comment sont réalisés les Wallhack/Aimbots et autre merde en tout genre sur cod4.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.indahax.com/game-hacks/le-protocole-cod4-et-les-clefs-cd/feed</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>COD4 cdkey to pb_guid</title>
		<link>http://www.indahax.com/game-hacks/cod4-cdkey-to-pb_guid</link>
		<comments>http://www.indahax.com/game-hacks/cod4-cdkey-to-pb_guid#comments</comments>
		<pubDate>Fri, 13 Jun 2008 14:47:10 +0000</pubDate>
		<dc:creator>Pierre</dc:creator>
				<category><![CDATA[Game Hacks]]></category>
		<category><![CDATA[anticheat]]></category>
		<category><![CDATA[cod4]]></category>
		<category><![CDATA[cod4key2guid]]></category>
		<category><![CDATA[guid]]></category>
		<category><![CDATA[pb]]></category>
		<category><![CDATA[punkbuster]]></category>

		<guid isPermaLink="false">http://www.indahax.com/?p=4</guid>
		<description><![CDATA[On va commencer ce blog avec un peu de Reverse Engineering sur punkbuster &#38; cod4. Je cherchais un moyen de générer des clefs CD valides pour cod4, les clefs générées par les k3yg3ns sont valides pour une vérification logiciel mais lorsque l&#8217;on va jouer en ligne, on va rapidement avoir le message &#171;&#160;clef cd invalide&#160;&#187;. [...]]]></description>
			<content:encoded><![CDATA[<p><img alt="" src="http://www.indahax.com/images/cb160.jpg" title="pgm" class="alignleft" width="160" height="120" />On va commencer ce blog avec un peu de Reverse Engineering sur punkbuster &amp; cod4. Je cherchais un moyen de générer des clefs CD valides pour cod4, les clefs générées par les k3yg3ns sont valides pour une vérification logiciel mais lorsque l&#8217;on va jouer en ligne, on va rapidement avoir le message &laquo;&nbsp;clef cd invalide&nbsp;&raquo;. La vérification est en faite effectuée sur le pb_guid qui est généré à partir de la clef CD.</p>
<p>Après avoir fait un peu de RE sur cod4 je me rends compte que le hash est généré via punkbuster (dans la DLL pbcl.dll ). Après avoir un peu bataillé avec la masse de junk code punkbuster qui fait plein d&#8217;opérations useless sur la clef CD j&#8217;arrive à dénicher la fonction qui génère le hash. C&#8217;est en faite un simple hash md5, avec une initialisation spéciale, qui est effectuée sur les 16 premiers caractères de la clef.</p>
<p><a href="tools/cod4key2guid.zip"> sources</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.indahax.com/game-hacks/cod4-cdkey-to-pb_guid/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

