tag:blogger.com,1999:blog-54596909235453151552024-03-16T19:52:57.412+01:00SoftbreakersIngeniería inversa creativaSoftbreakershttp://www.blogger.com/profile/01666968545873713297noreply@blogger.comBlogger29125tag:blogger.com,1999:blog-5459690923545315155.post-61005780591012512962017-05-23T17:09:00.002+02:002017-05-23T17:09:46.582+02:00Ataque ransomware en Telefónica y otras (2)<h2>
<i>
Wannacry </i>desactivado</h2>
<div style="text-align: justify;">
Finalmente la amenaza de <i>Wannacry </i>(al menos, de esta campaña) parece haber terminado. A estas alturas casi todo el mundo se habrá actualizado su <i>Windows</i> con <a href="http://www.catalog.update.microsoft.com/Search.aspx?q=KB4012598" target="_blank">los parches que Microsoft</a> lanzó dos meses antes, y ante el revuelo y sin que sirva de precedente incluso han sacado parches para sistemas operativos que ya no tenían soporte ni actualizaciones, como es el caso de <i>Windows XP</i> y <i>Windows Server 2003</i>.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8qb-6F5YdSn2Fqzlia6kiLnZgEUNceeupy7pSFpO6HXkyM_hbipIYv-w6tuaYLtJRTCw4g4iBx155gdz-N5UqHaV_u1DMRORZWTczs8OL_-AYbceLOGpOOBBDY-nvVTrCY-GzjiCshiNN/s1600/wannacry-screencap_thumb800.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="225" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8qb-6F5YdSn2Fqzlia6kiLnZgEUNceeupy7pSFpO6HXkyM_hbipIYv-w6tuaYLtJRTCw4g4iBx155gdz-N5UqHaV_u1DMRORZWTczs8OL_-AYbceLOGpOOBBDY-nvVTrCY-GzjiCshiNN/s400/wannacry-screencap_thumb800.jpg" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Captura <i>ransomware</i> <i>Wannacry</i></td></tr>
</tbody></table>
</div>
<div style="text-align: justify;">
<br />
<a name='more'></a>Por su parte el ransomware ha parado de expandirse, aunque por el camino habrán quedado muchos equipos con los archivos cifrados esperando a ver si suena la flauta y los operadores del ransomware liberan las claves de descifrado, ya sea por ver colmadas sus expectativas, o por sentirse acorralados por las fuerzas de seguridad, lo que ocurra antes...<br />
<br />
Pero hablemos de como se ha parado la expansión del ransomware.</div>
<br />
<h2>
Un salvador accidental</h2>
<div style="text-align: justify;">
No voy a entrar en los titulares que los medios han dedicado a la persona que ha parado la expansión del ransomware de un solo golpe. Titulares grandilocuentes como héroe, salvador, genio, etc... denominaciones a las que en honor a la verdad, y tal y como <a href="https://www.malwaretech.com/2017/05/how-to-accidentally-stop-a-global-cyber-attacks.html" target="_blank">el propio mencionado reconoce en su blog</a>, hay que añadir el adjetivo "<i>accidental</i>".</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Aunque inicialmente prefirió mantenerse en el anonimato, al final parece que ha decidido "<i>salir del armario</i>" ofreciendo una entrevista a la agencia de noticias <i>Associated Press</i> el pasado lunes 15 de mayo (el ataque comenzó la mañana del viernes 12).</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/wyq0cyRTZmo/0.jpg" frameborder="0" height="266" src="https://www.youtube.com/embed/wyq0cyRTZmo?feature=player_embedded" width="320"></iframe></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Primero, darle las gracias pues debido a su rápida intervención registrando el dominio al que trataba de acceder el <i>ransomware</i>, muchos equipos que podrían haberse contagiado no lo hicieron. Mucha gente tendría ahora sus archivos cifrados de no haber sido por él. Eso lo primero.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Y lo segundo las lecciones aprendidas. Tal y como él describe en su blog, no registró el dominio para detener la expansión del <i>ransomware</i>. Detectó que el <i>ransomware, </i>tras cifrar los archivos de la víctima trataba de conectar con un dominio que no había sido registrado para posteriormente comenzar a intentar expandirse usando la públicamente conocida (desde mediados de abril) vulnerabilidad <i>EternalBlue.</i><br />
<br />
Puesto que él se dedica a geolocalizar botnets, registró el dominio y lo apuntó hacia su servidor para disponer de primera mano las direcciones IP en las que aparecía un equipo infectado. Tal y como describe en su entrada, posteriormente puede intentar buscar alguna vulnerabilidad en el <i>malware </i>que sea explotable remotamente para tratar de inhabilitarlo.<br />
<br /></div>
<div style="text-align: justify;">
Unas cuatro horas más tarde fue cuando descubrió, por mensajes que le llegaban acerca de que el <i>ransomware </i>no trataba de propagarse por la vulnerabilidad del protocolo <i>SMB</i>, que el registro de ese dominio había cambiado el comportamiento del <i>ransomware</i>.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Inicialmente se temieron lo peor, que al registrar el dominio, habían activado la funcionalidad del <i>malware </i>de cifrar los archivos de la víctima, momentos de pánico tal y como describe en su blog. Afortunadamente fue un error al interpretar el código del <i>ransomware</i>. El programador del <i>ransomware </i>había dispuesto un interruptor remoto para detener la propagación de su criatura, que no era más que colocar un servidor al otro lado del dominio al que trataba de acceder el <i>ransomware</i>.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Por poner un símil, este investigador se había encontrado con una caja negra (el <i>ransomware</i>) que cifraba los archivos de las víctimas, y de la que salían cables por un lado y entraban por otro. El se limitó a cortar uno de estos cables y ponerse a escuchar lo que salía del mismo, sin antes estudiar el interior de dicha caja negra. De la misma manera que su acción permitió que el <i>ransomware </i>parara su expansión, ya que el programador del <i>ransomware </i>lo había diseñado así, también podría no haber provocado nada, o lo que es peor, haber provocado que en esa caja negra se desataran otros efectos aún peores... en cuyo caso hoy no estaríamos hablando de héroe salvador sino de otra cosa mucho menos gloriosa...</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
De cara al futuro es algo que se debe tener en cuenta. No me sorprendería que tarde o temprano apareciera un <i>malware </i>que por hacer un guiño a <i>Wannacry</i>, intentara acceder a un dominio no registrado y que si alguien lo registra y coloca un servidor a la escucha en dicho dominio, el <i>malware</i> comenzara a cometer salvajadas en los ordenadores infectados.<br />
<br />
Pero al César lo que es del César. Ha pasado lo que ha pasado, y gracias al héroe <i>accidental </i>como él se autodefine, muchos que se habrían infectado no lo han hecho.<br />
<br />
<h2>
Descifrador para <i>Wannacry</i></h2>
<div>
Desde un punto de vista puramente técnico, para mí el héroe de esta película es otra persona que no ha salido tanto en los medios. Me refiero al francés <a href="https://twitter.com/adriengnt" target="_blank"><i>Adrien Guinet</i></a>. Este investigador estudió la parte del <i>ransomware </i>encargada del cifrado de los ficheros, y se dio cuenta de que podía localizar la clave privada generada en la máquina de la víctima y enviada al centro de control de los que están explotando el <i>ransomware, </i>ya que ésta aún podía permanecer en la memoria <i>RAM </i>del equipo a pesar de que el <i>ransomware </i>liberara los contextos de cifrado proporcionados por las librerías del sistema operativo, en concreto tras la llamada a la función <i><a href="https://msdn.microsoft.com/es-es/library/windows/desktop/aa380268(v=vs.85).aspx" target="_blank">CryptReleaseContext</a>.</i></div>
<div>
<i><br /></i></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://i.ytimg.com/vi/BnlG-owSVTk/maxresdefault.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="225" src="https://i.ytimg.com/vi/BnlG-owSVTk/maxresdefault.jpg" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Adrien Guinet durante <a href="https://www.youtube.com/watch?v=BnlG-owSVTk" target="_blank">una conferencia en 2.015</a></td></tr>
</tbody></table>
<div>
A toda prisa desarrolló una aplicación que denominó <i><a href="https://github.com/aguinet/wannakey" target="_blank">Wannakey</a> </i>y que puso a disposición de todo el mundo gratuitamente. La condición necesaria para que pudiera localizar la clave privada, aunque no condición suficiente, era que el equipo tras haberse realizado el cifrado de los archivos no se hubiera reiniciado. Solo así, podía existir la posibilidad de que <i>Wannakey </i>pudiera localizar la clave privada necesaria para el descifrado de los archivos, aunque no es infalible ya que la memoria liberada podía ser sobrescrita en cualquier momento por el sistema operativo.</div>
<div>
<br /></div>
<div>
Posteriormente han surgido otras aplicaciones basadas en la anterior como <a href="https://github.com/gentilkiwi/wanakiwi" target="_blank"><i>Wannakiwi</i></a><i>.</i></div>
<div>
<i><br /></i></div>
</div>
<h2>
Dudas acerca del ransomware</h2>
<div>
Tras la polvareda quedan algunas dudas sin respuesta, o al menos por ahora sin respuesta. Además de las típicas de autoría y demás, desde un punto de vista más técnico:</div>
<div>
<ul>
<li>¿Por qué un "<i>botón</i>" de apagado?</li>
<li>¿Por qué un "<i>botón</i>" de apagado que cualquiera puede activar?</li>
<li>¿Por qué este ransomware a diferencia del resto no tiene medidas para dificultar la ingeniería inversa? Por ejemplo, empaquetado de los ejecutables para evitar o dificultar desensamblados, mecanismos de detección de ejecución en máquinas virtuales.</li>
</ul>
<div style="text-align: justify;">
<div>
El "<i>botón</i>" de apagado más lógico podría haberse implementado de una manera un poco más compleja, que permitiera a los que lo controlan parar momentáneamente la expansión del <i>ransomware</i> para después volverlo a liberar, pero dejarlo así, sin registrar el dominio a manos del primero que lo descubriera no tiene ningún sentido.</div>
<div>
<br /></div>
</div>
<div style="text-align: justify;">
Son dudas que pueden alimentar las hipótesis de algunos respecto a que <i>Wannacry </i>ha sido un <i>ransomware </i>que aún no estaba acabado y que ha podido "<i>escaparse</i>" en alguna prueba preliminar escurriéndose mediante el protocolo SMB usando el exploit <i>EternalBlue</i>. Solo así se entendería que tuviera un "<i>botón" </i>para controlar su expansión de fácil acceso para cualquier investigador (basta con capturar el tráfico saliente de una máquina infectada) y que no tuviera medidas anti-ingeniería inversa.</div>
</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<h2>
Recaudación económica</h2>
</div>
<div style="text-align: justify;">
Por ahora, en los tres monederos de bitcoin que usa el ransomware, llevan recaudados unos 49,63BTC que al cambio actual son poco más de 100.000€:</div>
<ul>
<li><a href="https://blockchain.info/address/12t9YDPgwueZ9NyMgw519p7AA8isjr6SMw" target="_blank">12t9YDPgwueZ9NyMgw519p7AA8isjr6SMw</a></li>
<li><a href="https://blockchain.info/address/13AM4VW2dhxYgXeQepoHkHSQuy6NgaEb94" target="_blank">13AM4VW2dhxYgXeQepoHkHSQuy6NgaEb94</a></li>
<li><a href="https://blockchain.info/address/115p7UMMngoj1pMvkpHijcRdfJNXj6LrLn" target="_blank">115p7UMMngoj1pMvkpHijcRdfJNXj6LrLn </a></li>
</ul>
<div style="text-align: justify;">
Por ahora solo hay ingresos y ninguna retirada de los monederos. Imagino que para los maleantes el tema es como convertirlos a moneda física o bienes sin que se pueda rastrear que los fondos provienen de dichos monederos...</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Es de suponer que ese trío de monederos de bitcoins estarán siendo minuciosamente vigilados por las autoridades para intentar localizar y detener a los autores del ataque. El tiempo dirá como acaba la cosa para los maleantes...</div>
<br />
<br />Softbreakershttp://www.blogger.com/profile/01666968545873713297noreply@blogger.com0tag:blogger.com,1999:blog-5459690923545315155.post-12565403924805817572017-05-12T18:57:00.000+02:002017-05-12T18:57:25.142+02:00Ataque ransomware en Telefónica y otras<h2>
Introducción</h2>
<div style="text-align: justify;">
Hoy 12 de mayo ha ocurrido. Telefónica, y otras empresas según el <a href="https://www.ccn-cert.cni.es/seguridad-al-dia/comunicados-ccn-cert/4464-ataque-masivo-de-ransomware-que-afecta-a-un-elevado-numero-de-organizaciones-espanolas.html" target="_blank">comunicado del CCN-CERT</a>, han sufrido un ataque de ransomware. No es la primera ni la última empresa a la que le pasará esto, pero en este caso el tema ha ido a mayores ya que el ejecutable que despliega el ransomware parece ser que usa un exploit basado en una vulnerabilidad ya corregida por Microsoft en su boletín <a href="https://technet.microsoft.com/en-us/library/security/ms17-010.aspx" target="_blank">MS17-010</a>. No estamos hablando de hacer click en un adjunto a un correo y un ransomware te cifra los archivo de tu máquina, si no que además el ransomware se propaga a través de la intranet (ya sea intranet física o virtual a través de VPN) a todas las máquinas Windows que pueda localizar.</div>
<div style="text-align: justify;">
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqI0-fQuizoVDArHutkYLrOBIAZqJqeJys64qloM3i_TKdf2dkUg0-ameia7eNkVu9RjbEfPgEW-dN1np4HLhGivhTokWxqpkyaJS7klgjtwp152zqi4HufE0zjAqmeckmt_LIaP9HcXd8/s1600/logo_telefonica_azul.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="142" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqI0-fQuizoVDArHutkYLrOBIAZqJqeJys64qloM3i_TKdf2dkUg0-ameia7eNkVu9RjbEfPgEW-dN1np4HLhGivhTokWxqpkyaJS7klgjtwp152zqi4HufE0zjAqmeckmt_LIaP9HcXd8/s400/logo_telefonica_azul.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Logo de Telefónica</td></tr>
</tbody></table>
<div style="text-align: justify;">
No voy a escribir sobre el ransomware usado (según el CCN-CERT una variante de <i>WannaCry</i>), si no un poco sobre la historia de la vulnerabilidad que se ha usado para expandir el ransomware por <a href="https://www.xataka.com/seguridad/un-ciberataque-deja-fuera-de-juego-la-intranet-de-telefonica-en-toda-espana" target="_blank">gran parte de la intranet de Telefónica España</a> y otras.</div>
<div style="text-align: justify;">
<a name='more'></a><h2>
<i><br /></i></h2>
<h2>
<i>¿NSA?</i> exploits</h2>
<div>
Hace prácticamente un mes (mediados de abril), el grupo <i><a href="https://en.wikipedia.org/wiki/The_Shadow_Brokers" target="_blank">Shadow Brokers</a> </i>liberó un <a href="https://github.com/misterch0c/shadowbroker/" target="_blank">paquete de exploits</a> que dicen haber robado a <i>Equation Group</i>, un grupo al parecer vinculado a la <i>NSA </i>americana (o incluso pueden ser parte de la propia <i>NSA</i>).</div>
<div>
<br /></div>
<div>
Dentro del paquete, varios de ellos afectaban al servicio <i>SMB </i>de distintas versiones del sistema operativo <i>Windows</i>. <i>Microsoft </i>lanzó casi inmediatamente <a href="https://blogs.technet.microsoft.com/msrc/2017/04/14/protecting-customers-and-evaluating-risk/" target="_blank">un comunicado</a> indicando que las vulnerabilidades ya habían sido corregidas anteriormente en forma de actualizaciones para los sistemas operativos afectados.</div>
<div>
<br /></div>
<div>
En concreto, las que afectaban a las últimas versiones del sistema operativo <i>Windows</i> ya habían sido corregidas por <i>Microsoft</i> un mes antes (a mediados de marzo). Concretamente la vulnerabilidad que se ha usado según el CCN-CERT se corrigió en el boletín <a href="https://technet.microsoft.com/en-us/library/security/ms17-010.aspx" target="_blank">MS17-010</a>.</div>
<h2>
<br /></h2>
<h2>
En casa del herrero...</h2>
<div>
El comunicado del CCN-CERT relaciona el acontecimiento con la aparición "<i>hace unos días</i>" de pruebas de concepto utilizando los citados exploits.</div>
<div>
<br /></div>
<div>
Y buscando dichas pruebas de concepto nos saltan, entre otras cosas, una entrada en el blog "<i>Un informático en el lado del mal</i>" titulado "<i><a href="http://www.elladodelmal.com/2017/04/hackear-windows-7-2008-r2-con.html" target="_blank">Hackear Windows 7 & 2008 R2 con Eternalblue y Doublepulsar de #ShadowBroker usando #Metasploit</a></i>". La entrada de ese blog llama mucho la atención, ya que el blog es de <a href="https://www.elevenpaths.com/es/quienes-somos/nuestro-equipo/chema-alonso/index.html" target="_blank">Chema Alonso, presidente de ElevenPaths</a>, la "<i>unidad global de ciberseguridad de Telefónica</i>".</div>
<div>
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEib_Rw-3gQvbeiOhtoWkTb2cgvw_OHfW8d7hjOuybI1RPp3T7_omTkUhs62s-HbX4nionI2O4w_s4yhyphenhyphen6uW35ZSnEORVSUN0378-tr5hAm1_WSCbCHvf9f36mVrEdgB0cmByaeC2ks-UwPP/s1600/elevenpaths.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="151" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEib_Rw-3gQvbeiOhtoWkTb2cgvw_OHfW8d7hjOuybI1RPp3T7_omTkUhs62s-HbX4nionI2O4w_s4yhyphenhyphen6uW35ZSnEORVSUN0378-tr5hAm1_WSCbCHvf9f36mVrEdgB0cmByaeC2ks-UwPP/s320/elevenpaths.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Logo ElevenPaths</td></tr>
</tbody></table>
En dicha entrada se expone como exportar el exploit <i>Eternalblue </i>junto con el plugin <i>DoublePulsar </i>para inyectar una librería al proceso remoto comprometido en el conocido framework <i>Metasploit.</i> Dicha entrada se basaba en un documento de uno de los autores fechado nada y nada menos que el 17 de abril, tres días después de la filtración por parte de <i>Shadow Brokers</i>.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
En la propia entrada recomiendan encarecidamente, y cito:</div>
<blockquote class="tr_bq" style="text-align: justify;">
<i>Si eres un personal de IT te recomendamos que apliques los parches de seguridad para esta vulnerabilidad lo antes posible las máquinas de tu empresa o dominio, ya que es una vulnerabilidad crítica que podría ser explotada por cualquiera, al no requerir la interacción por parte del usuario, solamente disponer de conectividad con la máquina.</i></blockquote>
<div style="text-align: justify;">
Chema Alonso ha comunicado vía <a href="https://twitter.com/chemaalonso" target="_blank">Twitter</a> que <i>ElevenPaths </i>no ha sido afectada, que él no es el responsable de TI de Telefónica y que sus compañeros están trabajando en el tema junto con el personal de TI de Telefónica.</div>
<div style="text-align: justify;">
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh16i5bv8U6MpLJtLC-TOAeQiiSQuxv7oJfviaFYBLyPycSkQsjC9JQN61oAwGReufIpWyd0Dd5fHk7a9vNvc2jypOtG6yqfuIywWoIas7i1cOt58RjBfzghMggYB_vkrumaQdm_7DjlK0T/s1600/chema_tweet.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="218" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh16i5bv8U6MpLJtLC-TOAeQiiSQuxv7oJfviaFYBLyPycSkQsjC9JQN61oAwGReufIpWyd0Dd5fHk7a9vNvc2jypOtG6yqfuIywWoIas7i1cOt58RjBfzghMggYB_vkrumaQdm_7DjlK0T/s400/chema_tweet.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Tweet de Chema Alonso</td></tr>
</tbody></table>
<div style="text-align: justify;">
Efectivamente no es responsabilidad suya, pero no deja de ser irónico que en una de las compañías más afectadas en España por este ataque, su unidad de ciberseguridad estuviera trabajando sobre dichos exploits, comprobando y advirtiendo de su efectividad desde hace ya casi un mes...</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
En otros tweets aclara que no ha sido Telefónica la única afectada tal y como afirma el comunicado del CCN-CERT. A estas horas también se sabe que el servicio de salud británico (<i>NHS</i>) también ha sido atacado por este ransomware, y esto ya es algo más peliagudo ya que puede afectar a la salud de las personas.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
También <a href="https://www.theguardian.com/technology/2017/may/12/nhs-ransomware-cyber-attack-what-is-wanacrypt0r-20" target="_blank">se reportan ataques en Ucrania, Rusia y Taiwan</a>.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
En fin, <a href="http://www.softbreakers.com/2015/04/la-agencia-de-certificaciones-de.html" target="_blank">una vez más</a> podemos aplicar aquello de "<i>en casa del herrero, cuchillo de palo"...</i></div>
Softbreakershttp://www.blogger.com/profile/01666968545873713297noreply@blogger.com1tag:blogger.com,1999:blog-5459690923545315155.post-22479070886889376542017-05-06T02:30:00.003+02:002017-05-06T02:57:58.020+02:00La continuidad de FX Interactive en entredicho... otra vez<h2>
Antecedentes</h2>
<div style="text-align: justify;">
Ya hace dos años (abril de 2.015) la situación de FX Interactive <a href="http://www.softbreakers.com/2015/04/fx-interactive-y-su-plataforma-digital.html" target="_blank">se describía como desesperada</a>. Entonces la empresa hacía unos meses había tenido que (volver a) despedir a parte de su plantilla. Y tras dos años la cosa parece no haber mejorado. Un <a href="http://www.elconfidencial.com/tecnologia/2017-05-05/fx-interactive-insolvente-fogasa-pc-futbol_1376814/" target="_blank">nueva noticia aparecida en ElConfidencial</a>, posiblemente surgida a partir de comentarios que llevan corriendo por algunos foros de videojuegos desde hace al menos una semana hace que se nos despierte el interés por chequear el estado de nuestra querida <i>FX Interactive</i>.</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6d0_33xALluAaqngxsN8z9cmAOJ_4HSBlWnPGIf5VHfTr0lLA1UeZGmZihppeY_eaL64o7bS8Gz7nzJeclJLWKMKIYBIV9UJN8nbJuTAEtJGntvE2NIpQBMmvtdy8x044k8E8C78Zcm7z/s1600/fx_logo.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="170" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6d0_33xALluAaqngxsN8z9cmAOJ_4HSBlWnPGIf5VHfTr0lLA1UeZGmZihppeY_eaL64o7bS8Gz7nzJeclJLWKMKIYBIV9UJN8nbJuTAEtJGntvE2NIpQBMmvtdy8x044k8E8C78Zcm7z/s320/fx_logo.jpg" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Logo de <i style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 11.88px;">FX Interactive</i></td></tr>
</tbody></table>
<div class="separator" style="clear: both; text-align: justify;">
</div>
<a name='more'></a><div style="text-align: justify;">
"<i>De aquellos lodos vienen estos barros</i>" que diría nuestro refranero. Ya en agosto de 2.015 aparece una sentencia en el <i>Boletín Oficial de la Comunidad de Madrid</i> (BOCM) en el que el juzgado de lo social de Madrid nº7 <a href="http://www.bocm.es/boletin/CM_Orden_BOCM/2015/08/07/BOCM-20150807-102.PDF" target="_blank">condena a <i>FX Interactive</i> al pago de 7831,05€ más el 10% por mora</a> a un antiguo empleado. La aparición en el BOCM se debe a que la empresa ni se presentó al juicio ni se pudo localizar su paradero para las notificaciones, por lo que éstas se entienden por notificadas al publicarlas en el BOCM. <i>Missing</i>...</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<h2 style="clear: both; text-align: justify;">
¿Dónde andarán?</h2>
<div class="separator" style="clear: both; text-align: justify;">
Pero desde marzo de 2.016 <i>FX Interactive</i> se convierte en un asiduo del día a día de los juzgados de lo social de Madrid, y en una pesadilla para los mensajeros encargados de hacer llegar las notificaciones a su destinatario. Se queda muy corto el redactor de la noticia de ElConfidencial al citar solo cuatro sentencias. Hasta una veintena de sentencias de lo social (excepto una de los juzgados de primera instancia) se han podido localizar en la sede electrónica del BOCM, y todas cortadas por el mismo patrón: condenas contra <i>FX Interactive</i> en demandas presentadas por antiguos empleados en juicios en los que <i>FX Interactive</i> hizo mutis por el foro, desde los prolegómenos del juicio hasta en la notificación de la sentencia...</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
</div>
<center>
<table style="text-align: center;"><tbody>
<tr> <th>Fecha</th> <th>Importe(€)</th> </tr>
<tr> <td><a href="http://www.bocm.es/boletin/CM_Orden_BOCM/2015/08/07/BOCM-20150807-102.PDF" target="_blank">07/08/2015</a></td><td style="text-align: right;">8.614,15</td></tr>
<tr> <td><a href="http://www.bocm.es/boletin/CM_Orden_BOCM/2016/03/17/BOCM-20160317-100.PDF" target="_blank">17/03/2016</a></td><td style="text-align: right;">28.377,16</td></tr>
<tr> <td><a href="https://www.bocm.es/boletin/CM_Orden_BOCM/2016/05/09/BOCM-20160509-135.PDF" target="_blank">09/05/2016</a></td><td style="text-align: right;">3.323,60</td></tr>
<tr> <td><a href="http://www.bocm.es/boletin/CM_Orden_BOCM/2016/05/11/BOCM-20160511-132.PDF" target="_blank">11/05/2016</a></td><td style="text-align: right;">7.942,05</td></tr>
<tr> <td><a href="http://www.bocm.es/boletin/CM_Orden_BOCM/2016/06/04/BOCM-20160604-8.PDF" target="_blank">04/06/2016</a></td><td style="text-align: right;">84.043,69</td></tr>
<tr> <td><a href="http://www.bocm.es/boletin/CM_Orden_BOCM/2016/06/04/BOCM-20160604-13.PDF" target="_blank">04/06/2016</a></td><td style="text-align: right;">17.642,35</td></tr>
<tr> <td><a href="http://www.bocm.es/boletin/CM_Orden_BOCM/2016/06/10/BOCM-20160610-106.PDF" target="_blank">10/06/2016</a></td><td style="text-align: right;">11.603,17</td></tr>
<tr> <td><a href="https://www.bocm.es/boletin/CM_Orden_BOCM/2016/06/11/BOCM-20160611-34.PDF" target="_blank">11/06/2016</a></td><td style="text-align: right;">50.296,95</td></tr>
<tr> <td><a href="http://www.bocm.es/boletin/CM_Orden_BOCM/2016/06/21/BOCM-20160621-205.PDF" target="_blank">21/06/2016</a></td><td style="text-align: right;">71.306,10</td></tr>
<tr> <td><a href="http://www.bocm.es/boletin/CM_Orden_BOCM/2016/07/20/BOCM-20160720-85.PDF" target="_blank">20/07/2016</a></td><td style="text-align: right;">9.243,21</td></tr>
<tr> <td><a href="http://www.bocm.es/boletin/CM_Orden_BOCM/2016/08/01/BOCM-20160801-80.PDF" target="_blank">01/08/2016</a></td><td style="text-align: right;">9.342,05</td></tr>
<tr> <td><a href="http://www.bocm.es/boletin/CM_Orden_BOCM/2016/08/25/BOCM-20160825-50.PDF" target="_blank">25/08/2016</a></td><td style="text-align: right;">3.272,17</td></tr>
<tr> <td><a href="http://www.bocm.es/boletin/CM_Orden_BOCM/2016/09/28/BOCM-20160928-134.PDF" target="_blank">28/09/2016</a></td><td style="text-align: right;">3.825,44</td></tr>
<tr> <td><a href="http://www.bocm.es/boletin/CM_Orden_BOCM/2016/11/02/BOCM-20161102-116.PDF" target="_blank">02/11/2016</a></td><td style="text-align: right;">15.272,14</td></tr>
<tr> <td><a href="https://www.bocm.es/boletin/CM_Orden_BOCM/2016/11/15/BOCM-20161115-261.PDF" target="_blank">15/11/2016</a></td><td style="text-align: right;">48.724,36</td></tr>
<tr> <td><a href="https://www.bocm.es/boletin/CM_Orden_BOCM/2017/02/14/BOCM-20170214-136.PDF" target="_blank">14/02/2017</a></td><td style="text-align: right;">60.175,64</td></tr>
<tr> <td><a href="https://www.bocm.es/boletin/CM_Orden_BOCM/2017/02/16/BOCM-20170216-118.PDF" target="_blank">16/02/2017</a></td><td style="text-align: right;">20.942,28</td></tr>
<tr> <td><a href="https://www.bocm.es/boletin/CM_Orden_BOCM/2017/02/16/BOCM-20170216-117.PDF" target="_blank">16/02/2017</a></td><td style="text-align: right;">17.343,88</td></tr>
<tr> <td><a href="http://www.bocm.es/boletin/CM_Orden_BOCM/2017/02/28/BOCM-20170228-71.PDF" target="_blank">28/02/2017</a></td><td style="text-align: right;">2.765,00</td></tr>
<tr> <td><a href="http://www.bocm.es/boletin/CM_Orden_BOCM/2017/03/21/BOCM-20170321-158.PDF" target="_blank">21/03/2017</a></td><td style="text-align: right;">21.163,03</td></tr>
<tr> <td><a href="https://www.bocm.es/boletin/CM_Orden_BOCM/2017/04/21/BOCM-20170421-166.PDF" target="_blank">21/04/2017</a></td><td style="text-align: right;">54.702,83</td></tr>
</tbody></table>
</center>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
Como se indica en <a href="http://www.bocm.es/boletin/CM_Orden_BOCM/2016/12/01/BOCM-20161201-71.PDF" target="_blank">esta resolución de 1 de diciembre de 2.016</a> respecto a los resultados de la ejecución de embargos para hacer frente a una de las citadas sentencias, ya desde el 1 de abril de 2.016 los juzgados vienen declarando insolvente a la empresa.</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbZwnOPXyZ3kecdUxCljJDIwfJWbcCQEu6jksbIhBSqDFpgY5afW5yd2tSLa4DNdqeg5spOLn0wRqvNZQOLlkigk17FbukZdrcU2SmKsyDHQmQBDPNMjm0st8K95YiXq89vApuRlEOZJ5G/s1600/equipoFX.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbZwnOPXyZ3kecdUxCljJDIwfJWbcCQEu6jksbIhBSqDFpgY5afW5yd2tSLa4DNdqeg5spOLn0wRqvNZQOLlkigk17FbukZdrcU2SmKsyDHQmQBDPNMjm0st8K95YiXq89vApuRlEOZJ5G/s640/equipoFX.jpg" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Equipo <i>FX Interactive </i>(fuente: <a href="https://twitter.com/FCS_FX_ESP/status/326736158480543744" target="_blank">Twitter 23/04/2013</a>)</td></tr>
</tbody></table>
<div class="separator" style="clear: both; text-align: justify;">
Todo lo anterior suma casi 550.000€, suma a la que <i>FX Interactive</i> no ha podido hacer frente en gran parte de las sentencias, lo que ha obligado a los jueces a decretar la insolvencia de la empresa para que se haga cargo de los pagos las arcas públicas a través del <i>Fondo de Garantía Salarial</i> (<i>FOGASA</i>). No se ha declarado insolvente la empresa, la han declarado los jueces al no poder encontrar bienes embargables para hacer frente a las indemnizaciones, y poder dar así una solución a los antiguos empleados de la empresa a través del <i>FOGASA</i>. La intervención del <i>FOGASA</i> provoca que el Estado se convierta en acreedor de la empresa, cantidades que se antojan de difícil recuperación, pero no es el único campo en el que la empresa debe dinero al Estado.</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<h2 style="clear: both; text-align: justify;">
Subvenciones y créditos públicos</h2>
<div>
<i>FX Interactive</i> ha ingresado importantes cantidades en forma de subvenciones y créditos con cargo en al menos dos programas de apoyo estatal a la innovación.</div>
<div>
<br /></div>
<div style="text-align: justify;">
En el <a href="http://www.boe.es/boe/dias/2011/12/27/pdfs/BOE-A-2011-20329.pdf" target="_blank">BOE del 27 de diciembre de 2.011</a> la empresa aparece como beneficiaria del <a href="http://www.agendadigital.gob.es/agenda-digital/planes-anteriores/Paginas/plan-avanza2-estrategia.aspx" target="_blank">Plan Avanza 2</a>. En dicho plan, la empresa recibe subvención y crédito para su proyecto <i>TSI-090100-2011-0194</i> titulado "<i>Proyecto de investigación industrial sobre nuevos entornos de desarrollo, usabilidad y adaptabilidad de videojuegos para televisión integrada con Internet (Smart TV)</i>". Para dicho proyecto recibió 70.371,38€ de subvención y 762.707,76€ de préstamo. Desconozco los resultados de dicho proyecto, y si el dinero ha sido mejor o peor empleado, pero lo que es seguro es que el préstamo hay que devolverlo, y según las condiciones indicadas en el <a href="https://www.boe.es/boe/dias/2011/03/30/pdfs/BOE-A-2011-5743.pdf" target="_blank">BOE de la convocatoria</a> (pág. 33.276) se debe amortizar en un plazo máximo de siete años, incluidos dos de carencia a un tipo de interés del 3,98%.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Posteriormente, en febrero de 2.013, la empresa aparece como beneficiaria del <i>Plan Nacional de Investigación Científica, Desarrollo en Innovación Tecnológica</i>, tal y como aparece al pie de la portada de su tienda digital.</div>
<div>
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEianxyt0cb14G6y_WPr2UFM4zpZvhHNnJxfINxE1lFKs8ktNZH0X-gwa-SZJIAn3TVDDy52eTo5NJoLlZqtmdJLa4MuReeEv9u0YeCNg_mfD-fPEBP_HbTyoOdRTfNYmC8qZg1yknPCrpyM/s1600/fx_financiacionestatal.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="182" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEianxyt0cb14G6y_WPr2UFM4zpZvhHNnJxfINxE1lFKs8ktNZH0X-gwa-SZJIAn3TVDDy52eTo5NJoLlZqtmdJLa4MuReeEv9u0YeCNg_mfD-fPEBP_HbTyoOdRTfNYmC8qZg1yknPCrpyM/s320/fx_financiacionestatal.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">La tienda digital <i>FX Store</i> financiada con ayudas públicas</td></tr>
</tbody></table>
<div style="text-align: justify;">
El importe de dicha ayuda, al igual de la anterior consta de una subvención más un préstamo. En este caso <a href="http://www.boe.es/boe/dias/2013/02/01/pdfs/BOE-A-2013-1089.pdf" target="_blank">los importes concedidos</a> son 220.680,76€ de subvención y 658.355,84€ de préstamos. Las <a href="http://boe.es/boe/dias/2012/06/07/pdfs/BOE-A-2012-7648.pdf" target="_blank">condiciones de devolución del préstamo</a> son siete años de amortización incluyendo tres de carencia, a un tipo de interés del 3,95%.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
No aparece información pública sobre el estado de devolución de ambos préstamos, si están al corriente o si acumulan retrasos, pero no cabe duda de que en la situación actual de la empresa con sus antiguos empleados acudiendo al <i>FOGASA</i> para cobrar nóminas impagadas o indemnizaciones por despido, estos préstamos deben suponer una losa importante.</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div>
<h2>
¿Y el futuro?</h2>
</div>
<div>
Pues yo lo veo bastante negro.</div>
<div>
<br /></div>
<div style="text-align: justify;">
La plataforma digital está gestionada en el lado del usuario por el <i>FX Web Player </i>diseñado por la empresa<i>,</i> que es un plugin <i><a href="https://en.wikipedia.org/wiki/NPAPI" target="_blank">NPAPI</a></i> (<i>Netscape Plugin Application Programming Interface</i>), una tecnología que data de 1.995 y que actualmente los tres grandes navegadores (<i>Chrome, Edge, Firefox</i>) han dejado de soportar. El último ha sido el navegador <i>Firefox, </i>que lo ha soportado hasta la salida de la versión 52.0 el pasado 7 de marzo. Este movimiento ha coincidido con el inicio de <a href="http://juegos.fxinteractive.com/fx/minisites/upgrade/" target="_blank">una campaña de<i> FX Interactive</i></a> por la que a los poseedores de juegos en formato físico de la empresa les regalan la versión digital del mismo o una equivalente de la tienda <i><a href="http://juegos.fxinteractive.com/index.php" target="_blank">FX Store</a></i>.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
A partir de ese momento <a href="https://www.facebook.com/pg/juegosFX/reviews/" target="_blank">han empezado a sugir quejas de los usuarios</a> que tienen juegos adquiridos en la biblioteca, y que no pueden acceder a ellos para instalarlos. La guía que <i>FX Interactive</i> <a href="http://www.fxinteractive.com/guia.firefox.fxstore.es/Guia.pdf" target="_blank">tiene aún colgada en su web</a> ya no es válida, ya que el enlace que indica para descargar <i>Firefox</i> apunta a la última versión disponible del dicho navegador, lo que desde el 7 de marzo ya no es válido.</div>
<div style="text-align: justify;">
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeqldpNYZ9xVEV9jE8cmgkDW0SzsYx8kKBkBOuDjfv5aWMyUsRNhbFkxqHDCzZQQOU-oib_3QSn0KjN0ihwTdtIePFIQb5CR65GWssARhpf1YRQ-4J9sASdt8W2zA4X1MeomjIVYMEC60G/s1600/fx_firefox.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeqldpNYZ9xVEV9jE8cmgkDW0SzsYx8kKBkBOuDjfv5aWMyUsRNhbFkxqHDCzZQQOU-oib_3QSn0KjN0ihwTdtIePFIQb5CR65GWssARhpf1YRQ-4J9sASdt8W2zA4X1MeomjIVYMEC60G/s400/fx_firefox.png" width="268" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Guía de <i>FX Interactive</i> para instalar Firefox</td></tr>
</tbody></table>
<div style="text-align: justify;">
Afortunadamente <i>Mozilla Firefox</i> ha dejado una versión 52 <i><u>ESR</u></i> (<i>Extended Support Release</i>) con soporte <i>NPAPI</i> que seguirá siendo actualizada <a href="https://www.mozilla.org/en-US/firefox/organizations/faq/" target="_blank">al menos durante un año</a>. Transcurrido ese año el que quiera seguir instalando sus juegos de <i>FX Store</i>, tendrá que usar una versión de <i>Firefox</i> para la que ya no saldrán actualizaciones ni se corregirán bugs que afecten a la seguridad del mismo, con todos los peligros que ello conlleva. Para entonces <i>FX Interactive</i> habrá tenido que sacar recursos de donde sea y renovar su <i>FX Web Player</i>.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
La versión 52 ESR de <i>Firefox</i> compatible con el <i>FX Web Player</i> que usa la tienda digital se puede descargar <a href="https://www.mozilla.org/es-ES/firefox/organizations/all/" target="_blank">desde aquí</a>, y además tiene que ser la versión de 32 bits, independientemente de que nuestro sistema operativo sea de 32 o de 64 bits.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Volviendo al tema del futuro de la empresa, nos encontramos con una tienda digital que necesita urgentemente la renovación del software cliente que se instala en los equipos de los usuarios, un catálogo de juegos de calidad aunque bastante añejo, lo que seguramente implique que más de un juego de su catálogo ya no funcione en Windows 10 y posteriores. Y sobre estas dificultades de tipo técnico, se juntan además problemas judiciales, embargos, y como guinda créditos estatales a devolver. Un cóctel bastante feo...</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Como a muchos con algunos años, si <i>FX Interactive</i> se nos muere se nos irá una parte importante de nuestro lado más <i>gamer</i>, y se podría decir que es la parte más importante de lo que son los videojuegos en español. Una empresa que se ha dedicado en cuerpo y alma a producir versiones dobladas a nuestro idioma con gran calidad, no solo en el doblaje o traducciones de los textos que aparecen en pantalla, sino también del resto de componentes físicos (carátulas, manuales, etc...), componentes físicos que hoy en día van desapareciendo con las versiones puramente digitales. La misma web de FX Interactive donde aparecía el catálogo físico y la web de la empresa propiamente dicho (<a href="http://www.fxinteractive.com/">www.fxinteractive.com</a>) ya ha desaparecido, salvo error en el servidor que subsanen próximamente, aunque el anuncio de la campaña <i><a href="http://juegos.fxinteractive.com/fx/minisites/upgrade/" target="_blank">Upgrade</a> </i>invita a pensar que renuncian al formato físico.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbpEO4H-YP6dgqIStd9zbsZWNQ0kFOw9sxyUcx2hlFHXZnmRkiOVGBWLleypmO3FcsILzS92dCmcMNgftsB2e-YM0MBdZLGYd9u-qVHFNfAadCOBdWNLReha2ynn0lLQW8iWGV9rOhPXvp/s1600/fx_archive.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="397" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbpEO4H-YP6dgqIStd9zbsZWNQ0kFOw9sxyUcx2hlFHXZnmRkiOVGBWLleypmO3FcsILzS92dCmcMNgftsB2e-YM0MBdZLGYd9u-qVHFNfAadCOBdWNLReha2ynn0lLQW8iWGV9rOhPXvp/s400/fx_archive.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Web de <i>FX Interactive</i> el 23 de abril de 2017... ¿volverá?</td></tr>
</tbody></table>
Preferiría que no hiciera falta, pero yo desde luego <a href="http://www.softbreakers.com/2015/04/fx-interactive-y-su-plataforma-digital_18.html" target="_blank">ya tengo mi copia de seguridad de los juegos</a> de mi biblioteca en <i>FX Store</i>...</div>
Softbreakershttp://www.blogger.com/profile/01666968545873713297noreply@blogger.com0tag:blogger.com,1999:blog-5459690923545315155.post-65051285270364642432016-10-19T01:08:00.000+02:002016-10-26T16:04:46.185+02:00El "Bellotagate" nacional<h2>
ZETTA Smartphone. El sector tecnológico español puesto en solfa... una vez más.</h2>
<div style="text-align: justify;">
Estos días ha saltado el escándalo del supuesto fabricante español, y más concretamente extremeño, <a href="http://www.zettaeuropa.com/" target="_blank">Zetta Smartphone</a>. Los que el día anterior se presentaban como un hito del sector tecnológico español que rivalizaba con los smartphones de Apple con un precio muy inferior, siendo recibidos en recepciones por parte de autoridades como <a href="http://www.gobex.es/comunicacion/noticia&idPub=17868" target="_blank">el presidente de la comunidad autónoma de Extremadura</a>, entrevistas en distintos canales de televisión y artículos periodísticos, al día siguiente se ha tornado en lo que por ahora parece un presunto engaño destinado a lucrarse a costa del respetable ánimo patriótico de comprar y promocionar lo "<i>made in Spain</i>".</div>
<div style="text-align: justify;">
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrcvJhAWlNwyofKO2cExvqvOoZRY5g-1UUoxYa6vhrpj4AK12o8Q8tQraVsSiyJ-wI48gkLsP-SDDfdHZc0Qn7xrE-owbpXtR6sw1GwkdwIWx58iPeIGNxQZtBmBio0zdZLk_QMIwMOyAG/s1600/zetta-europa-logo-1466179824.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="73" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrcvJhAWlNwyofKO2cExvqvOoZRY5g-1UUoxYa6vhrpj4AK12o8Q8tQraVsSiyJ-wI48gkLsP-SDDfdHZc0Qn7xrE-owbpXtR6sw1GwkdwIWx58iPeIGNxQZtBmBio0zdZLk_QMIwMOyAG/s320/zetta-europa-logo-1466179824.jpg" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Logo actual de la compañía Zetta Smartphone</td></tr>
</tbody></table>
<div style="text-align: justify;">
<a name='more'></a>Aunque era un run-run que ya corría por diversos foros de internet desde principios de 2.015, el alcance provocado por la aparición de una <a href="http://www.elespanol.com/reportajes/grandes-historias/20161014/162984111_0.html" target="_blank">entrevista en el diario El Español</a> el pasado 15 de octubre se vuelto contra los protagonistas de dicha entrevista, y con una resonancia mucho mayor amplificada varias veces.</div>
<div style="text-align: justify;">
<br /></div>
<h2 style="text-align: justify;">
Lo que dicen ser...</h2>
<div style="text-align: justify;">
En la entrevista los dos fundadores de la empresa (un frigorista industrial y técnico electrónico con estudios de FP en paro, y un inmigrante chino con estudios de Empresariales) se presentaban como unos emprendedores dispuestos a apostar por su tierra que realizaban la ingeniería de dispositivos móviles, y cuyas piezas mandaban fabricar en China, para finalmente realizar el ensamblaje de cada móvil en sus instalaciones extremeñas. Pero no diseñaban unos móviles cualquiera, no. Sus diseños eran móviles con características de alta gama, que competían de tú a tú con los diseñados por los ingenieros de la marca de la manzana, pero encima lo conseguían a un precio mucho más competitivo.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Tanto es así, que el propio logo de la marca (una bellota mordisqueada) recuerda enormemente al logo de la marca americana.</div>
<div style="text-align: justify;">
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJzcB3U2dQot6fTDIQgWB97POVYXW-CKZCDFObH8bnep1Pm8a4yTwREoHsgq5YHshQnH-H2ahSPGIZn7mLoruavGkv9Ek2qDPspzilHvg4IxxfFhPApuK5LsABDggzWzHtQcdp2vQtvR3c/s1600/zetta-europa-logo-1450952554.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="63" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJzcB3U2dQot6fTDIQgWB97POVYXW-CKZCDFObH8bnep1Pm8a4yTwREoHsgq5YHshQnH-H2ahSPGIZn7mLoruavGkv9Ek2qDPspzilHvg4IxxfFhPApuK5LsABDggzWzHtQcdp2vQtvR3c/s320/zetta-europa-logo-1450952554.jpg" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Logo previo (al menos hasta finales de abril de 2.016)</td></tr>
</tbody></table>
Recientemente, y quizás para evitar posibles litigios legales con Apple, añadieron un par de ondas a la mordedura del "<i>mordisco</i>", de manera similar al logo de las redes wifi.<br />
<div>
<br /></div>
<div>
En multitud de entrevistas <a href="http://www.zettaeuropa.com/content/10-sobre-nosotros" target="_blank">y en su propia web</a>, definen su empresa como:</div>
<div>
<blockquote class="tr_bq" style="text-align: justify;">
<i>Con el slogan “El primer móvil extremeño”, abraza bajo éste, tanto la venta de <b><u>terminales de elaboración propia</u></b> de alta calidad con las ultimas prestaciones a un precio competitivo</i></blockquote>
<div style="text-align: justify;">
El resaltado con negrita es obra mía. Toda una declaración de intenciones que enarbola su nacionalidad "<i>extremeña</i>", y que facilitó entre otras cosas el interés y apoyo del propio presidente de la comunidad extremeña.</div>
<div style="text-align: justify;">
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmw68Nrvsmy76qapKq3gW-fydOepvh39BQKIvpAnqL6j1I3Pzn43RHyu3erbTQHPGxbCMO8Rr080UziYsUEvYWRdFkxUXhd3saArnnF24utq1dkoWGk6uqmvTWvqAx1HkDGo4J1XkmhgIQ/s1600/gobex.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="425" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmw68Nrvsmy76qapKq3gW-fydOepvh39BQKIvpAnqL6j1I3Pzn43RHyu3erbTQHPGxbCMO8Rr080UziYsUEvYWRdFkxUXhd3saArnnF24utq1dkoWGk6uqmvTWvqAx1HkDGo4J1XkmhgIQ/s640/gobex.jpg" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Unai Nieto (izq.), fundador de ZETTA, junto con el presidente de Extremadura, Guillermo Fernández Vara. (Foto Gobex.es)</td></tr>
</tbody></table>
<div style="text-align: justify;">
Además de los móviles, también comercializan accesorios oficiales para los mismos (carcasas, fundas, protectores, etc...).</div>
</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Pero no solo parecían querer limitarse solo a los móviles y sus accesorios. Prueba de ello es este otro artilugio que <a href="https://www.facebook.com/zettaeuropa/videos/758198460955886/" target="_blank">presentaron en el programa "Extremadura X la tarde"</a> del canal autonómico de la región, igualmente con los logotipos de la empresa.</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfxLYb1qZ2ebBMzAryMWhXMryIAwJVF0QaTR9PHDNlJANg5ps6jz5OIaWmWB41FxQNGhmKoTvL8wabzT6bbQbxoALOl3fs9tGTHQrWWSkNL5jQ5EZyiWyDHg5FhwtMu09WxNeF4rdDLK6O/s1600/hoverboard.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="358" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfxLYb1qZ2ebBMzAryMWhXMryIAwJVF0QaTR9PHDNlJANg5ps6jz5OIaWmWB41FxQNGhmKoTvL8wabzT6bbQbxoALOl3fs9tGTHQrWWSkNL5jQ5EZyiWyDHg5FhwtMu09WxNeF4rdDLK6O/s640/hoverboard.jpg" width="640" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Al final de dicho programa, la presentadora del canal autonómico se despedía así:</div>
<blockquote class="tr_bq" style="text-align: justify;">
<i>Enhorabuena por haber conseguido dedicaros a lo que os gusta, pero sobre todo por hacer tecnología 100% extremeña</i></blockquote>
Y hasta ahí, la imagen con la que la empresa se presenta, o al menos se presentaba, a medios y público.<br />
<br />
<h2>
...y lo que parecen ser</h2>
<div style="text-align: justify;">
El artículo de El Español tuvo una rápida contestación en las redes. No en vano, las sospechas de que ZETTA se dedicaba a vender móviles del fabricante chino Xiaomi, en lugar de diseñar y ensamblar sus propios productos en tierras extremeñas <a href="http://www.forocoches.com/foro/showthread.php?t=4604589" target="_blank">ya venía circulando desde mucho antes</a>.</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOHnTjwxVvm3d3f2DeSU0hQnPzstRyWt08OmE8NZllicHuNzJPGLSqrh74YCS81JcF3DWyxevBtiUywgmTTQV3TxcGV-FA6bvnEm97ma4HjJHE-2Z8bJDpkVJWRx8uaAQjh06iDWI_rpdv/s1600/dg580_2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="189" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOHnTjwxVvm3d3f2DeSU0hQnPzstRyWt08OmE8NZllicHuNzJPGLSqrh74YCS81JcF3DWyxevBtiUywgmTTQV3TxcGV-FA6bvnEm97ma4HjJHE-2Z8bJDpkVJWRx8uaAQjh06iDWI_rpdv/s320/dg580_2.png" width="320" /></a></div>
<div style="text-align: justify;">
Pero no ha sido hasta esta última aparición en un medio generalista de la empresa, como es el caso de el diario El Español, cuando por fin <a href="http://www.forocoches.com/foro/showthread.php?t=5191758" target="_blank">las sospechas que circulaban por distintos foros</a> de internet también han saltado a los medios generalistas a modo de respuesta, pero de una manera masiva. Las dudas sobre la empresa no solo han aparecido en el <a href="http://www.elespanol.com/social/20161016/163483921_0.html" target="_blank">diario El Español</a>, sino en otros diarios de mayor tirada como <a href="http://www.elmundo.es/tecnologia/2016/10/17/58048a1d46163fb7558b45c4.html" target="_blank">El Mundo</a>, <a href="http://tecnologia.elpais.com/tecnologia/2016/10/17/actualidad/1476704276_793477.html" target="_blank">El País</a> o <a href="http://www.abc.es/tecnologia/moviles/telefonia/abci-picaresca-espanola-timo-iphone-extremeno-realidad-xiaomi-201610171439_noticia.html" target="_blank">ABC</a>. Tal ha sido la retroalimentación que incluso han aparecido reseñas en informativos de televisión como el caso de <a href="http://www.rtve.es/noticias/20161017/facua-pide-se-investigue-supuesto-fraude-del-smartphone-extremeno-zetta-europa/1426768.shtml" target="_blank">TVE</a>.<br />
<br />
Lo que inicialmente parecía un artículo promocional más de la empresa ZETTA en un diario, se ha vuelto contra la propia empresa de manera amplificada.<br />
<br />
No han tardado en aparecer análisis acerca de la fiabilidad de las acusaciones, análisis que parecen demostrar que los móviles de la empresa Zetta Smartphone son móviles comercializados por Xiaomi, que desde Zetta compraban como cualquier otro consumidor, y que las presuntas tareas de ensamblaje realizadas en sus instalaciones extremeñas, en realidad eran más bien tareas destinadas a hacer desaparecer las referencias a la marca Xiaomi, tanto en los embalajes, como en la carcasa del móvil y otros componentes internos de fácil acceso como la batería, además de modificar el sistema operativo del teléfono para sustituir toda referencia a Xiaomi por la marca de la bellota.<br />
<br />
Uno de los vídeos más ilustrativos de estos análisis surgidos a partir de la polémica, ha sido realizado por un canal de radio extremeño en el que anteriormente los responsables de ZETTA habían aparecido vendiendo las virtudes de su producto supuestamente 100% extremeño:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/ASha1EmTsE0/0.jpg" frameborder="0" height="266" src="https://www.youtube.com/embed/ASha1EmTsE0?feature=player_embedded" width="320"></iframe></div>
<br />
Obviamente, en caso de que un fabricante como Xiaomi fabricase productos de "marca blanca" para su venta por parte de otras empresas bajo su propia marca, esta no es la forma normal de proceder. Normalmente, el propio fabricante rotula los logos de la empresa para la cual fabrica tanto en el terminal como en el embalaje, sin que la empresa destinataria tenga que dedicarse a "tapar" con pegatinas la marca del fabricante original para sustituirla por la propia.<br />
<br />
Como era de esperar, a estas alturas de la película, y según <a href="http://tecnologia.elpais.com/tecnologia/2016/10/18/actualidad/1476785933_678387.html" target="_blank">información de El País</a>, Xiaomi ya ha negado tener ningún tipo de acuerdo con Zetta Smartphone para la venta bajo su propia marca de sus terminales, y ha mostrado su sorpresa por los hechos que se han relatado.<br />
<br />
Por parte de la empresa, la web así como de su perfil de Facebook caen intermitente, eliminan material de su perfil de Facebook, y presentan un escueto comunicado oficial:<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzXVRl96MG19k_NyF2ml5oobrAChsSggIpCbOiyOrbc2W_OTo0EH4KaeCNL93YuPL-xLd21GtV1GOGaPLLomlr67o1iiAUI6Hil2hZdzdr390FGcKSLulo9A7BCgrYt-Eoc5ZSaCodLpfM/s1600/comunicado.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="451" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzXVRl96MG19k_NyF2ml5oobrAChsSggIpCbOiyOrbc2W_OTo0EH4KaeCNL93YuPL-xLd21GtV1GOGaPLLomlr67o1iiAUI6Hil2hZdzdr390FGcKSLulo9A7BCgrYt-Eoc5ZSaCodLpfM/s640/comunicado.jpg" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><span style="font-size: 12.8px;">Comunicado oficial de la empresa</span></td></tr>
</tbody></table>
<br />
No hay mucho que comentar sobre el tibio comunicado, que parece más bien dar valor a las "<i>manifestaciones no contrastadas</i>" que contradecirlas. Mención aparte merece la nueva definición que hacen de su propia empresa, "<i>una pequeña empresa de 7 trabajadores que humildemente están trabajando para ofrecer la tecnología asiática</i>", definición que contrasta con la "<i>tecnología 100% extremeña</i>" que le abrió puertas a la hora de ocupar espacios en distintos programas de televisión del canal autonómico extremeño para promocionarse, amén de recibir en persona las bendiciones del propio presidente de la Junta extremeña.<br />
<br />
La misma Junta de Extremadura ha tenido que salir al paso sobre el tema <a href="http://www.europapress.es/videos/video-junta-polemica-movil-extremeno-zetta-20161018131251.html" target="_blank">dando explicaciones acerca de posibles subvenciones</a> recibidas por Zetta Smartphone:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/72vLlluYx84/0.jpg" frameborder="0" height="266" src="https://www.youtube.com/embed/72vLlluYx84?feature=player_embedded" width="320"></iframe></div>
<br />
Por si fuera poco las pruebas contra la empresa se siguen acumulando. Según informa <a href="http://www.abc.es/tecnologia/moviles/telefonia/abci-picaresca-espanola-timo-iphone-extremeno-realidad-xiaomi-201610171439_noticia.html" target="_blank">ABC</a>, el dominio "zettaeuropa.com" que usa la empresa para localizar su presencia en la red, está registrada a nombre de un tal "Bojun Cui" domiciliado en Zafra, Badajoz. Dicho nombre tiene un gran parecido con el de Eric Cui, que es el nombre con el que se presenta el co-fundador de origen chino de la empresa. Es posible que ese sea su verdadero nombre, o bien que sea el de algún familiar. Tal y como indica ABC, a nombre de dicha persona en el registro de marcas se encuentra varias <a href="http://www.opentenea.com/CUI+BOJUN/empresarios/BADAJOZ/empresario?empresario=1450077" target="_blank">solicitudes de registro</a>, destacando el de <a href="http://www.opentenea.com/MI+ZETTA/marca?marca=261251" target="_blank">la marca "MI ZETTA"</a>, solicitada el pasado 16 de abril, y de un indudable parecido con el logotipo de la empresa china Xiaomi:<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnbTG55IZQgjFOjVyzRUZMPR4Jlo5FC4fp7UfrxPxHezgNz5ip5eV1XC1GFFDp_KdORpBFog7NYos7Wr3RqJN5S4KhvaMIDW7i53nU9BYXqeUbZHzLESFKGy5Bl77FMPKkr4FOEmmadoxl/s1600/logos.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="168" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnbTG55IZQgjFOjVyzRUZMPR4Jlo5FC4fp7UfrxPxHezgNz5ip5eV1XC1GFFDp_KdORpBFog7NYos7Wr3RqJN5S4KhvaMIDW7i53nU9BYXqeUbZHzLESFKGy5Bl77FMPKkr4FOEmmadoxl/s320/logos.jpg" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Logos de "MI ZETTA" (izq.) y Xiaomi (der.)</td></tr>
</tbody></table>
<h2>
¿Y el IMEI?</h2>
<div>
Como muchos conocen, cada terminal móvil lleva un identificador único (o al menos, presuntamente único). Este identificador es utilizado, entre otras cosas, para las famosas lista negras de móviles robados que permiten impedir el acceso a las redes de telefonía de terminales que han sido denunciados como robados por sus propietarios.</div>
<div>
<br /></div>
<div>
Por ello, modificar el IMEI de un terminal móvil, aunque técnicamente posible, desde el punto de vista de su legalidad entra en un terreno un tanto pantanoso. El IMEI es un número de 15 cifras con <a href="https://es.wikipedia.org/wiki/IMEI" target="_blank">una determinada estructura</a>.</div>
<div>
<br /></div>
<div>
Las ocho primeras cifras son definidas por la <a href="http://www.gsma.com/" target="_blank">Asociación GSM (o GSMA)</a>. Estas ocho primeras cifras constituyen lo que se denomina como TAC (o <i>Type Allocation Code</i>). Cualquier fabricante de móviles y/o propietario de una marca <a href="https://imeidb.gsma.com/imei/login.jsp" target="_blank">debe solicitarlo para cada modelo que fabrique y/o comercialice</a>.</div>
<div>
<br /></div>
<div>
El trabajo de asignación y registro de TAC's es realizado actualmente por hasta seis entidades distintas. De las ocho cifras del TAC, las dos primeras identifican qué entidad es la que lo ha generado, mientras que las seis siguientes identifican la empresa registradora, la marca y el modelo. Posteriormente aparecen otros seis dígitos que constituyen el número de serie del terminal, que es asignado por el propio fabricante y un último dígito que permite verificar si el IMEI es correcto (similar a la letra de nuestro DNI).</div>
<div>
<br /></div>
<div>
¿Y que nos cuentan los IMEI de los terminales comercializados por ZETTA?</div>
<div>
<br /></div>
<div>
Hay varias páginas en donde introduciendo un IMEI, devuelven los datos que pueden interpretarse a partir del mismo. Estas páginas disponen de la base de datos que genera la asociación GSMA.</div>
<div>
<br /></div>
<div>
No dispongo de móvil ZETTA, pero a raíz del escándalo hay una imagen generada en <a href="http://www.htcmania.com/showpost.php?p=19215637&postcount=11" target="_blank">HTCMania</a> allá por junio de 2015, y que se reproduce actualmente con asiduidad mostrando el logo de Xiaomi que se encuentra al levantar la pegatina interna de un terminal ZETTA situada bajo la batería en uno de los terminales. Bajo la pegatina levantada, aparece otra con códigos de barras y con el IMEI del presunto terminal de ZETTA (en este caso dos IMEIs al tratarse de un terminal de doble SIM):</div>
<div>
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzTRddLzlzD-EYNVfFd0BbiKwzql2ofE4LgUTFjU3vvQh8usgapQkdGL2vTmLMkFG_fT-XYHJFHj98gl3TNhslxnX1Svora7Zw4NH03p1M_iBzmBpVTaHlJ_qJmpJ0NfMoMDeNAypV8EBv/s1600/imei.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="355" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzTRddLzlzD-EYNVfFd0BbiKwzql2ofE4LgUTFjU3vvQh8usgapQkdGL2vTmLMkFG_fT-XYHJFHj98gl3TNhslxnX1Svora7Zw4NH03p1M_iBzmBpVTaHlJ_qJmpJ0NfMoMDeNAypV8EBv/s640/imei.jpg" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Terminal ZETTA (HTCMania)</td></tr>
</tbody></table>
<div>
El IMEI que aparece es 86725502 779538 6. ¿Habrá ZETTA registrado, como fabricante que se supone que es, o al menos como marca de terminales móviles, su correspondiente TAC en la GSMA? </div>
<div>
<br /></div>
<div>
Introduciendo dicho IMEI en dos páginas distintas que ofrecen este servicio de chequeo de IMEI's, (<a href="http://www.imei.info/" target="_blank">IMEI.info</a> e <a href="https://imeidata.net/" target="_blank">IMEIData.net</a>) los resultados son inequívocos y coincidentes:</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyzbKC8riv97CTFaKp6U72FqZr4ehZMB85yM8G2rpFyl5lebZRoqJ2TPEEKeeEwnp305p7BTp1ghYLrpOtg3donewOxyXn1WAsS4eLp_X7FHdOyajKX36yqdnSuO7vEHHPUtBhUyEus1iu/s1600/imeidata.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="196" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyzbKC8riv97CTFaKp6U72FqZr4ehZMB85yM8G2rpFyl5lebZRoqJ2TPEEKeeEwnp305p7BTp1ghYLrpOtg3donewOxyXn1WAsS4eLp_X7FHdOyajKX36yqdnSuO7vEHHPUtBhUyEus1iu/s400/imeidata.jpg" width="400" /></a></div>
<div>
<br /></div>
<div>
Estamos pues ante un terminal fabricado por "XIAOMI INC", para la marca "XIAOMI", y concretamente el modelo "<a href="http://www.xatakamovil.com/otras/xiaomi-redmi-2s-conectividad-lte-y-snapdragon-de-64-bits" target="_blank">REDMI 2 LTE</a>". Nada que ver con el supuesto "<a href="http://web.archive.org/web/20150531024911/http://www.zettaeuropa.com/producto/zetta-conquistador-47-plus/" target="_blank">ZETTA CONQUISTADOR 4.7 PLUS</a>", ni tampoco con el precio (unos 100-130€ del Xiaomi Redmi 2 LTE frente a los 230€ del clon ZETTA). Y todo verificado de una manera limpia e indolora, sin necesidad de levantar pegatinas...</div>
<div>
<br /></div>
<h2>
Y otra vez el sector tecnológico nacional en la picota</h2>
<div>
El caso de ZETTA desgraciadamente no es el primero. Periódicamente se repiten casos bochornosos como lo fue el tema Gowex, que <a href="http://www.elconfidencial.com/mercados/inversion/2014-07-01/gowex-se-hunde-un-46-despues-de-que-gotham-valore-sus-titulos-a-0-euros_154936/" target="_blank">destapó una empresa de análisis extranjera</a> (y no la CNMV española como muchos hubieran deseado), o el ya más lejano de Kalysis, aquella empresa malagueña que defendía la patente de los lectores de tarjetas inteligentes que para asombro de todos había sido concedida por la Oficina de Patentes, y que hoy en día, a pesar del <a href="http://www.malagahoy.es/article/malaga/175849/juez/anula/la/patente/lector/dni/electronico/por/no/ser/novedosa.html" target="_blank">predecible revolcón judicial de 2008</a>, aún continúa exhibiendo en la <a href="http://kalysis.com/" target="_blank">cabecera de su web</a> a pesar de estar anulada y enterrada judicialmente.</div>
<div>
<br /></div>
<div>
El tema de ZETTA tampoco ha sido destapado por ningún organismo público que vele por los derechos de los consumidores, sino por unos cuantos internautas en un par de foros de internet.</div>
<div>
<br /></div>
<div>
La picaresca propia de los que intentan ganarse la vida de cualquier manera y a costa de cualquier cosa, junto con la falta de controles, o al menos la poca efectividad de éstos, hace un flaco favor a un ya de por sí flojo y titubeante sector tecnológico nacional, por no hablar de la imagen de la marca España que puede apreciar un observador extranjero.</div>
<div>
<br /></div>
<div>
En este caso, de ser cierto todo lo que se está contando, y parece que lo es, la Junta de Extremadura ha quedado coloquialmente hablando, con el "culo al aire" al prestar inocentemente su apoyo a una empresa que se vendía como la abanderada del sector tecnológico extremeño, cuando en realidad lo que presuntamente ha hecho es "pegar" pegatinas con su marca en productos de otros. Puede que no haya recibido subvenciones de dinero público, pero el mero hecho de las recepciones del presidente de la Junta además de los espacios informativos dedicados en el canal autonómico de televisión se puede considerar como un apoyo y respaldo público a un proyecto que tiene toda la pinta de no merecerlo. Alguien debería estar muy enfado estos días en la Junta de Extremadura...<br />
<br />
<h4>
Actualización</h4>
</div>
<div>
21/10/2016: Dos de los fundadores de la empresa aparecen en el programa <a href="http://atres.red/2fh_n" target="_blank">"Espejo Público" de Antena 3 TV</a>. En dicho programa se pueden apreciar los IMEI de dos terminales comercializados por ZETTA como "Multiverso 5.5". Al parecer fue el primer modelo comercializado por la empresa como propio. Los empresarios en dicho programa vuelven a insistir en su inocencia, en que sin sus modificaciones del software los móviles no podrían funcionar en España, y en que tienen permiso de sus proveedores para hacer lo que hacen, a pesar del <a href="http://tecnologia.elpais.com/tecnologia/2016/10/18/actualidad/1476785933_678387.html" target="_blank">desmentido de Xiaomi al diario El País</a>.</div>
<div>
<br /></div>
<div>
Los IMEI de ambos terminales se pueden apreciar en el minuto 5:55 y 6:47 del vídeo, el primero con los IMEI 354989068562574 y 354989068562582, mientras que el segundo viene numerado como 354989068563234 y 354989068563242.</div>
<div>
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGtffy8ERGARPajkhd52wYH8tQOtj4jZyYJvq7c9zzoa3nHWJqPjv9Z_Munvt-L8M8pDreDZqVp5wSFxaagRSqsvNfc1878kSM-YGJY4KKriuRr3etghxAYf6xRf32IehmU51N6CNmA0tr/s1600/a3tv.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="179" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGtffy8ERGARPajkhd52wYH8tQOtj4jZyYJvq7c9zzoa3nHWJqPjv9Z_Munvt-L8M8pDreDZqVp5wSFxaagRSqsvNfc1878kSM-YGJY4KKriuRr3etghxAYf6xRf32IehmU51N6CNmA0tr/s640/a3tv.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Terminales ZETTA Multiverso 5.5 (Fuente: Espejo Público 21-10-16, Antena 3 TV)</td></tr>
</tbody></table>
<div>
Para ambos terminales, <a href="https://imeidata.net/" target="_blank">IMEIData.net</a> reporta resultados similares:</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYzKLJaO_b5zmthM7R5etSj15VtVK55dJiFwHGVBeAJn-LcovocsLUOkfiY_i2k0JMZ8koWFviP8b22labC7hI1H44aBanPE9eN7CGO3FZEF9vH0YEnywkvg6U0P_Ku5TLBM5X6QIzzqPu/s1600/imeia3tv.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="192" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYzKLJaO_b5zmthM7R5etSj15VtVK55dJiFwHGVBeAJn-LcovocsLUOkfiY_i2k0JMZ8koWFviP8b22labC7hI1H44aBanPE9eN7CGO3FZEF9vH0YEnywkvg6U0P_Ku5TLBM5X6QIzzqPu/s640/imeia3tv.png" width="640" /></a></div>
<div>
<br /></div>
<div>
En este caso, el IMEI identifica el móvil como fabricado por "KVD International Group Limited", la empresa matriz de otra conocida marca de móviles chinos como es el caso de <a href="http://www.doogee.cc/article.php?AId=1" target="_blank">Doogee</a>. La misma raíz del IMEI ha sido usada en al menos cinco modelos distintos de terminales Doogee: DG350, DG2014, DG550, DG800 y DG330, todo ellos terminales que pueden ser adquiridos directamente en España con la marca Doogee.</div>
<div>
<br /></div>
<div>
"KVD International Group Limited" además de fabricar para comercialización bajo su propia marca Doogee, también actúa como fabricante OEM suministrando terminales que son vendidos bajo marcas de otras empresas, así que salvo que debajo de las pegatinas ZETTA de los modelos Multiverso 5.5 aparezcan logos de Doogee, podemos dar por bueno que este móvil ha sido diseñado por ZETTA, aunque el parecido con el modelo <a href="http://www.devicespecifications.com/es/model/90ea2e93" target="_blank">DG580 Kissme</a>, diseñado por Doogee, tanto en características técnicas como en características físicas es cuanto menos sorprendente habiendo sido diseñado por dos equipos completamente distintos y a varios miles de kilómetros de distancia... No solo ambos modelos replican el mismo aspecto físico sino incluso el mismo aspecto interno.</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiolNTehz4ZUIyC374GadoMe53Wk9ff1xTcKZN-5mogDN4-UICgp8wSaxX5aBH8rkQeLhpljBZ5dSwDBxtLFFa4Ttf42ztenRVzUBJSSflnOPn_KLiyw7MACBNO1-Y46klJidjyVQ796c8u/s1600/dg580.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="180" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiolNTehz4ZUIyC374GadoMe53Wk9ff1xTcKZN-5mogDN4-UICgp8wSaxX5aBH8rkQeLhpljBZ5dSwDBxtLFFa4Ttf42ztenRVzUBJSSflnOPn_KLiyw7MACBNO1-Y46klJidjyVQ796c8u/s400/dg580.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">ZETTA Multiverso 5.5 y Doogee DG580 Kissme</td></tr>
</tbody></table>
<br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOHnTjwxVvm3d3f2DeSU0hQnPzstRyWt08OmE8NZllicHuNzJPGLSqrh74YCS81JcF3DWyxevBtiUywgmTTQV3TxcGV-FA6bvnEm97ma4HjJHE-2Z8bJDpkVJWRx8uaAQjh06iDWI_rpdv/s1600/dg580_2.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="236" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOHnTjwxVvm3d3f2DeSU0hQnPzstRyWt08OmE8NZllicHuNzJPGLSqrh74YCS81JcF3DWyxevBtiUywgmTTQV3TxcGV-FA6bvnEm97ma4HjJHE-2Z8bJDpkVJWRx8uaAQjh06iDWI_rpdv/s400/dg580_2.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><span style="font-size: 12.8px;">ZETTA Multiverso 5.5 y Doogee DG580 Kissme (interior)</span></td></tr>
</tbody></table>
<div>
A la vista de las imágenes muchos concluirían que más que diseño propio, han encargado a Doogee directamente la fabricación de unidades del DG580 con su propia marca, cosa perfectamente legal y no discutible. En este caso, lo discutible sería haberle puesto la denominación de origen extremeña...</div>
</div>
Softbreakershttp://www.blogger.com/profile/01666968545873713297noreply@blogger.com0tag:blogger.com,1999:blog-5459690923545315155.post-29481933636879493522016-09-07T09:00:00.000+02:002016-09-07T11:09:31.275+02:00¿Te gustan los juegos de mesa? Tabletop Simulator - TTS Easy ManagerMedio año con el blog parado... ya iba siendo hora. Al lío.<br />
<br />
<h2>
Juegos de mesa</h2>
<div style="text-align: justify;">
Para aquellos que cuando se les habla de juegos de mesa lo que les viene a la cabeza es el parchís, la oca o las tres en raya. Y para aquellos jugones más avanzados que lo que les viene a la cabeza es el <i>Cluedo</i>, el <i>Monopoly </i>y el <i>Risk</i>. A todos ellos, os voy a dar una noticia. Hay todo un mundo más allá de esos juegos de mesa que encontramos apilados en las vitrinas del <i>Carrefour </i>o del <i>Hipercor</i>. Se precisarían un montón de entradas en el blog para empezar a abarcar esos otros juegos que no encontrareis en grandes comercios, y tan geniales que hacen que pase toda una tarde sin que te des cuenta... y además algunos de esos juegos necesitarán parte de la tarde siguiente para acabar la partida...</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Obviamente al ritmo de generación de entradas que tiene este blog, es una tarea que ni me planteo acometer. Pero hoy no voy a hablar ninguno de esos juegos de mesa que jamás encontrarás en una gran superficie comercial, voy a hablar de algo aún más rebuscado. Un simulador virtual de juegos de mesa.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTppWBgHsTl_9i_KPV6sSJWyHwcAvJX-SVTl3HVCEp5xGNbQlsgr8_h496E6I_wGxM6aeMUmYS3fKROlKCNFNe_sceQLeFvM5fX9XUybQ-6q53K84hCg1OysQeMO4e4B9gU3w3muJUk_Oa/s1600/TS-Boxshot.1.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTppWBgHsTl_9i_KPV6sSJWyHwcAvJX-SVTl3HVCEp5xGNbQlsgr8_h496E6I_wGxM6aeMUmYS3fKROlKCNFNe_sceQLeFvM5fX9XUybQ-6q53K84hCg1OysQeMO4e4B9gU3w3muJUk_Oa/s320/TS-Boxshot.1.png" width="232" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Tabletop Simulator</td></tr>
</tbody></table>
</div>
<h2 style="text-align: justify;">
<a name='more'></a>Tabletop Simulator</h2>
<div style="text-align: justify;">
<a href="http://berserk-games.com/tabletop-simulator/" target="_blank">Tabletop Simulator</a> es, técnicamente hablando, un simulador de físicas orientado a los juegos de mesa. Lo único que hace el simulador es presentarte distintos objetos que con tu ratón (y desde hace poco, también con tu sistema de realidad virtual, el que se lo pueda permitir) puedes cogerlos, trasladarlos de un lado a otro, voltearlos y dejarlos caer. Y poco más.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://media-mercury.cursecdn.com/attachments/3/652/tabletop-simulator-chess-massacre.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://media-mercury.cursecdn.com/attachments/3/652/tabletop-simulator-chess-massacre.gif" height="180" width="320" /></a></div>
<br /></div>
<div style="text-align: justify;">
Sobre lo que es un simulador de físicas, los desarrolladores de <i>Berserk Games</i> han añadido funcionalidades enfocadas a facilitar la gestión y el manejo de los típicos objetos que encontramos en los juegos de mesa: dados, barajas, cartas, tokens, fichas, etc...<br />
<br />
Así, las cartas al ponerlas unas sobre otras pueden apilarse automáticamente en un mazo perfectamente alineado sin necesidad de tener un pulso de cirujano, o una baraja de cartas puede barajarse pulsando solo una tecla. Funciones propias de un juego de mesa que precisan de un tratamiento especial sin el cual su realización en un simulador de físicas sin ningún tipo de asistencia es bastante complicado. Lo que no implementa el simulador son las reglas del juego, con lo que no hay ningún impedimento en terminar una partida de ajedrez de la manera que se aprecia en la animación anterior. Es responsabilidad de los propios jugadores realizar acciones de acuerdo con las reglas del juego que estén jugando, lo que en ocasiones puede producir ciertas fricciones cuando en una partida multijugador online, uno de los jugadores no conoce suficientemente las reglas, o bien se dedica voluntariamente a hacer el ganso para desesperación del resto de compañeros de partida virtuales.<br />
<br />
El tema se complementa con una funcionalidad multijugador que permite que alrededor del mismo tablero se conecten jugadores adicionales de forma remota, salvando así una de las limitaciones de los juegos de mesa físicos, que no es otra que la necesidad de estar todos los jugadores que están jugando una misma partida en el mismo sitio físico.<br />
<br />
Y ya, la guinda del pastel que han desarrollado en <i>Berserk Games</i>, es permitir a cualquier usuario de la aplicación generar un juego de mesa con sus propias cartas, fichas, dados, tablero, etc... y que además, estás creaciones, también conocidas como <i>mods</i>, sean fácilmente compartidas con el resto de usuarios de la aplicación a través de la <a href="https://steamcommunity.com/workshop/browse/?appid=286160" target="_blank">plataforma <i>Workshop </i>que integra <i>Steam</i></a>.<br />
<br />
<h2>
Estructura de los <i>mods</i></h2>
<div>
Cuando nos suscribimos a uno de los <i>mods</i> listados en el <i>workshop</i> del simulador, la aplicación descarga un fichero JSON. Dicho JSON describe los objetos que incluye el juego: barajas, tokens, dados, tablero, mesa sobre la que jugamos o incluso el entorno o habitación en la que se encuentra la mesa del juego. Incluso encontramos objetos más avanzados como una tableta en la que se puede navegar o visualizar un PDF con las reglas del juego.</div>
<div>
<br /></div>
<div>
Para cada objeto que lo precise, el JSON indica la dirección URL en la que se encuentra el recurso o recursos necesarios para generar el objeto. Por ejemplo, en un objeto de tipo baraja de cartas, se incluirá una dirección URL en la que se encuentra una imagen con el anverso y el reverso de las cartas que forman dicha baraja. En el caso especial de las barajas en la que una solo imagen genera varios objetos (en este caso cartas), la propia aplicación se encarga de particionar la imagen que contiene todas las cartas en tantas porciones como cartas tenga la baraja a generar, permitiendo así liquidar con una sola imagen una baraja con decenas de cartas distintas.</div>
<div>
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://images.akamai.steamusercontent.com/ugc/792942079462662695/4FB486261774FC1A040DEBAEBC86D2875CD88026/?interpolation=lanczos-none&output-format=jpeg&output-quality=95&fit=inside%7C1024:1024&composite-to=*,*%7C1024:1024&background-color=black" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="http://images.akamai.steamusercontent.com/ugc/792942079462662695/4FB486261774FC1A040DEBAEBC86D2875CD88026/?interpolation=lanczos-none&output-format=jpeg&output-quality=95&fit=inside%7C1024:1024&composite-to=*,*%7C1024:1024&background-color=black" height="320" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Una baraja de cartas en Tabletop Simulator</td></tr>
</tbody></table>
<div>
El simulador al cargar uno de estos ficheros JSON, comenzará a descargar de cada una de las URLs indicadas los recursos necesarios para generar los objetos definidos en dicho fichero. Los creadores de <i>mods </i>normalmente suben estas imágenes a proveedores de almacenamiento online como Dropbox, Google Driver o Imgur.</div>
<div>
<br /></div>
<div>
Estos recursos también pueden estar localmente en el ordenador, por lo que en lugar de una URL remota con la forma "<i>http://...</i>" o "<i>https://...</i>" se pueden usar URLs que comiencen por "<i>file://...</i>". Obviamente si quieres compartir tu <i>mod </i>con otros, es necesario subir los recursos a un servidor accesible por cualquier otro usuaurio interesado en utilizar el <i>mod</i>.</div>
<div>
<br /></div>
<div>
La aplicación también permite la inclusión en los <i>mods </i>de script escritos en LUA. Estos scripts permiten automatizar ciertas partes de un juego que se repiten, como puede ser por ejemplo la preparación del mismo (repartir las cartas iniciales entre los jugadores, colocar sobre el tablero determinados elementos), ahorrando así un valioso tiempo a los jugadores.</div>
<div>
<br /></div>
<h2>
Contenidos del <i>workshop</i></h2>
<div>
Practicamente no existe ninguna limitación a la hora de compartir <i>mods</i> propios con el resto de usuarios. En el <i>workshop</i> podemos encontrarnos juegos originales que no existen en formato físico, juegos clásicos virtualizados por algún entusiasta, o juegos comerciales que alguien armado de paciencia y un escáner ha virtualizado para goce y disfrute de la comunidad. También es muy normal, sobre todo para juegos muy populares, encontrar distintos <i>mods </i>que lo implementan, cada uno con sus propios añadidos: imágenes de mayor calidad, scripts para facilitar la partida, miniaturas modeladas en 3D, textos de cartas y otros objetos en distintos idiomas, etc...</div>
<div>
<br /></div>
<div>
Tal es la actividad de la comunidad que incluso existen plataformas alternativas al <i>workshop </i>de <i>Steam </i>donde encontrar <i>mods</i>, como es <i><a href="http://www.nexusmods.com/tabletopsimulator/?" target="_blank">Nexusmods</a>.</i></div>
<div>
<i><br /></i></div>
<div>
En ocasiones, ya sea por decisión del creador del <i>mod</i>, o bien por presiones del editor de un juego comercial en el que se ha basado el <i>mod</i>, el fichero JSON y/o los recursos dejan de estar disponibles, lo que deja a la gente que tenía dicho <i>mod</i>, e incluso con alguna partida a medio terminar, con la miel en los labios.</div>
<div>
<br /></div>
<h2>
TTS Easy Manager</h2>
<div>
Y ahora vamos a hablar de mi libro. </div>
<div>
<br /></div>
<div>
Los <i>mods</i> se construyen desde el propio interfaz ofrecido por Tabletop Simulator. Se define los distintos objetos (cartas, tokens, barajas, etc...) y para cada objeto se indican las URLs donde se encuentran los recursos necesarios para dibujar dichos objetos.</div>
<div>
<br /></div>
<div>
Pero cuando lo que quieres en hacer alguna modificación en un <i>mod </i>ya existente, como por ejemplo cambiar el idioma del juego, puede ser mucho más cómodo editar directamente el fichero JSON (con cuidado) cambiando los enlaces por otros propios donde se albergan los recursos modificados que quieres mostrar.</div>
<div>
<br /></div>
<div>
Esto en ficheros JSON grandes puede ser un poco lioso, y de ahí la motivación para desarrollar <a href="http://ttsmanager.softbreakers.com/" style="font-style: italic;" target="_blank">TTS Easy Manager</a>, y de paso aprender algunas cosillas de desarrollo<i>.</i></div>
<div>
<i><br /></i></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5sQTV8SbKHS2GCmpjTRAuXsvBkD8w0-szdkYMZfFkYLmQOXlv01We05FIkzRui5aD30hO3Zhyx7t-kIlohs2tG2bSwg_tY2cotbbdh-fTxAI_-qJBp7RSOmzXNS95qWZF91rqPyUDONl7/s1600/icono_trans.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5sQTV8SbKHS2GCmpjTRAuXsvBkD8w0-szdkYMZfFkYLmQOXlv01We05FIkzRui5aD30hO3Zhyx7t-kIlohs2tG2bSwg_tY2cotbbdh-fTxAI_-qJBp7RSOmzXNS95qWZF91rqPyUDONl7/s200/icono_trans.png" width="200" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Logo TTS Easy Manager</td></tr>
</tbody></table>
<div>
Este gestor trabaja directamente con los archivos JSON que definen los objetos de cada <i>mod</i>. De una manera resumida ofrece tres funcionalidades:</div>
<div>
<ol>
<li>Exploración de recursos</li>
<li>Edición de recursos</li>
<li>Respaldo y restauración de <i>mods</i></li>
</ol>
</div>
<h4>
1. Exploración de recursos</h4>
<div>
La exploración de recursos se realiza desde la propia ventana principal desde el momento en el que se carga en interpreta el fichero JSON del <i>mod </i>seleccionado. Se visualizará un listado con todos los recursos que incluye el <i>mod</i>, se indicará cuales se encuentran en la caché de Tabletop Simulator precargados anteriormente, y se muestra el contenido actual del enlace definido en el fichero JSON. A la hora de modificar un <i>mod </i>permite localizar rápidamente los recursos que queremos modificar de una manera fácil e intuitiva.</div>
<div>
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsckv1riML1Dk9O1T4N9r7Ev5QRcQRVbmE3bAfELeKc1KPk90qcvDBmjpEF3dTQb8_K4wcnuMucahfZj8k5u-K_bH7mZ55FphFi6bjNYbLLaqAXQ_OjYmDEANvGfwvTTBGtLLxzEUmW4sN/s1600/ttsman_mainwindow.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="235" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsckv1riML1Dk9O1T4N9r7Ev5QRcQRVbmE3bAfELeKc1KPk90qcvDBmjpEF3dTQb8_K4wcnuMucahfZj8k5u-K_bH7mZ55FphFi6bjNYbLLaqAXQ_OjYmDEANvGfwvTTBGtLLxzEUmW4sN/s400/ttsman_mainwindow.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Explorando recursos de un mod</td></tr>
</tbody></table>
<div>
<br /></div>
<h4>
2. Edición de recursos</h4>
<div>
Cada uno de los recursos listados del <i>mod </i>cargado puede modificarse su URL y cambiarla por otra de nuestra elección. Tan solo hay que pulsar el botón derecho del ratón sobre el recurso a modificar y se abrirá un asistente permitiendo la introducción de una nueva URL.</div>
<div>
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiE0YSjieqZulJ0TnsltZ4xlwqlyGroZC8PapuLPbA7d4WveXxtOiV8u0Q2LGJW7zqAoaDx0nbMkEF7g5eAIFSyEoy5HGHf1aKXdo-5NOj_4_niyE0NaeEwn5R8bFldDPvG71LSjrX4jjLg/s1600/ttsman_editwindow.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiE0YSjieqZulJ0TnsltZ4xlwqlyGroZC8PapuLPbA7d4WveXxtOiV8u0Q2LGJW7zqAoaDx0nbMkEF7g5eAIFSyEoy5HGHf1aKXdo-5NOj_4_niyE0NaeEwn5R8bFldDPvG71LSjrX4jjLg/s320/ttsman_editwindow.png" width="206" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Editando un recurso</td></tr>
</tbody></table>
<div>
<br /></div>
<h4>
3. Respaldo y restauración de <i>mods</i></h4>
<div>
Finalmente la funcionalidad de respaldo permitirá descargar localmente todos los recursos utilizados por un <i>mod</i>, asegurando así su perdurabilidad hasta que nosotros queramos. La copia de respaldo creada por el gestor puede ser empaquetada y almacenada donde queramos, enviada a un amigo, etc... Solo queda restaurarla desde el propio gestor para que vuelva a aparecer en el listado de partidas almacenadas de <i>Tabletop Simulator </i>para volver a disfrutarlo, independientemente de las distintas incidencias que haya sufrido el <i>mod</i> original.</div>
<div>
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJF0sWAQvmtMg0N4Pqb9X6hUuw8vp0sk9lSQ4Xp7ryrrTC-Jm55xR94iah_piAI1-QYzaG5DHHyLRyFCAHx-LhvlouGE9lBlImJmFDx1yMnOJdVCwNCyinADmBWfU5XAbPP-FO9PEZ4bJs/s1600/ttsman_backupwindow.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJF0sWAQvmtMg0N4Pqb9X6hUuw8vp0sk9lSQ4Xp7ryrrTC-Jm55xR94iah_piAI1-QYzaG5DHHyLRyFCAHx-LhvlouGE9lBlImJmFDx1yMnOJdVCwNCyinADmBWfU5XAbPP-FO9PEZ4bJs/s320/ttsman_backupwindow.png" width="264" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Descargando recursos</td></tr>
</tbody></table>
<div>
<br /></div>
<div>
La aplicación se encuentra en español e inglés, e incluye un fichero de ayuda en cada idioma. Además cada vez que arranca, busca si existen actualizaciones, para recuperar rápidamente la funcionalidad por si en algún momento una actualización de <i>Tabletop Simulator</i> cambia el formato de los archivos que accede y escribe <i>TTS Easy Manager, </i>y precisa actualizar el gestor.</div>
</div>
Softbreakershttp://www.blogger.com/profile/01666968545873713297noreply@blogger.com6tag:blogger.com,1999:blog-5459690923545315155.post-67204178045282435452016-02-23T10:04:00.000+01:002016-02-23T10:06:19.179+01:00Meteduras de pata que perduran<h2>
La metedura de pata de El Mundo</h2>
<div style="text-align: justify;">
El pasado 21 de febrero el diario <a href="http://www.elmundo.es/" target="_blank">El Mundo</a>, a eso de las 19:20, planta en su portada digital una exclusiva en la que <a href="http://www.elmundo.es/cronica/2016/02/21/56c765aaca4741ef628b460e.html" target="_blank">el periodista Javier Negre entrevista a la primera víctima</a> del tristemente célebre Sergio Morate, en prisión provisional a la espera de juicio por doble asesinato de su última expareja y de una amiga de ésta.</div>
<div style="text-align: justify;">
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://estaticos02.elmundo.es/assets/desktop/master/img/iconos/elmundo-portada.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="http://estaticos02.elmundo.es/assets/desktop/master/img/iconos/elmundo-portada.png" height="42" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Logo El Mundo</td></tr>
</tbody></table>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
No voy a entrar a discutir el caso en cuestión, tan solo voy a hacer una serie de consideraciones acerca de dicho artículo y de la metedura de pata hasta el fondo que constituye la fotografía que lo ilustra.<br />
<br /></div>
<div style="text-align: justify;">
<a name='more'></a>En el citado artículo, se entrevista a una víctima, que para proteger su identidad se nombra como Marta, cuya identidad ha sido protegida por la propia policía, y el padre que abre la puerta del domicilio al periodista incluso niega en un principio que Marta viva allí para protegerla.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
A lo largo del artículo se relata parte del sufrimiento que pasó la víctima a manos de su antigua pareja, hechos que tanto la chica como su padre quieren olvidar. Al final del artículo se dan un par de datos acerca de como la víctima rehizo su vida, lo que en una ciudad pequeña como Cuenca puede comprometer la identidad de la víctima. Y para finalizar la faena, el reportaje se ilustra con una imagen en negativo del rostro de la supuesta Marta.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
El filtrado realizado en esta imagen es fácil de revertir, como se muestra en esta <a href="http://amenzing.com/030066/la-metedura-de-pata-de-el-mundo/" rel="nofollow" target="_blank">entrada de Amenzing</a>. El proceso consiste tan solo en invertir los colores de la imagen, un solo un click de ratón en casi cualquier editor gráfico como <a href="http://www.getpaint.net/index.html" rel="nofollow" target="_blank">Paint.NET</a>. Aunque en las imágenes que siguen a continuación se muestra el rostro pixelado, en el artículo original de El Mundo la imagen aparecía sin pixelar y con toda nitidez.</div>
<div style="text-align: justify;">
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://amenzing.com/wp-content/uploads/2016/02/portada27.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="http://amenzing.com/wp-content/uploads/2016/02/portada27.jpg" height="157" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Imagen de Amenzing</td></tr>
</tbody></table>
<br />
<div style="text-align: justify;">
Como es de esperar, tanto en los comentarios de la noticia como en el propio <a href="https://twitter.com/javiernegre10/status/701487755235348480" rel="nofollow" target="_blank">Twitter del periodista</a>, las "felicitaciones" se suceden desde el momento en el que se publica el reportaje.</div>
<div style="text-align: justify;">
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBZ3odAxYmtMSgIlzGxJFV6ZHHHz9uZqlXsF5cwSEZ3PMLLR81RKiUxC20iPQtxlQiUjaY4Z90n_LvgeyilR5p-Bsma2lnKpw8I_Wew9woFw7pVDn7ae8Rkg9Uo-biGSRliaIOJq-qVvty/s1600/twitter.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBZ3odAxYmtMSgIlzGxJFV6ZHHHz9uZqlXsF5cwSEZ3PMLLR81RKiUxC20iPQtxlQiUjaY4Z90n_LvgeyilR5p-Bsma2lnKpw8I_Wew9woFw7pVDn7ae8Rkg9Uo-biGSRliaIOJq-qVvty/s320/twitter.png" width="170" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Tweet sobre el reportaje</td></tr>
</tbody></table>
<div style="text-align: justify;">
Es de esperar que la desafortunada imagen no haya aparecido en la edición impresa del diario El Mundo...</div>
<h2 style="text-align: justify;">
</h2>
<h2 style="text-align: justify;">
</h2>
<h2 style="text-align: justify;">
<br /></h2>
<h2 style="text-align: justify;">
Pues cambiamos la foto del reportaje... ¿no?</h2>
<div style="text-align: justify;">
En la mañana del día siguiente, lunes 22, mientras escribo estas líneas, desde El Mundo versión digital parece que han tomado cartas en el asunto y han cambiado la foto que ilustra la entrevista... y todo arreglado...</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Pues no. En primer lugar, efectivamente han cambiado la foto que ilustra la noticia, pero no han eliminado del servidor de El Mundo la fotografía anterior, que sigue siendo públicamente accesible.</div>
<div style="text-align: justify;">
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPUCftYriTF-2QKYd-OD4z853h25wAkddIKTbAb83HgBfl1QzC0a2KHicXgtGFJ14ymQ23EB3La0hO1tsBolGVRqU7visxW0FZIXqI6dY9jbn0SmLgPuSav40-SuciiVY2TpPGPeaYv0kG/s1600/elmundo2.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPUCftYriTF-2QKYd-OD4z853h25wAkddIKTbAb83HgBfl1QzC0a2KHicXgtGFJ14ymQ23EB3La0hO1tsBolGVRqU7visxW0FZIXqI6dY9jbn0SmLgPuSav40-SuciiVY2TpPGPeaYv0kG/s320/elmundo2.png" width="313" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Fotografía disponible en el servidor de El Mundo</td></tr>
</tbody></table>
<div style="text-align: justify;">
Pues se elimina la foto del servidor y se acabó el problema ¿no?... Pues tampoco. Nos quedan los buscadores.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Los buscadores de internet modernos no solo indexan y cachean contenidos en texto claro, si no también imágenes. Y como era de esperar, la foto en negativo de nuestra protagonista ya ha sido indexada por el buscador por excelencia: Google. Desde el momento en el que el artículo es indexado por un buscador, su eliminación ya queda más allá del alcance de El Mundo, ahora también depende del buscador o buscadores en cuestión y de sus políticas. Una sencilla búsqueda en Google nos lista la imagen:</div>
<div style="text-align: justify;">
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiL1ZLIzQZDdsQY0VALpatfDKMSvKWLIINkFmq7zTv210vwAQ7Kh5VKNllmzIcaulZWFsTwV6uu4MoUVw638p3oqkj9b59q1J5o1WdB16uVz6THnY-Q-YC5BSDMW5xxa7RG6194woTCD-4U/s1600/google.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="264" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiL1ZLIzQZDdsQY0VALpatfDKMSvKWLIINkFmq7zTv210vwAQ7Kh5VKNllmzIcaulZWFsTwV6uu4MoUVw638p3oqkj9b59q1J5o1WdB16uVz6THnY-Q-YC5BSDMW5xxa7RG6194woTCD-4U/s320/google.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Imagen indexada por Google</td></tr>
</tbody></table>
<br />
Y tirando del hilo, obtenemos de que URL proviene esa imagen indexada, concretamente de la portada del suplemento Crónica de El Mundo tal y como esta el día 22 a las 07:02 GMT.</div>
<div style="text-align: justify;">
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAqPVsfMTFPcDZrV8Jo3X3BJMhDV_A_Ifd_SrT7rdUbaKYrKTIjG-Cw6p5YFN2lawGYuJONv5fYwrsJEjmnPYGEI123-yT8PsP9hwxcec_YZ94DjeJs6m2VJvsHIJu1bs4O_Aq_B9bJkgC/s1600/elmundo-cronica.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="284" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAqPVsfMTFPcDZrV8Jo3X3BJMhDV_A_Ifd_SrT7rdUbaKYrKTIjG-Cw6p5YFN2lawGYuJONv5fYwrsJEjmnPYGEI123-yT8PsP9hwxcec_YZ94DjeJs6m2VJvsHIJu1bs4O_Aq_B9bJkgC/s320/elmundo-cronica.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Portada cacheada del suplemento Crónica</td></tr>
</tbody></table>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Afortunamente, en el caso de Google, se ofrece un servicio para eliminación de información y contenidos de sus índices, como es el caso de la <a href="https://support.google.com/websearch/answer/4628134?hl=es-419" target="_blank">eliminación de imágenes</a>.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Aquí Google distingue varios supuestos:</div>
<div style="text-align: justify;">
<ol>
<li>Eliminación de imágenes del sitio de un tercero. Este sería el caso si yo, o la afectada, quisieran eliminar de Google imágenes capturadas de un sitio, que como es el caso de el servidor de El Mundo, no gestionamos.</li>
<li>Eliminar de la caché de Google imágenes que ya han sido eliminadas del sitio del que se capturaron.</li>
</ol>
</div>
<div style="text-align: justify;">
La primera opción requeriría de ciertas comprobaciones por parte de Google para que verificaran que legítimamente estamos autorizados a eliminar de Google una imagen disponible en un servidor web que no gestionamos. La segunda opción sería la más rápida ya que tan solo requiere la comprobación de que la imagen ya no existe en el servidor desde el que se indexó, procedimiento que Google realiza automatizadamente. Desgraciadamente el servidor de El Mundo sigue facilitando la imagen, lo que nos complicará las cosas a cualquiera que no sean los propios administradores de dicho servidor.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Suponiendo que la web de la que partió la imagen no la controlamos nosotros, y que además la URL de la imagen sigue siendo válida, solicitaremos a Google una invalidación de los datos indexados referente a dicha URL para que la vuelva a meter es su motor de indexación y que en algún momento renueve la caché con los nuevos contenidos. El proceso es como sigue. </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
En primer lugar se accede al <a href="https://www.google.com/webmasters/tools/removals?pli=1" rel="nofollow" target="_blank">formulario de solicitud de eliminación de contenidos obsoletos</a>. Introducimos la URL de la imagen, la que nos devuelve Google cuando ampliamos la imagen que deseamos eliminar. </div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0qcHB6DIs_hQKXLuZEN1wBz6OuZQLFXC8CdRbJBf_8UMXKJNcSeJt3a6ul8IJriliYygCrM772MTOx89P3sSoxLAxfMS2MMXfiPziIXcmrjN8j3s4lKrVrpQ65IN3-8UlsvVSHFOcLJWP/s1600/borrado_google01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="72" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0qcHB6DIs_hQKXLuZEN1wBz6OuZQLFXC8CdRbJBf_8UMXKJNcSeJt3a6ul8IJriliYygCrM772MTOx89P3sSoxLAxfMS2MMXfiPziIXcmrjN8j3s4lKrVrpQ65IN3-8UlsvVSHFOcLJWP/s320/borrado_google01.png" width="320" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Tras unos segundos en los que el servidor de Google analiza la URL de la imagen, y como es de esperar en nuestro caso, nos indica que el contenido que queremos eliminar no ha sido eliminado por el propietario del sitio.</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRtqsdGR1d1B_Tx0aglDP03fPrHnuLyrc2YA5tP2Voyq593zVE0lo2OSy7WzM2tzLpCbBD1ymagc6OZZ4zCgTnGWG9UGZOmDt5b1jr_n4UaiYrVFHSJ8MlX6XA2jKlF1lEcNXsYfuTcEvA/s1600/borrado_google02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="145" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRtqsdGR1d1B_Tx0aglDP03fPrHnuLyrc2YA5tP2Voyq593zVE0lo2OSy7WzM2tzLpCbBD1ymagc6OZZ4zCgTnGWG9UGZOmDt5b1jr_n4UaiYrVFHSJ8MlX6XA2jKlF1lEcNXsYfuTcEvA/s320/borrado_google02.png" width="320" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Indicamos que "Sí" se ha eliminado o actualizado la imagen. En el siguiente paso, Google nos pide la URL en la que la imagen aparecía. Google por defecto muestra la URL de donde la capturó, en este caso la portada del <a href="http://www.elmundo.es/cronica.html" rel="nofollow" target="_blank">suplemento Crónica de El Mundo</a>.</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8C7PEOahNbml1cQzdUj3qn6WmwWK_CNfpqOrJ6q_j7cYTM3ytbVs-cWRQsYgE8Ed3rF99lZybjKF9yNGyzEi2MtLMA2CstwE9QPjf1tFXdUMj4hUVbahaXKB_j4ciGvfy_DxfVjoIqqlf/s1600/borrado_google03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="164" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8C7PEOahNbml1cQzdUj3qn6WmwWK_CNfpqOrJ6q_j7cYTM3ytbVs-cWRQsYgE8Ed3rF99lZybjKF9yNGyzEi2MtLMA2CstwE9QPjf1tFXdUMj4hUVbahaXKB_j4ciGvfy_DxfVjoIqqlf/s320/borrado_google03.png" width="320" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Tras pulsar enviar, Google nos informa que el contenido aún está activo. Lógicamente el suplemento Crónica sigue teniendo su portada. Seleccionamos la opción fragmento y caché obsoletos, aunque Google ya nos informa que "<u>es posible</u>" que lo eliminen si la caché está obsoleta, pero solo posible...</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrJRyeErXXlshhSCrhPXlsgjvwDUHexCv46qK3_VYYMc8mai6nhW1gQPvH0-kCy2YwucFGT5H9zALzOFV1HbU2OAjYdu3Js5taDdWcDxf7-66KzNb8-JyHDBXYd7TFIvGWdVZDSye0M18I/s1600/borrado_google04.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="192" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrJRyeErXXlshhSCrhPXlsgjvwDUHexCv46qK3_VYYMc8mai6nhW1gQPvH0-kCy2YwucFGT5H9zALzOFV1HbU2OAjYdu3Js5taDdWcDxf7-66KzNb8-JyHDBXYd7TFIvGWdVZDSye0M18I/s320/borrado_google04.png" width="320" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Introducimos alguno de los contenidos que aparecen en la actual caché de Google pero que ya no aparecen en la versión actual de la URL. En nuestro caso introducimos el nombre de la imagen en cuestión. El problema que tenemos es que el nombre del fichero con la imagen no es un texto que forma parte del contenido visible de la web, si no del código HTML.</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioaiwjQ5XVOPg-zMbaLm0tGSiNaYKb21foBWAJJOorkirBZjtvLLiVQ0hAt4MuTKnPnBZArTHOPxR8AwbkhkkzOkpoafrqEUmRETc_RrVoJSa9TujB2xjaCruwXVmaOZM7PLe-5be_pYL-/s1600/borrado_google05.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="184" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioaiwjQ5XVOPg-zMbaLm0tGSiNaYKb21foBWAJJOorkirBZjtvLLiVQ0hAt4MuTKnPnBZArTHOPxR8AwbkhkkzOkpoafrqEUmRETc_RrVoJSa9TujB2xjaCruwXVmaOZM7PLe-5be_pYL-/s320/borrado_google05.png" width="320" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Finalmente nuestra solicitud queda almacena en estado de pendiente. Ni que decir tiene que si El Mundo hubiera eliminado completamente la imagen de su servidor, o si bien el administrador de la web de El Mundo hubiera realizado el borrado de Google, el proceso hubiese sido inmediato. Por parte nuestra solo queda una solicitud que no sabemos si llegará a buen fin o no. </div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgocBVVBNX7FLzXx-7vEb3rlt6dUmXXVb9vgsuT6tvz1V03v6BNgM_lPwv_hDSMksJxWICbf2SK0vLstSiov5HWXoE8icsSYi9-VYo46bvvVzRODJnkMrysWK_znfRbhncqF59oBg8XMop8/s1600/borrado_google06.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="139" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgocBVVBNX7FLzXx-7vEb3rlt6dUmXXVb9vgsuT6tvz1V03v6BNgM_lPwv_hDSMksJxWICbf2SK0vLstSiov5HWXoE8icsSYi9-VYo46bvvVzRODJnkMrysWK_znfRbhncqF59oBg8XMop8/s320/borrado_google06.png" width="320" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
El objetivo de nuestra solicitud es tan solo tratar de adelantar el proceso de reindexado que periódicamente Google realiza sobre una URL determinada, para descartar contenidos obsoletos, aunque desconozco si estas solicitudes tienen efecto o no. Un par de minutos después dicha solicitud aparece como rechazada... :(</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Este proceso tendrían que realizarlo desde El Mundo en cada uno de los buscadores que pueden cachear imágenes, como Yahoo o Bing, aunque cada uno tendrá su propio procedimiento de eliminación.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Solo queda dar aviso a El Mundo, por si consideran conveniente no solo retirar la imagen de su servidor, sino además realizar ellos el proceso de borrado de los buscadores disminuyendo lo máximo posible el tiempo de exposición de una fotografía que nunca tendrían que haber publicado.</div>
<br />
<blockquote class="twitter-tweet" data-lang="es">
<div dir="ltr" lang="es">
<a href="https://twitter.com/javiernegre10">@javiernegre10</a> <a href="https://twitter.com/EspejoPublico">@EspejoPublico</a> <a href="https://twitter.com/Cronica_ElMundo">@Cronica_ElMundo</a> Borrad completamente la foto de esa mujer del servidor de El Mundo y de la caché de Google.</div>
— Softbreakers (@softbreakers) <a href="https://twitter.com/softbreakers/status/701775341438763008">febrero 22, 2016</a></blockquote>
<script async="" charset="utf-8" src="//platform.twitter.com/widgets.js"></script><br />
<br />
<div style="text-align: justify;">
A partir de las 19:00 del mismo día 22 Google ha renovado su almacenamiento en caché de la portada del suplemento Crónica, pero puesto que la imagen sigue estando en el servidor de El Mundo, la imagen continúa visible en el buscador de imágenes de Google. La metedura de pata perdurará en el tiempo hasta que por fin alguien de El Mundo con un poco de interés actúe, o bien se lance algún proceso automático de purgado del propio servidor que elimine contenidos que ya no son enlazados por ningún artículo.</div>
Softbreakershttp://www.blogger.com/profile/01666968545873713297noreply@blogger.com0tag:blogger.com,1999:blog-5459690923545315155.post-36455720839415839232016-01-20T16:02:00.000+01:002016-01-20T16:02:56.694+01:00Redondeando el tema "In Memoriam Revival Project"<h2>
In Memoriam</h2>
<div style="text-align: justify;">
La recuperación de la infraestructura necesaria para jugar al juego "<i>In Memoriam</i>" (rebautizado como "<i>Missing since January</i>" en EEUU) del extinto estudio francés <i>Lexis Numérique</i> ha sido el primer gran proyecto abordado en el blog. </div>
<div style="text-align: justify;">
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTKTsDL9qc_9T3JJ5KXzY3h6CCKLCVKFXwAX6WVsi39v7foyoMqh6p1RyqqviXlRAWvbw9LMToDRLsPhbS6mN0m_2xsBbUIM9e9GKkeNuDszHIb8QtFBGJoG1lYV0Q4XIP1KLdkSllCtOl/s1600/im_cdcase.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="231" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTKTsDL9qc_9T3JJ5KXzY3h6CCKLCVKFXwAX6WVsi39v7foyoMqh6p1RyqqviXlRAWvbw9LMToDRLsPhbS6mN0m_2xsBbUIM9e9GKkeNuDszHIb8QtFBGJoG1lYV0Q4XIP1KLdkSllCtOl/s320/im_cdcase.jpg" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><i>In Memoriam</i></td></tr>
</tbody></table>
<div style="text-align: justify;">
<br />
<a name='more'></a>Allá por septiembre de 2014 comenzaron <a href="http://www.softbreakers.com/search/label/inmemoriam" target="_blank">una serie de entradas</a> en el blog con el objetivo de documentar las tareas realizadas para poder permitir que un videojuego lanzado en el año 2003, y fuertemente basado en Internet, pudiera volverse a jugar a pesar de que prácticamente toda la infraestructura online desplegada por <i>Lexis Numérique</i> para el soporte del juego ya no estaba online. Poco después descubrí que este cierre parcial de los servidores del juego se debía a la liquidación judicial de la compañía desarrolladora anunciada en julio de 2014. A finales de agosto de 2014, lo poco que quedaba online fue definitivamente desconectado.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
El fruto de este proyecto, del cual un servidor aprendió bastante realizando cosas que nunca había hecho antes, se plasmó en un página web que denominé "<a href="http://inmemoriam.softbreakers.com/" target="_blank"><i>In Memoriam Revival Project</i></a>". Desde entonces y hasta ahora, aunque el tráfico ha sido todo lo escaso que se podía esperar de un antiguo videojuego que ya no está en venta, sí que algunos jugadores me han escrito agradecidos por poder jugarlo, o por poder volverlo a rejugar.</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTlfdKnN8M9XIXGXL9VOcTW5TwqFOogbP80V3cQ7GEDaysep6P6ScGUCROM3HuUO6pg6qnh4G1Js-upPY9D7t3PrE9Uk8y1uF8JOeM6yj5L-2_gUq9wAPYcf5RfnUTeqa0XhpP87Fk2hnG/s1600/fenix_logo_trans.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTlfdKnN8M9XIXGXL9VOcTW5TwqFOogbP80V3cQ7GEDaysep6P6ScGUCROM3HuUO6pg6qnh4G1Js-upPY9D7t3PrE9Uk8y1uF8JOeM6yj5L-2_gUq9wAPYcf5RfnUTeqa0XhpP87Fk2hnG/s200/fenix_logo_trans.png" width="200" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Logo "<i>In Memoriam Revival Project</i>"</td></tr>
</tbody></table>
<div style="text-align: justify;">
Y afortunadamente no ha sido grande el tráfico generado por los jugadores, porque la infraestructura que da soporte a "<i><a href="http://inmemoriam.softbreakers.com/" target="_blank">In Memoriam Revival Project</a></i>" se reduce prácticamente a un pequeño servidor dedicado junto con cuentas de hospedaje gratuitas, una infraestructura insuficiente para poder dar servicio a todos los jugadores que tuvo el juego en su día. En algo más de un año, apenas llegan al centenar de cuentas las que se han registrado en el juego utilizando la nueva infraestructura.<br />
<br />
Como proyecto cuya finalidad es aprender cosas de interés a la vez que se hace algo que tenga utilidad los resultados han sido muy satisfactorios. El despliegue dispuesto tan solo tiene un pero, que es el que ha provocado la mayor parte de los contactos que he recibido de usuarios. Y por la forma en la que se ha diseñado el videojuego, en un problema que lo convierte en injugable: no llegan los mensajes de correo enviados por el juego.<br />
<br />
Hay que recordar que en el juego, el jugador se enfrenta a un CD-ROM enviado por un asesino en serie que ha secuestrado a un periodista de investigación y su colaboradora que seguían sus pasos. El objetivo del juego es, de alguna manera, analizar el contenido del CD-ROM enviado por el secuestrador, reconstruyendo los fragmentos de la investigación realizada por los secuestrados que el asesino ha incluído en el CD-ROM, lo que le obligará a buscar pistas y respuestas a acertijos en internet. Además recibirá en su correo electrónico real mensajes de otros jugadores y personajes "virtuales" que prestan su colaboración a lo largo de la investigación, y algunos de estos mensajes son esenciales para continuar el juego.<br />
<br />
<h2>
Políticas anti-spam</h2>
<div>
El videojuego "<i>In Memoriam</i>" fue lanzado en el año 2.003, que medido en términos de la evolución de internet es como si decimos que se lanzó allá por la prehistoria. Obviamente el <i>spam</i> es un fenómeno que ya existía por entonces, precisamente en el año 2.003 se cumplían 25 años del primer <i>spam</i>, que no fue otro que un anuncio dirigido en 1.978 a los usuarios de la entonces ARPANET realtivo a una presentación de Digital Equipment Corporation, más conocida por sus siglas <i>DEC</i>. También ese año 2.003 se cumplió otra efeméride en lo relativo al fenómeno <i>spam</i>: por primera vez <a href="http://www.internetsociety.org/sites/default/files/History%20of%20Spam.pdf" target="_blank">el número de correos <i>spam</i> superó al número de correos legítimos</a>.</div>
<div>
<br /></div>
<div>
Desde octubre de 2.003, el personal conectado a la red de redes se ha quintuplicado, pasando la penetración de internet en la población mundial del 10,7% al 46,4% según datos del sitio <a href="http://www.internetworldstats.com/emarketing.htm" target="_blank">Internet World Stats</a>.</div>
<div>
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQNqchjIsEgrflH7KnypkPPw-T_nvzERzWt2Sw3BIhOq0XCDb3JR3rCp3ux70xBeR7wFibVZtTk8laFuqlruJzqvbrDxbBtVSyVo7rMRfWiTG0OY3nOylu0GoyMAtYl_3lfuLYe77v51W4/s1600/internet_users.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="270" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQNqchjIsEgrflH7KnypkPPw-T_nvzERzWt2Sw3BIhOq0XCDb3JR3rCp3ux70xBeR7wFibVZtTk8laFuqlruJzqvbrDxbBtVSyVo7rMRfWiTG0OY3nOylu0GoyMAtYl_3lfuLYe77v51W4/s400/internet_users.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Evolución del número de usuarios de Internet</td></tr>
</tbody></table>
<div style="text-align: justify;">
A nadie se le escapa que desde entonces hasta ahora, el correo <i>spam</i> también ha crecido. Ya en 2.010 <i>Symantec</i> estimaba que el 88% del tráfico generado por el correo electrónico era debido al <i>spam</i>. Y como es lógico, las políticas anti-spam de los grandes proveedores de correo electrónico como <i>Yahoo</i>, <i>Hotmail </i>o <i>Gmail </i>también han evolucionado.... aunque aquí cabe nombrar otra salvedad: en octubre de 2.003 cuando se lanzó el videojuego, el servicio de <i>Gmail </i>aún no existía ya que <i>Google </i>lo lanzó en fase beta en abril de 2.004.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
El crecimiento desbordado del <i>spam</i> ha obligado a los proveedores de correo electrónico a endurecer sus políticas <i>anti-spam</i>, de tal manera que lo que en el momento del lanzamiento del videojuego no era <i>spam</i>, con el paso de los años la evolución de dichas políticas lo ha colocado en el otro lado de la orilla.<br />
<br /></div>
<h2 style="text-align: justify;">
Impacto de las políticas anti-spam</h2>
<div>
Esta evolución de las políticas anti-spam ha impactado lógicamente en el funcionamiento del videojuego. Desde que aún era mantenido por la extinta <i>Lexis Numérique</i>, algunos mensajes de correo que el servidor del juego enviaba a las cuentas de correo de los jugadores eran incluídos por el proveedor de correo del jugador en la carpeta de <i>spam</i>, cuando no era directamente rechazado. Esto provocaba quejas de los jugadores relativos a la imposibilidad de seguir avanzando en el juego al no recibir mensajes de correo importantes.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkSagSl-auVjHuARdVtKWWMhR2hu9o0Fnlu9D928nbmFpnXr1wW4SKWV1QVp45JaCrWBJyKsuS4xQ2ECZzdcYrURTRQdYSppe08EYht7qWOhZ_inkkaRP_PMKRiNnILSnfrq8h6TmBxU-9/s1600/no-spam.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="197" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkSagSl-auVjHuARdVtKWWMhR2hu9o0Fnlu9D928nbmFpnXr1wW4SKWV1QVp45JaCrWBJyKsuS4xQ2ECZzdcYrURTRQdYSppe08EYht7qWOhZ_inkkaRP_PMKRiNnILSnfrq8h6TmBxU-9/s200/no-spam.jpg" width="200" /></a></div>
Uno de los encontronazos de los correos del videojuego con las nuevas políticas <i>anti-spam</i> es la dirección del remitente del correo electrónico. El protocolo SMTP usado para el transporte del correo electrónico no admite la autenticación entre los distintos servidores involucrados, lo cual inicialmente permite que un atacante malintencionado pueda modificar el dominio de la dirección de correo del remitente a su antojo. Así, cualquiera desde su máquina podría enviar correos remitidos por remitentes con dirección '@gmail.com', '@hotmail.com'... o lo que es peor, con dominios '@<a href="http://www.congreso.es/" target="_blank">congreso.es</a>', '@<a href="http://www.policia.es/" target="_blank">policia.es</a>' o '@<a href="http://www.cni.es/" target="_blank">cni.es</a>'.</div>
<div>
<br /></div>
<div>
Y esto fue así hasta las aparición del <a href="https://es.wikipedia.org/wiki/Sender_Policy_Framework" target="_blank"><i>Sender Policy Framework</i> o SPF</a>, cuya <a href="http://www.openspf.org/blobs/sender-authentication-whitepaper.pdf" target="_blank">primera versión</a> se liberó en diciembre de 2.014, un año después del lanzamiento del juego. Resumiendo el tema, este esquema de protección permite definir en el DNS de cada dominio registros de texto que listan las direcciones IP de servidores autorizados para remitir correos electrónicos de dicho dominio. Cuando un servidor SMTP recibe un correo electrónico con un remitente '@dominio.com' revisa los registros DNS de dicho dominio a ver si la IP de la máquina que le está remitiendo dicho correo aparece entre las autorizadas. Si está autorizado añade una cabecera en el correo indicándolo. El contenido de dicha cabecera es uno de los factores que puede determinar que el correo quede clasificado como <i>spam</i>.</div>
<div>
<br /></div>
<div>
Poco a poco los proveedores de correo principales comenzaron a implementarlo, y poco a poco los jugadores de "<i>In Memoriam</i>" comenzaron a perder correos electrónicos del juego. Como se dijo anteriormente, los jugadores reciben correos de colaboradores "virtuales", y obviamente cada colaborador tiene una dirección de correo virtual para meter en el campo "FROM" de los correos que envía. Uno de estos colaboradores resulta que tenía una dirección de correo '@hotmail.com', con lo que tras la implantación del SPF podemos imaginar lo que ocurría con los mensajes de este colaborador virtual al llegar al servidor SMTP del correo del jugador...<br />
<br />
Posteriormente, allá por mayo de 2.007 surgió una alternativa más segura denominada <a href="https://es.wikipedia.org/wiki/DomainKeys_Identified_Mail" target="_blank"><i>DomainKeys Identified Mail</i> o DKIM</a>. Usando criptografía asimétrica, se firman los mensajes al enviarlos con una clave privada propia del servidor que lo envía. Esta firma se añade como una cabecera adicional del correo. El servidor SMTP receptor consulta al servidor DNS del dominio del remitente el registro DKIM que contiene la clave pública correspondiente, lo que le permite verificar si la firma del mensaje es correcta o no, permitiendo discriminar correos legítimos de correos con el campo de remitente falseados.<br />
<br />
Desde entonces lucha contra el <i>spam</i> continúa evolucionando. Actualmente hay muchos otros factores que pueden hacer que los correos sean considerados como <i>spam</i>, aunque la lista de requisitos comienza a ser desesperadamente larga, como se puede ver en <a href="http://www.simultanews.com/articulos/llegada-al-inbox-de-cuentas-yahoo-gmail-hotmail.htm" target="_blank">este listado de recomendaciones</a> de un foro celebrado a principios de 2.009 con representantes de Yahoo Mail, Hotmail y Gmail. Con semejante listado lo que sorprende es que aún nos lleguen correos...<br />
<br />
<h2>
Impacto en In Memoriam Revival Project</h2>
</div>
<div>
Los mismos problemas que tenía <i>Lexis Numérique</i> para que sus jugadores recibieran los correos remitidos por el juego también los tiene el nuevo servidor implementado, pero aún más graves.</div>
<div>
<br /></div>
<div>
Finalizar el juego implica la recepción de unos 65 mensajes de correo (pueden ser menos o más según la velocidad con la que el jugador consiga superar determinadas fases), de unos ocho remitentes distintos. Estos ocho remitentes escriben desde direcciones de correo pertenecientes a cinco dominios distintos, y de esos cinco dominios solo dos no estaban registrados y controlados por <i>Lexis Numérique</i>. Eso significa que los desarrolladores del juego podían controlar los registros SPF de tres de los cinco dominios involucrados, y por tanto podían cumplir las exigencias de las nuevas políticas anti-spam en una buena parte de los mensajes remitidos por el juego.</div>
<div>
<br /></div>
<div>
En el caso de "<i>In Memoriam Revival Project", </i>no se posee ninguno de los dominios involucrados con el juego. Y esto es por dos razones. La primera es gran parte de los dominios relacionados con el juego están registrados por terceros. A partir del anuncio de liquidación de <i>Lexis Numérique </i>en junio de 2.014, la compañía dejo de renovar los nombres de dominio que poseía, y conforme los registros ya abonados iban caducando, los "<i>subastadores de dominios</i>" que acechan en internet esperando que alguna empresa olvide renovar algún dominio para "<i>secuestrarlo"</i> iban tomando posiciones, con lo que gran parte de dichos dominios no están disponibles salvo que se quiera abonar el "<i>rescate</i>" que sus actuales dueños propongan.</div>
<div>
<br /></div>
<div>
La otra gran razón es de índole económica. "<i>In Memoriam Revival Project</i>" es completamente gratuito para el usuario del juego. Puesto que no se poseen los derechos de explotación del juego, requerir un pago adicional a los propietarios del juego para el uso de la nueva infraestructura, aunque desde un punto de vista ético puede parecer apropiado (estudiar la comunicaciones del juego para programar desde cero un servidor que pueda darle soporte lleva su tiempo, además del desplegado y mantenimiento de la red de webs relacionadas, etc...), desde un punto de vista legal podría tener repercusiones negativas. Cierto es que podría haberse colocado un botón para donaciones voluntarias, o incluso algún pequeño baner publicitario, pero se ha preferido evitar problemas legales, y el precioso tiempo que estos problemas legales pueden absorber. Por ello, "<i>In Memoriam Revival Project</i>" no recibe ningún tipo de ingreso por parte de los jugadores, ni directo ni indirecto.</div>
<div>
<br /></div>
<div>
Puesto que no hay ingresos, sufragar el gasto de los dominios involucrados (algo más de treinta dominios) nunca se ha contemplado. De ahí, que el proyecto tenga que usar distintos "<i>trucos</i>" para que cuando el usuario acceda a un sitio web relacionado con el juego éste aparezca correctamente en su navegador web, a pesar de que en realidad dicho nombre de dominio apunta a otro sitio distinto, o incluso puede que no esté registrado.<br />
<br />
Al no tener registrados los dominios, no es posible definir registros SPF que apunten a la dirección IP del nuevo servidor del juego, ni mucho menos definir un registro DKIM, lo que se traduce en que prácticamente todos los correos enviados a proveedores como Gmail son rechazados y no se muestran al usuario, <u>ni siquiera en la carpeta de correos <i>spam</i></u>. Además se da el agravante de que el primer correo que envía el juego es el que contiene las credenciales (usuario y contraseña) de la cuenta que ha creado el jugador, y esa contraseña es necesaria para comenzar a jugar...<br />
<br />
<h2>
Primera solución: un cliente de correo web</h2>
</div>
<div>
La primera aproximación a una solución fue crear un rudimentario <a href="http://inmemoriam.softbreakers.com/es/Webmail/" target="_blank">cliente de correo web</a> en el propio sitio de "<i>In Memoriam Revival Project</i>". Si el correo no llegaba hasta el usuario, entonces que el usuario viniera a buscarlo. Usando como credenciales el correo electrónico registrado en el juego así como la contraseña generada por el mismo, el usuario podía autenticarse y revisar todos los correos electrónicos remitidos por el juego.</div>
<div>
<br /></div>
<div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvviea72iwYVUH5FmbLFfWkncof4pBz2gwUhIhouIV1TDAin8FgkHj1NtOzAAK1jW2PfHFDA0n7w1rwx9CKYt7UWldlxjSJ1FElNfTTK3hdHaxcwx_ikAl7RnSQ0EPcNbHNcUojk9JYPLG/s1600/im_webmail.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvviea72iwYVUH5FmbLFfWkncof4pBz2gwUhIhouIV1TDAin8FgkHj1NtOzAAK1jW2PfHFDA0n7w1rwx9CKYt7UWldlxjSJ1FElNfTTK3hdHaxcwx_ikAl7RnSQ0EPcNbHNcUojk9JYPLG/s320/im_webmail.png" width="290" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Cliente de correo web</td></tr>
</tbody></table>
Posteriormente se extendió el formulario de autenticación de este cliente de correo para solucionar el primer problema con el que se topaban los jugadores: no recibir el primer correo con la contraseña que genera el juego para la cuenta que han registrado. Si esa contraseña, tampoco podían autenticarse en el cliente de correo web.<br />
<br />
Actualmente el formulario permite autenticarse con la tradicional pareja "correo electrónico - contraseña" o bien con el par "correo electrónico - nombre de usuario". Esta última permite a los jugadores que no han recibido el correo con las credenciales completas, autenticarse en el cliente de correo web con los datos que han introducido en el juego para registrar la cuenta del jugador, accediendo así a sus mensajes de correo incluído el primero que les informaba sobre la contraseña generada. Posteriormente, una vez conocida la contraseña, pueden autenticarse de ambas maneras.<br />
<br />
Esta primera solución, aunque funcional, no era la mejor. El juego tras realizar una acción puede enviar al jugador uno o varios correos para su recepción inmediata, o bien puede que algunos se remitan con un retardo que puede ser de minutos, horas o incluso días. Obligar al jugador a acceder repetidamente al cliente de correo web para ver si ha recibido novedades es cansado, no es cómodo, ni da la sensación de inmersión en el juego que puede dar el recibir de repente un aviso de tu lector habitual de correo electrónico tanto en un ordenador como en un dispositivo móvil, indicando que has recibido un nuevo correo electrónico remitido por un personaje del juego a pesar de que hace un par de días que no lo tocas...</div>
<div>
<br />
Había que buscar otra solución.<br />
<br />
<h2>
La solución definitiva: un servidor POP</h2>
</div>
<div>
La solución ideal sería que los jugadores reciban en sus clientes de correo los mensajes enviados por el juego, junto al resto de sus mensajes de correo normales. Desgraciadamente la conjunción de las políticas anti-spam de los proveedores de correo junto con la naturaleza gratuita del proyecto que impide tomar las medidas adecuadas para salvar esos filtros anti-spam generan un problema inicialmente insalvable.</div>
<div>
<br /></div>
<div>
Pues como antes, si los correos no llegan a las cuentas de los jugadores para que sean accesible desde sus clientes de correo, que sean los clientes de correo los que vengan al servidor del juego a buscar los mensajes.</div>
<div>
<br /></div>
<div>
Para ello se programó una aplicación servidor que exponen siguiendo el <a href="https://www.blogger.com/"><span id="goog_589299684"></span>protocolo de correo POP<span id="goog_589299685"></span></a> los mensajes que el servidor ha remitido (o intentado remitir) a cada jugador. Obviamente como son mensajes de correo que son generados por el juego, no existe información personal del jugador que proteger, por lo que los comandos admitidos por el servidor POP son los mínimos imprescidibles para dar el servicio. No existe métodos de autenticación avanzados, ni encriptación SSL, etc... </div>
<div>
<br /></div>
<div>
Se han implementado los comandos mínimos que exige el <a href="https://tools.ietf.org/html/rfc1081" target="_blank">RFC 1081</a> junto con el comando opcional TOP, a los que se ha añadido el comando UIDL de la revisión posterior <a href="https://www.ietf.org/rfc/rfc1939.txt" target="_blank">RFC 1939</a>. Es de suponer que con esta implementación, practicamente cualquier cliente de correo podrá ser configurado añadiendo una cuenta adicional de correo con los datos necesarios para conecterse al servidor y leer los correos remitidos por el juego. Con esto se logra que el usuario pueda recibir los correos en los dispositivos de lectura que desee, por ejemplo puede configurar el lector de correo electrónico de su móvil para ir leyendo los correos que reciba sin necesidad de minimizar el juego para visualizarlos en el mismo ordenador.</div>
<div>
<br /></div>
<div>
Pero configurar un cliente de correo para acceder a los mensajes del juego no es la única posibilidad que ofrece esta solución. Muchos proveedores de correo como Gmail permiten importar en la cuenta de correo mensajes de otras cuentas y proveedores distintos siempre y cuando el proveedor externo permita el acceso usando los protocolos POP o IMAP. Si el proveedor de correo del jugador admite esta posibilidad tan solo tiene que configurar la funcionalidad en la web de su proveedor de correo. En la <a href="http://inmemoriam.softbreakers.com/es/FAQ/#faq10" target="_blank">sección FAQ de la web</a> se indican los pasos necesario para hacerlo en Gmail. Al hacer esto, automáticamente los clientes de correo que el jugador ya tenga debidamente configurados para acceder normalmente a su proveedor de correo, también mostrarán los correos enviados por el juego sin necesidad de configurarles nada, puesto que los filtros anti-spam no se aplican a correos importados de un proveedor externo. Por así decirlo, metemos los correos del juego con calzador en Gmail, y ya podemos decir aquello de "<i>donde las dan...</i>"</div>
<div>
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKZj-MTDN5KBsMN7RFKAP4APP_Q_OPv9wPu2lwo7heMfeQftzRFURta6pB0THaQFl9oUpyq6ZmZqQ1djTaGVGvCIuQAaEd5ZdrcApTPnNW07ZbjNK1IpBMD4gTUf4NrcQe8ev5E2z9oxDh/s1600/im_gmail.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="265" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKZj-MTDN5KBsMN7RFKAP4APP_Q_OPv9wPu2lwo7heMfeQftzRFURta6pB0THaQFl9oUpyq6ZmZqQ1djTaGVGvCIuQAaEd5ZdrcApTPnNW07ZbjNK1IpBMD4gTUf4NrcQe8ev5E2z9oxDh/s400/im_gmail.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Mensajes del juego en Gmail</td></tr>
</tbody></table>
<div>
Con esto se puede considerar ya que "<i>In Memoriam Revival Project</i>" ha conseguido recrear completamente la experiencia que el juego ofrecía en sus buenos momentos, he incluso mejor ya que con el servidor POP se asegura que no se perderán mensajes de correo por las políticas anti-spam o modificaciones de las mismas que puedan producirse en el futuro.</div>
</div>
Softbreakershttp://www.blogger.com/profile/01666968545873713297noreply@blogger.com0tag:blogger.com,1999:blog-5459690923545315155.post-38372884561032175272015-10-13T09:00:00.000+02:002016-05-17T20:47:19.109+02:00Diseccionando un dropper .NET distribuído en software pirata<h2>
Peligros del software ilegal</h2>
<div style="text-align: justify;">
Tampoco le voy a dar muchas vueltas. El uso de distribuciones ilegales de software, aparte de ilegal, es peligroso. No digo que toda distribución ilegal de software lleve malware, <a href="https://news.microsoft.com/download/presskits/dcu/docs/idc_031814.pdf" target="_blank">pero haberlas haylas</a>. Y los juegos piratas no son una excepción.</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhs5SG9XeCfPM4rhUR9QTJZ5RhT96efB5Z4vKTZ0NeVE14lL_ZgUGGjiEzZcyOGSz6IzYVZDEUht7dh6SEeIV5QnilOzS8uDD_D8cHivdqi2dKj2xg4D3gk625Eh-ubHIf2BbeNtU4dlFr2/s1600/soma_pirate_cd.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="257" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhs5SG9XeCfPM4rhUR9QTJZ5RhT96efB5Z4vKTZ0NeVE14lL_ZgUGGjiEzZcyOGSz6IzYVZDEUht7dh6SEeIV5QnilOzS8uDD_D8cHivdqi2dKj2xg4D3gk625Eh-ubHIf2BbeNtU4dlFr2/s320/soma_pirate_cd.png" width="320" /></a></div>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br />
<a name='more'></a>Lejos quedan aquellos tiempos en los que el malware se distribuía al intercambiar disquetes entre conocidos. Ahora, con la generalización de las conexiones de internet, la red de "<em>conocidos</em>" con los que intercambiar es enorme. Y con las redes <em>peer to peer</em>, entre las que destacan las redes <em>torrent</em>, pasamos de redes de intercambio enormes a cuasi mundiales. Y al intervenir tantos participantes, el hecho de recibir contenidos con "<em>regalo oculto</em>" generado por alguien con malas intenciones es solo cuestión de tiempo.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Además, la naturaleza del software a distribuir con "<em>regalo oculto</em>" genera una segmentación del mercado de posibles víctimas a las que infectar que permite especializar el malware a distribuir según el tipo de usuarios o equipos a los que se desea atacar.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Por poner un ejemplo de esta segmentación de mercado que provoca la naturaleza del software pirateado que usa como cebo, un malware bancario irá muy bien "<em>colocado</em>" en una distribución ilegal de software dedicado al mercado bursátil. Y visto desde otra perspectiva, un troyano controlado por la policía igualmente puede colocarse en un visor de imágenes dentro de un paquete de material supuestamente pedófilo.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
En esta entrada vamos a ver un malware especializado en una determinada labor que se alberga en un "<em>cebo"</em> que por su naturaleza permitirá maximizar la eficacia de la finalidad de dicho malware.</div>
<br />
<h2 style="text-align: justify;">
Money, money, money...</h2>
<div style="text-align: justify;">
Antes los virus eran prácticamente inofensivos, o al menos con finalidad inofensiva aunque provocaran daños colaterales involuntarios, como puede ser la saturación de las redes de comunicación, o errores y disfunciones en equipos infectados. Pero ese tiempo ya pasó.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Actualmente el mercado de virus se ha "<em>profesionalizado</em>". Ya no se busca ni fama ni reconocimiento sino más bien lo contrario, el anonimato más absoluto acerca de los autores y una finalidad que no es otra que un retorno económico en perjuicio de los usuarios infectados.</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTixp_a2k2HZ1Aztc1BiOR85duZuzaqh0dWZRWJjDOPAybjRdqpBYW31I3vkKKhRRAT0K8PUDRvReGcoD9RCdYVXFtlCPgPHuzQ4E7mFxk__LxHqzHLLyiRjVgh45ix3ITODHSFEG0cmqU/s1600/soma_thief.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="183" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTixp_a2k2HZ1Aztc1BiOR85duZuzaqh0dWZRWJjDOPAybjRdqpBYW31I3vkKKhRRAT0K8PUDRvReGcoD9RCdYVXFtlCPgPHuzQ4E7mFxk__LxHqzHLLyiRjVgh45ix3ITODHSFEG0cmqU/s320/soma_thief.png" width="320" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Así, periódicamente aparecen en los medios noticias sobre las distintas campañas de <em>ransonware</em> que encriptan documentos en los equipos infectados y exigen al usuario un pago para descriptarlos y volver a tener acceso a sus contenidos.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
La aparición de las criptomonedas con el <em>bitcoin</em> a la cabeza ha cambiado los medios de pago que usan los delicuentes cibernéticos a la hora de recoger el <em>botín</em><em>, </em>por ejemplo para recoger los frutos de las extorsiones realizadas mediante los nombrados <em>ransomware</em>.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Pero las cripotomonedas no solo han cambiado los medios de pago utilizados por ciberdelicuentes. La generación de las distintas criptomonedas, proceso también conocido como <em>minado,</em> precisa de una gran complejidad de computación que va aumentando mes a mes. Los <em>mineros</em> se reunen en lo que se llaman <em>pools </em>de mineros, estableciendo redes de computación distribuída para aunar recursos y aumentar las posibilidades de generar un nuevo bloque válido de criptomonedas. Periódicamente se reparten los beneficios de los bloque generados según la potencia de cálculo que cada <em>minero</em> ha aportado al <em>poll</em>.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Esto ha dado pie a la aparición de un nuevo tipo de <em>malware</em> cuya finalidad es absorber parte de los recursos de computación de la máquina donde se instala para realizar <em>minería</em> de la criptomoneda de turno. Este tipo de <em>malware</em> no es más que un cliente de un determinado <em>poll</em> (en muchos de ellos el cliente <em>minero</em> es de código abierto) modificado para ejecutarse sin mostrar ningún tipo de interfaz al usuario, de tal manera que arranque y funcione sin que el usuario lo perciba.</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmV45DK7aiJZUcOaIyccw7tn_-OYUswoOpXOgq_XeboNx3_gteHNfseWe9GminjQmd11Mi5AxImHjIr9uo66zm3MeUfVXJiBNE0ZqAxu3jd76ZaOhTFx4fiegVEpIByy3axfZBKwOy0jRu/s1600/soma_malware_miner.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmV45DK7aiJZUcOaIyccw7tn_-OYUswoOpXOgq_XeboNx3_gteHNfseWe9GminjQmd11Mi5AxImHjIr9uo66zm3MeUfVXJiBNE0ZqAxu3jd76ZaOhTFx4fiegVEpIByy3axfZBKwOy0jRu/s1600/soma_malware_miner.png" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
El único perjuicio que pueden percibir los usuarios es el enlentecimiento en la capacidad de respuesta del equipo, al encontrarse parte de la capacidad de proceso desviada a otras labores.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Dada la potencia computacional a emplear, los <em>mineros</em> se han modificado para utilizar en los cálculos, en lugar del procesador, las tarjetas gráficas. El uso de los procesadores en paralelo que aportan las tarjetas gráficas aumenta enormemente la capacidad de <em>minado</em> por su alta velocidad de cálculo.<em> </em>Pero claro, no todos los ordenadores disponen de tarjetas gráficas potentes, y sobrecargar un <em>poll </em>con multitud de clientes remotos que apenas tienen capacidad de proceso puede incluso acarrear sanciones al que aporta todos esos clientes de poca capacidad de proceso.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
¿Y cómo distribuir un malware de este tipo, que precisa un equipo con una capacidad de proceso gráfica decente? Pues como no, en una distribución pirata de un juego que exija una mínima potencia gráfica. Cogemos el juego, modificamos el instalador para que además instale nuestro malware de <em>minado</em>, lo subimos a la red torrent y a esperar que nuestra aportación <em>extra</em> al <em>pool</em> se traduzca en beneficios limpios y sin posiblidad de rastreo. La única ligazón que existe entre ese malware y su creador en el identificador del <i>monedero</i> virtual de criptomoneda dónde el <em>pool</em> volcará periódicamente lo que corresponda a la red de minado aportada por el ciberdelincuente, monederos que como muchos sabrán son completamente anónimos.</div>
<br />
<h2 style="text-align: justify;">
El especímen</h2>
<div style="text-align: justify;">
Nuestro protagonista de hoy se está distribuyendo mediante redes torrent utilizando el juego <em>SOMA</em>, de <em>Frictional Games</em>, lanzado el pasado 22 de septiembre. Concretamente se está utilizando una versión manipulada del producto comercializado <a href="http://www.gog.com/game/soma">por la tienda digital <em>GOG.com</em></a>. Los requisitos recomendados para el juego son una tarjeta gráfica <em>Nvidia GTX480</em> o una <em>AMD Radeon HD 5970</em>, que aunque no son el último grito, son unas tarjetas gráficas con una potencia respetable que harán que el <em>minero</em> rinda a gusto.</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPB_3CNeyHf0aA9As6rcxSqwgzDWcCt1KaCSFFLj_OGr4nOQHxYryYPbI91W32aMomtdwd6uLqYENwTwOgBPS_yPFjjlWQyue944VmkyT77ZFzZ0IDIIulO5gR-McLRFhhqQGYL7AHPhi1/s1600/soma_game.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="149" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPB_3CNeyHf0aA9As6rcxSqwgzDWcCt1KaCSFFLj_OGr4nOQHxYryYPbI91W32aMomtdwd6uLqYENwTwOgBPS_yPFjjlWQyue944VmkyT77ZFzZ0IDIIulO5gR-McLRFhhqQGYL7AHPhi1/s320/soma_game.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">SOMA, de Frictional Games</td></tr>
</tbody></table>
<div style="text-align: justify;">
El torrent en cuestión tiene el siguiente hash:</div>
<code class="prettyprint lang-cs"><br />
C2691A348E76E727AF2691218FEECD5E8E750C91</code><br />
<div style="text-align: justify;">
<br />
La distribución lleva el instalador junto con tres ficheros mucho más grandes con extensión .bin, aunque para nuestras intenciones nos basta con descargar solo el instalador que pesa unos 31Mb, disponible <a href="https://www.hybrid-analysis.com/sample/107a541f43e3cada555438279304b162b94d4021139ed83bb7d0f7a4e2299738%231/107a541f43e3cada555438279304b162b94d4021139ed83bb7d0f7a4e2299738.bin.gz">aquí</a> (descomprimir y renombrar el archivo resultante a "<em><span style="color: black;">setup_soma_2.0.0.1.exe</span></em>").</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
El instalador presente en dicho torrent es en realidad el <a href="https://es.wikipedia.org/wiki/Dropper_(malware)" target="_blank"><em>dropper</em></a> de un malware destinado a la minería de criptomonedas mediante <em>GPU</em>.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
El malware <em>minero</em> que transporta e instala este <em>dropper</em> disfrazado de instalador, también <a href="https://www.virustotal.com/es/file/641049d72098d123e653e7857054faba93e23a45df3417bfc2e6b490807b53f4/analysis/">aparece en <em>VirusTotal</em></a> desde el 5 de septiembre, bastantes días antes de que se lanzara el juego, por lo que es posible que incluso el propio culpable del tema cometiera la imprudencia de subirlo a ver si los antivirus lo cazaban.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Inicialmente el <em>minero</em> era detectado solo por <em>ESET-NOD32</em>, aunque a fecha 2 de octubre ya es detectado por 20 de 56 antivirus, con lo que por lo pronto se le acabó el chollo a nuestro amigo.</div>
<div style="text-align: justify;">
Este <em>dropper</em> se ha subido <a href="https://www.virustotal.com/es/file/107a541f43e3cada555438279304b162b94d4021139ed83bb7d0f7a4e2299738/analysis/">a <em>VirusTotal</em></a>, y a fecha 2 de octubre sigue apareciendo como "<em>limpio</em>" por parte de los 57 antivirus que ahora mismo soporta el servicio. Las máquinas virtuales de análisis automatizado de malware tampoco parecen verle problema a este <em>dropper</em>, tanto en <em><a href="https://www.hybrid-analysis.com/sample/107a541f43e3cada555438279304b162b94d4021139ed83bb7d0f7a4e2299738?environmentId=1">Windows 7</a></em> como en <em><a href="https://www.hybrid-analysis.com/sample/107a541f43e3cada555438279304b162b94d4021139ed83bb7d0f7a4e2299738?environmentId=3">Windows 8</a></em>.</div>
<br />
<h2 style="text-align: justify;">
Al tema...</h2>
<div style="text-align: justify;">
El <em>dropper</em> imita la apariencia de los instaladores originales de los juegos comercializados por <em>GOG.com</em>, ya que muestra el icono que utilizan los mismos, pero lo que no puede imitar es la firma digital con la que<em> GOG.com</em> autentifica todos sus instaladores. Además, en los detalles del archivo el autor tampoco se ha esmerado demasiado.</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnL6_fvST2McPkwrqgOQpdk_ChxjJhe-DBAsIPJSbi16OJV_4jOFerYkL8BroHFaAA4els0yzQfes4TTm1t107RH3jk-pPKVyIw3ErUcurw_5IrCESn4iOKLCsSAMG97Q8vJ5hra21L8G1/s1600/soma_gog_properties.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="218" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnL6_fvST2McPkwrqgOQpdk_ChxjJhe-DBAsIPJSbi16OJV_4jOFerYkL8BroHFaAA4els0yzQfes4TTm1t107RH3jk-pPKVyIw3ErUcurw_5IrCESn4iOKLCsSAMG97Q8vJ5hra21L8G1/s320/soma_gog_properties.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">A la izquierda instalador manipulado y a la derecha el original</td></tr>
</tbody></table>
<div style="text-align: justify;">
La falta de firma digital ya es suficiente para hacernos sospechar. La búsqueda por Google del nombre original "<em>MdmProject_v4.exe</em>" <a href="https://www.google.es/webhp?q=mdmproject_v4.exe">confirma las sospechas</a>. O tenemos "<em>bicho</em>" o el autor es un consumado bromista...</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
En una primera toma de contacto dentro de una máquina virtual, lanzamos el instalador modificado. Enseguida crea un nuevo archivo en su mismo directorio con el nombre "<em>setup_soma.bin</em>" y lanza lo que parece el instalador del juego. Si acudimos al administrador de tareas de Windows encontramos arrancados el ejecutable "<em>setup_soma_2.0.0.1.exe</em>" y el nuevo archivo "<em>setup_soma.bin</em>". Copiamos este último archivo con extensión <em>.exe, </em>y revisando sus propiedades descubrimos que es el instalador original de <em>GOG.com.</em></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Empezamos para meterle mano con la herramienta <em>PEiD</em>, que nos intentará identificar el compilador utilizado, si se ha empaquetado el ejecutable, etc...</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioDhYUAL7RIV1UcL73abdQWhRNuqpyShAL_HMbARRtXh7D9WW6AfoaGFx55SiO14nuelZtJZwicAjta9dRjZXl8Aw4ijSBDhAQz8FHxUniWjnrT4bWepOZprqEuBz-JK-eyZywl-qzXoBi/s1600/soma_gog_peid.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="184" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioDhYUAL7RIV1UcL73abdQWhRNuqpyShAL_HMbARRtXh7D9WW6AfoaGFx55SiO14nuelZtJZwicAjta9dRjZXl8Aw4ijSBDhAQz8FHxUniWjnrT4bWepOZprqEuBz-JK-eyZywl-qzXoBi/s320/soma_gog_peid.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Salida de PEid</td></tr>
</tbody></table>
<div style="text-align: justify;">
Nos encontramos ante un ejecutable <em>.NET</em>, así que recurrimos a <em><a href="http://ilspy.net/">ILSpy </a></em>para echar un primer vistazo:</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj26gii7aKS8jySvkUjIHqWT6az5i9FTdhMI989WYCfmi2zvoOOMHCnnTkL_8ixu93OpVSG33dKko0ndIJQtSDrBM-DR_0loR1BoFk2qp5JrNlYj9zxuS0neH7fqieoEdRf3IaknP-FMiUk/s1600/soma_gog_ilspy_offuscated.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="235" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj26gii7aKS8jySvkUjIHqWT6az5i9FTdhMI989WYCfmi2zvoOOMHCnnTkL_8ixu93OpVSG33dKko0ndIJQtSDrBM-DR_0loR1BoFk2qp5JrNlYj9zxuS0neH7fqieoEdRf3IaknP-FMiUk/s320/soma_gog_ilspy_offuscated.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Primer vistazo con ILSpy</td></tr>
</tbody></table>
<div style="text-align: justify;">
Pues nuestro gozo en un pozo. En nuestro primer vistazo vemos bastantes cosas, pero todo sería más claro con los nombres de clases y variables ya que al parecer el autor ha utilizado algún ofuscador de código. Revisando lo que saca <em>ILSpy</em> encontramos una de las pocas clases sin ofuscar con el nombre <em>BabelAttribute</em> y el siguiente contenido:</div>
<code class="prettyprint lang-cs"><br />
using System;<br />
public sealed class BabelAttribute : Attribute<br />
{<br /> public const string Version = "3.5.0.0";<br />
}</code><br />
<br />
<div style="text-align: justify;">
Un poco más de búsqueda por internet y localizamos un producto denominado<em> <a href="http://www.babelfor.net/products#Obfuscator">Babel Obfuscator</a>, </em>que resulta ser un ofuscador para <em>.NET</em>, y concretamente estamos ante la versión 3.5.0.0.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Como para casi toda medida hay una contramedida, rebuscamos un poco más por internet y nos encontramos con <a href="https://github.com/0xd4d/de4dot"><em>de4dot</em></a>, que nos ofrece desofuscar y desempaquetar ejecutables <em>.NET</em>. Entre otros, parece soportar el ofuscador utilizado, por lo que vamos a darle una oportunidad. Antes de nada hay que tener en cuenta que esta herramienta puede ejecutar parte de la aplicación a tratar, por lo que si se sospecha que pudiera tener malware se recomienda usarla dentro de una máquina virtual.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Descargamos una distribución binaria de <em>de4dot</em> (o bien compilamos todos los fuentes) en una máquina virtual. Volcamos igualmente el instalador a desofuscar y los arrastramos sobre el ejecutable "<em>de4dot.exe</em>". Enseguida se nos crea un nuevo archivo con la versión presumiblemente <em>limpia</em> de polvo y paja.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Abrimos ese nuevo archivo con <em>ILSpy</em> y ya vemos algo mejor:</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzGvZYKRK3t-8F432STntPbqd2LriYuXaSz0TXpG0fh9ou9DKcG61rZ2E9hb3yFG7KFk_1HhOpdj6wd_XwKnh6WmzvUqRESmOiEzFKfkS0In5oZNddQ3yJqqZHl_S3WQr55Z010PLLZEHZ/s1600/soma_gog_ilspy_deobfuscated.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="234" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzGvZYKRK3t-8F432STntPbqd2LriYuXaSz0TXpG0fh9ou9DKcG61rZ2E9hb3yFG7KFk_1HhOpdj6wd_XwKnh6WmzvUqRESmOiEzFKfkS0In5oZNddQ3yJqqZHl_S3WQr55Z010PLLZEHZ/s320/soma_gog_ilspy_deobfuscated.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Segundo vistazo con ILSpy</td></tr>
</tbody></table>
<div style="text-align: justify;">
Para empezar a desmenuzar el tema hacemos que <em>ILSpy</em> nos cree un proyecto de <em>Visual Studio</em> con el código desensamblado. Seleccionamos el ejecutable en el árbol que muestra el descompilador a la izquierda, y desde el menú <em>File</em> pulsamos <em>Save code... </em>para crearnos el proyecto.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Como es de esperar, de entrada el proyecto no compilará. Antes hay que <em>limpiarlo</em> y <em>asearlo</em> un poco.</div>
<div style="text-align: justify;">
Vemos que hay multitud de ficheros fuente que pertenecen al espacio de nombre "<em>SevenZip</em>". Estos archivos pertenecen al <em>SDK</em> del compresor <em>7zip</em>, disponible en <a href="http://www.7-zip.org/sdk.html" target="_blank">este enlace</a>. Borramos todos estos archivos del proyecto. En el directorio raíz del proyecto generado por <em>ILSpy</em> habrán quedado algunos archivos huérfanos que no son referenciados, ya que pertenecen al <em>SDK </em>de <em>7zip</em>, que hemos eliminado<em>.</em> Esto ficheros <em>huérfanos</em> los liquidamos igualmente.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Ahora importamos los del <em>SDK</em> de <em>7zip </em>para C#, que dentro del paquete del <em>SDK </em>se encuentran en el subdirectorio <em>CS</em>. El proyecto dentro del directorio del <em>SDK "\7zip\Compress\LzmaAlone"</em> no nos hace falta importarlo a nuestro proyecto. Por otro lado, con un editor de recursos extraemos el icono que utiliza el <em>dropper </em>para incorporarlo a nuestra solución, que es el mismo icono que usan los instaladores de <em>GOG.com</em> originales.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Ahora ya podemos intentar compilar el proyecto, y esta vez sí que nos compila. Al revisar el código, vamos renombrando las clases, propiedades y métodos con nombres más explicativos de la función que realizan. Al final, el resultado que usaré para comentar el funcionamiento del <em>dropper, </em>y <a href="https://github.com/softbreakers/setup_soma_code" target="_blank">disponible en</a><em><a href="https://github.com/softbreakers/setup_soma_code" target="_blank"> GitHub</a>,</em> ha quedado tal que así:</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiK7gJk-jGnhlCOc3-Fm__7S37KhF1AJoehPTrhE84fb4gLjIJc_PiUiqjs0nDbP4XX7u9Dgpq3m4s1Kufk3eG5o15XO3l9gFa4kqX7DLKISt3JL1jqZECt5KIq5Cro2e_AteZa6fuzu0eG/s1600/soma_vs_solution.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiK7gJk-jGnhlCOc3-Fm__7S37KhF1AJoehPTrhE84fb4gLjIJc_PiUiqjs0nDbP4XX7u9Dgpq3m4s1Kufk3eG5o15XO3l9gFa4kqX7DLKISt3JL1jqZECt5KIq5Cro2e_AteZa6fuzu0eG/s320/soma_vs_solution.png" width="300" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Proyecto resultante tras reordenar y renombrar clases</td></tr>
</tbody></table>
<div style="text-align: justify;">
El punto de entrada a la aplicación, el archiconocido "<em>Main" </em>de toda la vida, queda así:</div>
<br />
<code class="prettyprint lang-cs">using MdmProject_v4;<br />
using System;<br />
using System.Diagnostics;<br />
using System.Threading;<br />
using System.Windows.Forms;<br />
<br />
internal static class MainClass<br />
{<br /> [STAThread]<br /> private static void Main(string[] args)<br /> {<br /> try<br /> {<br /> if (args.Length == 0)<br /> {<br /> FileUtils.LaunchFile(Application.ExecutablePath, "runas", true, ProcessWindowStyle.Normal);<br /> }<br /> else<br /> {<br /> OriginalApplicationLauncher.SaveAndLaunchOriginalApplication();<br /> Thread.Sleep(TimeSpan.FromMinutes((double)new Random().Next(2, 3)));<br /> TemplateVersionFactory @templateFactory = new TemplateVersionFactory();<br /> TemplateVersion templateVersion = @templateFactory.LocateFirstTemplateInstalled();<br /> TemplateInstaller templateInstaller = new TemplateInstaller(templateVersion);<br /> if (templateVersion.prop_tmp_dir == null)<br /> {<br /> templateInstaller.InstallTemplate();<br /> }<br /> else<br /> {<br /> templateInstaller.CreateTask(false);<br /> }<br /> }<br /> }<br /> catch (Exception)<br /> {<br /> }<br /> }<br />
}</code><br />
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
En primer lugar la aplicación revisa si no se ha pasado algún parámetro. Si no se han pasado parámetros, llama al método "<em>FileUtils.LaunchFile</em>" y posteriormente finaliza la ejecución. Este método lo que hace es arrancar el programa que se pasa como primer parámetro, con los argumentos del segundo parámetro, y si el tercer parámetro es verdadero, trata de ejecutarlo con elevación de privilegios, o sea, equivale a ejecutarlo "<em>como administrador</em>". Según esté configurado el <a href="http://windows.microsoft.com/es-es/windows/turn-user-account-control-on-off#1TC=windows-7"><em>UAC</em></a> de <em>Windows</em>, el sistema operativo se nos mostrará un aviso pidiendo confirmación o no.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Así, puesto que lo normal es que se invoque la aplicación sin argumentos, el efecto que se produce es que la aplicación finaliza tras intentar lanzarse a sí misma con elevación de privilegios. Cuando se lanza a sí misma, coloca como argumento la cadena "<em>runas</em>", con lo que en la nueva ejecución el programa pasa por la claúsula "<em>else</em>".</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Con esto, el <em>dropper</em> consigue intentar lanzarse con elevación de privilegios sin indicarlo en su manifiesto, con lo que inicialmente no parece tan peligroso como otros ejecutables a los que el sistema operativo añade un pequeño escudo al icono del ejecutable.</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYvj0RzHQE0PxetAnr2R2UTuRfzfmSv5N9wBTXGVCBiOXAtaa-Yq5-Dsxutaq0-hkblXsN1sEWsmH4UvAK6eeGU9JNxt_MwkwyJFdRRYx04gTfu23vkOxE9Kzcbcb49mLBQUyuI6L1i40r/s1600/soma_uac_icon.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYvj0RzHQE0PxetAnr2R2UTuRfzfmSv5N9wBTXGVCBiOXAtaa-Yq5-Dsxutaq0-hkblXsN1sEWsmH4UvAK6eeGU9JNxt_MwkwyJFdRRYx04gTfu23vkOxE9Kzcbcb49mLBQUyuI6L1i40r/s1600/soma_uac_icon.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Icono UAC</td></tr>
</tbody></table>
<div style="text-align: justify;">
Otro factor que añade esta forma de lanzarse es permitir <em>desengancharse</em> de un hipotético <em>debugger </em>que esté revisando la aplicación. El <em>debugger</em> finalizará al acabar el proceso inicial, permitiendo que el nuevo proceso lanzado con elevación de privilegios continue sin estar sometido al escutrinio del <em>debugger</em>. Y no hablo de un <em>debugger</em> operado por un humano, que posiblemente pille la jugada, sino de otros como pueden ser los <em>sandbox</em> para análisis automatizado de <em>malware</em>, como por ejemplo <a href="http://www.cuckoosandbox.org/" target="_blank"><em>Cuckoo</em></a>.</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjndzVcHXP_N51sWRBdDpbFCT_M3XfMg7OF_HtJUrNK5_SYS6UQjY2VRfLstz7A3haLzfIap-FZEB138wXYlAU9EeEHNL11Lfk9sf0yi2C_dSeqlh6nSuW4-EFdGM5VBFBMVEWptVMSie2H/s1600/soma_cuckoo_logo.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjndzVcHXP_N51sWRBdDpbFCT_M3XfMg7OF_HtJUrNK5_SYS6UQjY2VRfLstz7A3haLzfIap-FZEB138wXYlAU9EeEHNL11Lfk9sf0yi2C_dSeqlh6nSuW4-EFdGM5VBFBMVEWptVMSie2H/s1600/soma_cuckoo_logo.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Logo de Cuckoo</td></tr>
</tbody></table>
<div style="text-align: justify;">
El método con el que comienza la claúsula "<em>else</em>" almacena en el mismo directorio desde el que se lanza la aplicación el recurso "<em>setup</em>" en un fichero con el nombre "<em>setup_soma.bin</em>" (método "<em>FileUtils.SaveBinaryToFile</em>") y finalmente lo ejecuta usando el intérprete de comandos lanzando "<em>cmd.exe /c \setup_soma.bin</em>" ("<em>FileUtils.LaunchFile</em>"). Este archivo es el instalador original del juego generado por <em>GOG.com</em> con su correspondiente firma digital. A partir de aquí comienza la instalación del juego, que es lo que la víctima espera.</div>
<br />
<code class="prettyprint lang-cs">using MdmProject_v4.Properties;<br />
using System;<br />
using System.Diagnostics;<br />
using System.IO;<br />
using System.Windows.Forms;<br />
<br />
internal class OriginalApplicationLauncher<br />
{<br /> public static void SaveAndLaunchOriginalApplication()<br /> {<br /> try<br /> {<br /> if (Globals.currentDirectory == "")<br /> {<br /> Globals.currentDirectory = Environment.CurrentDirectory;<br /> }<br /> string text = Path.Combine(Globals.currentDirectory, Globals.originalApplicationFileName);<br /> if (Resources.originalFileContents.Length != 1)<br /> {<br /> FileUtils.SaveBinaryToFile(text, Resources.originalFileContents);<br /> }<br /> FileUtils.LaunchFile(Globals.cmdPath, "/c \"" + text + "\"", false, ProcessWindowStyle.Hidden);<br /> }<br /> catch (Exception ex)<br /> {<br /> MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Hand);<br /> }<br /> }<br />
}</code><br />
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Una vez lanzada la instalación real del juego, en el procedimiento principal el <em>dropper</em> espera un tiempo aleatorio de entre 2 y 3 minutos para a continuación comenzar con la extracción e instalación del <em>payload</em>. Nuevamente, esta espera podrá permitir burlar aquellos sistemas automatizados de <em>malware</em> más <em>impacientes</em> que finalicen los análisis antes de 2 minutos.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
El autor de este <em>malware</em>, como muestra una sencilla búsqueda en internet de algunas cadenas que aparecen en el ejecutable ("<em>Steam-S-1-8-22-9865GUI</em>", "<em>MdmUpdateTaskMachineCore</em>", "<em>mdmproject_v4</em>"), ya lleva varias campañas dedicadas al tema <em>cripto-minero</em>. Para la instalación del <em>payload</em> se definen una serie de <em>plantillas</em> implementadas con la clase <em>TemplateVersion</em>. Esta clase tiene las siguientes propiedades privadas junto con sus correspodientes <em>getters</em> y <em>setters </em>públicos:</div>
<br />
<code class="prettyprint lang-cs"> [Serializable]<br />
internal class TemplateVersion<br />
{<br /> // Nombre del fichero con payload a ejecutar <br /> private string run_file;<br />
<br /> // Lista de directorios donde puede instalarse el payload<br /> private string[] root_dir;<br />
<br /> // Subdirectorio a crear (dentro de alguno de los 'root_dir')<br /> // donde instalar el payload<br /> private string up_dir;<br />
<br /> // Nombre de la tarea con la que se instalará el payload<br /> private string task_name;<br />
<br /> // Ficheros que forman el payload<br /> private string[] files;<br />
<br /> // Null en caso de que los ficheros se acaban de crear<br /> // En caso de que los ficheros ya existieran, indica el <br /> // directorio en el que se encuentran<br /> private string tmp_dir;<br />
<br /> [...]<br />
}</code><br />
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Tras el "<em>sleep</em>", el <em>dropper</em> intentará localizar si se encuentra ya instalada en el sistema alguna de sus plantillas anteriores.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
En caso afirmativo, el <em>dropper </em>se limita a recrear la tarea programada que lanza al malware minero, apuntando a la instalación que haya localizado. Para crear esta tarea programada en primer lugar se vuelca a disco un fichero "<em>config.xml" </em>(ver "<em>TemplateInstaller.SaveTaskConfigFile</em>") con una serie de parámetros ajustados en tiempo de ejecución (fecha de inicio de la tarea programada, ejecutable a lanzar con sus argumentos, etc...). Este fichero de configuración viene ya preconstruído en el código de la aplicación, en la cadena "<em>Globals.taskConfigXml</em>". La tarea identificada por "<em>Java Update Schedule</em>" queda programada para ser lanzada 20 minutos después de que el usuario se loguee en el sistema, se ejecutará el <em>payload</em> "jusched.exe" y se pasará como parámetro supuestamente el identificador del autor del malware en el <em>pool </em>minero al que se conectará el <em>payload, </em>"<em>overbtc123.</em>". Además la tarea se programa para que se ejecute por primera vez con un retardo aleatorio de entre 1 y 2 días después de la fecha actual, dificultando aún más el que usuario relacione los problemas de rendimiento que sin duda aparecerán con la ejecución del instalador del juego.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Tras crear el archivo de configuración de la tarea, ésta es importada ejecutando la aplicación del sistema operativo "<em>schtasks.exe</em>" (ver "<em>TemplateInstaller.LaunchTaskCreator</em>"), con lo que la tarea ya programada queda así:</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSif_XHG04ZTu_8tkhKZRWs1hG5X4fX4OucVnElR-2egK8aDMVphqn6X3mZIscufG8cb-CgCsS6Q3nmtwSIacK4wkOYCE1HW8x7vPeWOQMonq2w7bu4etJ3_cZSbccdasYy2PlqC7eG_AC/s1600/soma_programmed_task.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="228" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSif_XHG04ZTu_8tkhKZRWs1hG5X4fX4OucVnElR-2egK8aDMVphqn6X3mZIscufG8cb-CgCsS6Q3nmtwSIacK4wkOYCE1HW8x7vPeWOQMonq2w7bu4etJ3_cZSbccdasYy2PlqC7eG_AC/s320/soma_programmed_task.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Cabecera de la tarea programada</td></tr>
</tbody></table>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCkvct9PdhT3QikXRdHJUPaxTqX3Z02ptONzwLr1_C1jTyPr0liF25HA1MUpryAGO-8H63cmJuho7a-bYKEB9UHtAK0XJFgJGCbJ88BtqBhpUO_jtDQ0YX98BC0ohhVA73zQBfsGJZWVqa/s1600/soma_programmed_task_trigger.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="276" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCkvct9PdhT3QikXRdHJUPaxTqX3Z02ptONzwLr1_C1jTyPr0liF25HA1MUpryAGO-8H63cmJuho7a-bYKEB9UHtAK0XJFgJGCbJ88BtqBhpUO_jtDQ0YX98BC0ohhVA73zQBfsGJZWVqa/s320/soma_programmed_task_trigger.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Disparador de la tarea</td></tr>
</tbody></table>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBhaiRMEQD0pLmjUOtlCXQp9XyDLpyRIa2td6NjUZ1VcT_CdwgbEf9Et3iXfb10XSFz1iwQ7gEt3ERwTTTYZ1kLLNPXbn4iG8YpYqJYZBLMMxJiQ3vOgUvmG2jXO7zfWLf4tjpKatyAeUH/s1600/soma_programmed_task_action.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBhaiRMEQD0pLmjUOtlCXQp9XyDLpyRIa2td6NjUZ1VcT_CdwgbEf9Et3iXfb10XSFz1iwQ7gEt3ERwTTTYZ1kLLNPXbn4iG8YpYqJYZBLMMxJiQ3vOgUvmG2jXO7zfWLf4tjpKatyAeUH/s320/soma_programmed_task_action.png" width="296" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Tarea a realizar</td></tr>
</tbody></table>
<div style="text-align: justify;">
En caso de no localizar una plantilla anterior ya instalada, el <em>dropper</em> despliega los archivos del <em>payload</em> y finalmente crea (o recrea si existiera) la tarea programada. Los archivos del <em>payload</em> se incluyen, al igual que el instalador original de <em>GOG.com</em> al que suplanta, como recurso con el nombre "<em>jusched</em>". A diferencia del instalador original que se encuentra inalterado en los recursos del <em>dropper</em>, los archivos del <em>payload </em>se encuentran empaquetados con LZMA, de ahí el que el proyecto incluya el <em>SDK</em> de <em>7zip</em>. Entre otras cosas, el <em>dropper</em> consigue así dificultar la detección del <em>malware minero </em>en el interior del instalador por parte de aplicaciones antivirus.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
El <em>payload </em>está formado por un ejecutable junto con tres librerías de terceros:</div>
<ul>
<li><em><strong>jusched.exe</strong>. </em>Usando el mismo nombre e icono que el actualizador de Java al que pretende simular, contiene el cliente minero modificado por el autor del malware.</li>
<li><strong>libcurl.dll</strong>. Librería de cURL para comunicaciones, supuestamente son el servidor del <em>pool </em>minero.</li>
<li><strong>msvcr120.dll</strong> y <strong>msvcp120.dll</strong>. Librerías de runtime de <em>Microsoft</em> <em>Visual Studio 2013</em> para C y C++ respectivamente.</li>
</ul>
<div style="text-align: justify;">
Estos ficheros son volcados a un subdirectorio denominado "<em>Java</em>" que el <em>dropper </em>crea dentro de uno de los subdirectorios presentes en alguno de los directorios de sistema ya existentes en, y por orden de preferencia:</div>
<ul>
<li><em>ApplicationData</em></li>
<li><em>LocalApplicationData</em></li>
<li><em>Personal</em></li>
<li><em>MyMusic</em></li>
<li><em>MyPictures</em></li>
</ul>
<div style="text-align: justify;">
Puesto que el <em>dropper </em>se lanza con privilegios de administración, no tendrá problemas en crear el directorio "<em>Java</em>" y volcar el <em>payload</em> en alguno de los subdirectorios ya existentes del directorio de aplicaciones (normalmente "<i>C:\Users\NOMBRE_USUARIO\AppData\Roaming</i>").</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Una vez instalados los archivos y programada la tarea, el <em>dropper</em> finaliza mientras que el usuario espera que el instalador original del juego sigue instalando el videojuego...</div>
<br />
<h2 style="text-align: justify;">
Notas</h2>
<div style="text-align: justify;">
No se comprobado la funcionalidad de lo que a todas luces parece que es un malware minero implementado en el archivo "<em>jusched.exe</em>". Es de suponer que es del interés del creador del malware el que los ordenadores infectados sean completamente funcionales para maximizar el rendimiento del minero. Asi mismo, no le interesa realizar otros funcionalidades secundarias que puedan alertar al usuario, más allá de la necesaria caída de rendimiento del equipo cuando el minero se encuentra funcionando.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
De todas maneras queda bajo la responsabilidad del lector lanzar los archivos enlazados, aunque yo aconsejaría usar siempre máquinas virtuales...</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Los ficheros fuente decompilados a partir del binario del <em>dropper,</em> y con <span style="text-decoration: underline;">el <em>payload</em> original</span> (o sea, cuidado con auto-inyectarse el minero) en su archivo de recursos, <a href="https://github.com/softbreakers/setup_soma_code" target="_blank">se encuentran en Github</a>.</div>
Softbreakershttp://www.blogger.com/profile/01666968545873713297noreply@blogger.com0tag:blogger.com,1999:blog-5459690923545315155.post-66094953230040536842015-10-12T08:00:00.000+02:002015-11-23T15:20:33.395+01:00FX interactive. Como NO implementar un protocolo desafío-respuesta de autenticación.<h2>
Introducción</h2>
<div style="text-align: justify;">
En entradas anteriores se ha descrito de una manera muy básica la <a href="http://juegos.fxinteractive.com/index.php" target="_blank">plataforma digital de <em>FX Interactive</em></a>, centrándonos en la manera de salvaguardar los contenidos descargables que tengamos adquiridos por si en un futuro, y dado <a href="http://www.elconfidencial.com/tecnologia/2015-02-26/fx-interactive-se-desangra_718330/" target="_blank">los rumores acerca de las dificultades económicas</a> de la compañía, éstos se confirman y la compañía deja de operar dejando a sus clientes sin sus preciados juegos adquiridos en versión digital.</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-2QHyAqZQKMnod9CjnnS6UQlAUSnxXSoJQ9GikT9SlBRStHP4eQtQGl_qid7cLYhZ9gmLyBnfh7PNThXxWcyrJJeqp6Ury-yGtIOB6Qbv86xyia2XTrfscyepUhAjwJVUJoWAbp42M4_N/s1600/fx_logo.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="170" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-2QHyAqZQKMnod9CjnnS6UQlAUSnxXSoJQ9GikT9SlBRStHP4eQtQGl_qid7cLYhZ9gmLyBnfh7PNThXxWcyrJJeqp6Ury-yGtIOB6Qbv86xyia2XTrfscyepUhAjwJVUJoWAbp42M4_N/s320/fx_logo.jpg" width="320" /></a></div>
<br />
<a name='more'></a><div style="text-align: justify;">
Curioseando en el funcionamiento de la plataforma digital, se localizaron ciertas deficiencias en lo referente a la gestión de la autenticación en la plataforma (que de entrada <u>no obliga al uso de SSL</u>), que permitían a un atacante comprometer con relativa facilidad las credenciales de los usuarios de la plataforma siempre y cuando pudiera interceptar la comunicación.<br />
<br /></div>
<h2 style="text-align: justify;">
Mecanismo de autenticación</h2>
<div style="text-align: justify;">
Vamos al tajo. La <a href="http://juegos.fxinteractive.com/index.php" target="_blank">plataforma digital de <em>FX Interactive</em></a> usa como credenciales de acceso la típica combinación de correo electrónico como identificador de usuario y una contraseña.</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgaaOz8kxvkI9cjEx9HmGcICxPpsn7pMlUuRhPfnKeed_NO_byiHR31ByMPv_6YiFdYtlpw7Gk_BGXM-DY-hozD8QR4uexzHlu-hSvKzN1_BcX99UONqcdYvwgY2SDCHgVkorDV4qijRLn4/s1600/fx_login.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="196" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgaaOz8kxvkI9cjEx9HmGcICxPpsn7pMlUuRhPfnKeed_NO_byiHR31ByMPv_6YiFdYtlpw7Gk_BGXM-DY-hozD8QR4uexzHlu-hSvKzN1_BcX99UONqcdYvwgY2SDCHgVkorDV4qijRLn4/s320/fx_login.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Ventana de autenticación</td></tr>
</tbody></table>
<div style="text-align: left;">
<span style="text-align: justify;"><br />
</span></div>
<div style="text-align: justify;">
A partir de ahí, se despliega el mecanismo de autenticación basado en un protocolo desafío-respuesta. En este tipo de protocolos el servidor genera un desafío que envía al cliente, el cual debe calcular la respuesta correcta mediante una función conocida tanto por servidor como por el cliente. La autenticación se valida si el cliente envía la respuesta correcta al desafío enviado por el servidor. De esta manera se evita la transmisión por el canal de comunicaciones de las contraseñas de acceso.<br />
<br /></div>
<div style="text-align: justify;">
La forma en la que las credenciales del usuario, que es el <em>secreto</em> conocido tanto por servidor como por el cliente y que no debe transmitirse por el canal de comunicaciones, entran en este tipo de esquemas de autenticación varía de una implementación a otra.<br />
<br /></div>
<div style="text-align: justify;">
En nuestro caso concreto, el <em>secreto</em> es el <em><a href="https://es.wikipedia.org/wiki/MD5" target="_blank">hash MD5</a></em> de los dos campos de credenciales, tanto correo electrónico como contraseña. En la parte cliente, este <em>hash</em> debe ser calculado por el navegador tras introducir el usuario las credenciales en la ventana de autenticación. En la parte servidor, es posible que este <em>hash</em> sea lo que se almacena evitando así guardar la contraseña en texto claro. La forma en la que se calcula este <em>hash</em> en el lado del cliente aparece en el fichero de javascript <em><a href="https://juegos.fxinteractive.com/fx/public/js/login_tools.js" target="_blank">login_tools.js</a></em>, en la función <em>hashPassword</em>:</div>
<br />
<code class="prettyprint lang-js">/////////////////////////////////////////<br />
// Calcula el hash de una contraseña<br />
// password: contraseña<br />
// mail: e-mail del usuario<br />
/////////////////////////////////////////<br />
function hashPassword(password, mail)<br />
{<br />
//Calculamos la sal a partir del mail<br />
salt = calcMD5(mail.toLowerCase()).substr(0, 16);<br />
return calcMD5(password + salt);<br />
}</code><br />
<pre style="text-align: justify;"></pre>
<div style="text-align: justify;">
Traduciendo al cristiano, se calcula el <em>hash MD5</em> de la dirección de correo electrónico en minúsculas, en forma de cadena hexadecimal en minúsculas. La primera mitad (los 16 primeros caracteres) de este <em>hash MD5</em> constituirán lo que se denomina una <a href="https://es.wikipedia.org/wiki/Sal_(criptograf%C3%ADa)" target="_blank"><em>sal criptográfica</em></a>. El resultado final de la función será el <em>hash MD5</em> de la cadena formada por concatenación de la contraseña seguida de la sal calculada anteriormente.<br />
<br /></div>
<div style="text-align: justify;">
El uso de esta <em>sal criptográfica</em> evita que si el <em>secreto</em> es comprometido, el atacante pueda calcular fácilmente la contraseña. Aunque el <em>hash MD5</em> no es una operación considerada como reversible (al menos actualmente), es susceptible de ataques de fuerza bruta en los que se compara el <em>hash MD5</em> interceptado con <em>hashes MD5</em> precalculados en forma de gigantescas tablas, lo que se conocen como <a href="https://es.wikipedia.org/wiki/Tabla_arco%C3%ADris" target="_blank">tablas <em>rainbow</em></a>. Estas tablas contienen los <em>hashes</em> calculados para distintos algoritmos de un listado de palabras susceptibles de ser utilizadas como contraseñas, como por ejemplos diccionarios en distintas lenguas. El uso de <em>sales </em>complica, y prácticamente imposibilita, el éxito de ataques basados en tablas precalculadas, obligando al atacante a realizar ataques de fuerza bruta calculando los <em>hashes</em> de cada una de la palabras de su diccionario concatenadas con la <em>sal</em> correspondiente.<br />
<br /></div>
<div style="text-align: justify;">
El cómo interviene este <em>secreto</em> en el esquema de autenticación de la plataforma queda claro leyendo los comentarios que incluye el código javascript involucrado, en este caso la función <em>replyChallenge</em> del mismo fichero de javascript <a href="https://juegos.fxinteractive.com/fx/public/js/login_tools.js" target="_blank"><em>login_tools.js</em></a>:<br />
<br /></div>
<code class="prettyprint lang-js">//El desafio es un numero cifrado con el hash del password mediante AES<br />
//La respuesta consiste en el numero+1 cifrado de la misma forma</code><br />
<div style="text-align: justify;">
<br />
Previamente el navegador del cliente habrá enviado al servidor en una transacción anterior el identificador del usuario que desea autenticarse. En respuesta a dicha petición, tal y como cuenta el comentario del código, el servidor responde con el desafío que es un número aleatorio que envía el servidor cifrado con el protocolo simétrico <em><a href="https://es.wikipedia.org/wiki/Advanced_Encryption_Standard" target="_blank">AES</a></em> en modo <a href="https://es.wikipedia.org/wiki/Cifrado_por_bloques#Cipher-block_chaining_.28CBC.29" target="_blank"><em>CBC</em></a> y con vector de inicialización a cero, usando como clave de cifrado el <em>secreto</em> del usuario que desea autenticarse, que no es otro que el <em>hash</em> de las credenciales del usuario calculado de la manera descrita anteriormente.<br />
<br /></div>
<div style="text-align: justify;">
El navegador del usuario descifrará el desafío con el <em>hash</em> calculado por la función <em>hashPassword</em> a partir de las credenciales introducidas por el usuario. Al número resultante (si las credenciales introducidas son correctas necesariamente generará un número) sumará uno, y el resultado volverá a cifrarlo con <em>AES</em> usando el mismo <em>hash </em>como clave de cifrado para enviarlo al servidor. En el servidor se descifrará y se comprobará si la respuesta obtenida corresponde al desafío enviado, con lo que se finalizará la validación del usuario.</div>
<br />
<h2>
Deficiencias en la autenticación</h2>
<div style="text-align: justify;">
Lo anterior es, en teoría, lo que los diseñadores de la plataforma digital de <em>FX Interactive</em> tenían en mente. Pero una cosa es la teoría y otra la implementación práctica que actualmente presenta la plataforma.</div>
<br />
<h3 style="text-align: justify;">
SSL. Póntelo, pónselo</h3>
<div style="text-align: justify;">
Como se ha indicado anteriormente, la plataforma web no obliga a utilizar <em>SSL</em>. En la mayor parte de los servicios de internet que requieren de identificación, el servidor redirige automáticamente los accesos al interfaz de autenticación por <em>HTTP</em> hacia <em>HTTPS, </em>evitando en todo momento la transmisión de datos sensibles sin encriptación.</div>
<h1 style="text-align: center;">
<strong>http<span style="color: red;">s</span>://</strong></h1>
<div style="text-align: justify;">
En este caso esa redirección no se produce, y no es porque el servidor no soporte <em>SSL.</em> Si forzamos el acceso por HTTPS tecleando en el navegador <a href="https://juegos.fxinteractive.com%20/" target="_blank">http<span style="color: red; text-decoration: underline;"><strong>s</strong></span>://juegos.fxinteractive.com </a>el servidor responde correctamente, pero posiblemente nuestro navegador comience a mostrar advertencias ya que el certificado del servidor lleva muchos meses caducado.</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh84ibx6btREXN8NOeAk7ktd-8muMkQiwvQ2is87gl5mlEtXoAgorliS5wxppvh4zQR5JSjxJp7J-n8QNUVqhGGBP7UXqEgQK4MDQcHV2FmY_0jElJKFqIiXzovle5F1Onk2NvFMH1ogSTm/s1600/fx_certificate.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh84ibx6btREXN8NOeAk7ktd-8muMkQiwvQ2is87gl5mlEtXoAgorliS5wxppvh4zQR5JSjxJp7J-n8QNUVqhGGBP7UXqEgQK4MDQcHV2FmY_0jElJKFqIiXzovle5F1Onk2NvFMH1ogSTm/s320/fx_certificate.png" width="257" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Certificado de FX Interactive caducado</td></tr>
</tbody></table>
<div style="text-align: justify;">
La autenticación a cualquier servicio usando cifrado SSL es hoy en día una necesidad debido a la gran cantidad de dispositivos móviles y portátiles conectados mediante redes inalámbricas públicas y por tanto inseguras y susceptibles de ser monitorizadas. Redirigir los accesos HTTP a HTTPS y adquirir un certificado renovado no supone un esfuerzo apreciable en relación a todas las ventajas que aporta a la hora de proteger las credenciales de los usuarios.</div>
<br />
<h3 style="text-align: justify;">
Protocolo de autenticación</h3>
<div style="text-align: justify;">
En el siguiente ejemplo se van a utilizar unas credenciales de una cuenta existente (mail="test@softbreakers.com" y pass="password"), y cuyo <em>hash</em> calculado de la manera anteriormente descrita da el valor de nuestro <em>secreto</em>. Hay disponible calculadoras de <em>MD5</em> online como <a href="http://onlinemd5.com/" target="_blank">ésta</a>.</div>
<br />
<code class="prettyprint">md5(pass + md5(mail).substr(0, 16)) = "7d3d0b8a4f04f89f7f68b7134909b123"</code><br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSeETMfaM2gE7QCJ2iBhM8k4hD-idPIkDHHxEwcqHwRCN_KRqRPcv88sE098CA2WIE6rvJcz-_7YTk6aTzbaJPuJwD7JzcPzKYdtoAIOETdg_JFsRpVNRKPY0u0psWvnMKDhBatXeuG81e/s1600/fx_calculate_secret.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="218" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSeETMfaM2gE7QCJ2iBhM8k4hD-idPIkDHHxEwcqHwRCN_KRqRPcv88sE098CA2WIE6rvJcz-_7YTk6aTzbaJPuJwD7JzcPzKYdtoAIOETdg_JFsRpVNRKPY0u0psWvnMKDhBatXeuG81e/s320/fx_calculate_secret.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Cálculo del hash de las credenciales</td></tr>
</tbody></table>
A continuación se describe el diálogo de autenticación con la plataforma (por acortar, se omiten algunas cabeceras HTTP).<br />
<br />
<h4>
1. <em>login_get_challenge.php</em></h4>
El cliente envía una transacción POST pasando como parámetro el correo del usuario en texto en claro con el que se intenta autenticar.<br />
<br />
<code class="prettyprint">POST /fx/application/ajax/login_get_challenge.php HTTP/1.1<br />
Host: juegos.fxinteractive.com<br />
[...]<br />
mail=test%40softbreakers.com</code><br />
<div style="text-align: justify;">
<span style="text-align: justify;"><br />
</span> <span style="text-align: justify;">En caso de que dicho correo se encuentre registrado en la plataforma ,el servidor </span><span style="text-align: justify;">responde con </span><span style="text-align: justify;">un </span><em style="text-align: justify;"><a href="https://es.wikipedia.org/wiki/JSON" target="_blank">JSON</a></em><span style="text-align: justify;"> que incluye el desafío cifrado con </span><em style="text-align: justify;">AES</em><span style="text-align: justify;">. Además se establece la cookie para identificar la sesión </span><em style="text-align: justify;">PHPSESSID</em><span style="text-align: justify;">.</span><br />
<span style="text-align: justify;"><br />
</span></div>
<code class="prettyprint lang-java">({<br />
"Challenge":"6d50729aad86f75410e8b0ec0f0a2d77",<br />
"_resultStr":"WU_OK",<br />
"_permit":true,<br />
"_resultMsg":"Operacion completada correctamente"<br />
})</code><br />
<br />
En caso contrario, el <em>JSON</em> de respuesta informa del error.<br />
<br />
<code class="prettyprint lang-java">({<br />
"_resultStr":"WC_ERROR_NOUSER",<br />
"_permit":true,<br />
"_resultMsg":"El usuario referenciado no existe"<br />
})</code><br />
<br />
En nuestro caso, para el desafío cifrado del ejemplo, el valor descifrado usando el <em>secreto</em> calculado anteriormente quedaría así. En las imágenes de ejemplo he usado este <a href="http://aes.online-domain-tools.com/" target="_blank">cifrador online</a>.<br />
<br />
<code class="prettyprint">Desafío cifrado = "6d50729aad86f75410e8b0ec0f0a2d77"<br />
Desafío descifrado = AES-CBC(Desafío cifrado, Secreto) = "464557077"</code><br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpODDe6nlzs2jZlxlWuuyn0D4_evrzL645OyT_B7zhIu4KLhiIi1Aqz15uZIbf0BFzngCgN52S-PVml413IWl4YX459b7atnaGanW7rgX7-jab6khyphenhyphengXSjOOrJdj_Aabf5md2A2oJfcUMC/s1600/fx_decrypt_challenge.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="247" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpODDe6nlzs2jZlxlWuuyn0D4_evrzL645OyT_B7zhIu4KLhiIi1Aqz15uZIbf0BFzngCgN52S-PVml413IWl4YX459b7atnaGanW7rgX7-jab6khyphenhyphengXSjOOrJdj_Aabf5md2A2oJfcUMC/s320/fx_decrypt_challenge.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Descifrando el desafío</td></tr>
</tbody></table>
<h4>
2. <em>wu2_login.php</em></h4>
El cliente envía una transacción GET con los siguientes parámetros.<br />
<br />
<code class="prettyprint">GET /fx/application/wu2_login.php?<br />
email=7465737440736f6674627265616b6572732e636f6d&<br />
challenge=3664353037323961616438366637353431306538623065633066306132643737&<br />
hash_passw=3764336430623861346630346638396637663638623731333439303962313233 HTTP/1.1<br />
Host: juegos.fxinteractive.com<br />
Cookie: PHPSESSID=1bd1ur1l9841m2apoobi55ncu3</code><br />
<br />
<div style="text-align: justify;">
El contenido de los parámetros es el siguiente (un conversor online de ASCII <a href="https://www.branah.com/ascii-converter" target="_blank">aquí</a>) :</div>
<ul>
<li><em>"email"</em>. Contiene la dirección de correo del usuario a autenticar, codificado en ASCII hexadecimal.</li>
<li><em>"challenge"</em>. El desafío recibido en la transacción anterior codificado en ASCII hexadecimal.</li>
<li><em>"hash_passw"</em>. <span style="text-decoration: underline;">Nuestro <em>secreto</em> codificado en ASCII hexadecimal !!!</span></li>
</ul>
<div style="text-align: justify;">
En respuesta el servidor devuelve una página HTML que se limita a ejecutar una función en javascript en el que se han incrustado los valores necesarios para que el navegador del cliente pueda calcular la respuesta al desafío, redireccionando a la transacción para responder el desafío con los parámetros calculados:</div>
<br />
<code class="prettyprint lang-js">function() {<br /> var challenge = "error";<br /> var reply_challenge = "error";<br /> SetCookie("user_email","test@softbreakers.com");<br /> SetCookie("user_hash_passw","7d3d0b8a4f04f89f7f68b7134909b123");<br /> challenge = "6d50729aad86f75410e8b0ec0f0a2d77";<br /> reply_challenge=replyChallenge(challenge,GetCookie("user_hash_passw"));<br /> if (reply_challenge=="")<br /> reply_challenge = "error";<br /> window.location = <br /> "http://juegos.fxinteractive.com/fx//application/reply_challenge.php?" +<br /> "&challenge=" + bin2hex(challenge) +<br /> "&reply_challenge=" + bin2hex(reply_challenge) +<br /> "&user_hash_passw=" + bin2hex(GetCookie("user_hash_passw"));<br />
});</code><br />
<br />
<h4 style="text-align: justify;">
3. <em>replay_challenge.php</em></h4>
Es la transacción final del proceso de autenticación en el que el cliente contesta al servidor con la respuesta que ha calculado a su desafío.<br />
<br />
<code class="prettyprint">GET /fx//application/reply_challenge.php?<br />
&challenge=3664353037323961616438366637353431306538623065633066306132643737<br />
&reply_challenge=3935346166623438306137373430663137663665343235356338376632393134<br />
&user_hash_passw=3764336430623861346630346638396637663638623731333439303962313233 HTTP/1.1<br />
Host: juegos.fxinteractive.com<br />
Cookie:<br />
PHPSESSID=1bd1ur1l9841m2apoobi55ncu3;<br />
user_email=test@softbreakers.com; <br />
user_hash_passw=7d3d0b8a4f04f89f7f68b7134909b123</code><br />
<br />
<div style="text-align: justify;">
Los parámetros son los mismos de la transacción anterior a excepción del correo electrónico (en este caso "<em>hash_passw</em>" se ha renombrado como "<em>user_hash_passw</em>") junto con la respuesta al desafío en el parámetro "<em>reply_challenge</em>" codificado en ASCII hexadecimal.</div>
<div style="text-align: justify;">
A partir de esta transacción, todas las transacciones posteriores incluyen en las cookies la dirección de correo del usuario y el <em>secreto.</em></div>
<div style="text-align: justify;">
Usando una calculadora de <em><a href="http://onlinemd5.com/" target="_blank">MD5</a></em>, de <em><a href="https://www.branah.com/ascii-converter" target="_blank">ASCII</a> </em>y de <em><a href="http://aes.online-domain-tools.com/" target="_blank">AES</a> </em>podemos echar nosotros mismos las cuentas para comprobar que hemos interpretado correctamente el modelo de autenticación utilizado.</div>
<br />
<code class="prettyprint">Secreto = "7d3d0b8a4f04f89f7f68b7134909b123"<br />
Desafío cifrado = "6d50729aad86f75410e8b0ec0f0a2d77"<br />
Desafío descifrado = AES-CBC(Desafío cifrado, Secreto) = "464557077"<br />
Respuesta = Desafío + 1 = "464557078"<br />
Respuesta ASCII = "343634353537303738"</code><br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCo9gI9oH8AqlEmZbZb1MilKNowykvgVIMInucu-v-rC4J2pw7oxeTylf_8c3D8lHphhN8M3ApM-15gizfnNvNqyg0z8UuExQLVPI37FLvJv2SClbKrT8oa6Ptmfo6-dmX-JtXwPdAdU2x/s1600/fx_calculate_response_ascii.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="138" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCo9gI9oH8AqlEmZbZb1MilKNowykvgVIMInucu-v-rC4J2pw7oxeTylf_8c3D8lHphhN8M3ApM-15gizfnNvNqyg0z8UuExQLVPI37FLvJv2SClbKrT8oa6Ptmfo6-dmX-JtXwPdAdU2x/s320/fx_calculate_response_ascii.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Calculando ASCII hexadecimal de respuesta</td></tr>
</tbody></table>
<br />
<code class="prettyprint">Respuesta cifrada = AES-CBC(Respuesta, Secreto) = "954afb480a7740f17f6e4255c87f2914"</code><br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhviCQuyCfJvteYSsVUdtgzFU4pfE1QiHPd2kywl_hw7VX2JUB-fgtvzKPvBpBHXGLx3_IeXIixWWifFVSS8Kps32_OxkSv2A8J6278Cok9eMjeQ9T4IyTZRCRCiCU3C6tZz_6wky4hrVIo/s1600/fx_crypt_response.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="244" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhviCQuyCfJvteYSsVUdtgzFU4pfE1QiHPd2kywl_hw7VX2JUB-fgtvzKPvBpBHXGLx3_IeXIixWWifFVSS8Kps32_OxkSv2A8J6278Cok9eMjeQ9T4IyTZRCRCiCU3C6tZz_6wky4hrVIo/s320/fx_crypt_response.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Cifrando respuesta</td></tr>
</tbody></table>
<br />
<code class="prettyprint lang-java">Respuesta cifrada hex. = "3935346166623438306137373430663137663665343235356338376632393134"</code><br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjo6jHc5UAdaFGhIgV7-F2dULZldPIPhb5JSAbnDluAD9eD-cS70Y9iBo8Uc-_0g_Z2DQm4-EQL2S8JxOTGF4L4ZHmKtFFTYdY4mbmkZsND5qu4B-Fw2_ZjGX8rJ_ISeIAINMuYr20SwjGO/s1600/fx_calculate_response_hex.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="135" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjo6jHc5UAdaFGhIgV7-F2dULZldPIPhb5JSAbnDluAD9eD-cS70Y9iBo8Uc-_0g_Z2DQm4-EQL2S8JxOTGF4L4ZHmKtFFTYdY4mbmkZsND5qu4B-Fw2_ZjGX8rJ_ISeIAINMuYr20SwjGO/s320/fx_calculate_response_hex.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Calculando respuesta cifrada en ASCII hexadecimal</td></tr>
</tbody></table>
<br />
<div style="text-align: justify;">
Si la respuesta al desafío ha sido la correcta, el servidor nos envía en respuesta el siguiente <em>JSON</em> embebido en el cuerpo de un HTML vacío:</div>
<br />
<code class="prettyprint lang-java">({<br />
"challenge": "6d50729aad86f75410e8b0ec0f0a2d77",<br />
"reply_challenge": "954afb480a7740f17f6e4255c87f2914",<br />
"user_hash_passw": "7d3d0b8a4f04f89f7f68b7134909b123"<br />
})</code><br />
<br />
En caso de no haber superado el desafío de autenticación la respuesta tendría la forma:<br />
<br />
<code class="prettyprint lang-java">({<br />
"challenge": "6d50729aad86f75410e8b0ec0f0a2d77",<br />
"reply_challenge": "error",<br />
"user_hash_passw": "7d3d0b8a4f04f89f7f68b7134909b123"<br />
})</code><br />
<br />
<h4>
4. <em>login.php</em></h4>
En caso de haber superado el desafío, el cliente realiza finalmente la autenticación con la siguiente transacción.<br />
<br />
<code class="prettyprint">POST /fx/application/ajax/login.php HTTP/1.1<br />
Host: juegos.fxinteractive.com<br />
Cookie:<br />
user_email=test@softbreakers.com;<br />
user_hash_passw=7d3d0b8a4f04f89f7f68b7134909b123;<br />
PHPSESSID=1bd1ur1l9841m2apoobi55ncu3;<br />
[...]<br />
mail=test%40softbreakers.com&<br />
hash=954afb480a7740f17f6e4255c87f2914&<br />
navy=false</code><br />
<br />
<div style="text-align: justify;">
El parámetro <em>hash</em> lleva la misma respuesta al desafío que se validó en la transacción anterior.</div>
En respuesta el servidor devuelve un <em>JSON</em> con datos sobre el usuario ya autenticado.<br />
<br />
<code class="prettyprint lang-java">({<br />
"_resultStr":"WU_OK",<br />
"UserId":1570095,<br />
"CountryBirth":"OTR",<br />
"_permit":true,<br />
"Connected":-1,<br />
"UserMail":"test@softbreakers.com",<br />
"Alias":"test533",<br />
"Country":"OTR",<br />
"Language":"ES",<br />
"_resultMsg":"Operacion completada correctamente",<br />
"bug_key":"1bd3b9331183ca65e8465c8d70d0732f"<br />
})</code><br />
<br />
<h2>
Revisión del protocolo de autenticación</h2>
Tras estudiar el protocolo de autenticación utilizado en la plataforma, unas reflexiones...<br />
<br />
<h3>
No des pistas sobre tus usuarios.</h3>
<div style="text-align: justify;">
El primer "<em>pero</em>" del protoclo implementado salta en la primera transacción. Como se ha expuesto, si en la transacción "<em>login_get_challenge.php</em>" se envía el correo de un usuario dado de alta en la plataforma, el servidor responde con un <em>JSON</em> que incluye el desafío que debe superarse para lograr la autenticación. Pero si se envía un correo de un usuario que no está dado de alta, el <em>JSON</em> de respuesta incluye el correspondiente mensaje de error.<br />
<br /></div>
<div style="text-align: justify;">
Esto permitiría lanzar de una manera automatizada contra el servidor un listado de correos electrónicos y dilucidar qué usuarios están dados de alta en la plataforma digital. Para aquellos usuarios validados como presentes en la plataforma el atacante ya tendría la mitad de las credenciales...<br />
<br /></div>
<div style="text-align: justify;">
Lo ideal es que el servidor devuelva exactamente la misma respuesta independientemente de que el identificador del usuario (como es el correo electrónico en este caso) exista o no. Como ejemplo, la web del banco <em><a href="http://www.ingdirect.es/" target="_blank">ING Direct</a></em> no da pistas sobre sus clientes. Se puede introducir un DNI válido (como "<em><span style="color: black;">11111111H</span></em>") con cualquier fecha de nacimiento, que independientemente de que la pareja de datos corresponda a un cliente real o no, el servidor va a pasar a la siguiente fase de validación, impidiendo de esta manera a un atacante lanzar un ataque "<em>ciego</em>" para que el servidor valide cuales son los usuarios que reconoce y cuales no.<br />
<br /></div>
<h3>
El <em>secreto</em>, <em>secreto</em> es...</h3>
<div style="text-align: justify;">
El objetivo de los protocolos de autenticación basados en desafío-respuesta es realizar la autenticación sin enviar las credenciales a través del canal de comunicación. Si en la implementación del protocolo desafío-respuesta se envían las credenciales, o una derivación de las mismas siguiendo una determinada función, incluso aunque la función no sea reversible (como en este caso, el algoritmo <em>MD5</em> usado en la función de derivación), entonces se ha implementado mal el protocolo.<br />
<br /></div>
<div style="text-align: justify;">
A todas luces, no tiene sentido desplegar el mecanismo de desafío-respuesta cuando ya desde la segunda transacción "<em>wu_login2.php</em>" el cliente envía al servidor el <em>secreto</em> basado en las credenciales del usuario. Siendo así, lo más lógico es simplificar el protocolo y dejar que el servidor compare directamente el <em>secreto</em> enviado con el que el servidor tenga, ya sea almacenado en su base de datos sustituyendo a las credenciales en claro del usuario, o bien calculado en tiempo real si el servidor almacena en claro las credenciales (cosa que tampoco sería aconsejable). Si dicha comparación es positiva, se considera autenticado al cliente y nos dejamos de rodeos sin sentido...<br />
<br /></div>
<div style="text-align: justify;">
Para más <em>inri</em>, desde la transacción de respuesta al desafío "<em>reply_challenge.php</em>" tanto el identificador del usuario (su correo electrónico) como el <em>secreto</em>, se envían del cliente al servidor como <em>cookie. </em>Esto posibilita que un atacante que empiece a monitorizar la red de comunicación, aunque se haya perdido el protocolo de autenticación, pueda comprometer las credenciales de usuarios ya autenticados anteriormente con tan solo interceptar cualquier transacción posterior que el cliente envíe al servidor.</div>
<br />
<h3 style="text-align: justify;">
Explotación</h3>
<div style="text-align: justify;">
Suponiendo que un atacante acceda al correo y el <em>secreto</em> de algún usuario, la explotación a la hora de impersonar a dicho usuario ante la plataforma, es bien sencilla. No tiene más que importar las <em>cookies</em> y acceder a la plataforma, para lograr que ésta automáticamente lo considere autenticado. No hace falta intentar extraer la contraseña del usuario.<br />
<br /></div>
<div style="text-align: justify;">
Esto es así ya que la página en su código <em>javascript</em> dispone de una funcionalidad para realizar la autenticación de forma automática. Esta funcionalidad permite que no tengamos que introducir nuestras credenciales continuamente cada vez que accedemos a la plataforma digital. Dicho código se encuentra entre los scripts <em>inline</em> en el código HTML de la página principal de la plataforma:</div>
<br />
<code class="prettyprint lang-js">// Login automatico con cookies<br />
if (GetCookie("user_email")!="" && GetCookie("user_pass_known")=="true") {<br /> if (GetCookie("index")!="") {<br /> FXPlanet.Login(GetCookie("user_email"),"","",true,<br /> function(xml)<br /> {<br />
[...]</code><br />
<div style="text-align: justify;">
<br />
El código de la función "<em>FXPlanet.Login</em>" se encuentra en <em><a href="http://juegos.fxinteractive.com/fx/public/js/wu2.js.php" target="_blank">wu2.js.php</a> </em>(línea 2626). La declaración de dicha función es como sigue:</div>
<br />
<code class="prettyprint lang-js">FXPlanet.Login = function(email,user_id,user_hash,user_hold_logged,cb_ok,cb_ko)<br />
{<br /> user_hash_passw = user_hash;<br /> var arrParams;<br /> FXPlanet.doing_login = true;<br /> $("#js_loading").show();<br /> FXPlanet.AjaxCallEx("ajax/login_get_challenge.php", { mail: email }, function(reply) {<br /> if (reply._resultStr!="WU_OK") {<br /> FXPlanet.doing_login = false;<br /> FXPlanet.Event.trigger("login_ko",reply);<br /> if (typeof cb_ko==='function') cb_ko(reply);<br /> return;<br /> }<br /> login_url = "http://juegos.fxinteractive.com/fx/application/wu2_login.php?"+<br /> "email="+bin2hex(email)+<br /> "&challenge="+bin2hex(reply.Challenge);<br /> if (user_hash_passw!="")<br /> login_url += "&hash_passw="+bin2hex(user_hash_passw);</code><br />
<br />
<div style="text-align: justify;">
Los parámetros "<i>cb_ok</i>" y "<em>cb_ko</em>" son funciones javascript a ejecutar en caso de que la autenticación se realice correctamente ("<em>cb_ok"</em>) o no ("<em>cb_ko</em>"). Esta función, al ser llamada desde el script <em>inline</em> anterior lanzará todo el mecanismo de autenticación siguiendo el protocolo desafío-respuesta descrito. Al llegar a la transacción "<em>wu2_login.php</em>" descrita anteriormente, en este caso no se usa el parámetro "<em>hash_passw</em>" que contenía el <em>secreto, </em>ya que el parámetro correspondiente se le pasa a la función <em>FXPlanet.Login</em> vacío.<br />
<br /></div>
<div style="text-align: justify;">
Al lanzar "<em>wu2_login.php</em>" sin dicho parámetro, la respuesta del servidor difiere ligeramente de la anterior. El script que incluye la respuesta a esa transacción queda así:</div>
<br />
<code class="prettyprint lang-js">function() {<br /> var challenge = "error";<br /> var reply_challenge = "error";<br /> SetCookie("user_email","test@softbreakers.com");<br /> challenge = "ea3e3c03ad4a2d1f04e007577359b1d0";<br /> reply_challenge=replyChallenge(challenge,GetCookie("user_hash_passw"));<br /> if (reply_challenge=="")<br /> reply_challenge = "error";<br /> window.location = "http://juegos.fxinteractive.com/fx//application/reply_challenge.php?&challenge=" +</code><br />
<code class="prettyprint lang-js"> bin2hex(challenge) +</code><br />
<code class="prettyprint lang-js"> "&reply_challenge=" +</code><br />
<code class="prettyprint lang-js"> bin2hex(reply_challenge) +</code><br />
<code class="prettyprint lang-js"> "&user_hash_passw=" +</code><br />
<code class="prettyprint lang-js"> bin2hex(GetCookie("user_hash_passw"));<br />
});</code><br />
<br />
<div style="text-align: justify;">
La diferencia es que no se establece el valor de la <em>cookie</em> "<em>user_hash_passw</em>" con el valor que se pasa en el parámetro "<em>hash_passw</em>", que en este caso va vacío, sino que se usa el valor que actualmente tiene dicha <em>cookie</em>.</div>
<div style="text-align: justify;">
<br />
Por ello necesitaremos la <em>cookie</em> "<em>user_hash_passw</em>" con el valor del <em>secreto </em>correctamente establecido, además de las <em>cookies</em> necesarias para disparar la funcionalidad de autenticación automática implementada en el script <em>inline</em> de la página principal. Revisando el script <em>inline,</em> necesitaremos estas cuatro <em>cookies</em>:</div>
<ul>
<li>"<em>user_email</em>" con la dirección de correo del usuario a autenticar.</li>
<li>"<em>user_pass_known</em>" con el valor "<em>true".</em></li>
<li>"<em>index</em>" con un valor distinto de vacío.</li>
<li>"<em>user_hash_passw</em>" con el valor del <em>secreto</em> del usuario a autenticar.</li>
</ul>
<div style="text-align: justify;">
La importación puede realizarse de varias maneras, dependiendo del navegador utilizado. En caso de <em>Firefox</em> se puede utilizar una extensión como "<a href="https://addons.mozilla.org/es/firefox/addon/cookies-exportimport/" target="_blank"><em>Cookies Export/import</em></a>" o bien el editor manual de <em>cookies</em> del más completo <a href="http://getfirebug.com/" target="_blank"><em>Firebug</em></a>. En Chrome podemos encontrar extensiones para manipular <em>cookies</em> como "<em><a href="http://www.editthiscookie.com/" target="_blank">EditThisCookie</a>"</em>.<br />
<br /></div>
<div style="text-align: justify;">
En las plantillas presentadas a continuación hay tres valores entre corchetes que deben ser sustituídos:</div>
<ul>
<li><em>[EXP]</em> representa la fecha de caducidad de la cookie expresado en formato <em><a href="https://es.wikipedia.org/wiki/Marca_temporal" target="_blank">timestamp</a> </em>en segundos, y debe sustituirse por una fecha posterior a la que se desee hacer la prueba. Calculadoras de <em>timestamp</em> por ejemplo <a href="http://www.unixtimestamp.com/" target="_blank">aquí</a>.</li>
<li>[EMAIL]. Dirección de correo del usuario a autenticar. En nuestro caso <em>test@softbreakers.com</em></li>
<li>[SECRETO]. <em>Secreto </em>derivado de las credenciales. En nuestro caso <em>7d3d0b8a4f04</em><em>f89f7f68b7134909b123</em></li>
</ul>
<div style="text-align: justify;">
El formato <em>Netscape</em> es el más extendido a la hora de volcar a texto las <em>cookies</em> de una transacción. En dicho formato (admitido por la extensión "<a href="https://addons.mozilla.org/es/firefox/addon/cookies-exportimport/" target="_blank"><em>Cookies Export/import</em></a>" de <em>Firefox) </em>queda así.</div>
<br />
<code class="prettyprint">
juegos.fxinteractive.com FALSE / FALSE [EXP] user_email [EMAIL]<br />
juegos.fxinteractive.com FALSE / FALSE [EXP] user_hash_passw [SECRETO]<br />
juegos.fxinteractive.com FALSE / FALSE [EXP] user_pass_known true<br />
juegos.fxinteractive.com FALSE / FALSE [EXP] index loquequieras</code><br />
<br />
<div style="text-align: justify;">
Otras extensiones, como "<em><a href="http://www.editthiscookie.com/" target="_blank">EditThisCookie</a>" </em>de <em>Chrome,</em> admiten otros formatos como <em>JSON</em>:</div>
<code class="prettyprint lang-java"><br />
[{<br />
"domain": "juegos.fxinteractive.com",<br />
"expirationDate": [EXP],<br />
"hostOnly": true,<br />
"httpOnly": false,<br />
"name": "user_email",<br />
"path": "/",<br />
"secure": false,<br />
"session": false,<br />
"storeId": "0",<br />
"value": "[EMAIL]",<br />
"id": 1},<br />
{<br />
"domain": "juegos.fxinteractive.com",<br />
"expirationDate": [EXP],<br />
"hostOnly": true,<br />
"httpOnly": false,<br />
"name": "user_hash_passw",<br />
"path": "/",<br />
"secure": false,<br />
"session": false,<br />
"storeId": "0",<br />
"value": "[SECRETO]",<br />
"id": 2},<br />
{<br />
"domain": "juegos.fxinteractive.com",<br />
"expirationDate": [EXP],<br />
"hostOnly": true,<br />
"httpOnly": false,<br />
"name": "user_pass_known",<br />
"path": "/",<br />
"secure": false,<br />
"session": false,<br />
"storeId": "0",<br />
"value": "true",<br />
"id": 3},<br />
{<br />
"domain": "juegos.fxinteractive.com",<br />
"expirationDate": [EXP],<br />
"hostOnly": true,<br />
"httpOnly": false,<br />
"name": "index",<br />
"path": "/",<br />
"secure": false,<br />
"session": false,<br />
"storeId": "0",<br />
"value": "loquequieras",<br />
"id": 3}]</code><br />
<br />
<div style="text-align: justify;">
El siguiente video muestra la facilidad de captura de los datos necesarios suponiendo que podemos monitorizar la misma red de la víctima y que ésta realiza la conexión por HTTP sin encriptación (captura utilizando <a href="https://www.wireshark.org/" target="_blank"><em>Wireshark</em></a>), y como el atacante tras introducir las cuatro cookies con valores adecuados (utilizando la extensión <em><a href="https://addons.mozilla.org/es/firefox/addon/firebug/" target="_blank">Firebug</a> </em>del navegador <em>Firefox</em>), se autentica en la plataforma suplantando a la víctima.<br />
<div style="text-align: center;">
<br /></div>
</div>
<div style="text-align: center;">
<iframe allowfullscreen="allowfullscreen" frameborder="0" height="315" src="https://www.youtube.com/embed/KPa5uOGdh2E" width="560"></iframe><br /></div>
<div style="text-align: justify;">
<div style="text-align: center;">
<br /></div>
Dadas las características del servicio que ofrece esta plataforma, el que un atacante pueda acceder suplantando a terceros tampoco puede causar un gran perjuicio. El atacante podrá acceder e instalar los juegos adquiridos por la víctima, que por las <a href="http://juegos.fxinteractive.com/condiciones.html" target="_blank">condiciones de la plataforma</a> dicha instalación está permitida de manera simultánea en hasta cinco equipos distintos, con lo que se puede limitar el acceso a los mismos por parte del usuario legítimo. Por otro lado, la víctima puede acumular puntos en su cuenta que pueden canjearse por juegos ofertados en la plataforma digital. El atacante podría gastar estos puntos del usuario en adquirir en su nombre e instalarse artículos, con el consiguiente perjuicio para el usuario legítimo que seguramente no estaría interesado en gastar su saldo de puntos en esos artículos.</div>
<div style="text-align: justify;">
<br />
No existen problemas más graves como vulneración de datos privados del usuario, suplantación del usuario frente a otros, acceso a mensajes privados, etc... y esto es así salvo que el usuario cuyas credenciales se han comprometido en la plataforma de <em>FX Interactive</em> haya reutilizado la misma pareja de email-contraseña en otros servicios. Por ejemplo, imaginemos en nuestro ejemplo que el usuario "<em>test@softbreakers.com</em>" y que en la plataforma de <em>FX Interactive</em> usa como contraseña el palabro "<em>password</em>", usa la misma contraseña para acceder a los mensajes electrónicos de su cuenta de correo, o para su cuenta de Facebook, etc. En ese caso el asunto puede acabar muy mal.<br />
<br /></div>
<div style="text-align: justify;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyZAyUb50UZIa87xy1hrguJfS2KzJqJ0GDo-TXAOpRC2rj8NPABpZHtwlnLlDAhqJveMjSgj6okbo3snIe1xSVQC_Ppp0uobz7qUscIslmMGNdWu1Fyp_NDR8RoiPOHzRSn0gSJnM0GFX-/s1600/fx_pass_joke.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyZAyUb50UZIa87xy1hrguJfS2KzJqJ0GDo-TXAOpRC2rj8NPABpZHtwlnLlDAhqJveMjSgj6okbo3snIe1xSVQC_Ppp0uobz7qUscIslmMGNdWu1Fyp_NDR8RoiPOHzRSn0gSJnM0GFX-/s320/fx_pass_joke.jpg" width="284" /></a></div>
<br /></div>
<br />
<h3 style="text-align: justify;">
Extracción de contraseña en claro</h3>
<div style="text-align: justify;">
Aunque para impersonar al usuario en el servidor de <i>FX Interactive</i> no se precisa conocer la contraseña que ha utilizado, para verificar si esa contraseña (que de alguna manera va incluída en lo que hemos llamado <em>secreto</em>) es reutilizada en otro servicio distinto, antes tenemos que extraer dicha constraseña.<br />
<br /></div>
<div style="text-align: justify;">
Como se indicó antes nuestro <em>secreto</em> se calcula como:</div>
<br />
<code class="prettyprint">secreto = md5([contraseña] + md5([email]).substr(0, 16))</code><br />
<br />
<div style="text-align: justify;">
El algoritmo de hash <em>MD5 </em>tal y como se ha expuesto anteriormente no es reversible, por lo que aunque conozcamos las variables "<em>secreto"</em> y "<em>email"</em>, en la ecuación anterior no podemos calcular la variable "<em>contraseña"</em>. Al no ser una operación reversible, la vía para extraer la constraseña consiste en realizar suposiciones sobre el valor de la contraseña y ver si la operación anterior genera el mismo valor <em>secreto</em> que hemos interceptado. Gracias a la presencia de una <a href="https://es.wikipedia.org/wiki/Sal_(criptograf%C3%ADa)" target="_blank"><em>sal criptográfica</em></a> (los primeros 16 caracteres del hash <em>MD5</em> de la dirección de correo) que imposibilita el uso de <a href="https://es.wikipedia.org/wiki/Tabla_arco%C3%ADris" target="_blank">tablas <em>rainbow</em></a>, las posibilidades de extraer la contraseña en claro dependen de tres factores:</div>
<ul>
<li>La potencia de cálculo para calcular hashes <em>MD5</em> de la que pueda disponer el atacante.</li>
<li>El tiempo que el atacante quiera o pueda dedicar dicha potencia de cálculo a extraer la contraseña.</li>
<li>La fortaleza de la contraseña empleada por el usuario.</li>
</ul>
<div style="text-align: justify;">
De esos tres factores, el único que pueden controlar los usuarios es la fortaleza de la contraseña que seleccionen. Cada servicio de autenticación puede a su vez plantear limitaciones sobre la contraseña (número máximo de caracteres, caracteres admitidos, etc...) que pudieran limitar la fortaleza de la contraseña, pero normalmente estas limitaciones no implican que necesariamente solo se puedan utilizar contraseñas débiles.<br />
<br /></div>
<div style="text-align: justify;">
Lo primero que el atacante de fuerza bruta intentará delimitar es el universo de contraseñas que debe contemplar. Inicialmente la página de la plataforma comprueba la validez de una presunta contraseña tanto al intentar acceder como al crear una nueva cuenta con la siguiente función <em>javascript</em> definida en el propio HTML de la página principal:</div>
<br />
<code class="prettyprint lang-js">// comprueba si el password tiene formato correcto<br />
function IsPasswordOk(passw) {<br /> return passw.length>4;<br />
}</code><br />
<br />
<div style="text-align: justify;">
Por tanto, un atacante inicialmente "<em>solo</em>" tendría que comprobar contraseñas de 5 o más caractéres... Si al crear una cuenta introducimos una contraseña de menor longitud, nos aparece el error de que la contraseña desde tener entre 5 y 15 caracteres, aunque esa no es la comprobación que realiza la función "<em>IsPasswordOk</em>".</div>
<br />
<code class="prettyprint lang-js">if (!IsPasswordOk($("#input_pass_1").val())){<br /> $("#erorr_crear_texto").html("La contraseña no es válida. Debe tener entre 5 y 15 caracteres.<br/ >Por favor, revísala e inténtalo de nuevo.");<br /> $("#errores_crear").css({'visibility': 'visible'});<br />
} else {</code><br />
<br />
<div style="text-align: justify;">
Puesto que no se realizan localmente otras comprobaciones, habría que comprobar al crear una cuenta si el servidor permite crear contraseñas de más de 15 caracteres, además de verificar si admite todo tipo de carácter o si hay algunas excepciones. Esto permitiría definir con cuántos caracteres debe jugar el generador de posibles contraseñas a verificar y qué tipo de caracteres debe contemplar.</div>
<div style="text-align: justify;">
Para nuestro ejemplo práctico usaremos un simple diccionario de palabras, por lo que no vamos a ponernos generar miles y miles de cadenas aleatorias para probar si alguna de ellas en conjunción con la dirección de correo electrónico genera el <em>secreto</em> objetivo. La aplicación recorrerá el diccionario probando a calcular si alguna de esas palabras da resultado positivo, y si finaliza el diccionario sin encontrar coincidencia considerará el ataque fracasado. Como la contraseña de ejemplo, la palabra "<em>password</em>" se encontrará en nuestro diccionario no tendremos problema...<br />
<br /></div>
<div style="text-align: justify;">
Como jugones que somos, tendremos alguna tarjeta gráfica dedicada (o más de una), con lo que usaremos una aplicación que usa la potencia de cálculo de las tarjetas gráficas, aumentado la potencia de cálculo respecto a usar directamente el procesador. Esta aplicación es <em><a href="http://hashcat.net/oclhashcat/" target="_blank">oclHashcat</a></em>.</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiv02G0qFamQCZqHwPxuk36_mwKXp44zivOGS-ReB36BkIyO6fq8ZRGrdL-C-aMDlL7gDPjkE2LvEiHqhKKthgIrPP1A76z5LVKXUcvpVr8kHvTNKOFl-jtmi_r0hoiKM2oLrITUPua-xOI/s1600/fx_hashcat_logo.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiv02G0qFamQCZqHwPxuk36_mwKXp44zivOGS-ReB36BkIyO6fq8ZRGrdL-C-aMDlL7gDPjkE2LvEiHqhKKthgIrPP1A76z5LVKXUcvpVr8kHvTNKOFl-jtmi_r0hoiKM2oLrITUPua-xOI/s1600/fx_hashcat_logo.jpg" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Logo oclHashcat</td></tr>
</tbody></table>
<div style="text-align: justify;">
La aplicación es en línea de comandos y se sirve en dos sabores. Uno para gráficas <em>Nvidia</em> y otro para <em>AMD</em>. Una vez descargada la versión correspondiente, descomprimimos. La aplicación vienen en forma de ejecutable de 32 bits y otro de 64 bits, e incluye un pequeño diccionario de ejemplo que para nuestra sencilla contraseña es suficiente ya que contiene la palabra "<em>password</em>". Hay que preparar el fichero de entrada a la aplicación. Este fichero de entrada depende del tipo de <em>hash</em> que queramos calcular.<br />
<br /></div>
<div style="text-align: justify;">
Los tipos de cálculo que soporta la aplicación se listan <a href="http://hashcat.net/wiki/doku.php?id=oclhashcat" target="_blank">aquí</a>.</div>
<code class="prettyprint">0 = MD5<br />
10 = md5($pass.$salt)<br />
20 = md5($salt.$pass)<br />
30 = md5(unicode($pass).$salt)<br />
40 = md5($salt.unicode($pass))<br />
50 = HMAC-MD5 (key = $pass)<br />
[...]</code><br />
<br />
<div style="text-align: justify;">
En nuestro caso, corresponde al modo 10 ya que nuestro <em>secreto</em> es el hash <em>MD5</em> de la contraseña que queremos adivinar seguido de una <em>sal criptográfica</em>. Nuestra <em>sal </em>son los primeros 16 caracteres del hash <em>MD5</em> del correo electrónico, que en este caso es "test@softbreakers.com", y como vimos anteriormente nos da el valor "<i>6500cbeaca8426b5</i>".<br />
<br /></div>
<div style="text-align: justify;">
Los formatos del fichero de entrada dependiendo del tipo de cálculo se lista <a href="http://hashcat.net/wiki/doku.php?id=example_hashes" target="_blank">aquí</a>. Para el modo 10, el formato es "<em>hash:sal</em>". El "<em>hash</em>" es lo que hemos denominado <em>secreto.</em> Nos creamos un fichero en el mismo directorio donde hemos descomprimido oclHashcat. Introducimos el siguiente contenido y salvamos el fichero con el nombre "<em>hash.txt":</em></div>
<br />
<code class="prettyprint">7d3d0b8a4f04f89f7f68b7134909b123:6500cbeaca8426b5</code><br />
<br />
<div style="text-align: justify;">
Si tuviéramos varios usuarios y contraseñas que extraer, colocaríamos uno en cada línea. El comando a ejecutar sería:</div>
<br />
<code class="prettyprint">cudaHashcat64.exe -m 10 -a 0 hash.txt example.dict</code><br />
<br />
<div style="text-align: justify;">
El programa nos da la siguiente salida:</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVpu8bMU0vjDN60aLJbFRKqo9Sq-z-Brd4DfbD-ua8PoO7oWRnzxZGYYgSuPAJfK553GayPeaqnwydSnPWx6TzpWyBSgrBpQ6JEsrY2X90T_DgQYv3BPscOXE0R9XZdL-mwG62pi0zQ8Ib/s1600/fx_oclHashcat.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="294" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVpu8bMU0vjDN60aLJbFRKqo9Sq-z-Brd4DfbD-ua8PoO7oWRnzxZGYYgSuPAJfK553GayPeaqnwydSnPWx6TzpWyBSgrBpQ6JEsrY2X90T_DgQYv3BPscOXE0R9XZdL-mwG62pi0zQ8Ib/s320/fx_oclHashcat.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Ejecutando oclHashcat</td></tr>
</tbody></table>
<div style="text-align: justify;">
El programa ha recorrido el diccionario "<em>example.dict</em>" hasta encontrar una palabra a la que al concatenarle la sal que hemos definido y calcular el hash MD5 de la cadena resultante, se obtiene el hash deseado, el <em>secreto</em> que el atacante había interceptado. En este caso la palabra es "<em>password</em>", como era de esperar.<br />
<br /></div>
<div style="text-align: justify;">
Conforme va encontrando positivos los va incluyendo en el fichero "<em>cudaHashcat.pot</em>"<em>, </em>salvo que indiquemos otro fichero de salida. Al final de la ejecución, <em>oclHashcat</em> muestra una estadística de los resultados obtenidos.<br />
<br /></div>
<div style="text-align: justify;">
Ahora, con la contraseña en claro, el atacante puede explorar otros servicios para ver si la pareja "<em>test@softbreakers.com</em>" / "<em>password</em>" ha sido reutilizada por ese usuario en otros temas... y ahí es donde pueden empezar los problemas más serios para ese usuario.</div>
<br />
<h2 style="text-align: justify;">
Conclusiones</h2>
<div style="text-align: justify;">
El envío de información sensible, como la que se realiza durante la autenticación de un usuario en cualquier servicio online debería enviarse cifrada, y actualmente el estándar de cifrado en la web es <i>SSL</i>. Si tenemos en cuenta la gran cantidad de accesos que se realizan desde dispositivos móviles sobre redes inalámbricas, y dada la posible exposición de las distintas redes inalámbricas a las que un dispositivo móvil puede conectarse, sobre todo aquellos dispositivos que nos acompañan en el bolso o bolsillo todo el día, el cifrado de los accesos para ser una mejora del servicio a los usuarios a ser una imperiosa necesidad.<br />
<br /></div>
<div style="text-align: justify;">
<i>SSL </i>está hoy en día implementado en la mayor parte de los dispositivos susceptibles de ser utilizados a la <i>WWW</i>. Aún suponiendo el extraño caso de que se quiera dar soporte a algún tipo de dispositivo que no soporte <i>SSL</i>, los protocolos desafío-respuesta son una solución que permiten realizar la autenticación sin necesidad de enviar información sensible que permita robar la "<i>identidad" </i>al usuario, aunque la información posterior que se intercambia no sea cifrada, y por tanto visible para un posible atacante.<br />
<br /></div>
<div style="text-align: justify;">
El hecho de que la implementación de <em>FX Interactive</em> en su plataforma envíe información sensible junto con la respuesta al desafío de autenticación es un error que puede comprometer las credenciales del usuario. Pero el que dicha información sensible se incluya como <em>cookie</em> y se reenvíe en todas y cada una de las transacciones posteriores que el navegador del usuario envía al servidor de <em>FX Interactive</em> presenta un peligro aún mayor, ya que permite a un atacante poder robar las credenciales del usuario aunque no haya accedido a las transacciones de autenticación propiamente dichas.<br />
<br />
Esa <i>cookie</i> puede capturarse tal y como como se muestra en el video, monitorizando transacciones <i>HTTP </i>en caso de tener acceso a la red del usuario (por ejemplo con un ataque <i><a href="https://es.wikipedia.org/wiki/Ataque_Man-in-the-middle" target="_blank">MITM</a></i>), o incluso sin necesidad de acceder a la red del usuario en caso de que la web de <i>FX Interactive</i> tuviese (que no digo que la tenga) alguna vulnerabilidad <i><a href="https://es.wikipedia.org/wiki/Cross-site_scripting" target="_blank">XSS</a> </i>(permanente o no) que permitiera inyectar <i>javascript </i>para poder hacerse con dicha <i>cookie</i>. No estamos hablando del típico caso de captura de la sesión de un usuario ya autenticado, en el que dispones de unos minutos u horas para intentar sacarle partido antes de que la sesión capturada caduque, sino del hash de las credenciales que te permitirán realizar nuevas autenticaciones en cualquier momento siempre y cuando el usuario no cambie la contraseña... y además con el añadido de poder intentar extraer la contraseña en claro y que ésta haya sido reutilizada por el usuario en otro servicio online.<br />
<br />
Mientras el tema se arregla, en caso de que la empresa juzgue necesario arreglar algo (se ha intentado contactar por la dirección de correo de atención al cliente en dos ocasiones, pero sin ninguna respuesta), nosotros como usuarios y clientes podemos intentar defender nuestras credenciales accediendo a la plataforma escribiendo <i>HTTPS </i>en lugar de <i>HTTP</i>, y aceptando el certificado caducado que ahora mismo presenta el servidor (intentamos evitar que un supuesto atacante que monitorice nuestra red pueda capturar la <i>cookie </i>con el hash de nuestra contraseña), y revisar con cuidado los enlaces que recibamos de terceros que nos llevan a la web de <i>FX Interactive</i> antes de hacer click (para evitar un hipotético ataque <i>XSS</i> para capturar dicha <i>cookie</i>). Y por supuesto no compartir la contraseña utilizada con la de otros servicios, por si acaso...</div>
Softbreakershttp://www.blogger.com/profile/01666968545873713297noreply@blogger.com0tag:blogger.com,1999:blog-5459690923545315155.post-89369691030099976032015-08-19T14:11:00.000+02:002015-09-08T11:02:25.780+02:00Hacking Team blues 2<h2 style="text-align: justify;">
Recapitulando</h2>
<div style="text-align: justify;">
Ya pasan más de dos meses desde el filtrado de información de <i>Hacking Team, </i>filtración que podríamos calificar claramente como masiva con sus más de 400Gb. de información. La información ha ido poco a poco extendiéndose, expandiéndose a diestro y siniestro, y generando multitud de artículos y reacciones, particularmente en aquellos países en los que alguna agencia gubernamental aparecía como cliente de la empresa en la información filtrada.</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXx1xYBBL7QLtQn9YRTToCvdriQrDmLXhuxt_hr9ZyK-pVFtqwWlh1wLeLRpObefwQaae6tvK-LnVsIlxRm60wCRE4BecoeUUUDBMCwpUN6xWIXMH5HjGRwaIVu2sOQKmfyfZJ2KSdnm9V/s1600/ht_logo.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="56" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXx1xYBBL7QLtQn9YRTToCvdriQrDmLXhuxt_hr9ZyK-pVFtqwWlh1wLeLRpObefwQaae6tvK-LnVsIlxRm60wCRE4BecoeUUUDBMCwpUN6xWIXMH5HjGRwaIVu2sOQKmfyfZJ2KSdnm9V/s320/ht_logo.JPG" width="320" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTI3z3RIsw8G0sgieEvRZDpuQA4jdYHEQoDvD4cv2lP3LVG0pMtWXTif5xjJbq5nkH-jSGBxVQAGKyH3PzZcnI4ZHp81D9YEE7Xd_duliQ-gPJlDfg-g2LXQw7eIogTFdMlt8U1FWDGb22/s1600/ht_hackedteam.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="61" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTI3z3RIsw8G0sgieEvRZDpuQA4jdYHEQoDvD4cv2lP3LVG0pMtWXTif5xjJbq5nkH-jSGBxVQAGKyH3PzZcnI4ZHp81D9YEE7Xd_duliQ-gPJlDfg-g2LXQw7eIogTFdMlt8U1FWDGb22/s320/ht_hackedteam.png" width="320" /></a></div>
<br /></div>
<div style="text-align: justify;">
<br />
<a name='more'></a>Desde <a href="http://ht.musalbas.com/" target="_blank">los primeros volcados</a> "<i>en bruto</i>" de la información, que han ido <a href="https://hacked.thecthulhu.com/HT/" target="_blank">replicándose</a>, se ha empezado a disponer de formatos de visualización más especializados en determinados tipos de información a presentar:</div>
<div style="text-align: justify;">
</div>
<ul>
<li><a href="https://wikileaks.org/hackingteam/emails/" target="_blank"><i>Wikileaks </i>ha publicado</a> los correos filtrados junto con un motor para facilitar las búsquedas.</li>
<li>El código fuente filtrado <a href="https://github.com/hackedteam" target="_blank">se ha publicado en <i>Github</i></a>.</li>
</ul>
<div>
<div style="text-align: justify;">
Las empresas antivirus igualmente se han visto obligadas a "<i>ponerse las pilas</i>" y han comenzado a detectar las instancias de los agentes (aka, troyanos) que despliega el <i>Remote Control System</i> (o <i>RCS</i>) de <i>Hacking Team</i>, como por ejemplo <i>ESET</i>, aunque eso sí, <a href="http://www.virusradar.com/en/Win32_CrisisHT.A/description" target="_blank">sin dar demasiados detalles</a>.</div>
</div>
<div>
<div style="text-align: justify;">
<br /></div>
</div>
<div>
<div style="text-align: justify;">
Otras empresas de software afectadas por los exploits utilizados por el producto de <i>Hacking Team</i> para propagar sus agentes, también se han visto forzadas a "<i>reparar</i>" el lío, como es el caso de <i>Adobe</i>, con <a href="http://arstechnica.com/security/2015/07/hacking-team-leak-releases-potent-flash-0day-into-the-wild/" target="_blank">el enésimo exploit que afectaba a su complemento Flash</a>. Exploits que según la documentación filtrada<i> </i><a href="http://arstechnica.com/security/2015/07/how-a-russian-hacker-made-45000-selling-a-zero-day-flash-exploit-to-hacking-team/" target="_blank"><i>Hacking Team</i> adquiría a terceros</a>.</div>
</div>
<div>
<div style="text-align: justify;">
<br /></div>
</div>
<div>
<div style="text-align: justify;">
Para <i>Hacking Team</i>, la mañana del lunes 6 de julio en el que se encontraron el lío desplegado desde su propia cuenta de <i>Twitter</i>, también hackeada (cosas de compartir la misma contraseña en varios servicios), sin duda fue un duro despertar.</div>
</div>
<div>
<div style="text-align: justify;">
<br /></div>
</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEga9NsdA4ey-5P2bjuVCezMEQZJ1xe2SjPejlFkBV5PSveA7cAKAasekF3iFOERaYh2FS6yXJd0X40N5vIoy5n9_OQF1LhqV6cUiSD90AfqaptbYDDDKy7YkRwUfz6ELVVdm9ueOmhcB6im/s1600/ht_twitter_defacement.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="180" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEga9NsdA4ey-5P2bjuVCezMEQZJ1xe2SjPejlFkBV5PSveA7cAKAasekF3iFOERaYh2FS6yXJd0X40N5vIoy5n9_OQF1LhqV6cUiSD90AfqaptbYDDDKy7YkRwUfz6ELVVdm9ueOmhcB6im/s320/ht_twitter_defacement.jpg" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">La filtración expuesta en la cuenta <i>Twitter </i>de la compañía</td></tr>
</tbody></table>
<div>
<br /></div>
<div style="text-align: justify;">
Esa mañana, salvo las apresuradas reacciones de un empleado al borde de un ataque de nervios, ningún comunicado salió de la empresa. De hecho la web de la compañía estuvo parte de ese día caída.</div>
<div style="text-align: justify;">
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjG-Cx3RHKfShMHEsOUcQ2qqTN26gmEBiQxmd3Bi6Qt-manztYEFngLio71nrNs14NzqFymIDf9ENxLTWWVZ1hhPQmjeZ0VR3HDuAMep2btBdhPZpOsDK1c4ptB84WA_9BfGwCBYc35xxYd/s1600/ht_pozzi.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="269" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjG-Cx3RHKfShMHEsOUcQ2qqTN26gmEBiQxmd3Bi6Qt-manztYEFngLio71nrNs14NzqFymIDf9ENxLTWWVZ1hhPQmjeZ0VR3HDuAMep2btBdhPZpOsDK1c4ptB84WA_9BfGwCBYc35xxYd/s320/ht_pozzi.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Primeras reacciones</td></tr>
</tbody></table>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
No fue hasta dos días después cuando el día 8 <a href="http://www.hackingteam.com/index.php/about-us" target="_blank">apareció un primer comunicado</a> del accidente, que ha sido complementado posteriormente con otro comunicado del CEO de la compañía el pasado día 14 y con un nuevo comunicado el día 22.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
En ese primer comunicado la compañía, en boca de su responsable de marketing y comunicaciones exponía con bastante sinceridad en mi opinión, que el código filtrado ponía en manos de cualquiera con los conocimientos adecuados la posibilidad de utilizar la tecnología que habían desarrollado y que hasta ahora solo estaba en manos de gobiernos y agencias gubernamentales. Esto podía facilitar su uso por parte de terroristas y extorsionadores, por lo que describía la situación como "<i>extremadamente peligrosa</i>".</div>
<div style="text-align: justify;">
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhULzBIF7K0icfvjXhMHEn-mMZ2ESXRk5r15jEgBKDh79P9k5ayQfnqzi9OFBKfsbLHBxdtSG4lKQeCsxkihqh4TG4hzKHoozELQ_kGb9SRWG55nanjjxKU9XKlOjryxEooXYMBuxqD009h/s1600/ht_first_communicate.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhULzBIF7K0icfvjXhMHEn-mMZ2ESXRk5r15jEgBKDh79P9k5ayQfnqzi9OFBKfsbLHBxdtSG4lKQeCsxkihqh4TG4hzKHoozELQ_kGb9SRWG55nanjjxKU9XKlOjryxEooXYMBuxqD009h/s400/ht_first_communicate.png" width="341" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Primer comunicado oficial</td></tr>
</tbody></table>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
El último párrafo, el que indica que han solicitado a sus clientes que suspendan cualquier operación en curso que utilice la herramienta, es una obviedad. Lo solicite o no la empresa, cualquier agencia gubernamental de inteligencia medianamente responsable ante tamaña filtración abortará inmediatamente cualquier tipo de investigación que utilice la herramienta filtrada. De hecho, cuando <i>Citizen Labs</i> publicó nuevas investigaciones sobre el <i>RCS </i>de <i>Hacking Team</i> <a href="https://citizenlab.org/tag/hacking-team/page/2/" target="_blank">allá por febrero de 2014</a>, agencias como el <i>CNI </i>español <a href="https://wikileaks.org/hackingteam/emails/emailid/314174" target="_blank">desinstalaron los agentes desplegados y "<i>apagaron</i>" el sistema</a>, dejando su uso suspendido preventivamente durante varios meses. Y eso que los únicos datos relevantes que pudo publicar <i>Citizen Labs</i> fueron las direcciones IP de los anonimizadores que utilizaban los agentes interceptados, y quizás la dirección del recolector afectado. Desde luego, nada que ver con la filtración masiva que nos ocupa ahora.<br />
<br />
El segundo comunicado es del propio <i>CEO </i>de la empresa, restándole importancia al asunto. Desdice en parte al comunicado anterior indicando que no cree que el código fuente filtrado pueda permitir utilizar la tecnología para realizar ataques a objetivos, código fuente que considera como "<i>obsoleto</i>". Anuncia además, una nueva versión del <i>RCS </i>para permitir a las agencias cliente retomar lo antes posible las investigaciones que estaban realizando con la ayuda del <i>RCS</i>, ahora mismo paralizadas.<br />
<br />
También indica que aunque han mantenido relaciones comerciales con países "delicados" como Rusia, Sudán o Etiopía, y que en el momento en el que las circunstancias legales han cambiado, han cortado las relaciones comerciales con los países afectados.<br />
<br />
El tercer comunicado, de nuevo por parte del responsable de marketing, se reitera en el comunicado anterior de su <i>CEO</i>, y además muestra su lamento acerca de que la actividad de la compañía es legal, que la única ilegalidad ha sido la intrusión en sus equipos y la comunicación pública de datos confidenciales de la empresa y de sus clientes, y que por contra en los medios son ellos los que aparecen como los supuestos malhechores.<br />
<br />
<h2>
Desnudo integral de <i>Hacking Team</i> frente a sus clientes</h2>
<div>
No dudo que desde <i>HT </i>podrán retocar su <i>RCS </i>actual, y cambiar las huellas digitales de los agentes para evitar la detección de los antivirus, y volver adquirir nuevos exploits <i>zero-day</i> para sustituir a los filtrados (cosa que, por otro lado, tarde o temprano tenía que ocurrir). Pero el problema principal es recobrar la confianza.</div>
<div>
<br /></div>
<div>
La información filtrada ha comprometido no solo operaciones actuales de agencias gubernamentales, sino también operaciones pasadas. El listado de las direcciones IP de los anonimizadores asignados a cada cliente es un ejemplo. Con ese listado, un mero cruce de esas direcciones IP con los registros de equipos y servidores puede descubrir que un determinado equipo ha sido infectado en el pasado con un agente del <i>RCS</i>, pero es que además la lista permite saber qué agencia es la que operaba dicho agente. El uso que los clientes de <i>Hacking Team</i> hayan hecho de su producto en las operaciones que puedan descubrirse, podrían producir reacciones interesantes, e incluso problemas diplomáticos si a alguna agencia se le ha ido la mano convirtiendo en objetivos a ciudadanos extranjeros o incluso a empleados de embajadas. Imagino que a estas alturas en más de una embajada el administrador de sistemas habrá cruzado los registros del proxy corporativo con la lista de IP's de los anonimizadores filtrada, a ver si el país anfitrión los vigila, aunque si saliera algún positivo de esos cruces de datos puede que nunca se hagan públicos, pero interna y diplomáticamente hablando se puede montar un pollo...</div>
<div>
<br /></div>
<div>
Y la lista de direcciones IP de los anonimizadores es solo un pequeño ejemplo. La cantidad ingente de correos electrónicos no solo revelan cuestiones que a los clientes no les gustaría que se hubieran divulgado, si no en ocasiones opiniones sobre clientes o futuros clientes que los empleados de la empresa compartían vía correo electrónico, opiniones que pueden dificultar relaciones comerciales actuales y futuras. Y pongo dos ejemplos relativos a España, respecto al <a href="https://wikileaks.org/hackingteam/emails/emailid/754135" target="_blank"><i>Grupo de Apoyo Operativo</i> (<i>GAO</i>) de la <i>Guardia Civil</i></a> y de los <a href="https://wikileaks.org/hackingteam/emails/emailid/3497" target="_blank"><i>Mossos d'Esquadra</i></a>.<br />
<br />
Además de eso, los correos también reflejan las "jugarretas" que los empleados de <i>HT </i>realizaban a sus clientes a la hora de ocultarles errores o problemas en la herramienta de cara a cerrar una venta, o incluso después, como por ejemplo este <a href="https://wikileaks.org/hackingteam/emails/emailid/19213" target="_blank">correo titulado "<i>VIKIS DAP report</i>"</a> en el que uno de los "ingenieros de campo" (<i>Field Application Engineer</i> o <i>FAE</i> en la terminología de la empresa, ingenieros dedicados a tareas de pre-venta y post-venta) relata como él y su compañero (<i>Lorenzo </i>y <i>Serge</i>) ocultaron al cliente, en este caso una agencia gubernamental de Vietnam, los fallos en los test de invisibilidad ante productos antivirus durante las pruebas de aceptación del producto ("<i>Delivery At Place</i>" o <i>DAP</i>). En las pruebas de entrega de producto, el vendedor muestra al cliente que el producto que le suministra ofrece todas las funcionalidades y características contratadas. En caso de que se produzca alguna no conformidad del producto adquirido, el cliente puede negarse a aceptar la entrega, y por tanto no pagar mientras no se solucione la no conformidad. Es por tanto un acto crucial para el vendedor. No digo que <i>HT </i>sea la única empresa en la que sus empleados realizan "<i>trucos de prestidigitación</i>" durante demostraciones a clientes, pero el que se realicen durante las pruebas de aceptación y que además aparezcan evidencias irrefutables de las mismas, y encima con este nivel de difusión, no es algo que suela ocurrir. Traduzco unos párrafos del citado correo:<br />
<br />
<blockquote class="tr_bq">
<blockquote class="tr_bq">
<ul>
<li><i>Test de invisibilidad - MacOS (Yosemite) + AVG (instalador desasisitido): durante la infección todo marchó bien; un problema ocurrió justo después de que configuramos el cliente de correo del para permitir al agente interceptar los correos; tan solo unos segundos después de esa configuración, una ventana emergente de AVG alertó sobre la detección de un troyano. <u>Cerré la ventana emergente a tiempo mientras que el cliente estaba atendiendo a las explicaciones de Serge sobre las evidencias recibidas, por lo que el cliente no lo vio</u>. Los correos fueron recuperados correctamente por el agente, pero no tuvimos oportunidad para verificar cuál fue el causante de la detección (nuestro troyano o algún otro);</i></li>
</ul>
</blockquote>
</blockquote>
<br />
<blockquote class="tr_bq">
<blockquote class="tr_bq">
<ul>
<li><i>Test de invisibilidad - Win7 32bit + Norton Security (Word Exploit): El exploit funcionó correctamente, pero después de la infección el explorador* </i><i>era detectado en cada inicio de sesión y en cada sincronización. <u>Serge distrajo al cliente, mientras yo añadía el explorador* a la lista de excepciones de Norton</u>, para permitirle actualizarse a élite. Después de eso, todo ha transcurrido correctamente;</i></li>
</ul>
</blockquote>
</blockquote>
<br />
* Nota de traducción: el "<i>explorador</i>" es el agente más básico del <i>Remote Control System</i> o <i>RCS. </i>Este agente es<i> </i>desplegado inicialmente durante la infección, en este caso usando una vulnerabilidad de la aplicación <i>Office Word</i> de <i>Microsoft</i>. Este agente "<i>explorador</i>" se limita a estudiar el entorno de ejecución para decidir si se actualiza a alguno de los otros dos tipos de agente con verdaderas capacidades operativas, "<i>soldado</i>" o "<i>élite</i>", o si aborta la infección en caso de detectar la presencia de determinadas aplicaciones de seguridad, antivirus o de análisis de malware que pudieran comprometer la operación.<br />
<br />
Por si fuera poco, al final del correo su autor concluye:<br />
<blockquote class="tr_bq">
<i>Añado una consideración personal: 2 FAEs fueron fundamentales para esta actividad, ya que - y está claro a la vista de lo anterior - uno solo de nosotros se hubiera quedado bloqueado en el primer problema que tuvimos que encarar y el DAP no hubiera sido aceptado.</i></blockquote>
<br />
Estos "<i>juegos de manos</i>" no solo se producían para lograr la aceptación del producto por parte del cliente, sino incluso también en explotación como prueba <a href="https://wikileaks.org/hackingteam/emails/emailid/922093" target="_blank">este otro correo en el que se la juegan al cliente SEPYF</a> (Secretaría de Planeación y Finanzas del Estado de Baja California, México).<br />
<br />
Con estos antecedentes, se antoja difícil de cara al futuro la recuperación de la imagen y confianza de <i>HT </i>ante sus clientes, y mucho menos si hablamos del "<i>tipo</i>" de clientes de la empresa, un sector donde el menor atisbo de duda desemboca inexorablemente en el corte de relaciones.<br />
<br />
<h2>
Bases de datos filtradas</h2>
También se han filtrado bases de datos que requiere montarlas en el entorno adecuado para poder visualizar los datos adecuadamente. Si los correos exponían información comercial e incidencias técnicas de los clientes, estas bases de datos exponen en el caso de algunas agencias gubernamentales, nombres, direcciones de correo, direcciones postales, hashes de contraseñas usadas por los clientes, logs del <i>RCS</i> funcionando en clientes, etc... Información suficiente para poner en cuarentena las afirmaciones oficiales de la compañía en las que niega que se hayan divulgado datos sobre las investigaciones llevadas a cabo por los clientes usando el <i>RCS</i>.<br />
<br />
Al igual que los correos electrónicos filtrados en forma de <a href="https://en.wikipedia.org/wiki/Personal_Storage_Table" target="_blank">ficheros .<i>pst</i></a><i> </i>requieren de una plataforma para visualizar la información correctamente, estas otras bases de datos corresponden a plataformas de gestión documental que requieren de su instalación y configuración para poder visualizar los contenidos de manera adecuada.<br />
<br />
<h3>
Wiki de clientes</h3>
La primera de ellas es una <a href="http://ht.transparencytoolkit.org/Client%20Wiki/" target="_blank"><i>wiki </i>de clientes</a> funcionando sobre la plataforma gratuita <a href="https://www.mediawiki.org/wiki/MediaWiki" target="_blank"><i>MediaWiki</i></a>. Una vez montada la base de datos filtrada, instalado <i>MediaWiki </i>y todo debidamente configurado, podremos acceder al listado de clientes de <i>Hacking Team</i>, ordenado por orden alfabético, o por continentes y países. Esta wiki la han colgado públicamente en abierto <a href="http://htwiki.transparencytoolkit.org/index.php/Main_Page" target="_blank">en esta dirección</a>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgESnWI-_d5eevEHfAm4y2Sh7rmdusrgiqxCsnXU_xxWXxbmUnjHeKrCAbQ_BAkS3kHyunNSlWvPC_2TKdssUy9fXC2urVofLg15u6UAMiNvPZSTDv3KIuG-zyrW67NkqwqR6XZqHzyPK55/s1600/ht_wiki_countries.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgESnWI-_d5eevEHfAm4y2Sh7rmdusrgiqxCsnXU_xxWXxbmUnjHeKrCAbQ_BAkS3kHyunNSlWvPC_2TKdssUy9fXC2urVofLg15u6UAMiNvPZSTDv3KIuG-zyrW67NkqwqR6XZqHzyPK55/s320/ht_wiki_countries.png" width="218" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisld8q7wLYjomCH7_1d5GqVLMJaoErzWc5Vgz2U8M3x8wJRcu7Ynf93JWm8iuODvOGrgx4gmtVEYCFysupzv7v_7oESIoc7AF1AN7I82pu3i9bb7B6-Z_r35quVWzyd-nefeNzjjWL6fGo/s1600/ht_wiki_clients.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisld8q7wLYjomCH7_1d5GqVLMJaoErzWc5Vgz2U8M3x8wJRcu7Ynf93JWm8iuODvOGrgx4gmtVEYCFysupzv7v_7oESIoc7AF1AN7I82pu3i9bb7B6-Z_r35quVWzyd-nefeNzjjWL6fGo/s320/ht_wiki_clients.png" width="224" /></a></div>
<br />
Para cada uno de los clientes, la <i>wiki </i>tiene una plantilla preconfigurada para rellenar los datos. En gran parte de los casos la plantilla está sin rellenar, o bien tan solo han rellenado las direcciones IP de los anonimizadores. Pero en otros casos encontramos la plantilla completamente cumplimentada, con datos que incluyen el nombre del cliente, persona o personas de contacto con teléfono y email, dirección postal del cliente, datos del nodo <i>RCS </i>(IP, credenciales del administrador del sistema operativo, credenciales del administrador de <i>RCS</i>, credenciales de acceso remoto por <i>TeamViewer</i>), datos similares del recolector o recolectores, y de otros equipos como NAS, firewalls, switches, y anonimizadores. Igualmente nombres y datos de los usuarios <i>RCS </i>del sistema, e incluso del partner comercial local si lo hubiera.<br />
<br />
Hay que tener en cuenta que el sistema parece que se comercializa de dos maneras. Como servicio administrado y mantenido por <i>Hacking Team</i>, donde el cliente es un usuario de explotación del sistema, o bien como sistema completo en el que es el cliente el que administra y mantiene el sistema además de explotarlo.<br />
<br />
En aquellos casos en los que <i>RCS </i>se ha comercializado como un servicio para el cliente, parece lógico que la compañía dispusiera de alguna plataforma centralizada y de acceso rápido donde albergar todos los datos necesarios para resolver cualquier incidencia relacionada con el funcionamiento del producto durante su uso por parte del cliente, y es posible que esta <i>wiki</i>, de uso interno para la compañía,<i> </i>jugara ese papel.<br />
<br />
En cualquier modo de comercialización, <i>Hacking Team</i> mantiene el control sobre los anonimizadores, y posiblemente los recolectores, que aunque son utilizados por el cliente la contratación y la cuenta "<i>root</i>" de los mismos cae bajo la responsabilidad de <i>Hacking Team</i>. Esto es lógico teniendo en cuenta que si surge alguna emergencia (por ejemplo, un anonimizador comprometido porque unos <a href="https://citizenlab.org/2014/06/backdoor-hacking-teams-tradecraft-android-implant/" target="_blank">investigadores de <i>Citizen Labs</i> se ponen a husmear</a> en un equipo troyanizado por el <i>RCS</i>) desde <i>HT </i>pueden ser los primeros en enterarse (entre otras cosas, tienen monitorizadas las muestras que se envían a <i>VirusTotal</i>) y les permite actuar rápidamente para limitar el alcance del problema. Pero por otro lado, por los anonimizadores que <i>HT </i>controla pasan todas las evidencias que los distintos agentes distribuidos en los equipos objetivo capturan, y aunque desde <i>HT</i> permitan a los clientes revisar el código fuente, ya sabemos las mil y una maneras que hay de engañar al cliente...<br />
<div>
<br /></div>
<h3>
Plataforma de incidencias</h3>
</div>
<div>
Otra base de datos que encontramos entre la información filtrada, y que alberga información mucho más delicada, es la propia plataforma de incidencias mediante la que los clientes de <i>Hacking Team</i> se comunicaban con la compañía con dudas propias del uso del sistema surgidas durante su uso, tanto en operaciones reales como en operaciones simuladas para pruebas y entrenamiento.</div>
<div>
<br /></div>
<div>
En este caso lo que se ha filtrado ha sido el contenido completo del servidor Linux que hospedaba dicha plataforma de incidencias, y que era accesible en la dirección <a href="http://support.hackingteam.com/" target="_blank">support.hackingteam.com</a>. Buceando por los distintos directorios de dicho servidor, es posible extraer los datos necesarios para volver a montar la plataforma y visualizar lo que contenía en el momento en el que se efectuó la copia.</div>
<div>
<br /></div>
<div>
Para la plataforma de incidencias, <i>Hacking Team </i>utilizaba un producto comercial con <a href="https://wikileaks.org/hackingteam/emails/emailid/63032" target="_blank">licencia de pago anual</a> denominado <i><a href="http://www.kayako.com/" target="_blank">Kayako</a>.</i> La plataforma, construida sobre <i>PHP</i>, dispone de tres modos de acceso (usuarios, empleados y administradores), cada uno con distintas finalidades y funcionalidades. Las credenciales de acceso son el típico correo electrónico con una contraseña asociada a elección del usuario.<br />
<br /></div>
<div>
<h4>
Credenciales de acceso</h4>
</div>
<div>
<br />
La plataforma <i>Kayako</i> se alimenta con una base de datos <i>MySQL</i>. En dicha base de datos, además de las incidencias, se almacenan los usuarios así como sus credenciales de acceso. Una de las primeras cuestiones sobre las que se puede sacar partido son estas contraseñas. De todos es conocido la <a href="http://www.securitybydefault.com/2010/02/reutilizacion-de-credenciales-de-e.html" target="_blank">inclinación natural de cualquier ser humano a reutilizar las mismas credenciales de acceso en distintos servicios</a>. Es una cosa lógica teniendo en cuenta la gran cantidad de credenciales de acceso que una misma persona puede llegar a atesorar. Y nadie se salva de este pequeño "<i>pecado</i>" en cuanto a la seguridad informática se refiere, ni yo, ni expertos en seguridad informática como los empleados de <i>Hacking Team</i> a tenor de lo ocurrido en su cuenta de <i>Twitter </i>el pasado 6 de julio.</div>
<div>
<div>
<br /></div>
<div>
Es de suponer que si a los propios expertos les ocurre esto, a algunos de sus clientes, a pesar de ser empleados de agencias de inteligencia y cuerpos de seguridad gubernamentales para los que los temas de seguridad informática constituyen su día a día, lo de la reutilización de credenciales en distintos servicios también puede ocurrir... por lo que las credenciales almacenadas en el servidor de soporte filtrado son susceptibles de estar siendo utilizadas por el mismo usuario en otros servicios distintos. </div>
</div>
<div>
<br /></div>
<div>
Analizando este caso en particular, <i>Kayako</i>, como era de esperar, no almacena las contraseñas de los usuarios usando texto en claro. En nuestro caso, la plataforma almacena el hash <i><a href="https://es.wikipedia.org/wiki/Secure_Hash_Algorithm" target="_blank">SHA1</a> </i>de la contraseña, pero sin "<i>salpimentar</i>" de ninguna manera. Aunque <i>SHA1 </i>no es un algoritmo reversible, se puede empezar probando con un ataque basado en un buen diccionario, y enseguida nos daremos cuenta de que a pesar de estar tratando con contraseñas definidas por usuarios con una supuesta formación en seguridad informática, el ataque basado en diccionario nos escupe una tasa de éxitos del entorno al 20%, menor que la de una colección de credenciales de usuarios estándar que se puede situar en un 35% o más, pero más alta de lo que cabía esperar de usuarios con este perfil. Entre el listado de positivos podemos encontrar contraseñas tan imaginativas como "<i>ticket</i>"... aunque por otro lado hay que reconocer que esta contraseña difícilmente habrá sido reutilizada por el mismo usuario en otros servicios...</div>
<div>
<br /></div>
<div>
El 80% restante de contraseñas, que no saltan con un mero ataque de diccionario, quedan a las ganas, a la capacidad de proceso disponible, o de los servicios que cada uno desee contratar (que los hay), el tratar de obtenerlas por fuerza bruta pura. Además, el que la plataforma no añada "<i><a href="https://es.wikipedia.org/wiki/Sal_(criptograf%C3%ADa)" target="_blank">sales</a></i>" a la contraseña antes de calcular el <i>hash</i> que almacena en base de datos facilita el uso de tablas precalculadas, como las <a href="http://project-rainbowcrack.com/table.htm" target="_blank">tablas <i>rainbow</i></a>.<br />
<br />
El botín puede tener su utilidad si alguna de estas credenciales se reutiliza en otros servicios. Desde el punto de vista de la plataforma de incidencias filtradas, el obtener las contraseñas no tiene sentido ya que si queremos acceder impersonando a cualquiera de los usuarios existentes, tan solo tenemos que acceder a la base de datos <i>MySQL</i> y cambiar el <i>SHA1 </i>de la contraseña del usuario deseado por el <i>SHA1 </i>de una contraseña conocida. Es de suponer que desde <i>Hacking Team</i> habrán advertido ya a sus clientes acerca de la vulneración de sus correos y contraseñas registrados en la plataforma de incidencias.<br />
<br />
<h4>
Accediendo a la información de la plataforma de soporte</h4>
</div>
<div>
<br /></div>
<div>
Volviendo a la plataforma <i>Kayako</i> y sus modos de acceso, el modo de acceso más básico es el utilizado por los clientes de la empresa, al acceder a la URL <a href="https://support.hackingteam.com/" target="_blank">https://support.hackingteam.com</a>. Estos usuarios se encuentran englobados dentro de una determinada organización (como puede ser en el caso español "<i>CNI</i>"), y por tanto las incidencias introducidas por un usuario, así como las respuestas a las mismas, son visibles para ese usuario y para el resto de usuarios de la misma organización.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjf7j6QOvJ9iIyXgwtrdRqwW88PwWoWw2KYl3QZtLCXx8vIf2-qHJs6_PrM58qBuX03zA-hdssIbibU3Gz3stWwNGYeoLzpMzuHOYj-RFAlqqdoe_g2R2QzdxbL7Pxjqg6p87nwAl5Gue-8/s1600/ht_support_user_login.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="386" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjf7j6QOvJ9iIyXgwtrdRqwW88PwWoWw2KYl3QZtLCXx8vIf2-qHJs6_PrM58qBuX03zA-hdssIbibU3Gz3stWwNGYeoLzpMzuHOYj-RFAlqqdoe_g2R2QzdxbL7Pxjqg6p87nwAl5Gue-8/s640/ht_support_user_login.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Pantalla de acceso a la plataforma de soporte para clientes</td></tr>
</tbody></table>
Los otros dos modos de acceso están reservados para empleados de la empresa. Por un lado los empleados con privilegios solo para atender a las solicitudes de los clientes, con acceso mediante la URL <a href="https://support.hackingteam.com/staff" target="_blank">https://support.hackingteam.com/staff</a>, y por otro los empleados que además gozan de privilegios de administración sobre la propia plataforma de incidencias, que acceden por <a href="https://support.hackingteam.com/admin" target="_blank">https://support.hackingteam.com/admin</a>.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjGtE2mdZoyzM9n765Qw_DjxD-o1_9-aCB20VEZCkq3I576M6xVSq0bLJoi10LL_jRoSZr9LWai1ESfk03qO9nxZ1QiGYr7A_CZkdHKk7YkghO0tybcRIKWH0rNjTJXsQhQODgwZj1Wb2r/s1600/ht_support_staff_logged.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="475" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjGtE2mdZoyzM9n765Qw_DjxD-o1_9-aCB20VEZCkq3I576M6xVSq0bLJoi10LL_jRoSZr9LWai1ESfk03qO9nxZ1QiGYr7A_CZkdHKk7YkghO0tybcRIKWH0rNjTJXsQhQODgwZj1Wb2r/s640/ht_support_staff_logged.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Interfaz de soporte para empleados</td></tr>
</tbody></table>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnvi0PJFp3GSiFI3JG5YljykXXMb_rICbvFYRdTqadCFe8ugRX0Rr2573L_Ud_1EwHBN2NuG4POMUUHO_sI_VQxSpST31iQu6aylGrVCyeVG-k9gPSN8CvL2wlH2126M539-Hq16wrOw2w/s1600/ht_support_admin_logged.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="475" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnvi0PJFp3GSiFI3JG5YljykXXMb_rICbvFYRdTqadCFe8ugRX0Rr2573L_Ud_1EwHBN2NuG4POMUUHO_sI_VQxSpST31iQu6aylGrVCyeVG-k9gPSN8CvL2wlH2126M539-Hq16wrOw2w/s640/ht_support_admin_logged.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Interfaz de administración para administradores</td></tr>
</tbody></table>
Al entrar en la plataforma como usuario "<i>admin</i>" pero desde el enlace para empleados podremos acceder a todos los tickets creados en el sistema, independientemente del empleado en cuestión al que fuera asignada cada incidencia.<br />
<br />
Lo primero que encontramos son noticias publicadas por <i>HT</i> para información de todos sus clientes. En la captura anterior se puede apreciar una referente a la herramienta <i><a href="https://resistsurveillance.org/" target="_blank">DETEKT</a>, </i>creada por Claudio Guarnieri, investigador de <i>Citizen Labs</i> y coautor de <a href="http://www.cuckoosandbox.org/" target="_blank"><i>Cuckoo Sandbox</i></a> y <i><a href="https://malwr.com/">Malwr</a>, </i>intentando tranquilizar a los clientes con respecto a la efectividad de dicha herramienta. Otras noticias referencian también a otros informes de Citizen Labs, como el publicado el <a href="https://citizenlab.org/2014/02/mapping-hacking-teams-untraceable-spyware/" target="_blank">17 de febrero de 2014</a> recordando la necesidad de configurar los recolectores de manera que el puerto HTTP solo sea alcanzable desde las IP's de los anonimizadores asignados.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheMKhsD6m5TsIkiIeD-AZh4tltfOsqcbwUNPc7hMuFF46joLklkWucIHlS1jbQPW7lQEr2uTTYo0typlQTWEy8eyQJ8Es4e0zmFVJCHJ_KGLib-UydfShVsqNv76FqAqQI7rnxLLQ3lmfH/s1600/ht_support_news.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="332" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheMKhsD6m5TsIkiIeD-AZh4tltfOsqcbwUNPc7hMuFF46joLklkWucIHlS1jbQPW7lQEr2uTTYo0typlQTWEy8eyQJ8Es4e0zmFVJCHJ_KGLib-UydfShVsqNv76FqAqQI7rnxLLQ3lmfH/s640/ht_support_news.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Noticia en el portal de soporte referente al informe de Citizen Labs del 17/02/2014</td></tr>
</tbody></table>
<br />
El administrador de la plataforma de soporte de <i>HT </i>ha organizado los tickets en seis grupos:<br />
<br />
<ol>
<li>General</li>
<li>Peticiones de exploits</li>
<li>Incidencias de anonimizadores</li>
<li>Licencias</li>
<li>Seguridad</li>
<li>Actualizaciones</li>
</ol>
<br />
La información que se puede extraer de los tickets presentes en la base de datos (1.182 incidencias desde inicios del año 2.015 hasta el 26 de junio) es enorme. Por ejemplo, sin quebrarnos mucho la cabeza podemos sacar estadísticas que muestren qué organizaciones cliente de <i>HT </i>son las más activas en la plataforma de soporte, lo que puede dar una idea de qué clientes son los que utilizaban más activamente la herramienta <i>RCS. </i>En la gráfica, por simplificar, solo se han incluido los clientes que tienen creados más de 10 tickets.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMITxQqVbDD8k6gU4-AVgO3D6Ck9DIBu6wcAkYtt8Gih7zscCflQyOW5XmgNaYHpjF382F-zXCgP7c8r3n9Or4mxRoZkeXN9L_jSO0lBif9dRq4G9UPIM-rbVo5tQBvxG65sifKvp4QIdf/s1600/ht_support_tickets_by_client_flags.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMITxQqVbDD8k6gU4-AVgO3D6Ck9DIBu6wcAkYtt8Gih7zscCflQyOW5XmgNaYHpjF382F-zXCgP7c8r3n9Or4mxRoZkeXN9L_jSO0lBif9dRq4G9UPIM-rbVo5tQBvxG65sifKvp4QIdf/s640/ht_support_tickets_by_client_flags.png" width="504" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
De los seis grupos de incidencias, los más jugosos son los de peticiones de exploits y por otro lado los de seguridad.<br />
<br />
Los primeros son solo para clientes que han contratado el servicio de vectores de infección remotos, o bien que tengan una licencia de demostración de dicho servicio. Mediante este servicio, los clientes generan con su <i>RCS</i> un instalable silencioso del agente "<i>explorador</i>"(cada agente generado lleva embebido identificadores que permiten a <i>HT</i> determinar qué cliente lo ha generado), que lo envían adjunto a un ticket de petición de exploit, junto con otros archivos o información adicionales dependiendo del tipo de vector de infección a generar (para móviles Android 4.3.* o inferiores, o para equipos de escritorio mediante archivo de Office o por URL usando un bug del "<i>apreciado</i>" Adobe Flash). Todo aparece claramente explicado en <a href="https://wikileaks.org/hackingteam/emails/emailid/1078922" target="_blank">este ticket dirigido precisamente al <i>CNI</i> español</a> apenas cuatro días antes de la filtración.<br />
<br />
La filtración de la información enviada por los clientes en estas peticiones de exploits pueden dejar al descubierto actividades realizadas por los mismos, y con todas las consecuencias que pueden acarrear. Por ejemplo, en caso de que la infección se realice mediante un archivo de Office, el contenido del archivo utilizado para la infección puede determinar el perfil del objetivo a infectar. En gran parte de los casos el contenido es muy neutro, pero en otros casos se puede determinar que el objetivo tiene tintes claramente políticos. También las URL utilizadas para realizar infecciones pueden permitir identificar qué agencia estaba operando, al cruzar esos datos con los datos expuestos en informes de ataques como los relatados por <i>Citizen Labs</i> en los que hasta ahora la identidad del atacante ha permanecido en el anonimato.<br />
<br />
Como aperitivo para una posible entrada futura sobre el tema de peticiones de exploits (hay mucho que contar) una gráfica similar a la anterior pero incluyendo solo los tickets de petición de exploits por cliente, y listando solo aquellos que han hecho más de una petición.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoIxzGyvbBa9tY6pi3TCjx3gQs65bxliZax_2aG_xjMVvGKvxgLkiLOTbeR50edYIIfyBpPnt1Qh_KZgXJURn93VgbyTDzyJAW8-12st0QC8nI-uEzdGhpcuk0pRLYTsvQMdX2a5ywSa7t/s1600/ht_exploit_tickets_by_client.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoIxzGyvbBa9tY6pi3TCjx3gQs65bxliZax_2aG_xjMVvGKvxgLkiLOTbeR50edYIIfyBpPnt1Qh_KZgXJURn93VgbyTDzyJAW8-12st0QC8nI-uEzdGhpcuk0pRLYTsvQMdX2a5ywSa7t/s1600/ht_exploit_tickets_by_client.png" /></a></div>
<br />
Hay que destacar que la gráfica solo muestra número de tickets. Cada ticket puede incluir una petición para uno o más vectores de infección. Cada vector de infección solo se puede usar una única vez. Una vez que un objetivo usa el vector, éste se desactiva, evitando en gran medida el filtrado de vectores de infección que pudieran caer en manos de investigadores de la comunidad antivirus. Salvo los primeros, que quizás estén haciendo pruebas, algunos clientes destacan por una clara vocación <i>vírica</i>.<br />
<br />
Por otro lado, en los tickets de seguridad se exponen problemas de confidencialidad de las actividades realizadas por los clientes de <i>HT, </i>ya sean dudas iniciadas por los propios clientes, o bien alertas de exposición pública de direcciones IP de la infraestructura <i>RCS</i> de alguno de sus clientes.<br />
<br />
Al igual que las peticiones de exploits, las direcciones IP que aparezcan como comprometidas en algún ticket de seguridad, también pueden permitir identificar al atacante al cruzar dichos datos con informes de ataques ocurridos previamente.<br />
<br />
Además de los tickets incluídos en la base de datos de <i>Kayako</i> en el momento de la copia (tickets desde inicio de 2015 hasta el 26 de junio) se encuentran además copias de seguridad de la base de datos con tickets de años anteriores. Mucha información sensible para examinar.</div>
</div>
Softbreakershttp://www.blogger.com/profile/01666968545873713297noreply@blogger.com0tag:blogger.com,1999:blog-5459690923545315155.post-46020361265868040672015-07-07T02:00:00.001+02:002016-03-18T19:10:27.755+01:00Hacking Team blues<a href="http://www.hackingteam.it/" style="text-align: justify;" target="_blank"><i>Hacking Team</i></a><span style="text-align: justify;"> (<i>HT</i>) es una empresa italiana dedicada al desarrollo y comercialización de herramientas software de espionaje y vigilancia, entre cuyos clientes destacan cuerpos de seguridad e inteligencia de medio mundo.</span><br />
<div style="text-align: justify;">
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1hBWk6hV8C92Q39bQz-Hqw7orA_PyT41u0RBiUBaWTI-CdMqJpOzrEEEqWbNYGiQ9Uadzh1eKnSnbO_6uWwPEB-GT7AtYnjFZwtAeHGkrh9LG2t40OzKmzRZOM7IKZZUvxpkdpZivs3I1/s1600/ht_logo.JPG" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="56" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1hBWk6hV8C92Q39bQz-Hqw7orA_PyT41u0RBiUBaWTI-CdMqJpOzrEEEqWbNYGiQ9Uadzh1eKnSnbO_6uWwPEB-GT7AtYnjFZwtAeHGkrh9LG2t40OzKmzRZOM7IKZZUvxpkdpZivs3I1/s320/ht_logo.JPG" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Logo Hacking Team</td></tr>
</tbody></table>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
</div>
<a name='more'></a>El hackeo de uno o varios servidores de dicha empresa, y la posterior filtración pública del botín obtenido, unos 415Gb. de contenido en bruto, promete una serie de interesantes reacciones que están por llegar. Viendo el video de presentación de su producto estrella, <i>Remote Control System (RCS)</i>, ya nos podemos hacer una idea de lo jugoso de la información filtrada.<br />
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/v1yb-wWwAEQ/0.jpg" frameborder="0" height="266" src="https://www.youtube.com/embed/v1yb-wWwAEQ?feature=player_embedded" width="320"></iframe></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Además de código fuente de sus productos, presentaciones comerciales, etc... la filtración incluye listados de clientes actuales de la empresa, información que compromete no solo a la empresa sino también a los propios clientes.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Enseguida, <a href="http://pastebin.com/MP8zpQ26" target="_blank">entre los clientes de dicha empresa</a>, han aparecido la <i>Policía Nacional</i>* española y el <i>Centro Nacional de Inteligencia (CNI)</i>.</div>
<div style="text-align: justify;">
<br />
<blockquote class="tr_bq">
<i>(*) Actualización: Finalmente <a href="http://www.redeszone.net/2015/07/09/el-cni-confirma-que-contrato-los-servicios-de-hacking-team-pero-la-policia-nacional-lo-desmiente/" target="_blank">el CNI ha confirmado la contratación de los servicios de Hacking Team, pero la Policía Nacional lo desmintió</a>.</i></blockquote>
<br /></div>
<h2 style="text-align: justify;">
¿Qué es el <i>Remote Control System</i> de HT?</h2>
<div>
Citando lo que aparece en los manuales del producto:</div>
<blockquote class="tr_bq">
<blockquote class="tr_bq" style="text-align: justify;">
<i>RCS (Remote Control System) es una solución que soporta investigaciones por medio de la intercepción activa y pasiva de los datos y la información de los dispositivos bajo investigación. De hecho, RCS crea, configura e instala agentes de software de forma anónima que recopilan datos e información y envían los resultados a la base de datos central para decodificarlos y guardarlos.</i></blockquote>
</blockquote>
<div style="text-align: justify;">
Estamos ante una botnet para organismos gubernamentales en la que existe un centro de mando y control, existen "<i>agentes</i>" que recopilan información que son módulos software instalados en las máquinas objetivo. Estos "<i>agentes</i>" son instalados, o bien localmente si se tiene acceso físico a la máquina objetivo, o bien remotamente utilizando exploits, e incluso exploits zero-day según indican las presentaciones comerciales del producto. La instalación remota se realiza mediante ataques <i>man in the middle</i> por un módulo denominado <i>Network Injector</i>.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Además, para proteger en lo posible el servidor que hace de C&C, los datos enviados por los "<i>agentes</i>" se enrutan a través de anonimizadores hacia unos recolectores, que son los que alimentan finalmente con los datos al servidor C&C. El esquema con el que HT describe su producto es el siguiente:</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAYCcVsc4cgTQHVAyS-qjmSLzwu9APjc0qfDGhRGGYeI-du50HM1ksP_iI-rJYwgZ97FOmSv_D3i4Mh8PFhzSFVlgEe3fC9jhL8uQg72xv3T137x59j7JOpwPOFXmrvPyr3MN2LQH5bE6D/s1600/ht_rcs_architecture.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAYCcVsc4cgTQHVAyS-qjmSLzwu9APjc0qfDGhRGGYeI-du50HM1ksP_iI-rJYwgZ97FOmSv_D3i4Mh8PFhzSFVlgEe3fC9jhL8uQg72xv3T137x59j7JOpwPOFXmrvPyr3MN2LQH5bE6D/s400/ht_rcs_architecture.png" width="366" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Los anonimizadores son máquinas VPS distribuídas geográficamente que pueden encadenarse para aumentar la seguridad. Son las encargadas de comunicar los recolectores con los "<i>agentes</i>" instalados en los objetivos, y de comunicar los recolectores con el <i>Network Injector</i>. Toda comunicación entre el C&C con los "<i>agentes</i>" y el <i>Network Injector</i> se realiza mediante los recolectores y su cadena de anonimizadores asociada.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
El <i>Network Injector</i> puede entregarse en forma de componente hardware de red listo para ser instalado directamente en los proveedores de internet, o bien en forma de portátil para su despliegue en una red LAN o en una red Wifi. En ambos casos su misión es monitorizar el tráfico de red, y cuando se cumpla alguna de las condiciones establecidas desde el C&C, inyectar los "<i>agentes</i>" en el flujo HTTP. Ambos dispositivos usan un sistema operativo propio de la empresa (posiblemente un Linux tuneado).</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
La manera en la que se realiza la inyección del agente es variada. Infectar un archivo ejecutable conforme se descarga, inyectar código HTML al visitar una determinada página, bloquear un sitio y solicitar al usuario una actualización falsa del visor de Flash o reemplazar completamente un archivo que se está descargando por otro.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
La forma de instalación del agente también es configurable. El agente puede insertarse en documentos para los que se encuentren disponibles exploits (la librería de exploits se actualiza continuamente desde los propios servidores de HT), de tal manera que al abrir el documento el objetivo quede "<i>infectado</i>". Puede crearse un paquete de instalación para cualquiera de los sistemas operativos móviles soportados. Puede insertarse en un archivo ejecutable de Windows, OSX o Linux... e incluso instalarse en el firmware de la máquina haciéndolo persistente incluso a formateos o cambios de disco duro.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Los "<i>agentes</i>" dependen del sistema operativo del objetivo. Los "<i>agentes</i>" que HT suministra incluyen soporte para Windows, OSX, Linux, Android, IOS, Blackberry, Windows Mobile y Symbian. Cada uno de estos "<i>agentes</i>" vienen en tres sabores distintos:</div>
<div style="text-align: justify;">
</div>
<ol>
<li>Explorador.</li>
<li>Soldado.</li>
<li>Elite.</li>
</ol>
<div>
El agente "<i>explorador</i>" es el primero que aterriza en el objetivo. Su misión es recopilar datos sobre el entorno de ejecución para determinar si el ambiente es seguro, no complemente seguro, o claramente inseguro. Por ejemplo, si en el objetivo el "<i>explorador</i>" detecta la presencia de software antivirus actualizado, u otras herramientas de seguridad, esto puede provocar que se aborte la descarga de agente de otro nivel. En caso de que los datos recopilados por el "<i>explorador</i>" permitan clasificar al objetivo como completamente seguro, el siguiente agente que se descargue puede ser del tipo "<i>élite</i>", con todos los módulos de captura de datos habilitados. Por el contrario, en objetivos clasificados como no completamente seguros, se despliega el "<i>soldado</i>" que solo incluye algunos módulos que se hayan definido para minimizar la posibilidad de ser detectado.</div>
<div>
<br /></div>
<div>
La información que pueden recopilar los agentes es de lo más completa, y depende del tipo de objetivo en el que se han instalado:</div>
<div>
<ul>
<li>Grabación de llamadas (solo en agentes "<i>élite</i>").</li>
<li>Registro de mensajes.</li>
<li>Documentos, imágenes y fotos (solo en agentes "<i>élite</i>").</li>
<li>Capturas de pantalla periódicas.</li>
<li>Almacenado periódico de la posición geográfica.</li>
<li>Contactos.</li>
<li>Webs visitadas.</li>
<li>Keylogger para dispositivos móviles.</li>
<li>Keylogger, Mouselogger y contraseñas del sistema en dispositivos de escritorio.</li>
<li>Captura periódica de webcam.</li>
</ul>
<div>
<br /></div>
</div>
<br />
<h2 style="text-align: justify;">
Privacidad ante todo</h2>
<div>
Desde HT le han dado mucha importancia a que la acción de los agentes sea indetectable. Uno de los documentos filtrados describe el protocolo de actuación ante una crisis, definiendo crisis como el que hayan "<i>pescado</i>" a uno de los agentes del sistema RCS desplegado, o bien que se haya hecho público alguno de los exploits zero-day que utilizan.</div>
<div>
<br /></div>
<div style="text-align: justify;">
Para ello la empresa monitoriza entre otras cosas las muestras que VirusTotal analiza. En caso de que uno de los agentes generados por alguno de los clientes de HT aparezca por VirusTotal se desencadena el proceso establecido en dicho documento.</div>
<div>
<br /></div>
<div style="text-align: justify;">
Las medidas enumeradas incluyen la destrucción del VPS desde el que se ejecutaba el anonimizador que contactaba con el agente "<i>descubierto</i>", un proceso de comunicación y soporte con el cliente afectado, y una serie de procesos de investigación para determinar el alcance de lo que un supuesto atacante haya podido acceder.</div>
<div style="text-align: justify;">
<br /></div>
<h2 style="text-align: justify;">
Y todo se viene abajo...</h2>
<div style="text-align: justify;">
Toda esta cuidadosa política de privacidad se ha venido abajo con el filtrado ocurrido ayer. Entre otros archivos, se encuentran los archivos de licencia de gran parte de los clientes de HT. Estos archivos de licencia que el software de RCS validará en tiempo de ejecución, enumeran los módulos que el cliente ha adquirido: si ha adquirido agentes "<i>élite</i>" o no, número de anonimizadores, de recolectores, de inyectores, número de usuarios del sistema, máximo número de agentes desplegables en sistemas de escritorio y en móviles, etc...</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Revisando esos archivos de licencia, junto con el resto de documentación sobre ofertas comerciales y facturas, podemos hacernos una idea de para qué quieren usar los distintos clientes de HT su producto RCS, y el tamaño de la infraestructura que dedican al mismo. Información de inteligencia de gran valor, no porque pueda comprometer los sistemas RCS desplegados (que por cierto, a estas horas estarán todos ya desconectados), sino porque exponen los intereses e intenciones de los distintos cuerpos de seguridad y agencias de inteligencia que engrosan la lista de clientes de HT.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Esos 415Gb. de información estarán siendo cotejados por cientos de investigadores. Es de esperar que el fruto de ese cotejo irá saliendo a la luz en las próximas semanas. Estaremos atentos.</div>
Softbreakershttp://www.blogger.com/profile/01666968545873713297noreply@blogger.com0tag:blogger.com,1999:blog-5459690923545315155.post-37862613582985443722015-06-11T10:59:00.000+02:002015-06-11T11:05:05.218+02:00Troleando a VirusTotal<h2>
VirusTotal</h2>
<div style="text-align: justify;">
Cualquier profesional o aficionado a la seguridad informática conoce qué es <a href="https://www.virustotal.com/" target="_blank">VirusTotal</a>. Actualmente dentro del grupo Google, esta empresa tiene un germen español, y más concretamente malagueño. Lanzado en 2004 como un servicio por la empresa malagueña de seguridad informática <a href="http://hispasec.com/" target="_blank">Hispasec Sistemas</a>, fue finalmente <a href="http://www.abc.es/20120910/tecnologia/abci-google-compra-virustotal-espanola-201209101109.html" target="_blank">adquirido por Google en 2012</a>. A pesar de ello, <a href="http://www.xataka.com/entrevistas/virustotal-o-como-mantenerse-como-indies-tras-ser-adquiridos-por-google" target="_blank">han mantenido su sede en Málaga</a>.</div>
<div style="text-align: justify;">
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgg6ZXcCxOiXuRC_SRx3pVmraAhmldQyFB23eqtAxRyN9k1cNGFgvsNjukgW7ffEK9UdZYnFzxOSsBfuCViUW2n4PM0QHM5ZOuP1jH6vI2RuiBWHjecIajqB3ZD1iJ4Jc8nEkGaSkzyXA9u/s1600/virustotal_logo.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="50" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgg6ZXcCxOiXuRC_SRx3pVmraAhmldQyFB23eqtAxRyN9k1cNGFgvsNjukgW7ffEK9UdZYnFzxOSsBfuCViUW2n4PM0QHM5ZOuP1jH6vI2RuiBWHjecIajqB3ZD1iJ4Jc8nEkGaSkzyXA9u/s320/virustotal_logo.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Logo de VirusTotal</td></tr>
</tbody></table>
<div style="text-align: justify;">
</div>
Actualmente es un servicio gratuito que permite verificar la existencia de virus y malware en ficheros y enlaces web, utilizando para ellos los motores de búsqueda de una gran cantidad de antivirus. Cada vez que subimos un fichero, o un enlace, VirusTotal busca en su base de datos si dicho archivo o enlace ha sido escaneado anteriormente, ofreciéndonos la posibilidad de ver los resultados del escaneo anterior o bien volver a lanzar los motores de búsqueda sobre el archivo o enlace objetivo.<br />
<div style="text-align: justify;">
<br />
<a name='more'></a>El resultado del escaneo es un listado de los motores antivirus utilizados, junto con el resultado que han dado cada uno de ellos. Un servicio que ofrece a cualquier usuario normal escanear un fichero con decenas de antivirus a solo un par de clicks, y sin necesidad de tener instalado localmente ningún antivirus. Aunque <a href="http://www.elotrolado.net/noticia_los-hackers-utilizan-virustotal-de-google-como-campo-de-pruebas-para-refinar-virus_24903" target="_blank">también lo pueden usar los "<em>chicos malos</em>"</a> para verificar si sus creaciones serían detectadas o no por las versiones actuales de los motores antivirus, o para descubrir a partir de que momento empiezan a ser detectadas.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Poco a poco VirusTotal ha ido creciendo, y aunque de cara al usuario normal el servicio prácticamente no ha cambiado, para la comunidad de investigadores de seguridad informática ha ido incorporando poco a poco <a href="https://www.virustotal.com/es/documentation/" target="_blank">funciones adicionales</a>, e incluso <a href="https://www.virustotal.com/es/documentation/public-api/" target="_blank">una API</a> para facilitar el acceso de manera automatizada tanto al servicio como a la información que VirusTotal almacena en su cada vez más grande base de datos. No hay más que ver las <a href="https://www.virustotal.com/es/statistics/" target="_blank">estadísticas que ofrece</a> para imaginar el tamaño del asunto.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Así, de la misma manera que <a href="http://blog.9bplus.com/watching-attackers-through-virustotal/">los "<em>chicos malos</em>" pueden usar el servicio</a> para ir refinando poco a poco sus creaciones y disminuyendo las detecciones, la industria antivirus vigila las muestras subidas a VirusTotal para pulir a su vez su motores antivirus y actualizar sus ficheros de firmas. En cierta medida, VirusTotal se ha convertido en un escenario virtual en el que creadores de virus y de antivirus juegan al gato y al ratón.<br />
<br /></div>
<h2 style="text-align: justify;">
Escaneando muestras</h2>
<div style="text-align: justify;">
El punto de entrada al servicio es mediante un fichero que tenemos en nuestra máquina y que subimos al servicio de escaneo, o bien mediante un enlace que facilitamos al servicio, y son los propios servidores de VirusTotal los que acceden a dicho enlace para escanear los contenidos que devuelve. Ambas formas de entrada están disponibles tanto desde la interfaz de la página web como desde la propia API del servicio.</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheu7YWJjU12GqDCslUXKfRHApF8KVdIQSuYGa8iUzztM6RmfPWCGNmD5xRCATsxapyl5GF4glZQ7xrbK3GRkKcH3XediifjUAgNBKTd0jx3V8N6KpbIREp6cxlrUPNC0fWd0kkGJKmn8qT/s1600/virustotal_web_url.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="243" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheu7YWJjU12GqDCslUXKfRHApF8KVdIQSuYGa8iUzztM6RmfPWCGNmD5xRCATsxapyl5GF4glZQ7xrbK3GRkKcH3XediifjUAgNBKTd0jx3V8N6KpbIREp6cxlrUPNC0fWd0kkGJKmn8qT/s400/virustotal_web_url.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Interfaz web de VirusTotal</td></tr>
</tbody></table>
<div style="text-align: justify;">
Si se trata de verificar algún contenido con presencia online, enviar el enlace es una opción mucho más cómoda y sin tener que descargar previamente a nuestra máquina el contenido sospechoso, tanto si hacemos el proceso manualmente como si se realiza automatizadamente por una aplicación que interactúe con VirusTotal a través de su API.<br />
<br /></div>
<div style="text-align: justify;">
Para nuestras pruebas, en lugar de jugar con fuego y usar una muestra de un "<em>bicho</em>" real, vamos a usar un vector de test que está ampliamente admitido en la industria antivirus para comprobar el funcionamiento de sus productos, y que se conoce como <a href="http://es.wikipedia.org/wiki/EICAR" target="_blank">archivo EICAR</a>. Es una cadena ASCII de 68 caracteres que debería hacer saltar las alarmas de cualquier antivirus que se precie, y que nos mostrará una amenaza del tipo 'EICAR test' o similar. Y si no lo hace indica que hay algún problema con la configuración del antivirus, o que quizás deberíamos cambiar de producto antivirus.<br />
<br /></div>
<div style="text-align: justify;">
Como no podía ser de otra forma, dicho archivo ya se encuentra en la base de datos de VirusTotal, que <a href="https://www.virustotal.com/es/file/275a021bbfb6489e54d471899f7db9d1663fc695ec2fe2a2c4538aabf651fd0f/analysis/" target="_blank">nos muestra qué motores antivirus lo detectan y qué amenaza muestran</a>.<br />
<br /></div>
<h2 style="text-align: justify;">
Objetivo</h2>
<div style="text-align: justify;">
Suponemos que somos unos "<em>chicos malos</em>", y queremos desplegar un sitio web desde el que queremos distribuir una aplicación con malas intenciones. Mucha gente, e incluso puede que algunas herramientas automatizadas de seguridad, lanzarán contra VirusTotal el enlace de descarga de la aplicación para verificar si es una amenaza o no. Muchos lo hemos hecho en alguna ocasión cuando en una máquina en la que no disponíamos de antivirus, o al menos de antivirus actualizado, necesitábamos comprobar algún archivo descargado antes de utilizarlo.<br />
<br /></div>
<div style="text-align: justify;">
¿Podrían los "<em>chicos malos</em>" detectar si el que accede a descargar la aplicación es uno de los servidores de VirusTotal para analizarlo? Si esa detección es posible, se podría cambiar dinámicamente el contenido de la descarga por algún otro archivo inocuo cuando se detecte el acceso por parte de un servidor de VirusTotal, y evitar así que los análisis realizados por VirusTotal mediante enlace levanten sospechas.<br />
<br /></div>
<div style="text-align: justify;">
Este esquema de descarga selectiva de malware tampoco es una novedad. En casos de ataques selectivos donde solo se desea atacar equipos muy determinados, es una manera de mantener un perfil de exposición bajo para tratar de no llamar la atención. Solo los equipos que accedan desde determinadas direcciones IP descargarán el archivo malicioso, por lo que las posibilidades de que el servidor sea "<em>cazado</em>" y listado en las listas de sitios de distribución de malware disminuye, ya que de cara al mundo en ese servidor no hay malware.<br />
<br /></div>
<div style="text-align: justify;">
El procedimiento a seguir no tiene mucha historia. Desplegamos un servidor web que grabe todos los parámetros de la conexión cuando se accede al enlace de descarga. Accedemos a VirusTotal en donde introducimos nuestro enlace y esperamos a que el servidor de VirusTotal acceda al nuestro para descargar la muestra a escanear. Tras esto, en nuestro servidor tendremos almacenados los datos de los accesos que se hayan realizado desde los servidores de VirusTotal para realizar el escaneo solicitado. Solo queda examinar los datos del acceso (principalmente cabeceras HTTP y direcciones IP) y descubrir algún patrón que permita diferenciar el servidor o servidores de VirusTotal.<br />
<br /></div>
<div style="text-align: justify;">
Una vez definido un patrón que permita realizar esta distinción, solo queda codificar un par de líneas en nuestro servidor para que a las peticiones realizadas desde VirusTotal se devuelva un archivo inocuo, y para el resto de peticiones el archivo "<em>malicioso</em>", aunque en nuestro caso será el inofensivo archivo EICAR antes mencionado.<br />
<br /></div>
<h2 style="text-align: justify;">
Desplegando el tema</h2>
<div style="text-align: justify;">
Para las pruebas se ha creado una cuenta gratuita en servicio de hosting, con un subdominio gratuito suministrado por el propio hosting. Con esto conseguimos que ningún otro servidor acceda a nuestro equipo de pruebas y nos contamine los datos que vamos a recolectar, ya que es un nombre de dominio que acabamos de crear, y que nadie tendrá y los que aún no ha sido listado por los robots de los buscadores.<br />
<br /></div>
<div style="text-align: justify;">
El servidor web tiene un punto de entrada, "<em>/testbadfile.php?filename=xxx.yy</em>". Este punto devuelve el fichero EICAR en forma de fichero de texto comprimido con ZIP, y con el nombre definido en el parámetro "<em>filename</em>". Además devolver el fichero EICAR, grabará en una base de datos todos los parámetros de acceso de las peticiones web que se reciban. Usamos como nombre de fichero "<em>p1.zip</em>" y pasamos el enlace a VirusTotal. El servicio realiza un escaneo de la propia dirección web frente a diversos servicios dedicados a recopilar y clasificar sitios web maliciosos. Puesto que el enlace descarga un archivo, el archivo es escaneado frente a los motores antivirus que VirusTotal soporta.<br />
<br /></div>
<div style="text-align: justify;">
Aunque no es el objetivo de esta entrada, <a href="https://www.virustotal.com/es/url/788734605a4f7bd4a99a0da4dc11345ef6fac2e3f03b98a442f90a7e143aedfd/analysis/1433376546/" target="_blank">dos analizadores clasifican el enlace</a> (tras un par de días han pasado a ser cuatro) como perteneciente a un sitio malicioso, lo cual, teniendo en cuenta que el sitio y el dominio están recién creados, no debería ser así. Imagino que al ser un subdominio de un hosting gratuito, los dominios padre en ocasiones han debido ser utilizados con finalidades más bien dudosas, y esto ha debido provocar que esos dos analizadores consideren todos los subdominios de esos dominios "<em>dudosos</em>" como maliciosos. Lo cual tampoco me parece una política acertada...</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-Dhtj7gaSFe8PDhvEF4LfcAwtBU4W2oPNqsr8yV0Hl8aMnzvhf_0joKfQm9jbrdv-qKhcpuLAP_0UnGJzTZ4LN6KXGeklP-qoIV0T8fLmvUCsY4nFw343-uapRZ1i2adpBsrAyX9ez2sd/s1600/virustotal_url_testbadfile.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="172" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-Dhtj7gaSFe8PDhvEF4LfcAwtBU4W2oPNqsr8yV0Hl8aMnzvhf_0joKfQm9jbrdv-qKhcpuLAP_0UnGJzTZ4LN6KXGeklP-qoIV0T8fLmvUCsY4nFw343-uapRZ1i2adpBsrAyX9ez2sd/s640/virustotal_url_testbadfile.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Resultados análisis url '/testbadfile.php?filename=p2.zip'</td></tr>
</tbody></table>
<div style="text-align: justify;">
Al pinchar el enlace con los <a href="https://www.virustotal.com/es/file/286545e1837385ff3720b801b28c15abff24fb4cdb0cb8da35a860c17de9e981/analysis/1433376551/" target="_blank">resultados del análisis del archivo descargado</a>, como era de esperar, prácticamente la totalidad de los motores antivirus detectan correctamente el vector de test EICAR.</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEignLPa4pt2YAq53Tswcm_hE2Q9C-33BbYqQOzPOryf-0gZ07BmPa4gyNppJ4Sr7D5lCzAMMpfNYaLPB3HoD_aoYAT-2-7YeS8AuS0uQSZbQBDfG1Jhj4H7Ydl5i3yBrPyyHx3qJq6bmypu/s1600/virustotal_testbadfile.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="176" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEignLPa4pt2YAq53Tswcm_hE2Q9C-33BbYqQOzPOryf-0gZ07BmPa4gyNppJ4Sr7D5lCzAMMpfNYaLPB3HoD_aoYAT-2-7YeS8AuS0uQSZbQBDfG1Jhj4H7Ydl5i3yBrPyyHx3qJq6bmypu/s640/virustotal_testbadfile.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Resultados análisis archivo '/testbadfile.php?filename=p2.zip'</td></tr>
</tbody></table>
<div style="text-align: justify;">
Veamos qué datos hemos recopilado en nuestra base de datos. Aunque el análisis de URL de VirusTotal puede implicar la descarga de la muestra desde dos o tres servidores distintos, el que nos interesa, el que ataca la muestra con los motores antivirus es uno. Tal y como contaron <a href="http://blog.virustotal.com/2011/12/moving-to-google-app-engine.html" target="_blank">en su propio blog</a>, VirusTotal se mudó, poco antes de su adquisición por parte de Google, a la <a href="https://cloud.google.com/appengine/docs?csw=1" target="_blank">plataforma de aplicaciones en la nube</a> de la célebre marca del buscador.<br />
<br /></div>
<div style="text-align: justify;">
Uno de los accesos corresponde a una dirección IP que efectivamente corresponde al <a href="http://whois.arin.net/rest/net/NET-107-178-192-0-1/pft" target="_blank">bloque asignado a Google Cloud</a>. Esto podría ser suficiente para definir nuestro criterio, aunque dejaríamos fuera del objetivo de nuestra aplicación "<em>maliciosa</em>" a todas aquellas máquinas (virtuales o no) albergadas en la nube de Google.<br />
<br /></div>
<div style="text-align: justify;">
Afortunadamente la cabecera HTTP_USER_AGENT del servidor de VirusTotal es bastante descriptiva, con lo que la identificación del servidor al que debemos "<em>engañar" </em>es inequívoca:</div>
<pre style="text-align: justify;"><span style="color: blue; font-family: inherit;">Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US) AppEngine-Google; (+http://code.google.com/appengine; appid: s~virustotalcloud)</span></pre>
<pre style="text-align: justify;"></pre>
<h2 style="text-align: justify;">
</h2>
<h2 style="text-align: justify;">
Troleando...</h2>
<div style="text-align: justify;">
En el mismo servidor creamos una copia del punto de entrada '<em>testbadfile.php</em>' con el nombre '<em>testtrollfile.php</em>'. Cambiando una par de líneas del PHP, examinamos la cabecera HTTP_USER_AGENT de la petición entrante. Si se identifica el servidor de VirusTotal, el código PHP devuelve como contenido del fichero a descargar un archivo .zip con un archivo de texto inocente, y en caso contrario el archivo .zip contendrá el archivo EICAR.<br />
<br /></div>
<div style="text-align: justify;">
<a href="https://www.virustotal.com/es/url/899a18a67821f8466e18370343d67a25844d82401041c8ecdb084a1075738e01/analysis/1433375979/">El análisis de la nueva url</a> presenta los mismos resultados que el caso anterior.</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYKnVl3ChQOX-culCBvoT0MY2ysUidfSreVTKXVn9kn4bLNvxdteZbNeNo0Y-98zFcXV3Ry4TwOk7fUyIJWob4mK25IJrBK2msCfI0QDQyyN20aDeCcNgRwYc_ZWpQ1B4aI-hyMyS1o96M/s1600/virustotal_url_testtrollfile.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="174" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYKnVl3ChQOX-culCBvoT0MY2ysUidfSreVTKXVn9kn4bLNvxdteZbNeNo0Y-98zFcXV3Ry4TwOk7fUyIJWob4mK25IJrBK2msCfI0QDQyyN20aDeCcNgRwYc_ZWpQ1B4aI-hyMyS1o96M/s640/virustotal_url_testtrollfile.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Análisis url '/testtrollfile.php?filename=p1.zip'</td></tr>
</tbody></table>
<div style="text-align: justify;">
La diferencia está en el análisis del archivo descargado, que en este caso aparece inmaculado como una patena.</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-NFiYUoKiSsU0mBcpf4zUM-9_az26KgK1g3UFdx-yQrHDEio7_b0ADA2XZ9jsR2h7veICfkNOUyz7Y4icKMFfWgvtdLUgSMkn_2lFmZSJ7bZvrZy-RfKjw7iGGjKrk1OcXyWFC4EWheLa/s1600/virustotal_testtrollfile.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="177" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-NFiYUoKiSsU0mBcpf4zUM-9_az26KgK1g3UFdx-yQrHDEio7_b0ADA2XZ9jsR2h7veICfkNOUyz7Y4icKMFfWgvtdLUgSMkn_2lFmZSJ7bZvrZy-RfKjw7iGGjKrk1OcXyWFC4EWheLa/s640/virustotal_testtrollfile.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Análisis fichero '/testtrollfile.php?filename=p1.zip'</td></tr>
</tbody></table>
<div style="text-align: justify;">
Si desde cualquier otro ordenador se accede al mismo enlace que para VirusTotal está limpio, el antivirus instalado localmente debería cantarnos la presencia del vector de test EICAR. Y lo mismo ocurriría, y ahí está el peligro, si en lugar de jugar con el test EICAR jugáramos con un malware real.</div>
<div style="text-align: justify;">
<br />
Como prueba de concepto se ha dejado un <a href="http://softbreakers.besaba.com/" target="_blank">servidor activo</a> con dos enlaces:</div>
<ol>
<li style="text-align: justify;">'<a href="http://trollingvt.hol.es/show_eicar.php" target="_blank">show_eicar.php</a>' siempre va a suministrar el archivo EICAR comprimido en un zip, independiente del equipo desde el que se acceda. Permite comprobar que tanto VirusTotal como el antivirus de nuestra máquina detectan el patrón EICAR.</li>
<li style="text-align: justify;">'<a href="http://trollingvt.hol.es/hide_eicar.php" target="_blank">hide_eicar.php</a>' analizará las cabeceras de la petición HTTP. En caso de detectar el servidor de VirusTotal suministrará un archivo de texto inofensivo dentro del archivo zip. Y en caso contrario la petición descargará el mismo archivo zip que 'show_eicar.php', con el vector EICAR.</li>
</ol>
<div style="text-align: justify;">
<br /></div>
<h2>
Conclusiones</h2>
<div style="text-align: justify;">
Lo que se ha presentado no es un fallo en el servicio VirusTotal. De hecho, un usuario avezado puede distinguir que la firma SHA256 que ha calculado VirusTotal para la muestra que ha descargado y analizado es distinta de la firma del archivo que podemos descargar nosotros mismos usando el mismo enlace. La única salvedad podría ser que los "chicos malos" sean capaces de generar un archivo inocuo con la misma firma SHA256 que su muestra de malware, pero el cálculo de colisiones SHA256 parece ser un problema irresoluble, y al menos actualmente intratable por fuerza bruta.<br />
<br /></div>
<div style="text-align: justify;">
VirusTotal podría complicar mucho más la identificación de su servidor, eso es cierto. No solo usar cabeceras HTTP_USER_AGENT menos explícitas, sino acceder al enlace con la muestra a descargar desde un conjunto de proxies que fueran cambiando periódicamente a fin de dificultar la identificación por dirección IP.<br />
<br /></div>
<div style="text-align: justify;">
Es más, permitir al usuario de VirusTotal que solicita un análisis poder configurar la cabecera HTTP_USER_AGENT con distintos valores predefinidos podría ser una funcionalidad deseable. Enlaces maliciosos pueden actuar de distinta manera, y suministrar distintas versiones de malware según la información de dicha cabecera, que entre otras cosas permite identificar el navegador web utilizado y su versión, además del sistema operativo en el que se está ejecutando el navegador web.<br />
<br /></div>
<div style="text-align: justify;">
Mas que presentar una posible mejora que VirusTotal podría introducir, lo importante es dar un pequeño toque de atención a cualquier usuario del servicio de VirusTotal, o servicios similares que permitan introducir una URL desde la que se descarga la muestra que se desea analizar... si es posible, aunque es más incómodo, es mejor descargar localmente el archivo sospechoso y posteriormente subirlo al servicio web de análisis de malware, no nos la vayan a dar con queso...</div>
<br />
<h2 style="text-align: justify;">
Anexo</h2>
<div style="text-align: justify;">
La API de VirusTotal permite a usuarios de pago acceder a otras funcionalidades como es la base de datos de muestras. Es de dominio general que numeras empresas de seguridad informática y aplicaciones antivirus se alimenta de bases de datos como la de VirusTotal y similares.<br />
<br /></div>
<div style="text-align: justify;">
En la realización de está entrada, no solo se han registrado los accesos de los servidores de VirusTotal, sino también los accesos de los clientes de VirusTotal interesados en acceder a la muestras que la gente sube a VirusTotal, y que comienzan a llegar escasos minutos después de que VirusTotal realiza el primer acceso.<br />
<br /></div>
<div style="text-align: justify;">
Lo reseñable es el distinto interés con el que los robots (o puede que analista humanos manualmente) de la empresas abonadas a este servicio de VirusTotal han tratado los dos enlaces subidos al servicio de VirusTotal.<br />
<br /></div>
<div style="text-align: justify;">
Por un lado el enlace que suministra selectivamente el patrón EICAR a todos menos al servidor de VirusTotal, y que el VirusTotal ha clasificado como "<em>limpio</em>", tan solo ha recibido 6 impactos posteriores desde 6 direcciones IP distintas (dos de ellas de equipos en Japón de la empresa Trend Micro).<br />
<br /></div>
<div style="text-align: justify;">
El otro enlace que suministra el patrón EICAR a todos, y que así ha sido detectado correctamente por VirusTotal, ha alcanzado 50 impactos desde 27 direcciones IP distintas. Entre las empresas interesadas en la muestra en la que VirusTotal detectó el patrón EICAR se puede identificar a Mcafee desde equipos en India y EEUU, Trend Micro desde Japón, Avirasoft desde Rumanía, Microsoft SmartScreen desde Canadá, Secure Computing (adquiridos hace tiempo por Mcafee) desde EEUU e Ikarus Security Software desde Austria. Además hay muchas otras direcciones IP menos identificables desde Israel, China, Rusia, Alemania, Finlandia, Noruega y México.<br />
<br /></div>
<div style="text-align: justify;">
En resumen, el enlace "<em>troll</em>" que estaba limpio solo para el servidor VirusTotal apenas ha registrado descargas, mientras que el otro, en el que VirusTotal identificó el patrón EICAR, ha tenido numerosos "<em>seguidores</em>". De lo anterior se puede aventurar que para muchas empresas abonadas al servicio de VirusTotal, lo importante que les brinda VirusTotal es obtener muestras en las que otros motores antivirus detectan malware, lo que permite actualizar los archivos de firmas de sus propias herramientas para no quedarse atrás respecto a la competencia.</div>
Softbreakershttp://www.blogger.com/profile/01666968545873713297noreply@blogger.com0tag:blogger.com,1999:blog-5459690923545315155.post-80591636647225573172015-05-26T18:39:00.000+02:002015-05-26T21:16:06.765+02:00Resolviendo un crackme con Cheat Engine<h2>
Cheat Engine. Una 'navaja suiza' para <em>reversers</em>.</h2>
<div style="text-align: justify;">
En una <a href="http://www.softbreakers.com/2015/05/trampeando-videojuegos-con-cheat-engine.html" target="_blank">entrada anterior</a> ya apareció un extenso tutorial sobre esta pequeña gran herramienta. En aquella ocasión se utilizó para exponer las bondades de esta utilidad lo que viene a ser el objetivo natural de esta herramienta, un videojuego.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Pero como con muchas otras utilidades, podemos seguir sacándole punta a <em><a href="http://www.cheatengine.org/" target="_blank">Cheat Engine</a></em> en otros campos de aplicación distintos de los propios para los que ha sido concebido: hoy vamos a resolver un <a href="http://en.wikipedia.org/wiki/Crackme" target="_blank"><em>crackme</em></a>. Si la entrada anterior fue una introducción bastante extensa a la herramienta, en esta entrada vamos a '<em>liarla parda</em>', como <a href="https://www.youtube.com/watch?v=ICQrvG6jfOA" target="_blank">aquel que dice</a>.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Empezamos por el final. Esto es lo que vamos a perpetrar:</div>
<div style="text-align: justify;">
<div style="text-align: center;">
<br /></div>
</div>
<div style="text-align: justify;">
<div style="text-align: center;">
<iframe allowfullscreen="allowfullscreen" frameborder="0" height="315" src="https://www.youtube.com/embed/_M42lg89tsY" width="560"></iframe></div>
</div>
<div style="text-align: justify;">
</div>
<a name='more'></a><div style="text-align: center;">
<br /></div>
<div>
<div style="text-align: justify;">
Ya puestos a buscar formas de hacer lo mismo pero con distintos sabores, vamos a juguetear con un crackme que ha aparecido hace poco en <a href="http://www.securitybydefault.com/2015/04/resolviendo-un-crackme-con.html" target="_blank">la web de SecurityByDefault</a> como conejillo de indias para ilustrar el funcionamiento de <a href="http://jacquelin.potier.free.fr/winapioverride32/" target="_blank">WinAPIOverride</a>. El crackme en cuestión data del año 2001, realizado por '<em>SantMat</em>' del extinto grupo '<a href="http://www.reteam.org/ID-RIP/" target="_blank"><em>Immortal Descendants</em></a>'. Dicho grupo echó el cierre en octubre de 2001, al igual que muchos otros que existían desde los 90 y que justamente con la llegada del nuevo milenio se extinguieron casi todos prácticamente a la vez, como por ejemplo los <a href="http://www.elmundo.es/tecnologia/2014/04/06/533eb56cca4741be708b4579.html" target="_blank">muy recordados</a> por estas tierras <a href="http://hackstory.net/Whiskey_kon_Tekila" target="_blank">'<em>Whiskey Kon Tekila!</em>', o '<em>WkT!</em>'</a> para los amigos.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
El crackme puede descargarse de varios sitios:</div>
<ul>
<li><a href="http://reteam.org/ID-RIP/crackmes.htm" target="_blank">Del <em>backup</em> de la web del grupo</a> (último enlace de la sección '<em>CrackMe Practices</em>')</li>
<li><em><a href="http://www.crackmes.de/users/santmat/canyou/" target="_blank">Crackmes.de</a> </em>(requiere registro)</li>
<li><a href="http://thelegendofrandom.com/blog/archives/223" target="_blank"><em>The Legend Of Random</em></a></li>
</ul>
<div style="text-align: justify;">
En esos tres sitios los binarios del crackme son exactamente iguales y no parecen tener virus. Y lo digo porque la librería '<em>canyou.dll</em>' que le acompaña <a href="https://www.virustotal.com/es/file/bacde0c07b3f91ba246061796b5973026afccbb659409dbf488336586d22c2bc/analysis/1428264359/" target="_blank">hace saltar a algunos antivirus</a>. He desemsamblado tanto la librería como el ejecutable y ni la librería tiene nada raro, ni el ejecutable importa las funciones necesarias para poder extraer algo raro de la librería... De todas maneras, los más precavidos pueden usar una máquina virtual.</div>
<br />
<h2>
¿Can you CrackMe?</h2>
<div style="text-align: justify;">
Solo con ver el signo de apertura de interrogación inicial en una pregunta escrita en inglés, se puede suponer que la lengua nativa del autor no es el inglés. El <em>crackme</em> incluye una librería, el ejecutable y un fichero de texto en el que nos retan a crear un generador de claves válido.</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgZOmM2Vaf-M5fNbynuxPvZ-4V57eURQU4YvCiiT8SLBjG99mNm6mRrCaolcjCzb4a7HJ8Oyp0RWR4QoLn3fBh-LCnKSiMzEqZsZVqu7hLuh3H_nO_W7nmMOZueHayNwAu21GMvVeO3ubE/s1600/canyou_nfo.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgZOmM2Vaf-M5fNbynuxPvZ-4V57eURQU4YvCiiT8SLBjG99mNm6mRrCaolcjCzb4a7HJ8Oyp0RWR4QoLn3fBh-LCnKSiMzEqZsZVqu7hLuh3H_nO_W7nmMOZueHayNwAu21GMvVeO3ubE/s400/canyou_nfo.png" width="395" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">'Manual de uso'</td></tr>
</tbody></table>
<div style="text-align: justify;">
El <em style="text-align: justify;">crackme</em> está fechado a agosto de 2001, es decir, meses antes del lanzamiento de <a href="http://es.wikipedia.org/wiki/Windows_XP" style="text-align: justify;" target="_blank"><em>Windows XP</em></a>. Por las funciones que importa del sistema operativo, se tuvo que desarrollar para ejecutarse en un Windows 2000 o un Windows ME. La antigüedad del programa va a provocar que tengamos que tocarlo un poco para que funcione correctamente en Windows 7.<br />
<br /></div>
<div style="text-align: justify;">
La aplicación muestra una sencilla ventana en la que se nos invita a introducir el clásico usuario y número de serie, junto con un botón para validar la información introducida. Si la información proporcionada es correcta nos aparecerá el consabido mensaje de éxito y en caso contrario el típico mensaje de error tras el que la aplicación finaliza. Simple y básico.</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhia0GsgFw-a_ruyhI4GjVNwP9DzNo913Lh0Qh1TwRCx8bRU35sfvAuxjLs4b-hH55a_axidw3RroQ5GA92vXMZOqqe9RDPhN9FGrg0dgOX5kcy0LRSGBwTcSnQrNSTvyj8NXI2sQBXrSTE/s1600/canyou_mainwindow.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="198" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhia0GsgFw-a_ruyhI4GjVNwP9DzNo913Lh0Qh1TwRCx8bRU35sfvAuxjLs4b-hH55a_axidw3RroQ5GA92vXMZOqqe9RDPhN9FGrg0dgOX5kcy0LRSGBwTcSnQrNSTvyj8NXI2sQBXrSTE/s320/canyou_mainwindow.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Ventana principal del crackme</td></tr>
</tbody></table>
<div style="text-align: justify;">
No se va a entrar demasiado en el análisis del código del crackme, y se centrará el enfoque en cómo usar características avanzadas de <em>Cheat Engin</em>e que no se vieron <a href="http://www.softbreakers.com/2015/05/trampeando-videojuegos-con-cheat-engine.html" target="_blank">en la entrada anterior</a>. Por acortar esta entrada, ya de por sí extensa, el análisis sistemático del crackme se ha realizado <a href="http://www.softbreakers.com/p/introduccion-esta-entrada-es-un-anexo.html" target="_blank">en un anexo aparte</a>.<br />
<br /></div>
<div style="text-align: justify;">
Resumiendo, para el cálculo del número de serie el crackme utiliza:</div>
<ol>
<li>El nombre de usuario tecleado en el control de edición superior</li>
<li>Las coordenadas del cursor del ratón al pulsar el botón '<em>Gain Access!</em>'</li>
<li>El número de volumen del disco duro desde el que se ejecuta el crackme</li>
<li>La clave de producto de Windows</li>
</ol>
<div style="text-align: justify;">
Al pulsar el botón inferior, antes de nada el crackme valida que ninguno de los dos campos es nulo. Sobre los datos anteriores el crackme realiza una serie de operaciones e interrelaciones entre ellos que dan como fruto dos valores numéricos. Ambos números se convierten a cadena, y la concatenación de ambas cadenas forma el número de serie. Dicho número de serie se compara con el introducido por el usuario en el control de edición inferior. Si no son iguales se muestra un mensaje de error y se cierra la aplicación, y en caso contrario se muestra una felicitación.<br />
<br /></div>
<div style="text-align: justify;">
Los valores numéricos que forman las dos partes del número de serie se transforman a cadena utilizando la función '<em><a href="https://msdn.microsoft.com/en-us/library/windows/desktop/ms647550%28v=vs.85%29.aspx" target="_blank">wsprintf</a></em>'. Ambos números se almacenan en los registros <em>EDX</em> (dirección '<em>canyou.exe+1218</em>') y <em>ECX</em> (dirección '<em>canyou.exe+1224</em>'), para posteriormente invocar dos veces las función '<em><a href="https://msdn.microsoft.com/en-us/library/windows/desktop/ms647550%28v=vs.85%29.aspx" style="color: #41a62a;" target="_blank">wsprintf</a></em>', en '<em>canyou.exe+1235</em>' para convertir el valor numérico del registro <em>EDX</em> y en '<em>canyou.exe+1248</em>' para convertir el valor en <em>ECX</em>.<br />
<br /></div>
<div style="text-align: justify;">
El problema es que tras la primera invocación de la función '<em><a href="https://msdn.microsoft.com/en-us/library/windows/desktop/ms647550%28v=vs.85%29.aspx" style="color: #41a62a;" target="_blank">wsprintf</a></em>' en '<em>canyou.exe+1235</em>' el registro <em>ECX</em> no preserva su valor, con lo que el parámetro numérico que se pasa a la segunda invocación de '<em><a href="https://msdn.microsoft.com/en-us/library/windows/desktop/ms647550%28v=vs.85%29.aspx" style="color: #41a62a;" target="_blank">wsprintf</a></em>' en '<em>canyou.exe+1248</em>' no es el valor numérico previamente calculado, si no un valor inicialmente aleatorio.</div>
<div style="text-align: justify;">
<br />
En sistema operativos anteriores, tras ejecutarse '<em><a href="https://msdn.microsoft.com/en-us/library/windows/desktop/ms647550%28v=vs.85%29.aspx" style="color: #41a62a;" target="_blank">wsprintf</a></em>' el valor del registro <em>ECX</em> siempre era un valor fijo, con lo que podría generarse un keygen a pesar de este fallo (o puede que no) de desarrollo. En Windows 7 dicho valor es completamente aleatorio, con lo que si queremos generar un keygen tendremos que cambiar algunas líneas de código de sitio.</div>
<div style="text-align: justify;">
<br />
La idea es trasladar las dos instrucciones que cargan el registro <em>ECX</em> con el valor numérico adecuado ('<em>canyou.exe+121E</em>' y '<em>canyou.exe+1224</em>') por debajo de la primera llamada a la función '<em><a href="https://msdn.microsoft.com/en-us/library/windows/desktop/ms647550%28v=vs.85%29.aspx" style="color: #41a62a;" target="_blank">wsprintf</a></em>' en '<em>canyou.exe+1235</em>'. El cambio propuesto es el que se muestra:</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhs1FctmK1YXOWaJNzAxvb2m1pW7qiCqOCfwc1QYfcjbZd7FOgjYVDqjmLrUsqVz4fJh7-Qha0YfT4ModsEfjQLDGgpxXOesB7OKL-_3KxdgIuji2mxFAceTR7d0z4iy-SUYsq8goh5OYix/s1600/mod_asm1.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="238" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhs1FctmK1YXOWaJNzAxvb2m1pW7qiCqOCfwc1QYfcjbZd7FOgjYVDqjmLrUsqVz4fJh7-Qha0YfT4ModsEfjQLDGgpxXOesB7OKL-_3KxdgIuji2mxFAceTR7d0z4iy-SUYsq8goh5OYix/s640/mod_asm1.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Situación original. El registro ECX no conserva su valor tras la primera llamada a 'wsprintf'</td></tr>
</tbody></table>
<span style="text-align: justify;">Tras el citado cambio, la situación final queda así:</span><br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8kIfAYEz3vIUFevoEPL6KBEbxsbgpMg-xd7Z1u3B9C3gcrSWKOIxGpKe7x-2kriglbzs4wmlpNAP7xAQ03BzBF4aQuu0uHknwHtDVsp8o1NWdXuO5jNJD5vf2aYD9BlvAmBBzhSwlr4Ii/s1600/mod_asm2.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8kIfAYEz3vIUFevoEPL6KBEbxsbgpMg-xd7Z1u3B9C3gcrSWKOIxGpKe7x-2kriglbzs4wmlpNAP7xAQ03BzBF4aQuu0uHknwHtDVsp8o1NWdXuO5jNJD5vf2aYD9BlvAmBBzhSwlr4Ii/s640/mod_asm2.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Situación final. El registro ECX carga su valor justo tras la primera llamada a 'wsprintf'</td></tr>
</tbody></table>
<div style="text-align: justify;">
Este cambio puede realizarse con un desemsamblador/ensamblador que permita modificar un ejecutable, o bien directamente con un editor hexadecimal sobrescribiendo el contenido a partir del desplazamiento 0x61E tal y como se muestra:</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRi4XXTLmXBnYA3vK0YYYQXTgOKp5ba4oj7UjDyD2rnjl3cD_S40oWo2y1qk8Xp33pJyd6MBoVjsiyJcaW-RlTE41Ol-cvpsUeYZ2EBXfv6790NpxAK3iwttg6QhcMgIWctXt9eQMT3ugR/s1600/binary_comparing.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="313" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRi4XXTLmXBnYA3vK0YYYQXTgOKp5ba4oj7UjDyD2rnjl3cD_S40oWo2y1qk8Xp33pJyd6MBoVjsiyJcaW-RlTE41Ol-cvpsUeYZ2EBXfv6790NpxAK3iwttg6QhcMgIWctXt9eQMT3ugR/s320/binary_comparing.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Modificación del código. Arriba versión original y abajo versión modificada</td></tr>
</tbody></table>
<div style="text-align: justify;">
Al final de esta entrada hay un enlace para descargar, entre otras cosas, la versión modificada del crackme con esta pequeña corrección.</div>
<br />
<h2>
Desatando el potencial de Cheat Engine</h2>
<div style="text-align: justify;">
Como ocurre en la mayor parte de estos casos, hay decenas de maneras de resolver el problema. <a href="http://www.softbreakers.com/2015/05/trampeando-videojuegos-con-cheat-engine.html" target="_blank">Anteriormente se expusieron</a> las posibilidades que Cheat Engine ofrece para monitorizar el contenido de determinadas variables que utiliza el programa objetivo, y como actuar sobre ellas. Además, con Cheat Engine creamos un '<em><a href="http://en.wikipedia.org/wiki/Trainer_%28games%29" target="_blank">trainer</a></em>' con una ventana predefinida para mostrar al usuario las opciones e instrucciones de uso.<br />
<br /></div>
<div style="text-align: justify;">
En esta ocasión crearemos una ventana completamente desde cero usando el asistente de diseño que integra la herramienta. Además de monitorizar y obtener el contenido de determinadas variables que influyen en el cálculo de un número de serie válido, inyectaremos código en el contexto del la aplicación objetivo que nos permitirá realizar distintas funciones.<br />
<br /></div>
<div style="text-align: justify;">
Parto de que hemos arrancado Cheat Engine, hemos cargado el proceso en ejecución del crack '<em>canyou.exe</em>', y que hemos curioseado el funcionamiento del código del crackme, tras lo que hemos llegado a las conclusiones que se presentan <a href="http://www.softbreakers.com/p/introduccion-esta-entrada-es-un-anexo.html" target="_blank">en el anexo</a>.<br />
<br /></div>
<div style="text-align: justify;">
Para el resto del artículo es interesante cargar el archivo <em>.CT</em> que se enlaza al final de la entrada desde Cheat Engine, ya que lo que sigue va a ser una descripción de su funcionamiento.<br />
<br /></div>
<div style="text-align: justify;">
En la lista de direcciones del interfaz de Cheat Engine se encuentran listados dos direcciones de memoria y tres scripts:</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdkOJFGayPr606Eg899bGhnV1Cw3lHXRBQ2vHUfNyOIyuPeJTyEpL2Jge2ALeUdl-C9QvSvlIf0Ky0SW3kAdhFgW5baoiyusvUS9t-45SWYmbukeE1y7Ypbz5pVJoZfNh1ka7Dbs7erE6n/s1600/cheatengine2_addresslist.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="106" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdkOJFGayPr606Eg899bGhnV1Cw3lHXRBQ2vHUfNyOIyuPeJTyEpL2Jge2ALeUdl-C9QvSvlIf0Ky0SW3kAdhFgW5baoiyusvUS9t-45SWYmbukeE1y7Ypbz5pVJoZfNh1ka7Dbs7erE6n/s400/cheatengine2_addresslist.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">'Addresslist' para nuestro keygen</td></tr>
</tbody></table>
<div style="text-align: justify;">
La dirección etiqueta como '<em>randomSeed</em>' corresponde a lo que en el anexo he nombrado como '<em>semilla del ratón</em>', o <strong><em>SMR</em> </strong>(ver punto 3 de la sección dedicada al ejecutable '<em>canyou.exe</em>' <a href="http://www.softbreakers.com/p/introduccion-esta-entrada-es-un-anexo.html" target="_blank">en el anexo</a>).<br />
<br /></div>
<div style="text-align: justify;">
'<em>previousSerialSeed</em>' en el anexo aparece como '<em>semilla del ProductKey</em>', o <em><strong>SMP</strong> </em>(punto 1 de la sección '<em>canyou.exe</em>' <a href="http://www.softbreakers.com/p/introduccion-esta-entrada-es-un-anexo.html" target="_blank">del citado anexo</a>).<br />
<br /></div>
<div style="text-align: justify;">
Hasta aquí nada nuevo respecto a lo ya visto. Las novedades están en las funcionalidades de los tres scripts. Estos scripts, que pueden activarse y desactivarse, permitirán al script principal en LUA realizar llamadas a funciones de la API de Windows a las que LUA no tiene acceso directo. En realidad, desde el script en LUA podríamos importar otros módulos de LUA que permiten llamar directamente a funciones de la API de Windows, como la extensión '<a href="http://alien.luaforge.net/" target="_blank"><em>Alien</em></a>'. Para usar esta extensión hay que utilizar <a href="http://forum.cheatengine.org/viewtopic.php?p=5444542" target="_blank">una versión específica de la extensión para Cheat Engine</a>.<br />
<br /></div>
<div style="text-align: justify;">
En este caso se ha hecho de otra manera que permite de una manera sencilla no solo llamar a funciones de la API de Windows, si no que al ejecutarse dentro del contexto de la aplicación objetivo, podremos incluso llamar a funciones internas de la aplicación objetivo. Los tres scripts siguen el mismo esquema. De hecho podrían unificarse en un único script que mediante un parámetro se definiera cual de las funcionalidades se desea ejecutar.<br />
<br /></div>
<div style="text-align: justify;">
En la sección '<em>[ENABLE]</em>' de cada script, que se lanza al activarlo, se realizan las reservas de zonas de memoria usando '<a href="http://wiki.cheatengine.org/index.php?title=Cheat_Engine:Auto_Assembler" target="_blank"><em>alloc()</em></a>' necesarias para albergar en el contexto de la aplicación objetivo el código que deseamos ejecutar así como las distintas variables que dicho código precisa. En caso de desear acceder a alguna de estas variables desde el script principal en LUA debemos registrar los símbolos que correspondan con '<em><a href="http://wiki.cheatengine.org/index.php?title=Cheat_Engine:Auto_Assembler" target="_blank">registersymbol</a>()</em>'. La sección '<em>[DISABLE]</em>' que se ejecutará al desactivar el script liberará las zonas de memoria reservadas anteriormente con '<em><a href="http://wiki.cheatengine.org/index.php?title=Cheat_Engine:Auto_Assembler" target="_blank">dealloc()</a>'</em> y eliminará de la tabla de símbolos globales los símbolos que se registraron usando en esta ocasión '<a href="http://wiki.cheatengine.org/index.php?title=Cheat_Engine:Auto_Assembler" target="_blank"><em>unregistersymbol()</em></a>'.<br />
<br /></div>
<div style="text-align: justify;">
La novedad es la función '<a href="http://wiki.cheatengine.org/index.php?title=Cheat_Engine:Auto_Assembler" target="_blank"><em>CREATETHREAD(adr)</em></a>'. Como su nombre da a entender, permite crear y lanzar un hilo que ejecutará el código a partir de la dirección que se le pasa como parámetro hasta encontrar una instrucción de retorno '<em>ret</em>'. Este hilo se crea y se ejecuta en el contexto del proceso anfitrión, con lo que puede acceder a la memoria del mismo.</div>
<br />
<h4 style="text-align: justify;">
1. Script '<em>GetVolumeInformation</em>'</h4>
<div style="text-align: justify;">
Este script se encarga de obtener el número de volumen de la unidad de disco en la que se encuentra el directorio actual de la aplicación anfitriona. Para mostrar un script, hacemos click con el botón derecho del ratón sobre la línea que le corresponde en el listado de direcciones del interfaz principal de Cheat Engine, y en el menú contextual se selecciona la opción '<em>Change script</em>'.</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivTAKyT-I8kjkoCEWaQ5Xi9IvlmKG_pRkBXv5QA97QOIPwQWYH3hZr2PGLWMMJtogn4RD87X-Dhfqm0jXBRxcJjZSNMH38bU49zxYn-DzfCQwG9eVXnQ0zQXE4RrA27x96IEkVmQ4eRF7O/s1600/cheatengine2_getVolume.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivTAKyT-I8kjkoCEWaQ5Xi9IvlmKG_pRkBXv5QA97QOIPwQWYH3hZr2PGLWMMJtogn4RD87X-Dhfqm0jXBRxcJjZSNMH38bU49zxYn-DzfCQwG9eVXnQ0zQXE4RrA27x96IEkVmQ4eRF7O/s640/cheatengine2_getVolume.png" width="340" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Script 'GetVolumeInformation'</td></tr>
</tbody></table>
<div style="text-align: justify;">
Al activar el script anterior desde el script principal en LUA, se inyectará en el proceso anfitrión el código que obtendrá el número de volumen de la unidad de disco en la que se encuentra el directorio actual. Para ello realiza una llamada al la función de la API de Windows '<a href="https://msdn.microsoft.com/en-us/library/windows/desktop/aa364993%28v=vs.85%29.aspx" target="_blank"><em>GetVolumeInformation</em></a>'. Como siempre, los parámetros se pasan mediante la pila en la que se insertan en orden inverso (del último parámetro al primero). Tras la ejecución el hilo finaliza y la dirección '<em>volumeID</em>' albergará el número de volumen. Esta dirección se declara como símbolo para acceder a la misma desde el script en LUA. El script en LUA activará el script, lo que lanzará el hilo, esperará unos milisegundos y después accederá a la dirección '<em>volumeID</em>' en la que ya se encontrará el número de volumen. Tras recogerlo, desactivará el script lo que liberará todos los recursos utilizados. Puesto que la función '<em>GetVolumeInformationA</em>' es importada por el propio ejecutable anfitrión, se encontrará ya disponible para nuestro hilo al ejecutarse en el mismo contexto.<br />
<br /></div>
<div style="text-align: justify;">
Los otros dos scripts son similares, con la salvedad que el hilo se queda en un bucle infinito del que no finaliza hasta que el script principal en LUA activa un flag que se ha declarado como símbolo.</div>
<br />
<h4 style="text-align: justify;">
2. Script '<em>GetUserName</em>'</h4>
<div style="text-align: justify;">
Esto puede verse con claridad en el script '<em>GetUserName</em>', utilizado para obtener el nombre que el usuario introduce en el crackme:</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8n71W85g7YbUC6rEbgB2wzbyMsOCBb_8b9ALZncvDM1u1U9hFVLr5ZTZLQMWWal2vSHraaLk3mxOWRgdgTpcxNygLhXJOpZ3GpNJRvfWr0Rxpy2A5HwZoR0Lnj3HnUFFTPmqhGzavemZ5/s1600/cheatengine2_getUserName.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8n71W85g7YbUC6rEbgB2wzbyMsOCBb_8b9ALZncvDM1u1U9hFVLr5ZTZLQMWWal2vSHraaLk3mxOWRgdgTpcxNygLhXJOpZ3GpNJRvfWr0Rxpy2A5HwZoR0Lnj3HnUFFTPmqhGzavemZ5/s640/cheatengine2_getUserName.png" width="270" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Script 'GetUserName'</td></tr>
</tbody></table>
<div style="text-align: justify;">
La tarea del hilo es refrescar continuamente en la dirección '<em>username</em>' el texto que el usuario introduce en el control destinado al nombre en el crackme. Para ello usa la función de la API '<em><a href="https://msdn.microsoft.com/en-us/library/windows/desktop/ms645489(v=vs.85).aspx" target="_blank">GetDlgItemText</a></em>'. El primer parámetro (que corresponde al último que se inserta en la pila) es el manejador o '<em>handle</em>' de la ventana de diálogo en la que se encuentra el control del que queremos acceder al texto. Tras realizar varias búsquedas, y varias ejecuciones del crackme de la misma forma que se mostró <a href="http://www.softbreakers.com/2015/05/trampeando-videojuegos-con-cheat-engine.html" target="_blank">en la entrada anterior</a>, encontramos que el manejador de la ventana de diálogo se almacena en la dirección 0x18FF00. Con la directiva '<em>define()</em>' creamos un <em>atajo</em> para esa dirección y mantenemos el código algo más ordenado. El refresco se realiza cada 500ms. (el carácter '<em>#</em>' indica que el número debe tomarse con base decimal en lugar de hexadecimal) llamando a la función '<em><a href="https://msdn.microsoft.com/en-us/library/windows/desktop/ms686298(v=vs.85).aspx" target="_blank">sleep</a></em>'. A diferencia de la función '<em>GetDlgItemText</em>', la función '<em>sleep</em>' no está previamente importada por la aplicación anfitriona, por lo que debemos indicar la librería en la que se encuentra, y ya se encarga el motor de Cheat Engine de importar la dirección correcta.<br />
<br /></div>
<div style="text-align: justify;">
Al finalizar el periodo de 500ms. se comprueba el estado del flag '<em>stop</em>'. Si es distinto de cero finaliza el hilo, y en caso contrario vuelve al inicio recargando nuevamente el texto del control.</div>
<br />
<h4 style="text-align: justify;">
3. Script '<em>SetSerial</em>'</h4>
<div style="text-align: justify;">
El último script auxiliar es el encargado de escribir en el control del número de serie del crackme el número de serie calculado. Al igual que el anterior el hilo se ejecuta en un bucle infinito, aunque en este caso en lugar de un flag que desbloquea la finalización del hilo, dispone de un segundo flag que indica si hay un nuevo número de serie que deba volcar al control de la ventana de diálogo del crackme.</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLah4Ojycc1uylur0AlfGqS-wfFr362eo3uyQJyG466nKK6Yj08EYKZJydvkjaoxWNKSR12A7pKmww7tksd6cXxQhihb2525rwoplpwN4SiPrxFDAdGhaGtik6cbBYnZEwtBq_h8TfBj9Y/s1600/cheatengine2_SetSerial.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLah4Ojycc1uylur0AlfGqS-wfFr362eo3uyQJyG466nKK6Yj08EYKZJydvkjaoxWNKSR12A7pKmww7tksd6cXxQhihb2525rwoplpwN4SiPrxFDAdGhaGtik6cbBYnZEwtBq_h8TfBj9Y/s640/cheatengine2_SetSerial.png" width="200" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Script 'SetSerial'</td></tr>
</tbody></table>
<div style="text-align: justify;">
El hilo duerme durante 150ms. tras lo cual pasa a revisar el estado de los flags de control. El flag '<em>refresh_serial</em>' distinto de cero indica que hay un nuevo número de serie pendiente de ser insertado en la ventana del crackme. De ser así, resetea el flag a cero y realiza la llamada a la función '<a href="https://msdn.microsoft.com/en-us/library/windows/desktop/ms645521(v=vs.85).aspx" target="_blank"><em>SetDlgItemText</em></a>'. Al igual que el script anterior, el flag '<em>stop_serial</em>' distinto de cero marcará al hilo que debe finalizar. El script publica con '<em>registersymbol</em>' los dos flags que controlan el flujo del hilo ('<em>stop_serial</em>' y '<em>refresh_serial</em>'), además de un buffer de memoria etiquetado como '<em>serial</em>' donde el script principal en LUA volcará el número de serie que ha calculado, en forma de cadena de caracteres acabada en carácter nulo.</div>
<br />
<h4 style="text-align: justify;">
4. Script principal</h4>
Desde el interfaz principal de Cheat Engine, el script principal en LUA es accesible desde el menú '<em>Table</em>', opción '<em>Show Cheat Table Lua Script</em>'.<br />
<br />
<div style="text-align: justify;">
El script se ha escrito en forma de clase, aunque no es necesario hacerlo así. El objeto principal '<em>CanYou_Trainer</em>' que inicializa al inicio, contendrá las variables y las funciones necesarias.<br />
<br /></div>
<div style="text-align: justify;">
La clase principal tendrá cuatro funciones:</div>
<ol>
<li><em><strong>Main</strong></em>. Inicialización de la ventana principal y de las variables internas.</li>
<li><em><b>OnTimerRefresh</b></em>. En la inicialización se ha creado un timer, y esta será la función que se invocará cada vez que se cumpla el intervalo del timer.</li>
<li><strong><em>OnFormClose</em></strong>. En la inicialización se ha configurado la ventana principal para que ejecute este método cuando va a cerrarse. Libera recursos ordenadamente.</li>
<li><em><strong>CalculateSerial</strong></em>. Se encarga de calcula un serial válido.</li>
</ol>
<div>
<br /></div>
<h3>
<span style="font-weight: normal;">Main</span></h3>
<div style="text-align: justify;">
La ventana principal del <em>trainer </em>es '<em>UDF1</em>'. Se apunta el evento '<em>OnClose</em>' de dicha ventana para que lance a la función '<em>OnFormClose</em>'. Las variables internas de la clase que mantendrán la información importante para calcular el serial válido son:</div>
<ul>
<li><em>volumeID. </em>Número de volumen de la unidad que contiene al directorio actual.</li>
<li><em>randomSeed</em>. Semilla del ratón (<strong><em>SMR</em></strong>).</li>
<li><em>usernameSeed</em>. Semilla del nombre de usuario tecleado en el interfaz del crackme (<em><strong>SMU</strong></em>).</li>
</ul>
<div style="text-align: justify;">
El número de volumen se leerá la primera vez que se dispara el <em>timer</em>, ya que no va a cambiar. Las otras dos semillas se recalcularán en cada intervalo del <em>timer, </em>establecido en un segundo.</div>
<div style="text-align: justify;">
Una vez configurado el <em>timer</em>, y cargados los cinco punteros que apuntan al contenido de la lista de direcciones, se muestra la ventana principal y finaliza la función.</div>
<br />
<h3 style="text-align: justify;">
<span style="font-weight: normal;">OnTimerRefresh</span></h3>
<div style="text-align: justify;">
Las misiones del <em>timer</em> son dos, cargar en el <em>trainer</em> el contexto del proceso del crackme, en caso de que el proceso del crackme se encuentre entre la lista de procesos en ejecución. Una vez <em>enganchado</em> al proceso del crackme, se activarán los hilos de los scripts '<em>GetUserName</em>' y '<em>SetSerial</em>'. A partir de ahí, y mientras el proceso del crackme siga activo, el <em>timer</em> se encargará de mantener actualizados con la última información disponible del crackme, lo que he llamado semillas del ratón y del nombre de usuario (<em><strong>SMR </strong></em>y <em><strong>SMU</strong></em> <a href="http://www.softbreakers.com/p/introduccion-esta-entrada-es-un-anexo.html" target="_blank">en el anexo</a>). La del ratón se leerá directamente de la posición de memoria del proceso del crackme definida en la lista de direcciones. La del nombre del usuario se recalculará cada vez que se detecte que el nombre del usuario tecleado en la interfaz del crackme se ha modificado, usando para ello el script '<em>GetUserName</em>'.<br />
<br /></div>
<div style="text-align: justify;">
Si alguna de las semillas cambia porque variables de las que depende es modificada, se recalcula el nuevo serial llamando a la función '<em>CalculateSerial</em>'. El nuevo serial calculado es inyectado en el control correspondiente del interfaz del crackme usando el script 'S<em>etSerial</em>'.<br />
<br /></div>
<div style="text-align: justify;">
Una vez que el <em>trainer</em> se ha enganchado al proceso del crackme, si éste se cierra, el <em>trainer</em> también se cerrará automáticamente.</div>
<br />
<h3>
<span style="font-weight: normal;">OnFormClose</span></h3>
<div style="text-align: justify;">
Esta función es invocada cuando el usuario cierra la ventana del <em>trainer</em>. Se procede a señalizar a los hilos de los scripts '<em>GetUserName</em>' y '<em>SetSerial</em>' que deben finalizar, y se espera medio segundo antes de deshabilitarlos para liberar sus recursos, tras lo que se cierra el <em>trainer</em>.</div>
<br />
<h3 style="text-align: justify;">
<span style="font-weight: normal;">CalculateSerial</span></h3>
<div style="text-align: justify;">
Cuando desde la función que controla los eventos del <em>timer</em> se detectan cambios en la posición del ratón o en el nombre de usuario introducido en la interfaz del crackme, el serial debe recalcularse. Para ello lee de la memoria del proceso del crackme lo que denominé semilla de la clave de producto (<em><strong>SMP</strong></em>), que junto con las otras dos semillas y el número de volumen obtenidos por el evento del <em>timer</em> permitirán calcular un nuevo serial válido.<br />
<br /></div>
<div style="text-align: justify;">
El nuevo serial, una vez calculado, además de mostrarse en la interfaz del trainer, se copia al portapapeles y además se envía directamente al control correspondiente de la interfaz del crackme mediante la funcionalidad ofrecida por el script '<em>SetSerial</em>'.</div>
<br />
<h4 style="text-align: justify;">
5. Interfaz principal</h4>
<div style="text-align: justify;">
Cheat Engine ofrece un completo asistente gráfico para diseñar ventanas, muy similar al que podemos encontrar en versiones algo más antiguas de entornos de desarrollo como Delphi o Visual Basic.</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjH8-z9eSxqC7lXMroYqtRHiV-6D8OJNvizsG-atnTX7nEkwXbq1MkoOo73Vtt4GHP1C62gpIoGnHJedukOzMaJQuiFNmBRcJRx-4tTOcfMEkA9im4PvBNU_t6f1Mij81rHBs2wj4pxP1kX/s1600/cheatengine_trainerwindow.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjH8-z9eSxqC7lXMroYqtRHiV-6D8OJNvizsG-atnTX7nEkwXbq1MkoOo73Vtt4GHP1C62gpIoGnHJedukOzMaJQuiFNmBRcJRx-4tTOcfMEkA9im4PvBNU_t6f1Mij81rHBs2wj4pxP1kX/s1600/cheatengine_trainerwindow.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Ventana del 'trainer' funcionando</td></tr>
</tbody></table>
<div style="text-align: justify;">
Con una política de '<em>drag & drop</em>', crear un interfaz no requiere de mucha más explicación. Hay que tener en cuenta que a la hora de generar un ejecutable (menú '<em>File</em>', opción '<em>Save as...</em>', y en el desplegable de '<em>Tipo</em>' opción '<em>Cheat Engine Trainer Standalone (*.EXE)</em>'), hay que añadir los ficheros que contienen los recursos que el ejecutable necesite. En este caso, se han añadido dos imágenes del led que aparece en la esquina superior derecha del interfaz, y que señalan si el <em>trainer </em>está <em>enganchado</em> al proceso del crackme (led verde) o no (led rojo).</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPVteRKzR00EYeF-r45e2M_xpFfmfWXFYe-vXzmWPjuvuDIV6QDuncDHXvsn-Bfs_iCVJh0SnlhgTvgf-Cg6yQFFgxvon_ieOM3zIUi1yT1zp-ZH9A1_tLbsZcL0HxxBkWbyMtBqu24tcN/s1600/cheatengine_trainergeneration.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="207" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPVteRKzR00EYeF-r45e2M_xpFfmfWXFYe-vXzmWPjuvuDIV6QDuncDHXvsn-Bfs_iCVJh0SnlhgTvgf-Cg6yQFFgxvon_ieOM3zIUi1yT1zp-ZH9A1_tLbsZcL0HxxBkWbyMtBqu24tcN/s400/cheatengine_trainergeneration.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Inclusión de ficheros de recursos al generar el 'trainer'</td></tr>
</tbody></table>
<h2>
Conclusiones</h2>
<div style="text-align: justify;">
Aunque se ha ideado con el objetivo de los videojuegos en mente, esta versátil herramienta puede utilizarse para muchas otras cosas, e incluso para cosas serias. Corrección de errores en programas de los que no se dispone de los fuentes, creación de herramientas para tests automatizados de aplicaciones en desarrollo, etc... Es cuestión de echarle imaginación.<br />
<br /></div>
<div style="text-align: justify;">
Desde luego, aunque Cheat Engine está pensada para videojuegos, no es ni mucho menos una <em>herramienta de juguete</em>...<br />
<br />
Los archivos necesarios para este tutorial y los generados se encuentran <a href="https://www.dropbox.com/s/zbc45hv26lhpis8/CheatEngine2_files.zip?dl=1" target="_blank">en este enlace</a>.</div>
</div>
Softbreakershttp://www.blogger.com/profile/01666968545873713297noreply@blogger.com0tag:blogger.com,1999:blog-5459690923545315155.post-65065397986290282902015-05-08T02:03:00.000+02:002015-05-08T02:13:02.949+02:00Trampeando videojuegos con Cheat Engine<h2>
Tramposos somos</h2>
<div style="text-align: justify;">
En muchas ocasiones nos encontramos ante un juego en el que conseguir un determinado objetivo se nos pone un poco cuesta arriba, y aunque una y otra vez parece que lo tenemos en la punta de los dedos en el último momento acaba escapándose.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
En estas situaciones, lo normal es priorizar nuestra salud mental y olvidarnos del logro. Pero si no es el caso, no te queda otra que acudir a la noble y admirable perseverancia asiática, reiniciando una y otra vez hasta que se alinean los planetas.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: center;">
<iframe allowfullscreen="allowfullscreen" frameborder="0" height="315" src="https://www.youtube.com/embed/nLWOcJjHV-U" width="560"></iframe></div>
<address style="text-align: center;">
Superando logros. "<em>Classic Mode</em>"</address>
<div style="text-align: justify;">
<br />
Puesto que muchos no tenemos ya la paciencia necesaria para acometer este tipo de tareas de la forma clásica, le echamos un poco de la igualmente famosa picaresca española y sacamos algo así:</div>
<div style="text-align: justify;">
</div>
<a name='more'></a><br />
<div style="text-align: center;">
<iframe allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/_nE2fWnZ6pI" width="420"></iframe></div>
<div style="text-align: center;">
<span style="font-style: italic;">Superando logros... de "otro modo"</span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Aunque el vídeo está editado para acortarlo y destacar los datos importantes, no he usado ningún truco de vídeo para simular una bajada del tiempo contabilizado por el cronómetro, ni he pegado dos trozos de dos partidas distintas. Obviamente hay un truco, pero no es de vídeo. Se llama <em>Cheat Engine</em>.</div>
<br />
<h2>
Cheat Engine</h2>
<div style="text-align: justify;">
<em><a href="http://www.cheatengine.org/index.php" target="_blank">Cheat Engine</a></em> es una curiosa herramienta que une, al igual que lo que nos proponemos desde este blog, el mundo de la ingeniería inversa con el de los videojuegos. Siendo como es una herramienta de <a href="https://github.com/cheat-engine/cheat-engine/" target="_blank">código abierto</a>, presenta una gran cantidad de funcionalidades que la hacen muy versátil, no solo para hacer trampas en videojuegos modificando "<em>al vuelo</em>" parámetros del mismo, si no para otras tareas de ingeniería inversa que no tienen por qué tener como objetivo un videojuego.</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQ4IaTVegeduFxgnfrFqtgovPvrWqMmnlr8tAoEHR9AnV2Bh9ARD_zqVZ6giNCTd1iRlAcIhJojvF0bQGV30IaxZEftK1VGP-QoET5i1jen9XsN0TSuMcr4CMDC3txXX0NmPBly_sF0Pec/s1600/cheatengine_logo.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQ4IaTVegeduFxgnfrFqtgovPvrWqMmnlr8tAoEHR9AnV2Bh9ARD_zqVZ6giNCTd1iRlAcIhJojvF0bQGV30IaxZEftK1VGP-QoET5i1jen9XsN0TSuMcr4CMDC3txXX0NmPBly_sF0Pec/s1600/cheatengine_logo.jpg" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"> Logo de Cheat Engine</td></tr>
</tbody></table>
<div style="text-align: justify;">
El primer objetivo de la herramienta es ayudarnos a localizar en qué posiciones de memoria el videojuego objetivo almacena datos que nos interesan modificar: monedas, puntos, vida, etc... implementando para ello una gran cantidad de modos de búsqueda.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Una vez localizadas aquellas zonas de memoria que albergan datos que nos interesa controlar, la herramienta ofrece varias posibilidades a la hora de controlar el contenido de dichas zonas de memoria.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Técnicamente hablando, y para los que tienen experiencia en programación, <em>Cheat Engine</em> se engancha a un proceso en ejecución como un depurador, lo que le da acceso a la memoria del proceso y al flujo de ejecución del mismo.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Aunque al principio de esta entrada hemos mostrado un ejemplo con el juego <em><a href="http://store.steampowered.com/app/234490/" target="_blank">Rush Bros</a>, </em>para mostrar el funcionamiento básico de la herramienta vamos a usar otro juego que además ser gratuito y todos podemos descargar, tiene su encanto.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
El juego se llama <a href="http://robitgames.com/treasure-adventure-game/" target="_blank"><em>Treasure Adventure Game</em></a>, y como indica el desarrollador en su página se puede descargar desde varios sitios. En mi caso, puesto que tengo cuenta en <a href="http://www.gog.com/game/treasure_adventure_game" target="_blank"><em>GOG</em> me lo he bajado de ahí</a>. Quien lo quiera disfrutar en castellano, también existe <a href="http://freetimespenders.blogspot.com.es/2012/10/treasure-adventure-game-en-espanol-y.html" target="_blank">una traducción</a> disponible entre otros enlaces, <a href="https://app.box.com/s/euyfgcecjs2e21mk7fg5" target="_blank">aquí</a>.</div>
<br />
<h2 style="text-align: justify;">
Rebuscando en la memoria</h2>
<div style="text-align: justify;">
El primer paso es descubrir en qué localización de memoria nuestro programa objetivo almacena el dato o datos que queremos alterar. Para ello, la solución propuesta por <em>Cheat Engine </em>consiste en realizar búsquedas de manera iterativa. En cada iteración, se evalúa el criterio seleccionado por el usuario sobre los posibles objetivos localizados en la iteración anterior. Así, poco a poco, vamos descartando localizaciones de memoria quedándonos cada vez con menos localizaciones que cumplen las condiciones que vamos imponiendo.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Tras cada iteración, podemos modificar el criterio de búsqueda que se realizará en la siguiente, pero teniendo en cuenta que <em>Cheat Engine</em> en la siguiente iteración solo va a evaluar el criterio seleccionado en el conjunto de localizaciones que superaron el criterio de la iteración anterior.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Antes de realizar la primera iteración de búsqueda tenemos que definir qué tipo de dato contiene la variable que vamos a buscar. El tipo de dato se mantendrá constante durante el resto de iteraciones de búsqueda. <em>Cheat Engine</em> ofrece la búsqueda de valores enteros de tamaño de 1 byte a 8 bytes, búsqueda de valores flotantes, o incluso de cadenas de texto.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
En nuestro ejemplo, nuestro personaje en el juego <em><a href="http://robitgames.com/treasure-adventure-game/" target="_blank">Treasure Adventure Game</a></em> dispone de dos contadores, que se muestran en la esquina superior izquierda de la pantalla. Uno de nivel de vida con un valor inicial de 6, y justo debajo otro de monedas con un valor inicial de cero. Nuestro objetivo será controlar ambos valores usando <em>Cheat Engine.</em></div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_wRYyGuAXAUulhOS8lXEPoydMHbPNn7HIurKt_jqPgP7i7BR_4UZvdv0SgmejEiQX8fNbcWYFjQHJs9aj67ld1tIRON29r-JZBmp5ae4QQ5ZU74skPv3vgI-aGgCDKS9LIthWgXeilJ_Q/s1600/tag01.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="239" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_wRYyGuAXAUulhOS8lXEPoydMHbPNn7HIurKt_jqPgP7i7BR_4UZvdv0SgmejEiQX8fNbcWYFjQHJs9aj67ld1tIRON29r-JZBmp5ae4QQ5ZU74skPv3vgI-aGgCDKS9LIthWgXeilJ_Q/s320/tag01.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Captura de Treasure Adventure Game. 6 vidas y 21 monedas</td></tr>
</tbody></table>
<div style="text-align: justify;">
Para llegar a la pantalla que se aprecia en la captura, una vez iniciado el juego, y tras las charlas de turno, nos desplazaremos hacia la derecha hasta llegar ahí. Justo en esa puerta aparecen los primeros enemigos que nos darán monedas al eliminarlos, y nos quitarán vidas al tocarnos... lo que necesitamos para empezar a jugar con </div>
<em style="text-align: justify;">Cheat Engine</em><span style="text-align: justify;">.</span><br />
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
En <em>Cheat Engine</em>, pulsamos el botón '<em>Open Process</em>' y nos aparecerá una ventana con el listado de procesos en ejecución en nuestra máquina. Seleccionamos el proceso del juego, cuyo nombre vendrá precedido con un número en hexadecimal que es el identificador de proceso (aparece en el administrador de tareas de Windows en la pestaña '<em>Procesos</em>', columna '<em>PID</em>'). Aunque el nombre del proceso no cambia, ese identificador de proceso cambia en cada ejecución.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Ya estamos listos para lanzar nuestra primera búsqueda. En el tamaño del tipo de valor dejamos el valor por defecto de 4 bytes, que son más que suficientes para el tamaño de almacenamiento del valor que vamos a buscar. El tipo de búsqueda que vamos a hacer será por valor exacto, y en el control superior tecleamos el número a buscar, que será en este caso el número de vidas que nos quedan. Pulsamos el botón de nueva búsqueda y enseguida el programa nos habrá localizado unos cuantos millares de posiciones de memoria que guardan dicho valor.</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWLJcrBA9M-9LXYrqdDZ4mlegK9di7FQukTO8gxUX-eIEF2O4f6B5yM9TSqPxbKEwgZs-6-KUZ9kDbbg4It3Jus02BMgjf2epUGrOFuRXU0G-3-XD7hn0K-o4iCBttby2f8izD5XSEh2D2/s1600/cheatengine01.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="291" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWLJcrBA9M-9LXYrqdDZ4mlegK9di7FQukTO8gxUX-eIEF2O4f6B5yM9TSqPxbKEwgZs-6-KUZ9kDbbg4It3Jus02BMgjf2epUGrOFuRXU0G-3-XD7hn0K-o4iCBttby2f8izD5XSEh2D2/s320/cheatengine01.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Primera búsqueda para localizar el contador de vida</td></tr>
</tbody></table>
<div style="text-align: justify;">
Como se puede apreciar en la imagen, hemos encontrado algo más de 4700 posiciones de memoria. Si nos desplazamos por el listado, veremos que algunas aparecen en rojo, lo que indica que su valor actual es distinto del que tenía cuando se realizó la búsqueda. <em>Cheat Engine </em>nos muestra en tiempo real el valor almacenado en cada posición de memoria. En este caso, puesto que nuestro nivel de vida en el juego no ha cambiado, podemos repetir la misma búsqueda pulsando el botón '<em>Next Scan</em>'. Del listado actual, <em>Cheat Engine </em>eliminará todas aquellas posiciones que ya no almacenan el valor 6, lo que acortará el número de posibles objetivos.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
En el juego entramos en la cueva y nos dejamos '<em>acariciar</em>' por el primer bicho que encontremos, lo que disminuirá nuestro valor de vida en una determinada cantidad. Volvemos a <em>Cheat Engine</em>, introducimos el nuevo valor de vida restante en la casilla de valor a buscar, y pulsamos en '<em>Next Scan</em>'. La lista disminuirá considerablemente.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Seguimos iterando este proceso de búsqueda las veces necesarias para que, idealmente nos quede una única posición, o al menos un listado de resultados suficientemente corto.</div>
<br />
<h2 style="text-align: justify;">
Confirmando hallazgos</h2>
<div style="text-align: justify;">
Una vez que tenemos un número de posibles objetivos lo más bajo posible, pasamos a modificar manualmente los valores de dichas posiciones de memoria a ver cuál produce el efecto deseado. Sobre la posición de memoria a modificar, sacamos el menú contextual y seleccionamos la opción para cambiar el valor.</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXaRZr8hS4f0mvUAzjnECnA95yPkK2tMQ3P1kaf0_wDVp-iyMay4duB6329UTx7XVFl6lyMb_qD6Mu61MQSXqqYg-W4rH6Us6_aNfix8f2sB9B2iZp6Nd7XnovAgmWBxhbdMk_-XogC2pF/s1600/cheatengine02.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="292" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXaRZr8hS4f0mvUAzjnECnA95yPkK2tMQ3P1kaf0_wDVp-iyMay4duB6329UTx7XVFl6lyMb_qD6Mu61MQSXqqYg-W4rH6Us6_aNfix8f2sB9B2iZp6Nd7XnovAgmWBxhbdMk_-XogC2pF/s320/cheatengine02.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Tras buscar, probamos a cambiar los valores</td></tr>
</tbody></table>
<span style="text-align: justify;">Escribimos el valor que queramos, aunque para evitar errores y puesto que el valor máximo de vidas en el juego es 6, colocamos un valor menor o igual que 6, y pulsamos '</span><em style="text-align: justify;">Ok</em><span style="text-align: justify;">'. Si hemos acertado con la posición de memoria adecuada, el contador de vidas del juego mostrará el nuevo valor introducido.</span><br />
<div style="text-align: justify;">
<br />
Si es así, ya hemos localizado la posición en memoria del contador de vida en el juego. En el mismo menú contextual anterior seleccionamos la opción '<em>Add selected address to the addresslist</em>' para almacenar este valor y que no se nos pierda. La dirección de memoria aparecerá en la lista inferior del interfaz de <em>Cheat Engine</em>, lista que denominaremos <em>Cheat Table</em>. Desde el menú contextual de dicha lista inferior podemos cambiar para esa dirección la columna de descripción por algo más intuitivo como '<em>Vidas</em>'.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Reiniciamos la búsqueda con el botón '<em>New Scan</em>' y repetimos el proceso para las monedas. Cada vez que eliminemos un enemigo, esté soltará monedas que al recogerlas incrementará nuestro contador de monedas, lo que nos permitirá reiterar la búsqueda con el nuevo valor para descartar resultados obtenidos en la búsqueda anterior. En caso de que nos quedemos sin enemigos antes de localizar lo que buscamos, podemos salir y volver a entrar la cueva ya que esto repone los enemigos.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
En el caso de las monedas, la modificación del valor de la dirección de memoria que encontremos no se mostrará inmediatamente en la interfaz del juego ya que el contador de monedas solo se refresca al recoger nuevas monedas o al entrar o salir por una puerta. Al final, tendremos en nuestra <em>Cheat Table</em> un listado de direcciones similar a éste:</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYPkect-J5EbCVi85ywiRrGDlcQaNPe8R54EiiWOTpxzs99rVPD6cA1lv-sKhS0BBqNpNPuqHlw8jyp7ksKCatUNzlHmmrG5F5-TeLOrySZy0NjaDD77wZZP_N_7bQYFBwHoOm72uFXizp/s1600/cheatengine03.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="70" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYPkect-J5EbCVi85ywiRrGDlcQaNPe8R54EiiWOTpxzs99rVPD6cA1lv-sKhS0BBqNpNPuqHlw8jyp7ksKCatUNzlHmmrG5F5-TeLOrySZy0NjaDD77wZZP_N_7bQYFBwHoOm72uFXizp/s320/cheatengine03.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Listado final de direcciones</td></tr>
</tbody></table>
<div style="text-align: justify;">
Antes de dar por finalizada la búsqueda de las direcciones de memoria a controlar, hay que cerciorarse de una cosa. Desde el inicio hemos supuesto que las variables son de un tamaño de 4 bytes, pero ha sido una mera suposición. Posteriormente inyectamos en las posiciones de memoria localizadas valores de 4 bytes, pero si para el programa en realidad son variables de otro tamaño, podemos generar errores en la ejecución del programa.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Por ejemplo, si en realidad la variable que almacena las vidas restantes fuera de dos bytes, y dependiendo del compilador utilizado al generar el juego, es posible que si escribimos cuatro bytes estemos modificando inadvertidamente alguna otra variable adyacente en memoria a la que nos interesa.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
La manera más lógica es comprobar como usa el proceso esa posición de memoria, como la lee y como escribe en ella. Con <em>Cheat Engine</em> esa tarea es extremadamente sencilla, sin tener que acudir a otras herramientas externas de ingeniería inversa. El debugger que incorpora <em>Cheat Engine</em> nos permite acceder al código que escribe o lee una determinada posición de memoria. Lo habilitamos desde el menú contextual de la lista inferior de direcciones, y seleccionamos la opción para cazar los accesos de escritura a la dirección de memoria a comprobar.</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJ9mJfAXoLefkEumoiHUTlCfX4f1c-bV8m80GHEPf50wS1Q_P9wKJjHv3LKYyq0k89Fkpx2eUxEjV9DjLG4Ecos5DyXUO14VkvQng8338I3PTpg-vnuJ9Ar3_kYb6o2Jrty2SvIiDuUiCC/s1600/cheatengine04.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="280" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJ9mJfAXoLefkEumoiHUTlCfX4f1c-bV8m80GHEPf50wS1Q_P9wKJjHv3LKYyq0k89Fkpx2eUxEjV9DjLG4Ecos5DyXUO14VkvQng8338I3PTpg-vnuJ9Ar3_kYb6o2Jrty2SvIiDuUiCC/s320/cheatengine04.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Monitorizando los accesos de escritura a la variable</td></tr>
</tbody></table>
<span style="text-align: justify;">Una vez en marcha el debugger de </span><em style="text-align: justify;">Cheat Engine, </em><span style="text-align: justify;">en el juego realizamos alguna acción que provoque que dicho contador cambie.</span><br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-Jz0zDX1dq0sbRIdudKbip124yfZphaFvKbeWafmoe3bJjwaTnWAmUfbAwOGauqLBpOyUyFXRWPOyNzd939-5sOfklgTPrjjv_CkgKWmJydmnzrsgeko9ENdkw9esVUU3z2Ro_d_CIIoo/s1600/cheatengine05.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="250" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-Jz0zDX1dq0sbRIdudKbip124yfZphaFvKbeWafmoe3bJjwaTnWAmUfbAwOGauqLBpOyUyFXRWPOyNzd939-5sOfklgTPrjjv_CkgKWmJydmnzrsgeko9ENdkw9esVUU3z2Ro_d_CIIoo/s320/cheatengine05.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Resultado de monitorización accesos de escritura</td></tr>
</tbody></table>
<div style="text-align: justify;">
En la ventana del debugger, se nos muestran las instrucciones que escriben en la posición de memoria de interés. En la primera columna se muestra un contador con el número de veces que se ha ejecutado dicha instrucción, y en la segunda se muestra la instrucción propiamente dicha. Al seleccionar cada instrucción, en la parte inferior aparecen las instrucciones adyacentes a la de interés (que aparece marcada al final con '<em><<</em>'), además del contenido de los registros del procesador justo tras ejecutarse la instrucción marcada. En nuestro caso, el registro <i>EAX+08</i> apunta a nuestra variable, y en dicha posición se escribe el contenido del registro <i>ECX</i>, que contiene un cinco ya que acabamos de perder una vida en el juego. En las instrucciones anteriores podemos ver como en <i>ECX </i>se cargaba el contador de vidas actual, y se le restaba el valor de <i>EDX</i>, que valía uno.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Con la información facilitada por el debugger vemos que el contenido de la posición de memoria apuntada se escribe con el contenido del registro <i>ECX</i>, que ocupa 4 bytes, por lo que nuestra variable es de un tipo que ocupa cuatro bytes, así que todo parece estar correcto. También podía haberse dado el caso de que en la posición de memoria se hubiera volcado un valor de 8 bytes, como hubiera sido por ejemplo el registro <i>RCX</i>, <a href="https://msdn.microsoft.com/en-us/library/windows/hardware/ff561499%28v=vs.85%29.aspx" target="_blank">que tiene 64 bits</a>. En estos casos en los que se ha supuesto un tamaño de dato inferior al correcto, también es posible que no estuviéramos apuntando a la posición de memoria en la que se inicia el almacenamiento de la variable, si no a la parte final de la misma, con lo que también tendríamos que corregir ese dato.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Con el botón '<em>More information</em>' accedemos a información extra, como por ejemplo el contenido de la pila cuando se ejecutó dicha instrucción, información que puede ser muy importante para según cuales sean nuestros objetivos. Si fuera necesario, el menú contextual de la lista inferior de dirección, en su opción de '<em>Change record</em>', además de cambiar la descripción como vimos anteriormente, también nos permitirá corregir la variable objetivo, tanto su tamaño como la dirección de la misma.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Ya hemos resuelto la primera complicación: localizar en dónde se almacenan los valores que nos interesa alterar. Lo que sigue depende de lo que queramos hacer. Podemos hacer que <em>Cheat Engine </em>cambie el contenido de esa variable a un valor predeterminado cada vez que pulsemos una combinación de teclas que configuremos, o incluso podemos crear un programa independiente que lo haga, lo que en el mundo de los videojuegos se denomina "<em>trainer</em>", que no es mas que un pequeño programa especializado en modificar determinados parámetros para una versión específica de un juego.</div>
<br />
<h2 style="text-align: justify;">
Explotando los hallazgos</h2>
<div style="text-align: justify;">
La variable (o variables) de interés deben añadirse a la <em>Cheat Table</em>, que es la lista inferior del interfaz, y que contendrá la lista de direcciones de memoria sobre las que se quiere actuar (opción en negrita del menú contextual mostrado anteriormente). Una vez en la lista de direcciones, usando el menú contextual de dicha lista (<em>Change record -> Description</em>), podemos modificar la descripción de cada una de ellas para tenerlo todo ordenado y clarito, y que sepamos a qué se refiere cada variable. Se presentan a continuación las maneras que ofrece<em> Cheat Engine</em> para manipular el contenido de las variables de interés.</div>
<br />
<h3 style="text-align: justify;">
Desde la interfaz de Cheat Engine</h3>
<div style="text-align: justify;">
A la hora de manipular estos valores, la opción más sencilla es desde la propia interfaz de <em>Cheat Engine. </em>Ya hemos visto como podemos modificar cualquier valor de una dirección de memoria listada en la lista de objetivos.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
En nuestro ejemplo, esta solución es válida para en cualquier momento aumentarnos nuestras monedas o vidas restantes, aunque en el caso de las vidas puede hacerse pesado conmutar una y otra vez del juego a la interfaz de <em>Cheat Engine</em> para recuperarnos del último golpe. Además, es posible que es determinadas situaciones no nos de tiempo a conmutar a <em>Cheat Engine</em> para evitar que nos finiquiten en el juego.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Para ello, <em>Cheat Engine</em> dispone de una funcionalidad para "<em>congelar</em>" el valor de una determinada variable. Mientras una variable esté congelada, <em>Cheat Engine</em> vigilará continuamente el valor de la misma, y en caso de que cambie, la devolverá a su estado anterior. La congelación del contenido de una dirección de memoria se habilita desde la columna '<em>Active</em>' de la <em>Cheat Table</em>.</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEho9GQeR8wSYT8fPn-qoHVNf5m2uBNCJW3ZwYq6pjsWBdjQA5mnGeE9LNnziEu-idlih16JJ_LBAmQ10P8lQ5EWbpfHcOKApQAIMwjaKRVcMEBZHVDneHxxp7VSffjpRylsV-fXtmHYjAWe/s1600/cheatengine07.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="82" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEho9GQeR8wSYT8fPn-qoHVNf5m2uBNCJW3ZwYq6pjsWBdjQA5mnGeE9LNnziEu-idlih16JJ_LBAmQ10P8lQ5EWbpfHcOKApQAIMwjaKRVcMEBZHVDneHxxp7VSffjpRylsV-fXtmHYjAWe/s320/cheatengine07.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Contador de vidas "congelado"</td></tr>
</tbody></table>
<div style="text-align: justify;">
Una vez congeladas las vidas, ya podemos volver al juego y no tener que volver a preocuparnos de los golpes que nuestro personaje reciba. Hay que tener en cuenta que la funcionalidad de congelación no evita que el juego cambie la variable. En realidad el juego llega a modificar la variable, pero inmediatamente <em>Cheat Engine</em> detecta el cambio y devuelve la variable al estado anterior. Esto significa que si congelamos el contador de vidas cuando queda una sola vida, y un enemigo nos quita dos de golpe, la partida finalizará a pesar de que <em>Cheat Engine</em> acuda unas décimas de segundo después a intentar restaurar su valor.</div>
<br />
<h3>
Hotkeys</h3>
<div style="text-align: justify;">
Aunque desde la interfaz de <em>Cheat Engine</em> podemos manipular a placer cualquier variable que hayamos localizado, a la hora de realizar manipulaciones continuas de los valores, el tener que conmutar de la tarea del juego al proceso <em>Cheat Engine</em> una y otra vez puede hacerse bastante tedioso. Para evitarlo tenemos los hotkeys. Con <em>Cheat Engine</em> corriendo en segundo plano, y cuando en el juego o programa en cuestión queramos modificar alguna de sus variables, podemos pulsar una combinación de teclas o <em>hotkey</em> que hayamos predefinido para alterar el contenido de dicha variable. Además es posible definir todos los <em>hotkeys</em> que queramos, asignando a cada uno una modificación distinta, pudiendo manejar todas las variables que queramos sin tener que salir del juego en ningún momento, pulsando en cada momento la <em>hotkey</em> adecuada.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Haciendo click derecho en la <em>Cheat Table </em>sobre la variable que queramos modificar, en el menú contextual pulsamos la opción '<em>Set/Change hotkeys</em>'. Se muestra una ventana donde se listan <em>hotkeys</em> previamente definidos para editarlos, o bien podemos crear uno nuevo.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
En la ventana de creación y edición, primero se define el <em>hotkey</em>, que nos es más que la combinación de teclas con la que activaremos la funcionalidad definida debajo. Entramos en dicho control y pulsamos la combinación de teclas deseada. En caso de que queramos eliminar su contenido pulsamos el botón '<em>Clear</em>' de la derecha.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Debajo se define la operación a realizar sobre la variable al activar la funcionalidad mediante el <em>hotkey</em> definido. Las operaciones principales que permite <em>Cheat Engine</em> sobre la variable es congelarla, escribir un valor determinado o bien incrementarla o decrementarla con un valor definido. La opción de congelar la variable viene con varios '<em>sabores</em>', con lo que se amplían las posibilidades. El listado completo de opciones para asignación de funciones a un <em>hotkey</em> es el siguiente:</div>
<br />
<ul>
<li style="text-align: justify;">Altenar la congelación de la variable ('<em>Toggle freeze</em>'). Cada vez que pulsemos el hotkey, el estado de la variable conmutará entre congelada y descongelada.</li>
<li style="text-align: justify;">Altenar la congelación de la variable permitiendo incrementos ('<em>Toggle freeze and allow increments</em>'). Lo mismo que la anterior, aunque se dejará a la variable ser incrementada.</li>
<li style="text-align: justify;">Altenar la congelación de la variable permitiendo decrementos ('<em>Toggle freeze and allow decrements</em>'). Está claro...</li>
<li style="text-align: justify;">Congelar.</li>
<li style="text-align: justify;">Descongelar.</li>
<li style="text-align: justify;">Escribir valor ('<em>Set value to:</em>'). Se escribe en la variable el valor que pongamos debajo.</li>
<li style="text-align: justify;">Decrementar valor ('<em>Decrease value with:</em>'). Se decrementa la variable por el valor que definamos</li>
<li style="text-align: justify;">Incrementar valor ('<em>Increase value with:</em>'). Incremento por el valor que definamos.</li>
</ul>
<div style="text-align: justify;">
Finalmente hay un control para agregar una descripción de la funcionalidad que estamos definiendo.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
En nuestro ejemplo vamos a crear un <em>hotkey</em> sobre el contador de vidas que hemos localizado para obtener la invulnerabilidad. Definimos la funcionalidad con estos valores:</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfuF2wHZpC1dj8uS3zSPmXPVdgP1DbohnUTUL_ose864rHLMMSzySjBBeO1ojvBZyBtP8jTJg72lqomn-tV2vKL_A1r9AI-Im_x2JHe7uZmNZ9e1_XiQu0RRFCHaUCNkueo_zjJIctMGTo/s1600/cheatengine06.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="247" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfuF2wHZpC1dj8uS3zSPmXPVdgP1DbohnUTUL_ose864rHLMMSzySjBBeO1ojvBZyBtP8jTJg72lqomn-tV2vKL_A1r9AI-Im_x2JHe7uZmNZ9e1_XiQu0RRFCHaUCNkueo_zjJIctMGTo/s320/cheatengine06.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Vidas infinitas</td></tr>
</tbody></table>
<div style="text-align: justify;">
Con los valores definidos, al pulsar la tecla '<em>Control</em>' junto con la tecla '<i>V</i>', congelaremos el contador de vidas. Si volvemos a pulsar la combinación de teclas la descongelaremos. Y todo sin salir del juego.</div>
<br />
<h3 style="text-align: justify;">
Punteros, clases, objetos y otras zarandajas</h3>
<div style="text-align: justify;">
A estas alturas, más de uno se habrá dado cuenta que aunque <em>Cheat Engine</em> permite grabar los hallazgos de la <em>Cheat Table</em> para reusarlos en futuras ocasiones, al volver a arrancar <em>Cheat Engine</em>, el juego en cuestión, cargar el proceso del juego en <em>Cheat Engine</em> y recargar el fichero <em>*.CT</em> que <em>Cheat Engine</em> creó con nuestras variables, el contenido de las direcciones de memoria recargadas ya no es el que esperamos, y tenemos que volver a buscar la nueva localización de nuestras variables.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Esto se debe a que en la metodología de programación actual se utilizan variables dinámicas, en lugar de variables estáticas. Y esto es así sobre todo en lenguajes orientados a clases y objetos. Visto a bajo nivel, una clase viene a ser una definición de una estructura de datos, que se denominan propiedades de la clase. Esta clase no ocupa espacio en memoria, ni es directamente utilizable, es meramente una definición. Los objetos son instancias de clases, que cumplen con la definición de la clase que implementan, y estos ya sí ocupan espacio en memoria. Este espacio de memoria que ocupa el objeto es el necesario para almacenar todas las propiedades que define la clase de dicho objeto.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Por poner un símil en la vida real, podemos tener una idea abstracta de lo que es un coche y como se define. A partir de dicha definición, podemos heredar una idea abstracta de cómo es nuestra marca y modelo favorito de coche, que cumplirá todas las definiciones de un coche genérico y además incluirá otras más específicas. Eso serían las clases, donde '<em>Coche</em>' sería la clase padre, y '<em>MarcaX_ModeloY</em>' sería una de las posibles clases hija de la anterior. Ambas son definiciones abstractas, que no ocupan lugar en el mundo físico. El '<em>objeto</em>' sería el coche con matrícula XXXX y nº de bastidor YYYY que tenemos aparcado en el garaje, que es una implementación de la clase '<em>MarcaX_ModeloY</em>', y que ocupa un espacio y lugar en el mundo físico.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Volviendo a nuestro juego, podemos tener una clase '<em>Personaje</em>' que define una estructura de datos que define los parámetros necesarios para el funcionamiento del mismo, como puede ser la localización del personaje, el recurso visual usado para mostrarlo en el juego, etc... y como hemos visto otro de dichos datos puede ser nuestra variable '<em>Vidas</em>', que ocupa 4 bytes. A partir de la clase anterior, puede definirse otra clase heredera '<em>Protagonista</em>' que tenga todas las características de la clase padre '<em>Personaje</em>' y que además añada otros datos adicionales como puede ser una variable '<em>Monedas</em>' también de 4 bytes.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Al iniciar una partida el programa creará un objeto de la clase '<em>Protagonista</em>' para controlar el personaje que manejamos. Este objeto contendrá, entre otras cosas, los contadores <em>Vidas</em> y <em>Monedas</em> en los que estamos interesados. Al crearse el objeto, a partir de una dirección de memoria se reserva el espacio necesario para ubicar todas las propiedades de la clase. Todos los objetos de una misma clase almacenan sus propiedades en el espacio de memoria asignado de la misma manera y en el mismo orden. Así, si suponemos dos objetos distintos de la clase '<em>Protagonista</em>', en ambos la distancia en bytes desde el inicio del objeto en memoria hasta el elemento <em>Vidas</em> coincidirá.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Cada vez que desde <em>Cheat Engine</em> localizamos estas variables, encontramos direcciones de memoria que pertenecen al objeto de la clase '<em>Protagonista</em>' que el juego tiene creado en ese momento. El problema es que cada vez que se inicia el juego, y se vuelve a crear el objeto de la clase '<em>Protagonista</em>', éste se almacena en una dirección completamente arbitraria, con lo que la posición en memoria de los contadores que nos interesan habrá cambiado.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
De esta manera, si no queremos tener que repetir la búsqueda de las variables cada vez que arranquemos el juego, tendremos que fijarnos en otra cosa que no cambie. Lo que tendremos que buscar es en qué posiciones de memoria el juego guarda la dirección de memoria a partir de la cual se almacenan las propiedades del objeto '<em>Protagonista</em>', o dicho en otras palabras, localizar lo que se denomina el <a href="http://es.wikipedia.org/wiki/Puntero_(inform%C3%A1tica)" target="_blank">puntero</a> al objeto 'Protagonista'. Un puntero es una dirección de memoria en la que se almacena a su vez la dirección de memoria en la que hay un determinado dato. A partir de la dirección de inicio del objeto, acceder a sus propiedades se reduce a sumar un desplazamiento fijo.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
¿Como hacemos esto en <em>Cheat Engine</em>? La búsqueda de punteros se realiza de manera iterativa, similar a la búsqueda de valores. Si nos hemos fijado tras realizar varias veces las búsquedas de los contadores, ambos cambian de dirección en cada ejecución del juego, pero siempre hay una distancia fija de 16 bytes (0x10 en hexadecimal) entre ambos. Así, localizando un puntero que apunta a uno de ellos, también obtendremos el otro. Y cuando digo 'un puntero' me refiero a que pueden haber decenas de punteros válidos en el programa que apunten al mismo objeto, que puede estar referenciado desde varios sitios. Cualquiera de ellos nos valdría para nuestros propósitos.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Al igual que la búsqueda de valores, <em>Cheat Engine</em> usa un método 'ciego' para buscar posibles punteros a nuestra dirección de interés. Para las localizaciones de memoria que encuentre almacenadas en la memoria del proceso, buscará cuales pueden enlazarse mediante uno o más saltos (<em>offsets</em>) con la dirección de interés cumpliendo los requisitos que indiquemos en la ventana de configuración de la funcionalidad.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Por ejemplo, nos centramos en el contador de monedas, y en su menú contextual seleccionamos '<em>Pointer scan for this address</em>'. La ventana nos aparecerá inicialmente configurada con la dirección de interés en la parte superior.</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTtyQduBsWUdL2rD0WrjErK8M3ouIr7JSLoa4Lj-4aKi1Vym0tKUE_T61Q7cSPk2_Zd61thcVl4Z_Ct8wNb8rUanX_g5w3vje8UyH1FD1nUevDoAKULC_z2eHEI6GbFE007iDTvAOVffNK/s1600/cheatengine08.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTtyQduBsWUdL2rD0WrjErK8M3ouIr7JSLoa4Lj-4aKi1Vym0tKUE_T61Q7cSPk2_Zd61thcVl4Z_Ct8wNb8rUanX_g5w3vje8UyH1FD1nUevDoAKULC_z2eHEI6GbFE007iDTvAOVffNK/s320/cheatengine08.png" width="228" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Configuración búsqueda de punteros</td></tr>
</tbody></table>
<div style="text-align: justify;">
En la ventana hay muchas opciones, muchas de las cuales pueden parecer bastante crípticas tanto para novatos como para menos novatos...</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Inicialmente los más importantes pueden ser los del final, que van a permitir acotar y delimitar el universo, inicialmente casi infinito, sobre el cuál Cheat Engine va a realizar la búsqueda.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
El primer parámetro, '<em>Maximum offset value</em>' va a limitar el máximo tamaño de salto que va a contemplar el algoritmo de búsqueda. Tal y como está configurado, la distancia máxima de salto será de 2048 bytes, 0x800 en hexadecimal. Así, si el algoritmo encuentra una dirección de memoria almacenada, o sea, un puntero, solo estudiará el rango 4096 bytes situados alrededor del destino de dicho puntero. Si en ese rango no encuentra la manera de enlazar con el destino (directa o indirectamente a través de otro puntero), descartará dicho puntero.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
El segundo parámetro define el número máximo de saltos para llegar a la dirección destino. Tal y como se dijo anteriormente, un puntero es una posición de memoria que alberga la dirección de memoria de otro dato... la historia es que ese otro dato también puede ser a su vez otro puntero, y así hasta aburrir... El enlace entre un puntero y su anidado es lo que llamo un salto. El parámetro '<em>Max level</em>' define el número de saltos que va a contemplar el algoritmo de búsqueda para, a partir de localizar un puntero, llegar a la dirección de destino.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Dependiendo de la potencia del PC, y sobre todo de estos dos últimos parámetros, el algoritmo tardará más o menos tiempo en finalizar. Inicialmente definimos unos parámetros muy restrictivos dejando el '<em>Max level</em>' a dos o tres. Si con esa configuración no encontramos una solución consistente, siempre podemos aumentar esos dos parámetros para aumentar el universo de búsqueda.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Mientras que el resultado no tenga un número manejable de registros, reiteraremos la búsqueda para disminuirlos. En mi caso, con '<em>Max level</em>' a tres me ha arrojado 642 posibles punteros. Para ello, sin cerrar la ventana de búsqueda de punteros, cerramos el juego, lo volvemos a arrancar, y desde la interfaz principal de <em>Cheat Engine</em> repetimos la búsqueda de nuestro contador de monedas, que ahora estará localizado en una nueva posición de memoria. Una vez localizado, apuntamos el valor y volvemos a la ventana de búsqueda de punteros para filtrar aquellos punteros que ahora apuntan a la nueva dirección de dicho contador. Pulsamos en el menú '<em>Pointer scanner</em>', opción '<em>Rescan memory</em>', e introducimos la nueva dirección del contador de monedas. Un posible puntero válido de los localizados en la primera búsqueda debe apuntar a esta nueva dirección para no ser descartado.</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBCe2Qei8YnsMGJ4sKASLPNHjmIS5Sc5fQSAySuNguJST30SokYxXvEBf6n-Uuj7SaoIIuoeSjcH_D1Z8BQq7gdCDTMv9ial-AOzEWzKRmAsh2SzeGFiKvWFUNGtnp8ElLvPHIa4Ru6BJ7/s1600/cheatengine09.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="298" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBCe2Qei8YnsMGJ4sKASLPNHjmIS5Sc5fQSAySuNguJST30SokYxXvEBf6n-Uuj7SaoIIuoeSjcH_D1Z8BQq7gdCDTMv9ial-AOzEWzKRmAsh2SzeGFiKvWFUNGtnp8ElLvPHIa4Ru6BJ7/s320/cheatengine09.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Filtrando la búsqueda de punteros tras reiniciar el juego</td></tr>
</tbody></table>
<span style="text-align: justify;">Tras aplicar este filtrado, los resultados se reducen bastante.</span><br />
<span style="text-align: justify;"><br />
</span> <br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgX8832sW6gIHohvdAEqIuPz2pxDQaJNFjcIILugToqCoRsno4SVR8lkhRFD3TCBdNIWhSZYplB5SNbpSht21WJdbP7FT4jZEx9tBbkobD1b9coNZmoiUrPUKSPInc53vJFsCnI0XVgmj0R/s1600/cheatengine10.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="123" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgX8832sW6gIHohvdAEqIuPz2pxDQaJNFjcIILugToqCoRsno4SVR8lkhRFD3TCBdNIWhSZYplB5SNbpSht21WJdbP7FT4jZEx9tBbkobD1b9coNZmoiUrPUKSPInc53vJFsCnI0XVgmj0R/s320/cheatengine10.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Punteros localizados tras el primer filtrado</td></tr>
</tbody></table>
<div style="text-align: justify;">
Aunque repitamos el proceso, el número de punteros válidos no va a disminuir mucho más. Como era de esperar el mismo objeto puede estar referenciado en distintos lugares. Toca ahora elegir con cual nos quedamos.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Lo primero es explicar esa ventana. La primera columna indica el módulo y dirección relativa dentro de dicho módulo en el que se encuentra el puntero. Cuando lanzamos un ejecutable, el sistema operativo cargará en memoria los módulos que precisa. Como mínimo cargará un módulo, que es el propio ejecutable en sí. Luego, en la mayor parte de las ocasiones, cargará otras librerías que usa el ejecutable, y que constituyen el resto de módulos del proceso.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
'<i>THREADSTACK#0</i>' no referencia a un módulo, sino a la pila de uno de los hilos del proceso, en concreto del hilo 0, o sea, del hilo principal. La pila, <a href="http://es.wikipedia.org/wiki/Pila_(inform%C3%A1tica)" target="_blank">es un espacio de memoria reservado para cada hilo en ejecución</a> que se usa para pasar parámetros cuando se invoca un procedimiento o función, además de mantener la dirección de retorno para cuando se finalice la llamada al procedimiento.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Las columnas '<em>Offset</em>' indican la distancia en bytes a la que referencia el puntero localizado. Excepto la última, cada columna representa un salto de un puntero a otro anidado. Puesto que nuestro parámetro '<em>Max level</em>' lo acotamos a tres, no encontraremos punteros con más de tres columnas 'O<em>ffset</em>'. Para explicarlo mejor, hacemos doble click sobre el tercer resultado que en mi caso tiene tres columnas de offset con valores hexadecimales C8, 268 y18. Este puntero se añadirá a la lista <em>Cheat Table</em> del interfaz principal. Pulsamos sobre el con el botón de la derecha y seleccionamos en el submenú '<em>Change record</em>' la opción '<em>Address</em>'.</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTTttkGi0LqXAK30Pw-bxuKiUveTPTaki_y7iTUL0Xzyqu34A57CSjc4GluIiARvN9H3uyrETG52XkLxjTChYDtvnJ-t4sw8jzY6YQWbAxf6cr1HaOEryRH0qOFj9O0EwXZTRHEW7fq73Z/s1600/cheatengine11.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTTttkGi0LqXAK30Pw-bxuKiUveTPTaki_y7iTUL0Xzyqu34A57CSjc4GluIiARvN9H3uyrETG52XkLxjTChYDtvnJ-t4sw8jzY6YQWbAxf6cr1HaOEryRH0qOFj9O0EwXZTRHEW7fq73Z/s320/cheatengine11.png" width="250" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Estructura de un puntero</td></tr>
</tbody></table>
<div style="text-align: justify;">
La referencia para explicar la información de dicha ventana se lee desde abajo hacia arriba, y nos ayudamos con la calculadora de Windows en su vista de programador:</div>
<ol>
<li style="text-align: justify;">Este puntero se encuentra en la dirección relativa hexadecimal 0x59A0C del módulo principal. Su contenido apunta a la dirección <span style="color: #00ccff;">0x6301A0</span>.</li>
<li style="text-align: justify;">En el offset 0xC8 de dicha dirección, o sea, en la dirección 0x630268 (<span style="color: #00ccff;">0x6301A0</span> + 0xC8) encontramos un nuevo puntero que apunta a la dirección <span style="color: #339966;">0x630948</span>.</li>
<li style="text-align: justify;">En el offset 0x268 de dicha dirección, o sea, en la dirección 0x630BB0 (<span style="color: #339966;">0x630948</span> + 0x268) encontramos un nuevo puntero que apunta a la dirección <span style="color: red;">0x2BB5E00</span>.</li>
<li style="text-align: justify;">Y llegamos a la dirección destino (0x2BB5E18) sumando un offset de 0x18 a la dirección <span style="color: red;">0x2BB5E00 </span>anterior. El contenido de la dirección destino es nuestro ansiado contador de monedas, que en estos momentos refleja un valor de 6.</li>
</ol>
<div style="text-align: justify;">
Siguiendo la lógica de clases y objetos que se comentó anteriormente, 0x2BB5E00 es la dirección a partir de la que se almacena nuestro presunto objeto de la clase '<em>Protagonista</em>', mientras que el offset 0x18 indica el desplazamiento dentro de dicho objeto para llegar a la propiedad que almacena el contador de monedas.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Finalmente la última columna de la lista de punteros localizados indica la dirección final a la que apunta el puntero y el valor que dicha dirección almacena. En nuestro caso, todos apuntan a nuestro contador actual de <em>Monedas</em>, y en mi caso tengo 6 monedas, como así debe reflejar la interfaz del juego.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Lo lógico parece que es quedarnos con el puntero que aparece en la quinta línea. Es el que tiene menos "saltos" hasta llegar al objetivo, y además es una variable que está dentro del módulo principal. Eliminamos el resto de direcciones que tengamos en la <em>Cheat Table</em>, y hacemos doble click sobre el quinto puntero de la lista de resultados de la búsqueda. Lo etiquetamos como 'Puntero monedas'.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
El contador de vidas vimos que se encuentra en el mismo objeto, pero aplicando un offset adicional de 16 bytes (0x10 en hexadecimal) respecto al del contador de monedas. Volvemos a hacer doble click sobre el quinto puntero para volverlo a añadir, pero ahora editamos manualmente el último offset de 0x18 a 0x28, y colocamos una descripción adecuada.</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpyT3akdOAHgmvQHFZXQKmmeWkE525xWLcCnyIQogQyDfHXno5tXWA57u_Y-lvsIDwVqGSpisUbAqCxCSB1G-9QzYf81UlCCQ5MpHj4BzZc-e7VvBrZ8gvY0THlcYwxvIcSoGC_oiCLqui/s1600/cheatengine12.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpyT3akdOAHgmvQHFZXQKmmeWkE525xWLcCnyIQogQyDfHXno5tXWA57u_Y-lvsIDwVqGSpisUbAqCxCSB1G-9QzYf81UlCCQ5MpHj4BzZc-e7VvBrZ8gvY0THlcYwxvIcSoGC_oiCLqui/s1600/cheatengine12.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Ajuste manual del contador de vidas</td></tr>
</tbody></table>
<div style="text-align: justify;">
Al final, donde antes teníamos las direcciones que apuntaban directamente a los contadores de vidas y monedas, ahora tenemos dos direcciones estáticas junto con los offsets a aplicar para llegar la variable que apunta al objeto creado dinámicamente (el primer offset de 0x268) y a las propiedades dentro del mismo que almacenan ambos valores (0x18 para las monedas y 0x28 para las vidas). Estos punteros pueden utilizarse para controlar el valor de la variables de interés de la misma manera que se expuso en las secciones anteriores utilizando las direcciones finales directamente.</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgo-6-1vMORjn5u1V5N-s-HAOkiiqrHQIadDgTUufieVMBWMIOr5Frg5vnW1MMmdHrSF_pUwjBxHSbJh1e34JIHEWcJV3t8OqM7C2IVU8DqaubCVPQJ_coIl5Q_rTaDka1TLOHXy10jzvl2/s1600/cheatengine13.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="85" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgo-6-1vMORjn5u1V5N-s-HAOkiiqrHQIadDgTUufieVMBWMIOr5Frg5vnW1MMmdHrSF_pUwjBxHSbJh1e34JIHEWcJV3t8OqM7C2IVU8DqaubCVPQJ_coIl5Q_rTaDka1TLOHXy10jzvl2/s320/cheatengine13.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Tabla final de punteros</td></tr>
</tbody></table>
<div style="text-align: justify;">
Esta tabla final podemos guardarla, ya que no cambiará en futuras ejecuciones del juego. De hecho el archivo resultante podemos compartirlo con los amigos ya que les servirá igualmente, siempre y cuando usen la misma versión del juego. A partir de esta <em>Cheat Table</em> seguiremos trabajando para lograr otras cosas interesantes...</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
En la página de <em>Cheat Engine</em> se pueden encontrar también <em>Cheat Tables</em> como la que acabamos de generar <a href="http://www.cheatengine.org/tables.php" target="_blank">subidas por la comunidad para multitud de juegos</a>.</div>
<br />
<h3 style="text-align: justify;">
'<em>Nopeando</em>' el código del objetivo</h3>
<div style="text-align: justify;">
Como se comentó en una sección anterior, congelar desde <em>Cheat Engine</em> el contenido de una de las direcciones de memoria tiene sus problemas ya que lo que hace <em>Cheat Engine</em> es monitorizar el valor de la variable, y en el momento en que detecta que ha habido un cambio, la restaura a su valor inicial, pero el cambio se llega a producir. En el caso de nuestro ejemplo en el que congelamos el contador de vidas restantes, el que el cambio se produzca puede provocar que la partida finalice sin remedio si tras el cambio la variable llega a ser cero.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Otro de los mecanismos que ofrece <em>Cheat Engine</em> se basa en eliminar la instrucción que cambia el valor de una variable que no queremos que se vea modificada. Lo que realiza la herramienta es una modificación en el código del programa, sustituyendo una instrucción por una secuencia de instrucciones de ensamblador '<em>NOP</em>' (<em>No Operation</em>). Esta instrucción especial hace que el procesador no haga absolutamente nada. El código máquina de esta instrucción ocupa un único byte, por lo que si la instrucción a sustituir ocupa más espacio, cada uno de sus bytes es sustituido por una instrucción '<em>NOP</em>'.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Tal y como se hizo cuando intentamos determinar el tamaño de las variables, lanzamos desde <em>Cheat Engine</em> la funcionalidad para monitorizar los accesos de escritura hacia la variable que contiene el contador de vidas restantes, que ya la tenemos en forma de puntero dinámico en nuestra lista de objetivos. Al tratarse ahora de un puntero, <em>Cheat Engine</em> nos consulta si queremos buscar las instrucciones que escriben el puntero, o bien las que escriben en la dirección apuntada por el puntero.</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXbJfV9Au80k9xO2KkIozP695aP_kitImvdtO7TEfcofe9rBpRGBhWNnzS8LDgUsCJHS40ZHsGxdfAh631usKM0fyQOj6OCOKaA8xsfr8-D7q6U3MENubWK7i0ReM3Ylv5dRyt2aZdeoda/s1600/cheatengine14.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="126" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXbJfV9Au80k9xO2KkIozP695aP_kitImvdtO7TEfcofe9rBpRGBhWNnzS8LDgUsCJHS40ZHsGxdfAh631usKM0fyQOj6OCOKaA8xsfr8-D7q6U3MENubWK7i0ReM3Ylv5dRyt2aZdeoda/s320/cheatengine14.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Buscar accesos a un puntero o a la dirección a la que apunta</td></tr>
</tbody></table>
<div style="text-align: justify;">
Seleccionamos la opción inferior, y en el juego intentamos que cambie el contador de vidas para ver qué ocurre, y desde dónde ocurre. Una vez que se capturen las instrucciones que modifican nuestra dirección al realizar una determinada acción en el juego (como puede ser perder vidas por contactar con un enemigo), pulsamos sobre las mismas para ver información ampliada.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
En el caso de nuestro juego de ejemplo, solo ha aparecido una única instrucción, lo que facilita las cosas. Aunque ya podríamos eliminar dicha instrucción mediante la opción '<em>Replace with code that does nothing (NOP)</em>' deberíamos comprobar si esa instrucción se usa para modificar otras variables. Para ello activamos la opción para verificar los accesos que realiza dicha instrucción a otras variables, y jugamos un poco en el juego para hacer que el código corra...</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZTvOurgTBlJbVqD877gBrhyA6LzrbmrasRoCcdQgpQBFL25UKSP1LiH5FlEbbrJc6eYYyk-8Xahdnh1622XE_mZ8VnaIE3nRnyOyuxsAOguyRW4dTP-tPAK9EQm4WMUsqZgOYxQgyjveL/s1600/cheatengine15.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="178" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZTvOurgTBlJbVqD877gBrhyA6LzrbmrasRoCcdQgpQBFL25UKSP1LiH5FlEbbrJc6eYYyk-8Xahdnh1622XE_mZ8VnaIE3nRnyOyuxsAOguyRW4dTP-tPAK9EQm4WMUsqZgOYxQgyjveL/s320/cheatengine15.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Verificando las instrucciones que acceden al contador de vidas</td></tr>
</tbody></table>
<div style="text-align: justify;">
Una de las cosas que podemos realizar en el juego es comprar una gorra azul que venden en la tienda que se muestra en la siguiente captura. Tendremos que incrementar nuestro contador de monedas al menos hasta 100 para poder adquirirla, pero es algo que ya sabemos hacerlo.</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLJiUYLPupBtHdMdIciyLbKGcxchqDI5GetKKB7msQwbbN33AWVXxI3ddQPvwtI6PehMWylCkLHvVKtAiXOzvSvEI331httzFq67NIqvIxvtzNnBEM9OOTTgD2Nn9893Mz8MZr5nZu-oZ_/s1600/tag02.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="239" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLJiUYLPupBtHdMdIciyLbKGcxchqDI5GetKKB7msQwbbN33AWVXxI3ddQPvwtI6PehMWylCkLHvVKtAiXOzvSvEI331httzFq67NIqvIxvtzNnBEM9OOTTgD2Nn9893Mz8MZr5nZu-oZ_/s320/tag02.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Tienda en Treasure Adventure Game</td></tr>
</tbody></table>
<div style="text-align: justify;">
Al comprar la gorra veremos que la misma instrucción utilizada para decrementar el contador de vidas también se usa para decrementar el de monedas. Tras un rato jugando con el juego encontramos estos resultados:</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtP74qyL_ZuvGg11xZKil3UtrVFCBSqnQ1bvabSz_CLwx8gIhjdycHHXITWl0e7lVSn0Fy0vTHNzYLFF64d2hJLJupXqAvRyyMjSwshLNk4vT2iYJesVRPWm1dsncNAEscZncUfRXZl4vW/s1600/cheatengine16.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtP74qyL_ZuvGg11xZKil3UtrVFCBSqnQ1bvabSz_CLwx8gIhjdycHHXITWl0e7lVSn0Fy0vTHNzYLFF64d2hJLJupXqAvRyyMjSwshLNk4vT2iYJesVRPWm1dsncNAEscZncUfRXZl4vW/s320/cheatengine16.png" width="299" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Accesos de escritura al contador de vidas</td></tr>
</tbody></table>
<div style="text-align: justify;">
<em>Cheat Engine</em> ha registrado que el contador de vidas ha sido escrito por tres instrucciones distintas. Además estas instrucciones escriben en otras direcciones. En la primera columna se detalla el número de veces que cada instrucción ha sido ejecutada y entre paréntesis el número de direcciones distintas a las que ha accedido. Si hacemos doble click sobre la primera, que es la que nos decrementa vida cuando contactamos con un enemigo, se nos muestran dos ventanas adicionales:</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcYjjyEA_bV0DC0VviPRihg-fARR4SHur9UnSYVXwLp5-slmpnLfOcS4uYtQHTGNSLXO5ccTGZLyAyJb8FCrN4Lox0dlcv3X2W0IhJhkSzn8OUxuCrf8MGR9n0FuzAO9lZLhPqd9eqho9v/s1600/cheatengine17.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="132" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcYjjyEA_bV0DC0VviPRihg-fARR4SHur9UnSYVXwLp5-slmpnLfOcS4uYtQHTGNSLXO5ccTGZLyAyJb8FCrN4Lox0dlcv3X2W0IhJhkSzn8OUxuCrf8MGR9n0FuzAO9lZLhPqd9eqho9v/s320/cheatengine17.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Información adicional sobre accesos de escritura a variables</td></tr>
</tbody></table>
<div style="text-align: justify;">
Efectivamente, la instrucción que decrementa nuestro contador de vidas (0x2A95E28), también ha decrementado nuestro contador de monedas (0x2A95E18) al comprar la gorra en la tienda del juego. Si eliminamos dicha instrucción nuestro contador de vidas no se decrementaría, y como efecto colateral nuestro contador de monedas tampoco... genial ¿no?. Pues inicialmente sí, pero es posible que se produzcan efectos no deseados si más adelante durante el desarrollo del juego la instrucción vuelve a ser utilizada para decrementar otras variables sobre la que aún no ha actuado, y tampoco nos deberíamos arriesgar a producir errores en el juego.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Más adelante veremos como realizar esta modificación del código de una manera condicional, de manera que la modificación sea efectiva cuando se accede a la variable que queremos, pero que para el resto de direcciones de memoria el programa funcione normalmente.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Para '<em>nopear</em>' una instrucción la seleccionamos y pulsamos el botón '<em>Replace</em>', o bien seleccionamos la acción adecuada desde el menú contextual que vimos anteriormente. Le damos un nombre a la modificación que vamos a realizar, por ejemplo '<em>Inmunidad</em>', y aceptamos los cambios. Desde la ventana principal de la herramienta podemos acceder a listado de modificaciones de código realizadas mediante el botón '<em>Advanced Options</em>' de la esquina inferior izquierda.</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgS-CGR9Pcri0X3lKc3nQwGDzHqi6qvbx3xExgL3LPj9tNy_YIDGDqxBQyd_mxpdfnx_RuL7TMHalak_IwEu7vPDwRrrsbT4xBBfoQO5ElD-fphDHVlWKYPpFy1wQY8f-5S3AbG-FWOK2Tl/s1600/cheatengine18.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="228" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgS-CGR9Pcri0X3lKc3nQwGDzHqi6qvbx3xExgL3LPj9tNy_YIDGDqxBQyd_mxpdfnx_RuL7TMHalak_IwEu7vPDwRrrsbT4xBBfoQO5ElD-fphDHVlWKYPpFy1wQY8f-5S3AbG-FWOK2Tl/s320/cheatengine18.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Ventana con listado de instrucciones modificadas</td></tr>
</tbody></table>
<div style="text-align: justify;">
Desde esa ventana podemos hacer y deshacer a voluntad las modificaciones realizadas a las instrucciones listadas con el menú contextual. Si pulsamos sobre la primera opción en negrita se nos mostrará el listado en ensamblador de esa zona del juego. Antes de deshacer o rehacer una modificación del código, es recomendable pausar el juego con el botón superior de dicha ventana. Las instrucciones ya '<em>nopeadas</em>' aparecerán en rojo mientras que las que se encuentran en su estado original en negro.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
En el juego jugamos un poco y vemos que efectivamente nuestra vida no se decrementa, y cuando compramos algún artículo nuestras monedas tampoco. A diferencia de la '<em>congelación</em>' realizada por la herramienta mediante monitorización, con esta solución la variable nunca es decrementada, por lo que en la interfaz del juego no se aprecian los cambios en el contador de vida restante durante las décimas de segundo que sí eran visibles con la otra opción.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Antes de cerrar <em>Cheat Engine</em> guardamos nuestro trabajo. Las instrucciones de interés listadas en la ventana '<em>Advanced options</em>' se guardarán junto con nuestro punteros a los contadores a modificar.</div>
<br />
<h3 style="text-align: justify;">
Inyección de código</h3>
<div style="text-align: justify;">
Si todo lo anterior ha parecido interesante, llegamos a la parte más divertida. En la sección anterior se ha modificado el programa objetivo eliminando aquellas instrucciones que no nos interesaba que se ejecutaran. En esta sección vamos a inyectar nuestro código en el programa objetivo, pudiendo hacer lo que queramos, o al menos lo que nuestros conocimientos nos permitan hacer. Para entender completamente esta sección es necesario tener algunos conocimientos básicos de ensamblador.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Volvemos a nuestra ventana 'A<em>dvanced Options</em>' y hacemos doble click sobre la instrucción en la que queremos realizar modificaciones, que es la que nos decrementaba los contadores, tanto de monedas como de vidas, y puede que otros que aún no hemos descubierto. Se nos abrirá una ventana '<em>Memory Viewer</em>' con el listado en ensamblador del programa objetivo centrado en la instrucción de interés, y con un volcado de memoria en la parte inferior.</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7vKdZ3pRgDbguHR0HqF1H_6WezVXn6iv_YzY9UANSsULSQhWZsAe_x1F_iWZzcxJiMYT6eTs02dqhEGI5Hjn4cuaUbt6_unhSO7pgtrPrV1Yy9jAjNk9bnZWQMtQzY-n0twcuXkrQaMcx/s1600/cheatengine19.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="225" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7vKdZ3pRgDbguHR0HqF1H_6WezVXn6iv_YzY9UANSsULSQhWZsAe_x1F_iWZzcxJiMYT6eTs02dqhEGI5Hjn4cuaUbt6_unhSO7pgtrPrV1Yy9jAjNk9bnZWQMtQzY-n0twcuXkrQaMcx/s320/cheatengine19.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">El meollo del asunto</td></tr>
</tbody></table>
<div style="text-align: justify;">
A poco que naveguemos por las opciones de los distintos menús tanto contextuales como de los menús superiores vemos que estamos ante algo serio. No se van a tratar todas y cada una de las posibilidades que permite este debugger, ya que podríamos llenar otro tutorial más. Usaremos lo que necesitemos y el resto se deja a la curiosidad de cada uno...</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Vamos al menú '<em>Tools</em>' y pulsamos la opción '<em>Auto Assemble</em>'. Se nos abrirá una ventana inicialmente vacía, pero que enseguida vamos a llenar usando las plantillas que trae por defecto <em>Cheat Engine</em>. En el menú '<em>Template</em>' seleccionamos la plantilla '<em>Cheat Table framework code</em>'. Tendremos algo tal que así:</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBsk3Sa61YEh4ob_-kziMADguQi4l-GeNZ2HL0Tmq-7tKr7kZPOy3U_F5TUBAc-0CV_KaabGQ1zKjffHTv4JNYVyxRypcIFdJbQFCahCjNRSW2lQ3piFDB9OQBo4-1D6Phn5GAehLuVDW9/s1600/cheatengine20.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="130" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBsk3Sa61YEh4ob_-kziMADguQi4l-GeNZ2HL0Tmq-7tKr7kZPOy3U_F5TUBAc-0CV_KaabGQ1zKjffHTv4JNYVyxRypcIFdJbQFCahCjNRSW2lQ3piFDB9OQBo4-1D6Phn5GAehLuVDW9/s320/cheatengine20.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Framework para la Cheat Table</td></tr>
</tbody></table>
<div style="text-align: justify;">
La idea es exportar el código que inyectemos a la <em>Cheat Table</em> donde aparecen ahora mismo listados los punteros a nuestros contadores de vidas y monedas. Para ello, Cheat Engine nos provee un marco en el que insertar un script para hacer cualquier cosa. El script se dividirá en dos secciones, una que se ejecutara al habilitar el '<em>cheat</em>' o truco, y otra que se ejecutará al deshabilitarlo.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Lo siguiente es importar la plantilla para inyección de código. Menú '<em>Template</em>', opción '<em>Code injection</em>'. Se nos mostrará una ventana preguntando en qué dirección del programa objetivo queremos colocar nuestro punto de inyección de código, que por defecto mostrará la dirección en la que se encuentra la instrucción que decrementa nuestros contadores. Tras aceptar nuestro script se va poblando:</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgK9EYbJIwGONqSNcLIVXOmHlhms9Z2le5Xi1qcQL9wepPdXjPfkei7UJfGbU_-zRcewLdWo_Qqwn2seO9p5eWebiwFue72Y7EdCgxJQAnNHeZEOmKU-ORmAPUsDV0D3fKm321cmd1uWhc5/s1600/cheatengine21.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="313" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgK9EYbJIwGONqSNcLIVXOmHlhms9Z2le5Xi1qcQL9wepPdXjPfkei7UJfGbU_-zRcewLdWo_Qqwn2seO9p5eWebiwFue72Y7EdCgxJQAnNHeZEOmKU-ORmAPUsDV0D3fKm321cmd1uWhc5/s320/cheatengine21.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Plantilla de inyección de código añadida</td></tr>
</tbody></table>
<div style="text-align: justify;">
Revisemos lo que tenemos. Al habilitarse el <em>cheat, </em>el script ejecutará la parte de la sección '<em>[ENABLE]</em>'. Las acciones que se realizan al habilitarse el script son las siguientes:</div>
<ol>
<li style="text-align: justify;">Se reserva un bloque de memoria de kilobytes (2048 bytes), que se asigna a la etiqueta '<em>newmem</em>'.</li>
<li style="text-align: justify;">Se declaran tres etiquetas adicionales: '<em>returnhere</em>', '<em>originalcode</em>' y '<em>exit</em>'.</li>
<li style="text-align: justify;">A partir de la dirección de memoria reservada dinámicamente con la etiqueta '<em>newmem</em>' es donde se encontrará nuestro código nuevo.</li>
<li style="text-align: justify;">En el bloque de memoria reservado, tras nuestro código y etiquetado como '<em>originalcode</em>', se copiará el código original que el script sobreescribirá en el punto de inyección del programa objetivo.</li>
<li style="text-align: justify;">En el bloque de memoria reservado, y tras el código original se coloca con la etiqueta '<em>exit</em>' el salto que devuelve la ejecución al programa objetivo justo tras el punto de inyección, hacia la etiqueta '<em>returnhere</em>'.</li>
<li style="text-align: justify;">El redireccionamiento hacia nuestro código se mete en la dirección donde estaba la instrucción original que queremos sustituir, que en este caso será la dirección '<em>"treasure_adventure_game_1.0.exe"+C3D0</em>'. El redireccionamiento se realiza sustituyendo la instrucción a modificar (y en la mayor parte de las ocasiones, algunas de las adyacentes posteriormente) por un salto al bloque de memoria reservado dinámicamente. El punto justo tras este salto se etiqueta con '<em>returnhere</em>', y es donde volverá el flujo de ejecución tras ejecutarse lo que se inyecta en el bloque de memoria reservado, o sea, nuestro código y el código original sustituido.</li>
</ol>
<div style="text-align: justify;">
Al deshabilitar el <em>cheat</em>, las instrucciones de la sección '<em>[DISABLE]</em>' devolverán todo a su estado original:</div>
<ol>
<li>Se libera el espacio reservado anteriormente a partir de la etiqueta '<em>newmem</em>'.</li>
<li>En el punto de inyección se vuelven a escribir las instrucciones originales.</li>
</ol>
<div style="text-align: justify;">
Es importante entender como funciona el esquema de inyección de código ya que es posible que en ocasiones necesitemos corregir manualmente los que la plantilla ha insertado automáticamente.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Para simular lo que hicimos antes '<em>nopeando</em>' la instrucción que actualiza el contador con el nuevo valor tras decrementarlo, tan solo tendríamos que borrar la instrucción '<em>MOV</em>' que hay justo debajo de la etiqueta '<em>originalcode</em>'. Como vimos antes, con esta solución no solo impedimos que se decremente el contador de vidas, si no también el de monedas, que tampoco estaría mal. El problema es que en algún momento del juego al que aún no hemos llegado, puede que también impida el decremento de otra variable distinta, y el que no se decremento podría provocar efectos indeseados en el juego.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Vamos a evitarlo a costa de complicar un poquito más el script, pero poco más. La idea sería verificar si cuando se va a ejecutar la instrucción '<em>MOV</em>' que actualiza el contador tras el decremento, el registro <em>EAX</em> está apuntando al contador de vidas o no. Si está apuntando al contador de vidas nos saltamos la instrucción '<em>MOV</em>' para evitar el decremento, y en caso contrario dejamos que se actualice.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
La dirección donde se encuentra el contador de vidas la obtenimos anteriormente, y la tenemos en nuestra <em>Cheat Table</em> etiquetada como '<em>Puntero vidas</em>'. Si desde el menú contextual de esa variable vamos a '<em>Change record</em>', '<em>Address</em>' se nos mostrará la secuencia de saltos de dicho puntero.</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjm1APVavH_78WlbCs1Zgdl-aashLll_fe2XNUwvN5-RRWouTtQ5AURd-Ue-vOnaXK6L1uerakEpGEugiq-YZBY3Ne1N4KSb8fLPzux-M3r64mwGoYAB1j-tLSnoJ4F82wJB2KFQbKShbng/s1600/cheatengine22.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjm1APVavH_78WlbCs1Zgdl-aashLll_fe2XNUwvN5-RRWouTtQ5AURd-Ue-vOnaXK6L1uerakEpGEugiq-YZBY3Ne1N4KSb8fLPzux-M3r64mwGoYAB1j-tLSnoJ4F82wJB2KFQbKShbng/s1600/cheatengine22.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Dirección del puntero al contador de vidas</td></tr>
</tbody></table>
<div style="text-align: justify;">
El puntero estático lo encontramos en:</div>
<blockquote class="tr_bq" style="text-align: center;">
"treasure_adventure_game_1.0.exe"+00059A7C</blockquote>
<div style="text-align: justify;">
Al contenido de la dirección anterior sumamos el hexadecimal 0x268 y nos lleva al siguiente puntero, cuya dirección apunta por fin al objeto que gestiona al protagonista del juego.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
A partir de la dirección de inicio del objeto, sumando el hexadecimal 0x28 llegamos al contador de vidas. Esta dirección es la que tendremos que comparar con el sujeto de la instrucción '<em>MOV</em>' para ver si es el contador de vidas el que se va a decrementar.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
El puntero anterior se podría expresar gráficamente tal que así:</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnZdkylLvbo3Vch8bkHyH_usA6jlDiv9Rgpiq8a2PnrrdKNch8mTiCCGQRsXpVD5mrzw4BtcPChavkQTl_9q0Hcbqd3wFrwV1WFZ6CSWY803p8EOb88TCiACs-NsWsOhYC00iKu7ouZ0a4/s1600/punteros.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="146" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnZdkylLvbo3Vch8bkHyH_usA6jlDiv9Rgpiq8a2PnrrdKNch8mTiCCGQRsXpVD5mrzw4BtcPChavkQTl_9q0Hcbqd3wFrwV1WFZ6CSWY803p8EOb88TCiACs-NsWsOhYC00iKu7ouZ0a4/s320/punteros.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Esquema punteros al objeto 'Protagonista'</td></tr>
</tbody></table>
<div style="text-align: justify;">
Tanto la dirección del bloque de variables como el del propio objeto pueden cambiar de ejecución en ejecución. Lo que se mantiene es la localización del puntero inicial así como los desplazamientos relativos.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
En una primera aproximación, el código podría quedar así:</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgu7bOgEnNl2RGSZdytIdfHN9N1S5VdYZg48pPb3nFXh9gn48f1i1h2zoo9Zg-9-GA_KWLvM_lkdAdVclr4xFiC64Ko-iMKlTdt-UbOYCEey0wnh75rlpENm9hH3D4gplANZ46HOyMb9mV5/s1600/cheatengine23.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgu7bOgEnNl2RGSZdytIdfHN9N1S5VdYZg48pPb3nFXh9gn48f1i1h2zoo9Zg-9-GA_KWLvM_lkdAdVclr4xFiC64Ko-iMKlTdt-UbOYCEey0wnh75rlpENm9hH3D4gplANZ46HOyMb9mV5/s320/cheatengine23.png" width="315" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Primera versión del script de inmunidad</td></tr>
</tbody></table>
<div style="text-align: justify;">
Mediante cargas del contenido de direcciones de memoria, y adiciones a dichos contenidos, en un par de instrucciones se reconstruye la dirección final del contador de vida. Hay que destacar que puesto que al iniciarse el código original el registro <em>EAX</em> contiene la dirección del contador a decrementar menos ocho bytes, a la hora de generar dirección del contador de vidas, también restamos ocho. Por ello, la última operación de adición, en lugar de sumar 0x28 suma 0x20. Tras calcular en <em>EAX</em> la dirección del contador de vida, se mueve al registro <em>EBX</em>, se restaura el contenido original de <em>EAX</em> a la dirección de la variable que se iba a decrementar, se compara con <em>EBX</em> y salvo que sean iguales, se actualiza dicha variable.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
El código se puede probar y funciona perfectamente. Desde el propio desensamblador de <em>Cheat Engine</em> podemos ver como queda el código en memoria del proceso tras habilitar el script, momento en el que Cheat Engine ejecuta el código de la sección '<em>[ENABLE]</em>', y también podemos comprobar como se restaura correctamente el código original al deshabilitarlo.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Pero <em>Cheat Engine</em> permite aún más. A la hora de referenciar un puntero, la herramienta admite una nomenclatura que simplifica mucho el tema ya que nos libra de tener que meter una repetitiva serie de parejas de instrucciones '<em>MOV</em>' y '<em>ADD</em>'. De la manera simplificada quedaría así:</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizm1kFvAWmcH-SpsTzcQmHmbPuRaIk0NyFjLd7pcI1oskdT6hEseV1QnBJbb-YGnaaePRwsEIKYIWRBfUKQU5OdxarUfXnl_zV6OEMOmtzMNYngjeiNrZfopMKoIt9OMKsGO6j8g8h-ERl/s1600/cheatengine24.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="284" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizm1kFvAWmcH-SpsTzcQmHmbPuRaIk0NyFjLd7pcI1oskdT6hEseV1QnBJbb-YGnaaePRwsEIKYIWRBfUKQU5OdxarUfXnl_zV6OEMOmtzMNYngjeiNrZfopMKoIt9OMKsGO6j8g8h-ERl/s320/cheatengine24.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Versión simplificada del script de inmunidad</td></tr>
</tbody></table>
<div style="text-align: justify;">
La directiva <a href="http://wiki.cheatengine.org/index.php?title=Cheat_Engine:Auto_Assembler" target="_blank">'<em>define</em>' permite sustituir un valor por una cadena</a>. Al generar el código ensamblador, cada aparición de la cadena es sustituida por el valor definido. Al definir el valor, se usa la nomenclatura '<em>[X+Offset]</em>', que se traduce por el contenido de la dirección '<em>X+Offset</em>'. El anidamiento de dicha nomenclatura permite en una sola línea, alcanzar el final de un puntero.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Desgraciadamente <a href="http://www.cheatengine.org/forum/viewtopic.php?p=5586804" target="_blank">un bug, ya corregido en el repositorio</a> de <em>Cheat Engine</em> pero aún no en el ejecutable ya compilado y disponible para descarga, impide usar esa nomenclatura directamente.<br />
<br /></div>
<div style="text-align: justify;">
Además de instrucciones en ensamblador, <em>Cheat Engine</em> soporta también la inclusión de secciones en <a href="http://es.wikipedia.org/wiki/Lua" target="_blank">LUA</a>, siendo esa la solución actual mientras no se genere una nueva versión con el bug corregido. El script final nos queda así:</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7jm_qpHK6jYZoUJK_RPKINnKFBmt7FG4qw6bJx-RLnBZaaXu6yOCcmwBHVgjkYagkUnXTRtJ0SPGEZgM5gs_EazxOod_s-5Dwu0JhsVdDQK1iNeXG6cJKfPwrBUZAFPGslJ9m6FgesOfM/s1600/cheatengine25.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7jm_qpHK6jYZoUJK_RPKINnKFBmt7FG4qw6bJx-RLnBZaaXu6yOCcmwBHVgjkYagkUnXTRtJ0SPGEZgM5gs_EazxOod_s-5Dwu0JhsVdDQK1iNeXG6cJKfPwrBUZAFPGslJ9m6FgesOfM/s320/cheatengine25.png" width="316" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Script final para inmunidad</td></tr>
</tbody></table>
<div style="text-align: justify;">
La sección en LUA se encarga de calcular la dirección final y la mete en una sentencia '<em>define</em>'. Lanzamos el juego, enganchamos la herramienta al proceso del juego con la opción '<em>Open Process</em>', cargamos nuestro fichero .CT y hacemos doble click en la instrucción que guardamos en la ventana '<em>Advanced Options</em>'. Se nos abrirá la ventana '<em>Memory Viewer</em>' de la herramienta tal y como vimos anteriormente:</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7vKdZ3pRgDbguHR0HqF1H_6WezVXn6iv_YzY9UANSsULSQhWZsAe_x1F_iWZzcxJiMYT6eTs02dqhEGI5Hjn4cuaUbt6_unhSO7pgtrPrV1Yy9jAjNk9bnZWQMtQzY-n0twcuXkrQaMcx/s1600/cheatengine19.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="225" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7vKdZ3pRgDbguHR0HqF1H_6WezVXn6iv_YzY9UANSsULSQhWZsAe_x1F_iWZzcxJiMYT6eTs02dqhEGI5Hjn4cuaUbt6_unhSO7pgtrPrV1Yy9jAjNk9bnZWQMtQzY-n0twcuXkrQaMcx/s320/cheatengine19.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Código original previo a la inyección</td></tr>
</tbody></table>
<div style="text-align: justify;">
Sin cerrar esa ventana, en el interfaz principal de la herramienta activamos la línea que corresponde a ese script en nuestra <em>Cheat Table</em>. Delante de nuestros ojos, se inyecta el código y lo que veíamos se transforma en:</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeZj3GJ1MiAaKOlRKq_jp2EG56RhvmwfAWA3nOhHSR6RXjjIrpxPbYAiVHVBt8OKzSs62TgNuuaSXhzL0QItg-JJ3aPZda5BPFFPkGDPkIjnmR0McvdTowZ9NCYTIPESRT9zfWC6u2aB33/s1600/cheatengine26.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="187" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeZj3GJ1MiAaKOlRKq_jp2EG56RhvmwfAWA3nOhHSR6RXjjIrpxPbYAiVHVBt8OKzSs62TgNuuaSXhzL0QItg-JJ3aPZda5BPFFPkGDPkIjnmR0McvdTowZ9NCYTIPESRT9zfWC6u2aB33/s320/cheatengine26.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Punto de inyección insertado</td></tr>
</tbody></table>
<div style="text-align: justify;">
La instrucción '<em>MOV</em>' se ha convertido en un '<em>JMP</em>' a una dirección de memoria. Si vamos a esa dirección de memoria (click derecho, opción '<em>Go to address</em>'), nos encontraremos nuestro código inyectado.</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirgCxhlRUUX5HuP3dNudw_8blBMDhqHz75nsaCTOTo1GG60N32NrEmT1nbu8aI7y226UNIF3ibN-cduKwnq7GE6rE6xK2GcgWreZLSdRzWP2T4gqiU9Zf-0eUgsDbZcsYUAEm5a8rcsUT0/s1600/cheatengine27.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="137" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirgCxhlRUUX5HuP3dNudw_8blBMDhqHz75nsaCTOTo1GG60N32NrEmT1nbu8aI7y226UNIF3ibN-cduKwnq7GE6rE6xK2GcgWreZLSdRzWP2T4gqiU9Zf-0eUgsDbZcsYUAEm5a8rcsUT0/s320/cheatengine27.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Código inyectado</td></tr>
</tbody></table>
<div style="text-align: justify;">
El segundo operador de la instrucción '<em>CMP</em>' es el valor que ha calculado la sección en LUA de nuestro script, y que podemos verificar que es el correcto. La instrucción '<em>JMP</em>' del final nos devuelve al código original del programa, justo por debajo del punto de inyección. Solo nos queda desactivar el script en la <em>Cheat Table </em>y comprobar que todo se restaura correctamente.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Para ser completamente rigurosos nos ha faltado colocar un '<em>pushf</em>' al inicio del código inyectado y su correspondiente '<em>popf</em>' al final para conservar el estado de los flags al volver al código original, aunque en este caso no es necesario.</div>
<br />
<h3 style="text-align: justify;">
Generación de trainers</h3>
<div style="text-align: justify;">
A esta alturas del tutorial, el ingeniero inverso que no conociera <em>Cheat Engine</em> estará completamente asombrado con las funcionalidades que ofrece esta herramienta gratuita y además de código abierto, o al menos eso le pasó a un servidor. Pues aunque ni mucho menos se han expuesto todas las posibilidades que ofrece, ni se van a exponer porque daría para medio libro, voy a tratar una más.</div>
<div style="text-align: justify;">
Hasta ahora, todo el trabajo lo está realizando <em>Cheat Engine</em> en segundo plano. Para poder utilizar una <em>Cheat Table</em> generada previamente (o descargada por internet) además de tener el juego o programa objetivo, necesitamos instalar la herramienta y ejecutarla.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Otra funcionalidad de la herramienta es generar lo que se conoce como '<a href="http://en.wikipedia.org/wiki/Trainer_(games)" target="_blank"><em>trainer</em></a>'. Una vez generados todos los trucos que queramos o podamos en <em>Cheat Engine</em>, y comprobado su funcionamiento, la herramienta nos permite generar un ejecutable con un sencillo interfaz que permite a un usuario que no tenga muchos conocimientos utilizar los trucos que incluyamos en el mismo, y sin necesidad de instalar la herramienta.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
En el menú '<em>File</em>' de <em>Cheat Engine</em> pulsamos la opción '<em>Generate generic trainer lua script from table</em>'. Aparecerá una nueva ventana denominada '<em>Trainer generator</em>'. En el listado de la izquierda iremos colocando los trucos que seleccionemos de la <em>Cheat Table</em> que hemos generado, asignando a cada funcionalidad un <em>hotkey</em>. Desde el asistente podemos cambiar algunos parámetros visuales de la interfaz que mostrará el <em>trainer</em>, o incluso añadir música de fondo y sonidos de notificación cada vez que se activa o desactiva uno de los trucos. Además del asistente para generar el <em>trainer</em>, se mostrará una simulación en tiempo real del interfaz que se generará reflejando cualquier cambio que introduzcamos en el asistente.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
La información mínima que debe completarse es, además de los trucos que se deseen asignados a un <em>hotkey</em>, el nombre del proceso sobre el que debe operar el <em>trainer</em>. Dejamos el asistente como se muestra en la imagen:</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyta4DcxaQbMy36abHK4plGj7LrRD0dbWu_73CjsthoNeiHfeRuV8rjGjIHfKiOzzBFBIrjOxZ9hgyY33bDlPZrHRnKpymPH_UHs5Vl7WkpeE1SLi_KqTRCkJyi91kxtDIxt11sEHKZbvL/s1600/cheatengine28.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="202" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyta4DcxaQbMy36abHK4plGj7LrRD0dbWu_73CjsthoNeiHfeRuV8rjGjIHfKiOzzBFBIrjOxZ9hgyY33bDlPZrHRnKpymPH_UHs5Vl7WkpeE1SLi_KqTRCkJyi91kxtDIxt11sEHKZbvL/s320/cheatengine28.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Asistente de generación de trainers</td></tr>
</tbody></table>
<div style="text-align: justify;">
El <em>hotkey</em> '<em>Ctrl+M</em>'se ha configurado usando el puntero al contador de monedas de tal manera que se incremente en 100 unidades cada vez que se pulse. El segundo usa el segundo script que se mostró anteriormente, permitiendo habilitarlo y deshabilitarlo cada vez que se pulse la combinación '<em>Crtl+V</em>'. Se ha asignado además una imagen con el botón '<em>Set Side Image</em>' y se ha desactivado el checkbox que permite al usuario del <em>trainer</em> redimensionar la ventana del mismo. Pulsamos el botón '<em>Generate trainer</em>' y tras definir dónde y con que nombre queremos generarlo, nos aparece una ventana adicional:</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9e59kIXoAptbWDnB1REXepbllbypLvIdVzNRRV_dG8InCSzUa9p9U8GyWkIVzaUveM0PZVM5H6x1dJ8jcyYwYiDmRuOUVqABQjSq_TYp5PPTB9tKvY2DiC10yXPlqm32QKMPFVefmJMvl/s1600/cheatengine29.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="166" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9e59kIXoAptbWDnB1REXepbllbypLvIdVzNRRV_dG8InCSzUa9p9U8GyWkIVzaUveM0PZVM5H6x1dJ8jcyYwYiDmRuOUVqABQjSq_TYp5PPTB9tKvY2DiC10yXPlqm32QKMPFVefmJMvl/s320/cheatengine29.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Opciones de generación del trainer</td></tr>
</tbody></table>
<div style="text-align: justify;">
En esta ventana seleccionamos el tamaño del <em>trainer</em> a generar. '<em>Gigantic</em>' generará un ejecutable de mayor tamaño, pero será un ejecutable independiente que incluirá todas las librerías necesarias. '<em>Tiny</em>' generará un ejecutable mucho menor, pero precisa que <em>Cheat Engine</em> esté instalado. Debajo seleccionamos si el proceso objetivo es de 32 bits o de 64. En nuestro caso el juego <em>Treasure Adventure Game</em> es de 32 bits. También seleccionamos que características especiales usa el <em>trainer</em>, que en nuestro caso no usamos ninguna. A la derecha se incluyen archivos extras que precisa el <em>trainer</em>, como archivos de imagen, música o sonidos. Solo hemos incluido una imagen para ser mostrada en el lateral de la interfaz del <em>trainer</em>.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Tras pulsar el botón inferior '<em>Generate</em>' la herramienta ha generado en el directorio destino un ejecutable de casi 4Mb de tamaño y que muestra esta interfaz:</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCn-3v4e7csEmEY9OBQMmM2BYSbHxVlXouNRJ8gCAKBuUjslrDUl-0D4_GoFl2A1_RRcHM6EBh762V2n7RD3Y5W5tx7EFehJvDj4HGaHja_5UyZCddPtnJVuMUKxvrWT_QOrRhClwBVI-t/s1600/tag_trainer.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="181" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCn-3v4e7csEmEY9OBQMmM2BYSbHxVlXouNRJ8gCAKBuUjslrDUl-0D4_GoFl2A1_RRcHM6EBh762V2n7RD3Y5W5tx7EFehJvDj4HGaHja_5UyZCddPtnJVuMUKxvrWT_QOrRhClwBVI-t/s320/tag_trainer.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Interfaz del trainer generado</td></tr>
</tbody></table>
<div style="text-align: justify;">
Tras unas cuantas pruebas comprobamos que todo funciona como debería. El trainer se engancha automáticamente al proceso definido y realiza las acciones configuradas al pulsar los hotkeys definidos.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Para los más creativos y experimentados, <em>Cheat Engine</em> ofrece una libertad absoluta a la hora de definir la interfaz del <em>trainer</em> al incorporar un diseñador de ventanas al estilo de Visual Basic. Al diseñador de ventanas se accede con el botón '<em>Design userinterface manually</em>' de la ventana principal del asistente de generación de <em>trainers</em>.</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhazure7HRYrb1NhgP-zQ1Ho5ypm3l-qsmJiJhI-gTIupL7syfc7B5ZSpQylr03t0igOFaFAJ_fXGun_jKzL4By7Ia1wdg2_eTPUAzQvQxmiTBafb7XW1cXNhGuKSruQ_nxN0zHbNW2cIj_/s1600/cheatengine30.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="172" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhazure7HRYrb1NhgP-zQ1Ho5ypm3l-qsmJiJhI-gTIupL7syfc7B5ZSpQylr03t0igOFaFAJ_fXGun_jKzL4By7Ia1wdg2_eTPUAzQvQxmiTBafb7XW1cXNhGuKSruQ_nxN0zHbNW2cIj_/s320/cheatengine30.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Diseño avanzado interfaz del trainer</td></tr>
</tbody></table>
<h2>
Conclusiones</h2>
<div style="text-align: justify;">
Quedan muchas cosas en el tintero, en gran parte porque el que suscribe se considera un novato en el uso de la herramienta, y aún tiene muchas cosas que aprender. Lo que sí está claro es que es una herramienta que puede facilitar mucho las cosas al abordar otro tipo de tareas relacionadas con la ingeniería inversa, aunque el programa objetivo no tenga nada que ver con videojuegos. Localizar en qué parte del código se realizan cálculos de determinados valores, que usando herramientas más tradicionales como un debugger normal y un desemsamblador puede llevar su tiempo, con <em>Cheat Engine</em> es prácticamente inmediato. Una vez hecho el tedioso trabajo de localizar nuestra zona de código '<em>objetivo</em>' ya podemos acudir a otras herramientas, aunque las funcionalidades adicionales que aporta <em>Cheat Engine</em> en gran parte de los casos puede hacer que no necesitemos nada más.<br />
<br />
La <i>Cheat Table</i> generada durante este tutorial está disponible <a href="https://www.dropbox.com/s/x8pcuqxjx4s46v8/treasure_adventure_game.CT?dl=1" target="_blank">en este enlace</a>.</div>
Softbreakershttp://www.blogger.com/profile/01666968545873713297noreply@blogger.com15tag:blogger.com,1999:blog-5459690923545315155.post-60185141221226870512015-04-18T00:00:00.000+02:002015-04-18T11:09:13.661+02:00FX Interactive y su plataforma digital. Iteración 1.<h2>
Respaldando nuestros contenidos digitales</h2>
<div style="text-align: justify;">
Como se indicó en la <a href="http://www.softbreakers.com/2015/04/fx-interactive-y-su-plataforma-digital.html" target="_blank">entrada principal</a>, nuestro objetivo es poder respaldar los contenidos digitales de nuestra cuenta en <em>FX Classics Store</em> de tal manera que podamos reinstalar los juegos adquiridos a voluntad, y sin necesidad de tener acceso al sitio web de <em>FX Classics Store</em>. Dada la delicada situación económica presentada en distintos medios de comunicación, la prudencia obliga a ello.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
En caso de que finalmente los temores sobre la futura viabilidad de la empresa se materialicen, es posible que <em>FX Interactive</em> habilite algún tipo de solución para los usuarios de su plataforma digital no pierdan los títulos adquiridos. Pero mientras tanto no está de más que nos busquemos nuestras propias soluciones por si llegado el momento la empresa no ofrece ninguna alternativa.</div>
<a name='more'></a><br />
<h2>
<span style="text-align: justify;">Localizando el repositorio de descargas</span></h2>
<div style="text-align: justify;">
En el proceso de instalación normal de un producto de <em>FX Classics Store</em>, la aplicación <em>FX Web Player</em> en primer lugar descarga los contenidos a instalar. El primer paso es localizar en qué lugar de nuestro disco duro se almacena temporalmente dicha descarga para proceder a respaldar dichos contenidos.</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBEWoNg6-YpO9wHuGHoF5pQ-Li-IbG5-0gwNv98_6k_xYBzCQuwDaICDg4Ti2ls7SAgmtvw65D4WNV3ngc1YkbQfuxIF1e1H9Fgp85dLnGCcD-oracsZHGFAo2IMFb18iqucsezKDDAIQl/s1600/fx_progresodescarga.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img alt="Progreso de descarga" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBEWoNg6-YpO9wHuGHoF5pQ-Li-IbG5-0gwNv98_6k_xYBzCQuwDaICDg4Ti2ls7SAgmtvw65D4WNV3ngc1YkbQfuxIF1e1H9Fgp85dLnGCcD-oracsZHGFAo2IMFb18iqucsezKDDAIQl/s1600/fx_progresodescarga.png" height="90" title="Progreso de descarga" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Progreso de descarga</td></tr>
</tbody></table>
<div style="text-align: justify;">
Se nos pueden ocurrir muchas maneras para descubrir, mientras que se nos muestra la ventana anterior, dónde se está almacenando lo que se está descargando. Voy a utilizar una herramienta muy útil y versátil denominada <em><a href="https://technet.microsoft.com/es-es/sysinternals/bb896645" target="_blank">Process Monitor</a></em>, de <em><a href="https://technet.microsoft.com/es-es/sysinternals" target="_blank">Sysinternals</a></em>.<br />
<br /></div>
<div style="text-align: justify;">
La herramienta ha sido creada por <em>Mark Russinovich</em> y <em>Bryce Cogswell</em>, responsables de la web <em>Sysinternals</em> y autores de la afamada serie de libros técnicos "<em>Windows Internals</em>", que desde <em>Windows NT</em> nos describen las interioridades de las distintas versiones de los sistemas operativos <em>Windows</em>. Esta herramienta es una evolución que unifica dos de sus primeras y más populares herramientas, <em>Filemon</em> y <em>Regmon</em> (acrónimos de <em>File Monitor</em> y <em>Registry Monitor). </em>Tan popular fue la web <em>Sysinternals</em> y las herramientas que distribuían gratuitamente sus autores que finalmente en 2006 <em>Microsoft</em> adquirió a <em>Sysinternals</em>.<br />
<br /></div>
<div style="text-align: justify;">
La finalidad de esta herramienta es, como su nombre describe perfectamente, monitorizar las actividades que los distintos procesos que corren en nuestro sistema operativo realizan. Actualmente la herramienta permite monitorizar acciones sobre nuestros discos duros, sobre el registro de <em>Windows</em> o incluso sobre la red.</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiy8cowKQ6x9WzrW4msVORSuFDP2OIKCtaYoc5wjt2_BnzSwMtbTnQyR7ZpHkXLlFocqbyCphXxhTW-wR6LKgjFOVaBIjEa9oVqBn0OocR6YYO8ODtGZXdWZ7NR6hawj3YcQTfZtU2H3Xcz/s1600/fx_processmonitor.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img alt="Process Monitor de Sysinternals" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiy8cowKQ6x9WzrW4msVORSuFDP2OIKCtaYoc5wjt2_BnzSwMtbTnQyR7ZpHkXLlFocqbyCphXxhTW-wR6LKgjFOVaBIjEa9oVqBn0OocR6YYO8ODtGZXdWZ7NR6hawj3YcQTfZtU2H3Xcz/s1600/fx_processmonitor.png" height="167" title="Process Monitor de Sysinternals" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><i>Process</i> Monitor de <i>Sysinternals</i></td></tr>
</tbody></table>
<div style="text-align: justify;">
Por supuesto, el registro de eventos puede ser inmenso, y buscar lo que nos interesa puede ser como buscar una aguja en un pajar. Para evitarlo, la aplicación permite definir una serie de filtros para poder delimitar lo que nos interesa, y que solo se nos muestren los eventos que cumplen los criterios que definamos. Tampoco es la intención explicar todas las bondades de esta versátil herramienta, por lo que directamente paso a lo que nos interesa.<br />
<br /></div>
<div style="text-align: justify;">
Vamos a suponer que no sabemos absolutamente sobre la aplicación que queremos monitorizar. Solo sabemos que se va a descargar algo de Internet y que lo va a almacenar a algún lugar de nuestro disco duro. La herramienta al arrancar inicialmente nos ofrecerá definir un filtro para evitar que la aplicación comience desde el inicio a mostrar todos los eventos que registra.<br />
<br /></div>
<div style="text-align: justify;">
Puesto que no conocemos nada de nuestro objetivo, procuraremos cerrar todos los procesos que no nos interesen en ese momento, para evitar en lo posible que se vuelquen al registro de la herramienta eventos que no nos interesan. Esto disminuirá el tamaño del pajar en el que tendremos que buscar la aguja que queremos. Definimos el siguiente filtro en los desplegables y pulsamos el botón "<em>Add</em>" para añadirlo:</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmxMoAmj4PODOOlFYjrWtsYErqCETFlazx4OHsvtX4_FELihhLxhFV_cQOiAJCTswfrIQ03-4iuQHxrYVOwEVRDCUoag9SjNbQt2hgXIf_By4RnGdQAAsTeldo6j0XZ1cy4nHBHtGZTYc1/s1600/fx_processmonitor_filtro1.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img alt="Filtro para registrar escrituras en fichero" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmxMoAmj4PODOOlFYjrWtsYErqCETFlazx4OHsvtX4_FELihhLxhFV_cQOiAJCTswfrIQ03-4iuQHxrYVOwEVRDCUoag9SjNbQt2hgXIf_By4RnGdQAAsTeldo6j0XZ1cy4nHBHtGZTYc1/s1600/fx_processmonitor_filtro1.png" height="199" title="Filtro para registrar escrituras en fichero" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Filtro para registrar escrituras en fichero</td></tr>
</tbody></table>
<div style="text-align: justify;">
Este sencillo filtro va a registrar todas las escritura a fichero que se realicen por cualquier proceso en ejecución en nuestro sistema operativo. Obviamente esto van a ser muchos eventos, pero vamos a estar muy poco tiempo registrando eventos. El mínimo imprescindible para que se registre alguno de los eventos de escritura a disco proceso que nos interesa, que actualmente no sabemos cual es. En el momento que pulsemos el botón "<em>OK</em>" la herramienta se lanzará a registrar eventos. Antes hacemos otra cosa más.<br />
<br /></div>
<div style="text-align: justify;">
En nuestro navegador, entramos en nuestra cuenta de <em>FX Classics Store</em> y comenzamos a descargar alguno de los juegos de nuestra biblioteca, en mi caso "<em>Imperivm - La guerra de las Galias</em>". Cuando aparezca la ventana de progreso de descarga y el juego comience a descargarse, volvemos a nuestro <em>Process Monitor</em> que habíamos dejado a medias, y ahora sí, pulsamos el botón para que comience a funcionar con el filtro que hemos definido.<br />
<br /></div>
<div style="text-align: justify;">
Tras uno o dos segundos registrando eventos, paramos la captura en la herramienta pulsando el botón de la barra con el icono de una lupa. En tan solo ese intervalo habremos registrado decenas de miles de eventos, de las cuales gracias a nuestro filtro actual solo se nos mostrarán unas centenas de escritura a fichero. En mi caso muestra lo siguiente:</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVfKVJHolugiI26WTZmNAfgjoIQhV5QQGcDcd6IY4bd2pTImZpwMtdFQHzdbdRRywvyc-5Auo0ZWcxdWGxMC_hVpseLYMT1V-nzZL5RQ8GVF42tgJINt5Axh4I8RCaY_q9ZYyhvG2cr74a/s1600/fx_processmonitor_descargando.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img alt="Registrando la descarga con Process Monitor" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVfKVJHolugiI26WTZmNAfgjoIQhV5QQGcDcd6IY4bd2pTImZpwMtdFQHzdbdRRywvyc-5Auo0ZWcxdWGxMC_hVpseLYMT1V-nzZL5RQ8GVF42tgJINt5Axh4I8RCaY_q9ZYyhvG2cr74a/s1600/fx_processmonitor_descargando.png" height="155" title="Registrando la descarga con Process Monitor" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Registrando la descarga con <i>Process Monitor</i></td></tr>
</tbody></table>
<div style="text-align: justify;">
La información que nos proporciona la herramienta es enorme. Vemos que hay un proceso en ejecución llamado "<em>FXWebPlayer.exe</em>" que está escribiendo un archivo llamado "<em>IMPERIVM_I.w2i</em>". Si sobre ese evento pulsamos el botón de la derecha nos aparece un menú contextual con varias opciones. Una de ellas, "<em>Jump to...</em>" no abrirá una ventana del explorador de Windows en la ubicación del archivo que se está escribiendo. Una vez que se finalice la descarga, y antes de comenzar con la instalación, tendremos disponible el archivo para crear la copia de respaldo. Tened en cuenta que tras la instalación dicho archivo es eliminado del disco duro, por lo que debe ser copiado una vez finalizada la descarga y antes de comenzar a instalar.<br />
<br /></div>
<div style="text-align: justify;">
Otra de las opciones del menú contextual, "<em>Properties...</em>" nos mostrará la propiedades del proceso, entre otras donde se encuentra instalado y con que argumentos se ha invocado:</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgt5ajLgiWHn8jkCFNBpaLuCq1L3EdvALh-XCytd-IHxI5g4cEjnuhLnYfBuO_1PnHIq69p8jbp-T4V1fIMRAMsXUn9PisdUJzyngWU5RqdLAaoXve8rpJILVdR-2kUxGchojPt_Qkk_Slw/s1600/fx_processmonitor_propiedadesproceso.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img alt="Propiedades del proceso FXWebPlayer.exe" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgt5ajLgiWHn8jkCFNBpaLuCq1L3EdvALh-XCytd-IHxI5g4cEjnuhLnYfBuO_1PnHIq69p8jbp-T4V1fIMRAMsXUn9PisdUJzyngWU5RqdLAaoXve8rpJILVdR-2kUxGchojPt_Qkk_Slw/s1600/fx_processmonitor_propiedadesproceso.png" height="250" title="Propiedades del proceso FXWebPlayer.exe" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Propiedades del proceso <i>FXWebPlayer.exe</i></td></tr>
</tbody></table>
<div style="text-align: justify;">
Ya tenemos localizado el directorio en donde <em>FX Web Player</em> almacenará los paquetes instalables que descarga, y que deberíamos guardar por si en un futuro <em>FX Classics Store</em> lamentablemente dejara de operar.<br />
<br /></div>
<div style="text-align: justify;">
Lo siguiente será descubrir como instalar estos paquetes .w2i. Llegados hasta aquí se plantea una disyuntiva. Descubierta la manera de salvaguardar los contenidos que se descargan desde la plataforma <em>FX Cloud</em>, si además añadimos la manera de instalarlos dejando de lado la gestión DRM que se realiza desde <em>FX Web Player, </em>se podrían colocar las bases para la distribución e instalación de los productos que soporta <em>FX Cloud </em>de una manera incontrolada, y además contraviniendo las condiciones de uso de <em>FX Classics Store:</em></div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTMq77XFIesbn_20gr2ZnsRv1SParPSKgGM8AOo3BpFK-biP0F7dwEUvVIVCnRCPRB56X61nc9jHS9ZyttWyMNx2SqvXpBKffJVhARlH61cZpezbwk2wWbdwEvv4vwAgVDUrtOofIuDCB8/s1600/fx_restricciones_instalacion.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img alt="Restricciones en la licencia de los productos de FX Classics Store" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTMq77XFIesbn_20gr2ZnsRv1SParPSKgGM8AOo3BpFK-biP0F7dwEUvVIVCnRCPRB56X61nc9jHS9ZyttWyMNx2SqvXpBKffJVhARlH61cZpezbwk2wWbdwEvv4vwAgVDUrtOofIuDCB8/s1600/fx_restricciones_instalacion.png" height="197" title="Restricciones en la licencia de los productos de FX Classics Store" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Restricciones en la licencia de los productos de <i>FX Classics Store</i></td></tr>
</tbody></table>
<div style="text-align: justify;">
Aunque lo que queda por descubrir ya lo he visto escrito en otros sitios, al menos en una versión muy rudimentaria y que puede presentar problemas con algunos juegos, la publicación de la siguiente entrada donde se trata la instalación de los paquete .w2i la dejaré en suspenso mientras los usuarios de <em>FX Classics Store</em> podamos seguir accediendo a los productos adquiridos.<br />
<br /></div>
<div style="text-align: justify;">
Mientra tanto y por si acaso, almacenad los archivos .w2i de vuestros juegos, tened <em>FX Web Player</em> instalado (parte de sus componentes son necesarios para la instalación), y ojalá que no tenga que publicar esa entrada en muchos años...</div>
Softbreakershttp://www.blogger.com/profile/01666968545873713297noreply@blogger.com12tag:blogger.com,1999:blog-5459690923545315155.post-10606216572432110662015-04-17T16:11:00.001+02:002015-04-18T11:17:20.277+02:00Salimos a Twitter<blockquote class="twitter-tweet" lang="es">
Inaguramos nuevo canal con <a href="https://twitter.com/hashtag/miprimerTweet?src=hash">#miprimerTweet</a> <a href="http://t.co/D9hTuFR79p">pic.twitter.com/D9hTuFR79p</a><br />
— Softbreakers (@softbreakers) <a href="https://twitter.com/softbreakers/status/589068500876034048">abril 17, 2015</a></blockquote>
<script async="" charset="utf-8" src="//platform.twitter.com/widgets.js"></script>Softbreakershttp://www.blogger.com/profile/01666968545873713297noreply@blogger.com0tag:blogger.com,1999:blog-5459690923545315155.post-30280294617519672622015-04-16T14:32:00.002+02:002015-04-18T12:53:09.068+02:00La Agencia de Certificaciones de Ciberseguridad 'defaced'<h2>
En casa del herrero...</h2>
Triste, pero cierto. A la hora de publicación de esta entrada así estaba el asunto en una de las páginas de la web de la <i><a href="http://acc.icfs.uam.es/" target="_blank">Agencia de Certificaciones de Ciberseguridad</a></i>, dependiente del <a href="http://www.icfs.es/" target="_blank"><i>Instituto de Ciencias Forenses y Seguridad</i></a> de la <i>Universidad Autónoma de Madrid</i>:<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkvEkKuniM-3A63ZKRMGosaNQtOMUAR4KOKMEMBXgiawDeuVpUabgudEEexZhiqa_NDeNWBORE3opMStFDL3l6-n_9vekl_6caMrC3L4IVpfS-jZ_7BmFJOqIQpkSNgVSc2qJifMq8biJX/s1600/acc_defaced.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkvEkKuniM-3A63ZKRMGosaNQtOMUAR4KOKMEMBXgiawDeuVpUabgudEEexZhiqa_NDeNWBORE3opMStFDL3l6-n_9vekl_6caMrC3L4IVpfS-jZ_7BmFJOqIQpkSNgVSc2qJifMq8biJX/s1600/acc_defaced.png" height="218" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">http://acc.icfs.uam.es/cursos-certificacion</td></tr>
</tbody></table>
<a href="http://acc.icfs.uam.es/cursos-certificacion" target="_blank"><i>El enlace afectado</i></a> se encuentra en la parte inferior, en la sección de Recursos de las páginas que describen algunas certificaciones como la <a href="http://acc.icfs.uam.es/ccsp-sp" target="_blank">CCSP-SP</a>, <a href="http://acc.icfs.uam.es/ccsp-dj" target="_blank">CCSP-DJ</a>, etc... Ya está incluso <a href="http://webcache.googleusercontent.com/search?q=cache:5_7MIquirjoJ:acc.icfs.uam.es/hacked-dz-falcko+&cd=2&hl=es&ct=clnk&gl=es" target="_blank"><i>indexado por Google en su caché</i></a> con esta apariencia al menos desde hace dos dias.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrTuUtb8l0aIb1t4L39qWWiSW8xOqMaNaZiRwlEfDhDbQCqY_7CO8r1dyhyXmLcRgnrNvzsdr99X5L1L69Y75JKHgVSA8i4viArCTXzrWYSvyMHVLueI6ViVuIStIjwI99HDqc1okRp_tG/s1600/acc_defaced2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrTuUtb8l0aIb1t4L39qWWiSW8xOqMaNaZiRwlEfDhDbQCqY_7CO8r1dyhyXmLcRgnrNvzsdr99X5L1L69Y75JKHgVSA8i4viArCTXzrWYSvyMHVLueI6ViVuIStIjwI99HDqc1okRp_tG/s1600/acc_defaced2.png" height="144" width="200" /></a></div>
<br />
En fin, como dice el dicho, en casa del herrero cuchillo de palo...Softbreakershttp://www.blogger.com/profile/01666968545873713297noreply@blogger.com0tag:blogger.com,1999:blog-5459690923545315155.post-53853854914485526892015-04-16T00:00:00.000+02:002015-04-16T00:00:00.785+02:00FX Interactive y su plataforma digital.<h2>
Introducción</h2>
<div style="text-align: justify;">
<em><a href="http://es.wikipedia.org/wiki/FX_Interactive" target="_blank">FX Interactive</a></em> es un referente del sector de videojuegos en España. Fue fundada por los hermanos <em>Ruíz</em> junto con otros cuatro socios provenientes de <em>Dinamic Multimedia</em>. Los hermanos <em>Ruíz</em> son toda una institución nacional en el mundo de los videojuegos. Conocidos por sus inicios como <em><a href="http://es.wikipedia.org/wiki/Dinamic_Software" target="_blank">Dinamic Software</a></em> donde ganaron su merecida fama, y también por su paso posterior por la ya nombrada <em><a href="http://es.wikipedia.org/wiki/Dinamic_Multimedia" target="_blank">Dinamic Multimedia</a></em>.</div>
<div style="text-align: justify;">
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgK4ccwVs2G0rSgtE7vuKXJeWFRKYG-rJcN0vW2BHTTTQLOrBBa4sHTz9HGdFe6zN6PIfkqdMdWYV4htVqNtpocXBvG7Kpi_AI31PEhLJTmRQmIb8IEBVIJHQtEzmpFfdz-Gke56RzTboVR/s1600/fx_logo.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img alt="Logo FX Interactive" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgK4ccwVs2G0rSgtE7vuKXJeWFRKYG-rJcN0vW2BHTTTQLOrBBa4sHTz9HGdFe6zN6PIfkqdMdWYV4htVqNtpocXBvG7Kpi_AI31PEhLJTmRQmIb8IEBVIJHQtEzmpFfdz-Gke56RzTboVR/s1600/fx_logo.jpg" height="170" title="Logo FX Interactive" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Logo de <i>FX Interactive</i></td></tr>
</tbody></table>
<em></em><br />
<a name='more'></a><em>FX Interactive</em> principalmente se dedica a editar y localizar al español juegos de otras desarrolladoras, esmerándose en la calidad final del producto que igualmente se encargan de distribuir en formato físico. Tal es la dedicación y el esmero con el que cuidan sus lanzamientos, que sería injusto decir que solo se han dedicado a "<em>traducir</em>". Rehacen los extras que acompañaban al producto original de tal manera que los manuales de la versión española de <em>FX Interactive</em> superan con creces el manual de la versión internacional. Además, para el doblaje de la voces, acuden a dobladores profesionales. En la memoria de muchos está el doblaje en la versión española de juegos como <em>The Longest Journey</em> y otros.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZvxb2aNiNrYRgHpT-7vVwbCGJGG4rcJBG7UXcqr59EhEsK-DYRtOHR9BB8F3vwG-qiaOGJqIu5P-d_jHXqnBIEgwRvLkQL9aI4xPu1OzXTsoOPyZtybHZeq-In9sblvBmmE_ZpyZRY6VC/s1600/fx_TheLongestJourney.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img alt="The Longest Journey - Versión de FX Interactive" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZvxb2aNiNrYRgHpT-7vVwbCGJGG4rcJBG7UXcqr59EhEsK-DYRtOHR9BB8F3vwG-qiaOGJqIu5P-d_jHXqnBIEgwRvLkQL9aI4xPu1OzXTsoOPyZtybHZeq-In9sblvBmmE_ZpyZRY6VC/s1600/fx_TheLongestJourney.jpg" height="320" title="The Longest Journey - Versión de FX Interactive" width="227" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><i>The Longest Journey</i> - Versión de <i>FX Interactive</i></td></tr>
</tbody></table>
<span style="text-align: justify;">También han publicado y distribuido productos de desarrolladoras españolas como </span><em style="text-align: justify;"><a href="http://es.wikipedia.org/wiki/Pendulo_Studios,_S.L." target="_blank">Pendulo Studios</a></em><span style="text-align: justify;">, autores de los inolvidables </span><em style="text-align: justify;">Hollywood Monsters</em><span style="text-align: justify;">, </span><em style="text-align: justify;">Runway</em><span style="text-align: justify;">, y sus correspondientes secuelas.</span><br />
<div style="text-align: justify;">
Como no podía ser de otra forma, en 2011 comenzaron a distribuir digitalmente parte de sus productos, mientras seguían simultáneamente con la tradicional distribución en versión física. En 2012 lanzaron el servicio <em>FX Cloud</em>, que permite la descarga de productos adquiridos previamente en su versión física.</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYQTY6ljS5M5NmOchP8ExdzuwMuC0cL0V20_t0Ovqfie6D954dyksV7cT-kzfPzSNNLoD6jw0sFNi5ucOVgB698HCjzQQNZhjmsNQeXrzX8oHNkm8mgZxTZJ4VZLxa8mZ_xfwgOrwj8Ioz/s1600/fx_fxcloud.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img alt="Servicio FX Cloud" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYQTY6ljS5M5NmOchP8ExdzuwMuC0cL0V20_t0Ovqfie6D954dyksV7cT-kzfPzSNNLoD6jw0sFNi5ucOVgB698HCjzQQNZhjmsNQeXrzX8oHNkm8mgZxTZJ4VZLxa8mZ_xfwgOrwj8Ioz/s1600/fx_fxcloud.jpg" height="182" title="Servicio FX Cloud" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Servicio <i>FX Cloud</i></td></tr>
</tbody></table>
<span style="text-align: justify;">A mediados de 2013, renuncian a continuar con la distribución física de sus productos en España, México y otros países hispanohablantes, llegando a un </span><a href="http://www.micromania.es/noticias/fx-interactive-bandai-namco" style="text-align: justify;" target="_blank">acuerdo con la filial española de la japonesa <em>Namco Bandai</em></a><span style="text-align: justify;"> para que ellos se encarguen de la distribución física pero solo en España.</span><br />
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Recientes noticias aparecidas en distintos medios relatan que la compañía actualmente <a href="http://www.elconfidencial.com/tecnologia/2015-02-26/fx-interactive-se-desangra_718330/" target="_blank">se encuentra en una situación económica desesperada</a>. Se apunta a la competencia de las plataformas digitales de venta y distribución de videojuegos, y la falta de capacidad de adaptación de <em>FX Interactive</em> a las nuevas condiciones de mercado impuestas por estas plataforma, y en especial a <em><a href="http://store.steampowered.com/" target="_blank">Steam</a></em>.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Efectivamente el catálogo de <em>FX Interactive</em> no se oferta por la plataforma <em>Steam</em>, por lo que solo es adquirible en formato físico tradicional, y solo algunos títulos se pueden adquirir digitalmente mediante la plataforma <em>FX Classics Store</em>. Imagino que esto se deberá a las limitaciones de distribución que imponen las licencias que <em>FX Interactive</em> acuerda con cada desarrolladora. En el caso del título <em>FX Fútbol</em>, que es desarrollado por la propia <em>FX Interactive</em>, no existen esas limitaciones, y para su última versión la compañía ha decidido por fin apostar por su distribución por <em>Steam</em>, además de seguir en paralelo con la tradicional distribución física y la inclusión de una copia de respaldo en la plataforma digital <em>FX Cloud</em>.</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGf1XQtYLEye5UZYd1sdEuGZ3Fk7kq6LKFNh4AYGHPRiSdsKOotEWrSod8Wa1BRI52dG65WDO7yCLRqyveomszfCT8-UJ6hms-ComoWF9an99ldAp37yCu-vfnIS-alwqYsAGfS6LTOk-Q/s1600/fx_fxfutbol.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img alt="Publicidad FX Fútbol 2015" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGf1XQtYLEye5UZYd1sdEuGZ3Fk7kq6LKFNh4AYGHPRiSdsKOotEWrSod8Wa1BRI52dG65WDO7yCLRqyveomszfCT8-UJ6hms-ComoWF9an99ldAp37yCu-vfnIS-alwqYsAGfS6LTOk-Q/s1600/fx_fxfutbol.jpg" height="177" title="Publicidad FX Fútbol 2015" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Publicidad <i>FX Fútbol 2015</i></td></tr>
</tbody></table>
<h2>
<span style="text-align: justify;">FX Classics Store y FX Cloud</span></h2>
<div style="text-align: justify;">
Los juegos que actualmente distribuye <a href="http://www.fxinteractive.com/home.htm" target="_blank"><i>FX Interactive</i></a> se pueden dividir en tres grupos:</div>
<br />
<ol style="text-align: justify;">
<li>Juegos comercializados en formato físico.</li>
<li>Juegos comercializados en formato físico y con versión digital respaldada en el servicio <i>FX Cloud</i>.</li>
<li>Juegos comercializados en formato digital en su tienda <a href="http://juegos.fxinteractive.com/" target="_blank"><i>FX Classics Store</i></a>.</li>
</ol>
<div style="text-align: justify;">
El primer grupo es puramente el soporte tradicional. El juego se compra en formato físico y se nos vende solo y exclusivamente lo que contiene la caja, principalmente manual y soporte físico con el juego. Si se nos estropea el soporte físico, perdemos el juego.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
El segundo grupo es similar al primero, por lo que debemos adquirir el juego en soporte físico. Pero en este caso, <i>FX Interactive</i> ofrece adicionalmente al usuario a través de su servicio <i>FX Cloud</i> un copia digital de respaldo que podemos descargar e instalar.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
El tercer grupo es lo que conocemos de otros servicios similares como <a href="http://store.steampowered.com/" target="_blank"><i>Steam</i></a>, <a href="http://uplay.com/" target="_blank"><i>UPlay</i></a> o <a href="http://www.origin.com/" target="_blank"><i>Origin</i></a>. No adquirimos nada en formato físico, sino una licencia para descargar y ejecutar el juego adquirido. A diferencia de otros servicios donde la plataforma digital solo permite ejecutar la copia adquirida del juego simultáneamente en un único ordenador, <i>FX Interactive</i> permite la instalación y ejecución del juego de manera simultánea <a href="http://juegos.fxinteractive.com/condiciones.html" target="_blank">en hasta 5 ordenadores</a>.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
El servicio <i>FX Cloud</i> aporta la distribución digital tanto a los productos del segundo grupo, como a los vendidos en la tienda digital <i>FX Classics Store</i>. En cualquiera de ambos casos el cliente debe abrirse una cuenta en <i>FX Classics Store</i>, que aglutinará todos los productos adquiridos por el cliente, tanto los productos digitales adquiridos en la tienda digital como las versiones digitales de aquellos productos adquiridos en formato físico que incluyan soporte digital en <i>FX Cloud</i>. El acceso a las versiones digitales de aquellos productos adquiridos en formato y que soportan <i>FX Cloud</i> se realiza introduciendo un código de activación que acompaña a la versión en soporte físico.</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQF7OoIaQGYNusS3fVJnVGMlIjTmHR0S4uroNJpbLaF5dbNns05Hapet1R6O3kAOnBWgScgiiplIWO_fGPQa4HT-YJ20hl815XkTzxySA_1-bxPuLukZB7CC04ovdYXNgYguQ1sQ8BFKQq/s1600/fx_financiacionestatal.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img alt="FX Classics Store - Financiación estatal" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQF7OoIaQGYNusS3fVJnVGMlIjTmHR0S4uroNJpbLaF5dbNns05Hapet1R6O3kAOnBWgScgiiplIWO_fGPQa4HT-YJ20hl815XkTzxySA_1-bxPuLukZB7CC04ovdYXNgYguQ1sQ8BFKQq/s1600/fx_financiacionestatal.png" height="182" title="FX Classics Store - Financiación estatal" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><i>FX Classics Store</i> - Financiación estatal</td></tr>
</tbody></table>
<div style="text-align: justify;">
Tal y como se indica al pie la propia página de <a href="http://juegos.fxinteractive.com/" style="text-align: justify;" target="_blank"><i>FX Classics Store</i></a>, éste es un proyecto cofinanciado por el <i>Ministerio de Industria, Energía y Turismo</i> dentro del <i>Plan Nacional de Investigación Científica, Desarrollo e Innovación Tecnológica</i>. Rebuscando un poco por el mundo de los <a href="http://boe.es/" style="text-align: justify;" target="_blank">BOE</a> encontramos el BOE de 1 de febrero de 2013, en el que concretamente para este proyecto se han destinado un total de casi 880.000€, distribuidos por un lado como una subvención de 220.680,76€ (<a href="http://www.boe.es/boe/dias/2013/02/01/pdfs/BOE-A-2013-1089.pdf" style="text-align: justify;" target="_blank">página 8917</a>) y por otro un crédito de 658.355,84€ (<a href="http://www.boe.es/boe/dias/2013/02/01/pdfs/BOE-A-2013-1089.pdf" style="text-align: justify;" target="_blank">página 8929</a>). Todo bajo el epígrafe '<em>PROYECTO DE DESARROLLO EXPERIMENTAL DE UNA PLATAFORMA TIC PARA LA MEJORA DE LA DISTRIBUCIÓN INTERNACIONAL DE VIDEOJUEGOS MEDIANTE HERRAMIENTAS DE MARKETING DIGITAL</em>'.<br />
<br /></div>
<div style="text-align: justify;">
La subvención entiendo que es a fondo perdido y no reembolsable, pero el crédito (<a href="http://boe.es/boe/dias/2012/06/07/pdfs/BOE-A-2012-7648.pdf" target="_blank">véase este otro BOE</a>) tiene un tipo de interés del 3,95%, y un plazo máximo de devolución de 7 años en el que se incluyen hasta 3 años de carencia. Puesto que dichas ayudas aparecieron en el BOE de febrero de 2013, es de suponer que con un periodo de carencia de 3 años, allá por principio de 2016 <i>FX Interactive</i> tendrá que comenzar a devolver el crédito, que suponiendo que el importe aprobado se haya desembolsado completamente, y que se hayan acogido al máximo plazo de devolución de 7 años, y que durante los tres de carencia no se haya abonado nada, <a href="http://www.bde.es/clientebanca/simuladores/simulador_carencia.htm" target="_blank">sale una letra mensual</a> de algo más de 16.700€.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
La tienda <i>FX Classics Store</i> estaba desarrollada y funcionando al menos en fase beta <a href="http://www.elpixelilustre.com/2011/12/fx-classic-store.html" target="_blank">desde diciembre de 2011</a>, siete meses antes de que se convocaran dichas ayudas, y algo más de un año antes de que las concedieran. Teniendo en cuenta que actualmente la empresa parece encontrarse en problemas económicos, la devolución de dicho crédito podría considerarse un escollo más en el futuro de la empresa a corto plazo.</div>
<br />
<h2>
Funcionamiento de la plataforma digital</h2>
<div style="text-align: justify;">
A diferencia de muchas otras plataformas de contenidos digitales, el software que dispone <i>FX Interactive</i> no trae embebido ningún tipo de gestión DRM. La gestión del DRM la realiza el propio sitio web <em>FX Classics Store</em> en conjunción con un objeto <em><a href="http://es.wikipedia.org/wiki/ActiveX" target="_blank">ActiveX</a></em> que se despliega desde el sitio web en los ordenadores de los usuarios.</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjj6iB5Gl2_hTZCcikIkwOnj9azrkGlO0RQQTfq7c_vfWHUKofUEw5iXnelqhJGlBii9PkwOPYJmqkH5CPz6D1aWXRtQff5geWESqHdJlhyn7ZMXVt2DLD1WTFMkIvceeg0SsdLM4H4Kp4/s1600/fx_fxwebplayer.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img alt="Instalación FX Web Player" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjj6iB5Gl2_hTZCcikIkwOnj9azrkGlO0RQQTfq7c_vfWHUKofUEw5iXnelqhJGlBii9PkwOPYJmqkH5CPz6D1aWXRtQff5geWESqHdJlhyn7ZMXVt2DLD1WTFMkIvceeg0SsdLM4H4Kp4/s1600/fx_fxwebplayer.png" height="183" title="Instalación FX Web Player" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Instalación <i>FX Web Player</i></td></tr>
</tbody></table>
<div style="text-align: justify;">
A la vez que se instala el objeto <em>ActiveX</em>, el mismo paquete instala otras aplicaciones auxiliares.<br />
<br /></div>
<div style="text-align: justify;">
La cuenta de cada usuario almacena los títulos que tiene adquiridos y que son mostrados en su área privada, una vez autenticado en la web de <em>FX Classics Store</em>. Al pulsar en cada uno de los títulos que el usuario tiene en su área privada, el código <em>javascript</em> de la página invoca al objeto <em>ActiveX</em> que realiza todas aquellas gestiones para las que el código <em>javascript</em> de una página web no tiene privilegios de acceso.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Tras pulsar sobre el título ya adquirido y que queremos descargar, el objeto <em>ActiveX</em> iniciado por el <em>javascript</em> de la página, abre una conexión <em>TCP</em> con un servidor de <em>FX Interactive</em>, concretamente hacia <em>wu2.fxinteractive.com: 44500</em>, consultando parámetros de instalación y descarga del juego, si el usuario tiene permiso para acceder a dicho juego y si le quedan instalaciones (las <a href="http://juegos.fxinteractive.com/condiciones.html" target="_blank">condiciones de uso de <em>FX Classics Store</em></a> establecen que cada título puede estar instalado hasta en cinco ordenadores simultáneamente).</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Una vez validados los derechos del usuario autenticado en la web de <em>FX Classics Store</em> sobre el juego en cuestión, se muestra en el navegador un botón para instalar el juego, e incluso si está instalado muestra un botón para lanzarlo y otro para desinstalarlo.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
El objeto <em>ActiveX</em> se encarga de descargar el paquete con la instalación del juego. Consiste en un archivo con extensión .w2i. Una vez descargado el paquete, se descomprime y si todo ha ido bien se pregunta al usuario si desea instalar.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Desde un punto de vista de programación, el objeto <em>ActiveX</em> se comporta como una librería de funciones que aporta al código <em>javascript</em> de la web todas las funcionalidades necesarias. El flujo de control de todo proceso se realiza desde <em>javascript</em>, concretamente desde el archivo "<a href="http://juegos.fxinteractive.com/fx/public/js/wu2.js.php" target="_blank">wu2.js.php</a>". Ese código <em>javascript</em> invoca funciones del objeto <em>ActiveX</em> y examina los resultados que devuelve.</div>
<br />
<h2 style="text-align: justify;">
Proceso de instalación</h2>
<div style="text-align: justify;">
En los paquetes .w2i hay un archivo "<em>wu2_install.cfg</em>". Este archivo es el que contiene las instrucciones de instalación. El archivo es un listado de órdenes a ejecutar por el instalador y contiene varias secciones separadas: secciones de copia de archivos, creación de entradas en el registro de <em>Windows</em>, creación de accesos directos e incluso ejecución de instaladores de productos de terceros como librerías en tiempo de ejecución.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Tras la descompresión, este archivo "<em>wu2_install.cfg</em>" es interpretado por una aplicación auxiliar que se instala a la vez que el objeto <em>ActiveX</em>. La aplicación, denominada "<em>w2i.exe</em>", siguiendo las instrucciones listadas en el archivo "<em>wu2_install.cfg</em>" copiará los archivos en los lugares indicados por dicho archivo, creará las entradas de registro indicadas, y finalmente borrará tanto el directorio donde se han desempaquetado los contenidos del paquete de instalación, como el propio archivo .w2i.</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBEWoNg6-YpO9wHuGHoF5pQ-Li-IbG5-0gwNv98_6k_xYBzCQuwDaICDg4Ti2ls7SAgmtvw65D4WNV3ngc1YkbQfuxIF1e1H9Fgp85dLnGCcD-oracsZHGFAo2IMFb18iqucsezKDDAIQl/s1600/fx_progresodescarga.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img alt="Progreso de descarga" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBEWoNg6-YpO9wHuGHoF5pQ-Li-IbG5-0gwNv98_6k_xYBzCQuwDaICDg4Ti2ls7SAgmtvw65D4WNV3ngc1YkbQfuxIF1e1H9Fgp85dLnGCcD-oracsZHGFAo2IMFb18iqucsezKDDAIQl/s1600/fx_progresodescarga.png" height="90" title="Progreso de descarga" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Progreso de descarga</td></tr>
</tbody></table>
<div style="text-align: justify;">
Todo el proceso de carga e instalación es monitorizado por el código en <em>javascript</em> invocando distintos procedimientos del objeto <em>ActiveX</em>. Con esta interacción, al usuario se le mostrarán barras de progreso durante la descarga y durante la descompresión. Tras finalizar la instalación, la aplicación "<em>w2i.exe</em>" habrá copiado los archivos al directorio de instalación, creado las entradas de registro correspondientes para que el juego funcione adecuadamente y para que pueda ser desinstalado desde la utilidad de desinstalación de <em>Windows</em>, y además habrá generado los accesos directos tanto en el menú de inicio de <em>Windows</em> como en el propio escritorio. Igualmente habrá lanzado los instaladores de otros componentes que pudieran hacer falta para el juego (librerías en tiempo de ejecución de .<em>NET</em>, librerías <em>OpenGL</em>, etc...).<br />
<br />
<h2 style="text-align: justify;">
Objetivos</h2>
<div style="text-align: justify;">
Los posibles problemas económicos de la compañía son una mala noticia para los amantes de los juegos en español, y plantea serios interrogantes sobre la continuidad de la plataforma de distribución digital, y sobre la disponibilidad futura de los juegos que muchos clientes han adquirido mediante dicha plataforma.<br />
<br /></div>
<div style="text-align: justify;">
Nos proponemos en próximas entradas echar un vistazo más detallado al funcionamiento de la plataforma digital <em>FX Cloud</em> a ver si es posible, de alguna manera, descargar los contenidos y dejarlos almacenados, por si en un futuro ocurre la desgracia de que <em>FX Interactive</em> se vea forzada a dejar de operar, y los juegos adquiridos en su plataforma digital dejan de estar disponibles.</div>
</div>
Softbreakershttp://www.blogger.com/profile/01666968545873713297noreply@blogger.com0tag:blogger.com,1999:blog-5459690923545315155.post-67624315329192380742015-03-06T11:32:00.000+01:002015-03-06T11:32:09.034+01:00In Memoriam - 5 - Reconstruyendo el servidor del juego<h2>
Funcionamiento</h2>
<div>
<div style="text-align: justify;">
Tal y como se apuntó en la <a href="http://www.softbreakers.com/2014/09/in-memoriam-1-cenizas.html" target="_blank">primera entrada de esta serie</a>, la función principal del servidor es remitirle a cada jugador los correos que genera el juego conforme el desarrollo la partida va avanzando.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
En una primera fase, el jugador debe crearse una cuenta en el juego, introduciendo su nick y la dirección de correo electrónico que desea utilizar. Al crear la cuenta, el juego genera una contraseña aleatoria en forma de letras mayúsculas, coincidiendo la longitud del nick seleccionado por el usuario con el de la contraseña que genera el juego.</div>
</div>
<div style="text-align: justify;">
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh479zCxzsnjoSDmDAn95BJuRKV4P8GBsZzhKGyxCMapUksl8TsqX6cvjDpYCZCN8Ejeooyp0udprrIrIwVOuv0pEG2YcP_-tMNz7F3tFeKIAc6W-FzD-qNAvwYXQHne1SGLStWNahyKSKS/s1600/im_reg.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img alt="Registro In Memoriam" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh479zCxzsnjoSDmDAn95BJuRKV4P8GBsZzhKGyxCMapUksl8TsqX6cvjDpYCZCN8Ejeooyp0udprrIrIwVOuv0pEG2YcP_-tMNz7F3tFeKIAc6W-FzD-qNAvwYXQHne1SGLStWNahyKSKS/s1600/im_reg.png" height="230" title="Registro In Memoriam" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Registro In Memoriam</td></tr>
</tbody></table>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<a name='more'></a>El juego envía al servidor esta información para crear la nueva cuenta. El servidor comprobará si existe alguna otra cuenta con la misma dirección de correo electrónico, que es la única limitación.</div>
<div style="text-align: justify;">
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtfXoLgi_jx1xtiV3zB_ojtfIe-l3PUmuA_OkRLFM1e8Kef7trSH1rTuTOGqqgEKvOF48YUzqfe30Jlx16JwTGfPZd7R64lYSW4VJJ0VodVjw5CFUKtym9REYvwZCfXhcqheSfIVj0Lz-X/s1600/im_regdupe.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtfXoLgi_jx1xtiV3zB_ojtfIe-l3PUmuA_OkRLFM1e8Kef7trSH1rTuTOGqqgEKvOF48YUzqfe30Jlx16JwTGfPZd7R64lYSW4VJJ0VodVjw5CFUKtym9REYvwZCfXhcqheSfIVj0Lz-X/s1600/im_regdupe.png" height="229" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Registro rechazado por correo duplicado.</td></tr>
</tbody></table>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
En caso de que no exista otra cuenta con la misma dirección de correo electrónico, el servidor crea temporalmente la cuenta e informa al juego que acepta la creación de la cuenta. En ese momento el juego solicita al servidor que envíe un primer mensaje a la cuenta de correo del jugador. En ese primer correo se envía la información relativa a la creación de la cuenta, contraseña incluida.</div>
<div style="text-align: justify;">
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_gGP_hyphenhyphen9mTaEFD4KC1IZcPf70oZJOElZlgE1NmqRr-BhLrLHyeRmytoJB7dR21TH5sFTJ_laVEO-UwvoUGrTndQfAxhatjfCuQ3VqrN7ZpiEo6Q9-9O2wkpAg_Fl3gTRuMjVpsSY8YE5b/s1600/im_regaccept.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_gGP_hyphenhyphen9mTaEFD4KC1IZcPf70oZJOElZlgE1NmqRr-BhLrLHyeRmytoJB7dR21TH5sFTJ_laVEO-UwvoUGrTndQfAxhatjfCuQ3VqrN7ZpiEo6Q9-9O2wkpAg_Fl3gTRuMjVpsSY8YE5b/s1600/im_regaccept.png" height="231" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Registro pendiente de confirmación</td></tr>
</tbody></table>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Si todo va bien, el jugador recibirá un correo electrónico con el nick, correo electrónico y contraseña de la cuenta del juego. El juego queda a la espera de que el jugador valide la creación de la cuenta, introduciendo la contraseña de la misma.</div>
<div style="text-align: justify;">
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7O7-otwumKc2K8QocOCgVKAJfNeXQvDE5oNC9gSU1SZ4QPfIREXTgfOXjCfosJOoUO9spaZTaGZK-bEeuwbfSRq9VGN-M-RM6H15M9bs1Lz1R5qU9fwro1tgu5LL6AkgiKG9XSwb5J_RX/s1600/im_regconfirm.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7O7-otwumKc2K8QocOCgVKAJfNeXQvDE5oNC9gSU1SZ4QPfIREXTgfOXjCfosJOoUO9spaZTaGZK-bEeuwbfSRq9VGN-M-RM6H15M9bs1Lz1R5qU9fwro1tgu5LL6AkgiKG9XSwb5J_RX/s1600/im_regconfirm.png" height="229" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Confirmación del registro</td></tr>
</tbody></table>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<div>
En caso de introducir la contraseña correctamente el juego confirma al servidor definitivamente la creación de la cuenta, y comienza el juego mostrando el inquietante vídeo introductorio.</div>
<div>
<br /></div>
<div>
A partir de ahí, la comunicación entre el juego y el servidor se reduce a peticiones de envío de correos que el juego transmite al servidor. Cada transacción de envío de correo incluye un parámetro adicional que permite retrasar el envío de dicho correo hacia la cuenta de correo del jugador. Este parámetro permite retrasar el envío minutos, horas o incluso días, logrando así que el momento de la recepción de los mensajes no guarde relación con el hecho de que estemos jugando o no al juego. Así, es posible recibir uno de estos correos sin haber iniciado el juego durante un par de días.</div>
<div>
<br /></div>
<h2>
Mensajes opcionales</h2>
<div>
<div>
El contenido de estos correos puede ser más o menos importante. Algunos son completamente necesarios, otros intentan aumentar la inmersión en el juego aunque no lleven información imprescindible, y otros llevan pistas optativas destinados a ayudarnos en determinadas fases del juego si nos quedamos atascados demasiado tiempo.</div>
<div>
<br /></div>
<div>
La mecánica de retrasar el envío de los mensajes a la cuenta de los usuarios es la que permite al juego conseguir esta funcionalidad por la que podemos empezar a recibir pistas si nos quedamos atascados en alguna fase. Al iniciar una fase para la que el juego tiene programado mensajes con pistas opcionales, se lanzan contra el servidor el envío de estos mensajes introduciendo retardos que pueden ser de varios días. Estos mensajes quedan almacenados en el servidor a la espera de que se cumpla el plazo estipulado para cursarlos. Si nos atascamos en esa fase, y se cumplen los retrasos definidos, el servidor nos envía cada uno de esos correos en el momento programado.</div>
<div>
<br /></div>
<div>
Independientemente de que dichos correos opcionales se hayan enviado o no, una vez que se finalice esa fase de la partida, el juego lanza una o varias transacciones especiales hacia el servidor para borrar selectivamente algunos de estos correos con pistas opcionales. En caso de que hayamos finalizado la fase antes de que se cumpla el plazo para el envío alguno de esos correos, el juego los borra del servidor y nunca los recibiremos.</div>
<div>
<br /></div>
<div>
Por ello, la secuencia de mensajes recibidos durante una partida por un jugador, puede ser distinta de la secuencia recibida por otro jugador. Así, además de que en cada fase cada una de las partes de la misma pueden resolverse en cualquier orden, la velocidad con la que resolvamos cada una de las partes puede hacer que recibamos o no recibamos algunos correos adicionales.</div>
</div>
<div>
<br /></div>
<h2>
Funciones adicionales</h2>
<div>
Aparte del registro de cuentas y el envío de mensajes de correo, el juego precisa del servidor otras funcionalidades, como la modificación del correo electrónico de una cuenta existente y el borrado de cuentas.</div>
<div>
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_fhTEVpg6IL1QxzoJuI2ZkGxfAbN-QDU_dCMLhh8YOya-ejvqzmE5-PVbsrsrP3h5J1uX6bgqUQ8q4V9-pXzY7yP_H1oZKq_VlJMu-KBr0VuxraxKhJO8K1MD2hszTm3qruk0wTkRFL0l/s1600/im_regchange.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_fhTEVpg6IL1QxzoJuI2ZkGxfAbN-QDU_dCMLhh8YOya-ejvqzmE5-PVbsrsrP3h5J1uX6bgqUQ8q4V9-pXzY7yP_H1oZKq_VlJMu-KBr0VuxraxKhJO8K1MD2hszTm3qruk0wTkRFL0l/s1600/im_regchange.png" height="231" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Modificación de la cuenta de correo</td></tr>
</tbody></table>
<div>
<br /></div>
<div>
Estas funciones adicionales, aunque no son necesarias para disfrutar del juego, han sido igualmente implementadas en el servidor.</div>
<div>
<br /></div>
<h2>
Mejoras</h2>
<div>
<div>
Hasta aquí el funcionamiento original del malogrado servidor de Lexis Numérique. En el nuevo servidor desplegado finalmente, se han introducido algunas modificaciones y funcionalidades adicionales.</div>
<div>
<br /></div>
<div>
La primera relativa al borrado de cuentas. El juego, cuando registra una nueva cuenta de un jugador, recibe del servidor un identificador numérico que identifica la cuenta. Cuando el jugador quiere borrar su cuenta, el juego envía al servidor una transacción especial con el identificador numérico de la cuenta a eliminar.</div>
<div>
<br /></div>
<div>
Desde el punto de vista de seguridad de la transacción, sería muy fácil para un tercero lanzar de manera automatizada contra el servidor la transacción de borrado, cambiando el identificador de la cuenta a borrar, y con muchas posibilidades de borrar una gran cantidad de cuentas que no le pertenecen.</div>
<div>
<br /></div>
<div>
Por ello, cuando el juego borra una cuenta, el nuevo servidor da la misma respuesta que el servidor original, haciendo creer al juego que la cuenta se ha eliminado sin errores, pero en realidad no se borra nada. Para borrar una cuenta definitivamente, en la web del proyecto <a href="http://inmemoriam.softbreakers.com/es/Borrar-cuenta/" target="_blank">se ha desplegado un formulario</a> en el que el jugador debe introducir la cuenta de correo electrónico y la contraseña de la cuenta a borrar.</div>
</div>
<div>
</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgq-zBO4P7hR_eXgzb4GJUz6QLb-HlbAABwEpzdzn7x_WS2lB_BGtk-KRXdf9gaci9earm4EWJbV4S7-FQEU3eURoEwdxVoJvU0nwVbV14fX3ToQu5X6EkmrAz_YwOAREj1w193RhiOThDv/s1600/im_deleteaccount.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgq-zBO4P7hR_eXgzb4GJUz6QLb-HlbAABwEpzdzn7x_WS2lB_BGtk-KRXdf9gaci9earm4EWJbV4S7-FQEU3eURoEwdxVoJvU0nwVbV14fX3ToQu5X6EkmrAz_YwOAREj1w193RhiOThDv/s1600/im_deleteaccount.png" height="171" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Formulario de borrado de cuentas</td></tr>
</tbody></table>
<div>
<br /></div>
<div>
<div>
La otra mejora de importancia es proporcionar un cliente de correo web para poder acceder a los mensajes enviados por el juego. Una de las quejas más frecuentes que se podía encontrar en foros sobre el juego, era la no recepción de correos importantes que dejaban al jugador bloqueado en su partida sin poder avanzar.</div>
<div>
<br /></div>
<div>
Los correos que envía el servidor tienen como remitente cuentas de correo de distintos dominios, como por ejemplo info@skl-network.com o julie_massenet@hotmail.com. Muchos proveedores de correo actuales toman medidas contra el spam, y para clasificar un correo como spam usan varios criterios. Uno de ellos es la relación entre el servidor que envía el correo y el dominio del supuesto remitente. Obviamente, enviar un correo con un remitente de Hotmail desde un servidor que no tiene nada que ver con Hotmail.com tiene todas las papeletas de ser clasificado como spam.</div>
<div>
<br /></div>
<div>
Dependiendo de las políticas del proveedor de correo electrónico que reciba este mensaje sospechoso, el mensaje puede ser alojado en una carpeta de spam permitiendo al receptor acceder al mismo y decidir si es spam o no, o bien el mensaje puede ser directamente descartado.</div>
<div>
<br /></div>
<div>
Para salvar este escollo, el nuevo servidor para el juego <a href="http://inmemoriam.softbreakers.com/es/Webmail/" target="_blank">dispone de un rudimentario cliente de correo web</a>. Introduciendo la dirección de correo registrada en el juego junto con la contraseña asignada, se da acceso a todos los mensajes que ha enviado el juego al usuario.</div>
</div>
<div>
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSmeQ4lIL5YGXvOxxIVe-eW63Isvu6-ZptEKBkMYl-jfSkCINNSckYy9-5B3Jg234WcCYvbHFs-dTEzKocEKUizzGWn2mu-QtuQV67oAoer1ha2qviZkBvFIyAGgish1p3PGUDrosLRIzI/s1600/im_webmail.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSmeQ4lIL5YGXvOxxIVe-eW63Isvu6-ZptEKBkMYl-jfSkCINNSckYy9-5B3Jg234WcCYvbHFs-dTEzKocEKUizzGWn2mu-QtuQV67oAoer1ha2qviZkBvFIyAGgish1p3PGUDrosLRIzI/s1600/im_webmail.png" height="320" width="290" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Cliente de correo web</td></tr>
</tbody></table>
<div>
Obviamente el cliente de correo web desplegado no permite enviar correos. Tan solo permite leer mensajes enviados por el juego al jugador. Aquellos mensajes que aún no se hayan enviado porque el juego los haya creado con un retardo de envío, no se mostrarán hasta el momento adecuado.</div>
<div>
<br /></div>
</div>
Softbreakershttp://www.blogger.com/profile/01666968545873713297noreply@blogger.com0tag:blogger.com,1999:blog-5459690923545315155.post-44407574784009486852015-02-09T14:22:00.000+01:002015-04-17T14:15:13.758+02:00Falciani para Rato<h2>
Cuando lo que quieres ocultar, se entrevé.</h2>
<div style="text-align: justify;">
La informática avanza muy deprisa. Menuda obviedad para comenzar... Pero la cuestión no esa, la cuestión es que avanza <u>demasiado</u> deprisa. Para un servidor, que comenzó en esto de la informática con un <a href="http://es.wikipedia.org/wiki/MSX" target="_blank">MSX</a>, es muy evidente, tanto como que es otra obviedad más, y ya van dos en el mismo párrafo.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
La aparición de herramientas cada vez más completas y simples de usar, permiten a casi cualquier persona con unos conocimientos mínimos crear cualquier tipo de aplicación que un equipo de versados programadores a la vieja escuela, directamente en ensamblador, tardarían meses o años en implementar. Y esto es bueno.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Estas herramientas y asistentes permiten desentenderte de las "<i>tripas</i>" del asunto, y no tener que bajar a complejidades más ligadas a las interioridades de la máquina sobre la que va a funcionar lo que desarrollas. Y esto también es bueno.</div>
<div style="text-align: justify;">
<br />
<a name='more'></a>Pero un desarrollador que se haya currado programación en ensamblador, incluso bajo sistemas operativos tan "<i>asistidos</i>" y "<i>visuales</i>" como Windows, sabe que el desentenderse de las "<i>tripas</i>" tiene sus peligros. Cada vez más el desarrollo de software depende de "<i>asistentes</i>" que te facilitan, aceleran y simplifican la implementación del engendro que te toque implementar. Pero en cambio, ese "<i>asistente</i>" te genera una "<i>caja negra</i>", en la que por un lado metes la entrada y por el otro sale la salida que has programado que saque, pero no tienes ni idea de como funciona lo que hay dentro más allá de los algoritmos que has introducido en tu entorno de desarrollo: en qué se basa lo que hay detrás de las bambalinas de las que el "<i>asistente</i>" te abstrae, cómo ha traducido tus rutinas y algoritmos al lenguage máquina... Y esto, cuando empiezan los problemas, ya no es tan bueno.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Ejemplo de lo anterior, se produce muy a menudo en el mundo del desarrollo web. A diferencia de otras aplicaciones, las tripas de lo que nos muestra nuestro navegador web son fácilmente accesibles, dejando a la luz cosas curiosas que el navegador no muestra, que el que ha editado y desplegado el contenido web no sabe que están ahí, pero que cualquiera que acceda al código HTML que muestra el navegador puede ver. Y la lista de sorpresas que podemos encontrar es de lo más variopinto: comentarios HTML de contenido jocoso sobre el jefe o colegas, funciones javascript que ya no se usan, etc... En la mayor parte de las ocasiones la información que se puede obtener revisando el código HTML que renderiza nuestro navegador no tiene mucha más utilidad que la de echarnos unas risas, pero en otras ocasiones puede afectar incluso a la seguridad de la plataforma de despliegue: contraseñas y credenciales de acceso, direcciones y puertos de otros equipos, datos confidenciales, etc,..</div>
<div style="text-align: justify;">
<br /></div>
<h2 style="text-align: justify;">
Los "<i>próximamente</i>"</h2>
<div style="text-align: justify;">
Una de las maneras más trilladas de aumentar la expectación, y por tanto la audiencia, son los que yo denomino los "<i>próximamente</i>". Están por todos lados: al final del capítulo de tu serie favorita, en anuncios publicitarios, en el cartelón que han pegado en el escaparate del local de la esquina que anteayer aparecía como disponible, y como no, en la web.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Muchos somos curiosos, y el hecho de que en una web aparezca un "<i>próximamente</i>" desencadena un acto involuntario e incontrolable en la mano que controla el ratón que se traduce en click derecho, opción "<i>Ver código fuente</i>" o "<i>Inspeccionar elemento</i>". En innumerables ocasiones, estos actos "<i>involuntarios</i>" han arruinado calculadas estrategias publicitarias, que se han ido al traste por no darle una última revisión al código HTML que ha generado el "<i>asistente</i>" de turno que usan para la generación y gestión de contenidos en la empresa correspondiente. La lista de víctimas es interminable. Productos que se filtran antes de su presentación oficial, contenidos desvelados antes de tiempo...</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Lo que traigo hoy, y que da título a esta entrada, es una noticia aparecida en el diario <a href="http://www.elconfidencial.com/" target="_blank">El Confidencial</a>. En dicha noticia, se publicita el contenido parcial de la célebre lista filtrada por <a href="http://es.wikipedia.org/wiki/Herv%C3%A9_Falciani" target="_blank">Hervé Falciani</a>, ingeniero de sistemas que trabajó para el banco HSBC en Suiza. <a href="http://www.elconfidencial.com/" target="_blank">El Confidencial</a> declara que mostrará en exclusiva, y junto con la cadena <a href="http://www.lasexta.com/" target="_blank">La Sexta</a>, el contenido de dicha lista.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
En la portada de <a href="http://www.elconfidencial.com/" target="_blank">El Confidencial</a> aparece un banner deslizable que muestra fotos de supuestos integrantes de dicha lista, y al final del mismo hay varios que han sustituidos por un icono de un candado con la inquietante leyenda "Próximamente en El Confidencial".</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYyLEJqgbsUnOD9-Ikw_lJ3a4jskwvunfdMtBFKMzjtPUvQVlQjhlw56KapneXNRN8i2zi59iieMQyzpatrMgWJA0HwRW4mYIwgMSOisFiH_y4OcmU88nopcBxt8UwjZ-s9BHhim27pjV6/s1600/ie_con_img.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYyLEJqgbsUnOD9-Ikw_lJ3a4jskwvunfdMtBFKMzjtPUvQVlQjhlw56KapneXNRN8i2zi59iieMQyzpatrMgWJA0HwRW4mYIwgMSOisFiH_y4OcmU88nopcBxt8UwjZ-s9BHhim27pjV6/s1600/ie_con_img.png" height="221" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Portada El Confidencial. 09/02/2015 10:40</td></tr>
</tbody></table>
Huelga decir que antes de que fuera consciente de lo que hacía, mi mano derecha ya había realizado las acciones correspondientes sobre el ratón para estamparme delante de las narices el código HTML que tenía cargado el navegador. El "<i>próximamente</i>", o al menos una pequeña parte, se mostraba ante mis ojos en toda su plenitud.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNvpfEQppj3q1RB9fQe2vMcVdxfArLYje95X2qNk2-0yfTBsi7PXqPRA2sHRZjXrKoZhyphenhyphenhwGXDAu5fnPAE4vcwaHbrmbjLvRgS-RDxQ8NEyfbrtSQj4Tnv7lInNNHaBRuLnK8-gre1AnUC/s1600/source.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNvpfEQppj3q1RB9fQe2vMcVdxfArLYje95X2qNk2-0yfTBsi7PXqPRA2sHRZjXrKoZhyphenhyphenhwGXDAu5fnPAE4vcwaHbrmbjLvRgS-RDxQ8NEyfbrtSQj4Tnv7lInNNHaBRuLnK8-gre1AnUC/s1600/source.png" height="228" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Extracto del código HTML</td></tr>
</tbody></table>
Por supuesto, es posible que cuando se desvelen el resto de candados que aparecen en dicho banner, ninguno de ellos corresponda con el nombre que aparece actualmente con atributo "alt" de las imágenes de los candados. De hecho es lo más posible por la forma en la que se manejan las imágenes en los gestores de contenido. Por ejemplo, en Wordpress al dar de alta una imagen, puedes asignarle varios atributos que se asignan por defecto a la imagen en todos los lugares donde esta aparezca. Es posible que la imagen del candado se haya usado en alguna noticia relacionada con ese señor, y dicha imagen la hayan reutilizado para un contenido que puede que no tenga nada que ver como es la lista de Falciani. Revisando un poco más el código fuente vemos que todas las imágenes de dicho banner, sean de candado o no, tienen el mismo nombre en su atributo "<i>alt</i>", con lo que parece pausible que sea un error.<br />
<br />
El que aparezca el nombre del aludido entre los futuribles "<i>próximamente</i>" de dicho diario, es algo que solo el tiempo nos dirá. Lo que es ineludible es, en caso de que finalmente dicho nombre no aparezca, el daño que se le produce a dicha persona al asociarla a dicha información. Y no me refiero al daño que sufre su imagen ante los cuatro "<i>locos</i>" que se les dispara la mano derecha para bucear en el código HTML ajeno.<br />
<br />
El atributo "<i><a href="http://www.w3schools.com/tags/att_img_alt.asp" target="_blank">alt</a></i>" de una imagen no es una información que permanezca oculta entre las interioridades del código HTML. Su contenido describe la imagen, y la sustituye en aquellos entornos en los que la que la imagen no puede ser mostrada, como por ejemplo cuando tenemos el navegador configurado para que no muestre imágenes, cosa perfectamente posible en entornos con baja velocidad de acceso a Internet o donde queremos ahorrar tráfico de datos, como puede ser en dispositivos móviles.<br />
<br />
En el navegador Internet Explorer, si deshabilitamos las imágenes (Opciones de Internet - Opciones avanzadas - Multimedia - Mostrar imágenes), la portada de el diario se nos mostrará así.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRwbwgKxMd2DfkTrP95n8Xusa0u0wWA6TSZ0wltBQe4qA5a43nzr2W9DgmoBH9FZJ7ph92SZv1UEkx0RZVtePyBcH-kfD6XUx7apCm5axB9DoCE-qzAHil8Az9Cq_x31d0w9ugLjwSnFnM/s1600/ie_sin_img.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRwbwgKxMd2DfkTrP95n8Xusa0u0wWA6TSZ0wltBQe4qA5a43nzr2W9DgmoBH9FZJ7ph92SZv1UEkx0RZVtePyBcH-kfD6XUx7apCm5axB9DoCE-qzAHil8Az9Cq_x31d0w9ugLjwSnFnM/s1600/ie_sin_img.png" height="192" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Portada El Confidencial sin imágenes.</td></tr>
</tbody></table>
Obviamente la imagen que ofrecen del aludido deja mucho de desear, sobre todo si no tiene nada que ver con la noticia. Pero hay más...<br />
<br />
El atributo "alt" de las imágenes también es utilizado por aplicaciones lectoras de pantalla, destinadas a personas con problemas de accesibilidad, en este caso con problemas de visión. A la hora de plasmar la imagen para una persona con problemas de visión, el software lector sustituye la imagen por el contenido de dicho atributo, tanto de manera sonora, como en los <a href="http://es.wikipedia.org/wiki/L%C3%ADnea_Braille" target="_blank">dispositivos braille</a> conectados al equipo y que permiten a personas con graves problemas de visión acceder a la información que les pueden brindar las nuevas tecnologías.<br />
<br />
Veamos como oiría este banner una persona con problemas de visión asistida por el lector <a href="http://es.wikipedia.org/wiki/Orca_%28software%29" target="_blank">Orca</a>, incluído por defecto en Ubuntu. Una persona usando una <a href="http://es.wikipedia.org/wiki/L%C3%ADnea_Braille" target="_blank">línea braille</a> leería exactamente lo mismo. Por simplicar la página a procesar, introduciremos en el navegador <a href="http://datos.elconfidencial.com/exclusiva-8f/?grid=6,1" target="_blank">la URL que lleva directamente a dicho banner</a>.<br />
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div style="text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://ytimg.googleusercontent.com/vi/Qifrbs-_gR0/0.jpg" frameborder="0" height="266" src="http://www.youtube.com/embed/Qifrbs-_gR0?feature=player_embedded" width="320"></iframe></div>
<br />
También se llevarían una mala impresión del aludido las personas que usen lectores de pantalla para acceder a la información.<br />
<br />
De cara a futuros "<i>próximamente</i>" que intenten enervar la curiosidad de los lectores, no sería mala idea que los creadores de contenido echaran un vistazo al código HTML que genera su gestor de contenidos antes de publicarlo. Que tengan la seguridad de que muchos de sus curiosos lectores también van a hacerlo.<br />
<br />
<h4>
ACTUALIZACION</h4>
</div>
<div style="text-align: justify;">
Algo más de dos meses después de esta entrada, en abril, Rodrigo Rato fue detenido de manera temporal durante unos registros por agentes del servicio de Aduanas de la Agencia Tributaria, y acusado de presuntos delitos de fraude, alzamiento de bienes y blanqueo de capitales por parte de la Fiscalía de Madrid.</div>
Softbreakershttp://www.blogger.com/profile/01666968545873713297noreply@blogger.com0tag:blogger.com,1999:blog-5459690923545315155.post-27772030821332503832015-01-22T18:10:00.001+01:002015-04-18T11:16:42.997+02:00Whatsapp desde el navegador Chrome<h2 style="text-align: justify;">
Whatsapp desde tu ordenador</h2>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Desde hace unas horas, Whatsapp ha liberado las modificaciones necesarias para habilitar una de las funcionalidades más demandadas por sus usuarios desde hace tiempo: la posibilidad de <a href="http://www.xatakandroid.com/comunicacion-y-mensajeria/asi-se-usa-whatsapp-web-desde-el-ordenador" target="_blank">usar Whatsapp desde un ordenador</a>. Hasta hace nada, la única opción posible <a href="http://www.redeszone.net/whatsapp/bluestacks/" target="_blank">pasaba por instalar un emulador de Android</a> en el ordenador e instalar la aplicación móvil de Whatsapp en el mismo. Esta opción, desapareaba la cuenta de Whatsapp con el móvil ya que los servidores de Whatsapp no permiten tener la cuenta simultáneamente aparejada con más de un dispositivo.</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7s9Goci-fDBZZZaNOSPWLIWiXNV22z-8ZiNcolBFi_kYgRV3NmgRkWm4PEnJo0fv0tjFqNj1R4JfOR5EH1LYaB7tu6elQuOTd5yZQe79OQXE6gi0aoj1-OsGiG7Ihr8hvbkodFcwbkZXt/s1600/whatsapp.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7s9Goci-fDBZZZaNOSPWLIWiXNV22z-8ZiNcolBFi_kYgRV3NmgRkWm4PEnJo0fv0tjFqNj1R4JfOR5EH1LYaB7tu6elQuOTd5yZQe79OQXE6gi0aoj1-OsGiG7Ihr8hvbkodFcwbkZXt/s1600/whatsapp.jpg" height="148" width="320" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br />
<a name='more'></a>Allá por el mes de febrero se anunció que <a href="http://tecnologia.elpais.com/tecnologia/2014/02/19/actualidad/1392848898_360807.html" target="_blank">Facebook había adquirido Whatsapp</a> por 13.800 millones de euros. Coincidencia o no, desde entonces parece que Whatsapp se ha puesto las pilas para intentar cumplir con los deseos de sus numerosos usuarios, deseos que en muchos casos eran más bien condiciones necesarias para lograr una implementación razonablemente segura y responsable de la famosa aplicación de mensajería. Ejemplo de característica responsable de cara a sus clientes es la encriptación segura de los mensajes enviados por sus usuarios, funcionalidad que no se presentó <a href="http://www.abc.es/tecnologia/moviles-aplicaciones/20141118/abci-whatsapp-cifrado-conversaciones-201411181714.html" target="_blank">hasta noviembre del año pasado</a>.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
A la hora de implementar el acceso a las funcionalidades de Whatsapp desde un ordenador convencional, la empresa se ha decidido por implementar una aplicación web, en lugar de una aplicación de escritorio convencional, y la ha bautizado como "<i>Whatsapp Web</i>" Esto, en esencia, permite a la empresa dotar a la aplicación de las facilidades multiplataforma de las que disfruta cualquier aplicación web, sin necesidad de codificar y mantener distintas aplicaciones para distintos sistemas operativos. Por otro lado se simplifica la actualización de la aplicación, que tendrá que mantener su compatibilidad con las aplicaciones móviles de Whatsapp, sometidas a actualizaciones muy frecuentes.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Por otro lado, aunque la funcionalidad es multiplataforma e independiente del sistema operativo, en la versión actual no es multinavegador. De hecho es "<i>mono-navegador</i>" ya que solo soporta el navegador Google Chrome. Desde el lado del dispositivo móvil, el soporte de la funcionalidad tampoco es completamente universal ya que actualmente "<i>Whatsapp Web</i>" no es soportado por el cliente para iPhone. </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
La liberación de esta funcionalidad ha coincidido en tiempo con el <a href="http://www.elmundo.es/tecnologia/2015/01/21/54bf542a22601d15618b456c.html" target="_blank">bloqueo de los usuarios de Whatsapp Plus</a>, que desde ayer se encontraron con esta desagradable sorpresa al abrir la aplicación Whatsapp Plus:</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwUGDATkz6KxcGMxwMqD2m_Bn0lD7BiHta3aojnWzhzkZ3dGaLX71WJ1Z02O3wf2dqpnBGzvwVGz_1mfrYO_fQJaYboDKXPwVMRsMnkgmYYhkw3J78Wbg-W8IkucxTwLmgjleKLd4Ln-Jo/s1600/whatsapp_plus_blocked.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwUGDATkz6KxcGMxwMqD2m_Bn0lD7BiHta3aojnWzhzkZ3dGaLX71WJ1Z02O3wf2dqpnBGzvwVGz_1mfrYO_fQJaYboDKXPwVMRsMnkgmYYhkw3J78Wbg-W8IkucxTwLmgjleKLd4Ln-Jo/s1600/whatsapp_plus_blocked.jpg" height="320" width="187" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<a href="http://articulos.softonic.com/que-es-whatsapp-plus-comparativa" target="_blank">Whatsapp Plus</a> es una aplicación <a href="http://articulos.softonic.com/entrevista-whatsapp-plus-uso-ilegal" target="_blank">realizada por un español a partir de ingeniería inversa</a> sobre la aplicación oficial, y que sustituye a la misma. Usa los mismos servidores de Whatsapp y la cuenta del usuario, pero añade muchas más funcionalidades que la aplicación oficial no ofrece. La razón oficial dada por la empresa es que <a href="https://www.whatsapp.com/faq/es/general/105" target="_blank">no puede garantizar la seguridad de Whatsapp Plus</a> ni de los mensajes y datos que se cursan a través de dicha aplicación. Puede que Whatsapp Plus no soporte las funcionalidades de encriptación punto a punto introducidas por Whatsapp el pasado mes de noviembre, o puede que el bloqueo tenga algo que ver con la aplicación web presentada hoy.</div>
<div style="text-align: justify;">
<br /></div>
<h2 style="text-align: justify;">
Whatsapp Web</h2>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
En el esquema de funcionamiento propuesto por Whatsapp, la aplicación web (<a href="https://web.whatsapp.com/">https://web.whatsapp.com</a>) nos presenta un código QR que debe ser escaneado por el cliente actualizado de Whatsapp. A partir de ese momento, la aplicación web y la aplicación móvil se sincronizan, pasando la aplicación móvil a funcionar como un servidor de la aplicación web. Esto implica que el dispositivo móvil debe mantenerse encendido y conectado a la red de datos, ya sea a la red de datos móvil de nuestro operador de telefonía o bien a una red wifi.</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div style="text-align: justify;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhH58SFQGO-I8QuyYPWJqIFsiC3jkvwaH17NTPnRC582nGZ_EW5haP14LPHv2tBQreWXuJ5l-ST9X3xEl5G3LmWTqD5PFukwRDX4TOjt-RA-F7S-NAyLld_CoZ55SF9tzsQZtDB9CcX8HLx/s1600/whatsapp_web.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhH58SFQGO-I8QuyYPWJqIFsiC3jkvwaH17NTPnRC582nGZ_EW5haP14LPHv2tBQreWXuJ5l-ST9X3xEl5G3LmWTqD5PFukwRDX4TOjt-RA-F7S-NAyLld_CoZ55SF9tzsQZtDB9CcX8HLx/s1600/whatsapp_web.jpg" height="208" width="320" /></a></div>
<br /></div>
<div style="text-align: justify;">
<h4>
¿Por qué es necesario tener el móvil encendido?</h4>
Esto para muchos usuarios puede parecer un fastidio, ya que si queremos apagar el móvil, o éste se queda sin batería, o estamos en un entorno en el que no hay cobertura de datos móviles ni red wifi disponible, nuestra aplicación web dejará de funcionar. Lo que para muchos puede parecer una chapuza por parte de Whatsapp, es una condición completamente necesaria. Puesto que desde el pasado mes de noviembre los mensajes se encriptan punto a punto, la aplicación web no puede alimentarse directamente de los servidores de Whatsapp. En teoría, tras dicha actualización, los mensajes de nuestra cuenta solo pueden desencriptarse en nuestra aplicación móvil. De hecho, <b>si "<i>Whatsapp Web</i>" pudiera funcionar con el móvil apagado estaríamos ante un escándalo de proporciones monumentales</b> ya que significaría que la encriptación punto a punto anunciada en noviembre no era más que un bulo y una conspiración para hacernos creer que la confidencialidad de nuestros mensajes estaba, por fin, garantizada.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
De esta manera, cuando desde la aplicación web creamos un nuevo mensaje en uno de nuestros chats, este mensaje es transmitido a la aplicación móvil, y es ésta la que se encarga de retransmitirlo hacia los servidores de Whatsapp. Posteriormente los distintos acuses de recibo (primer check cuando los servidores de Whatsapp reciben el mensaje, segundo check cuando el móvil del destinatario descarga el mensaje, y el controvertido doble check azul de acuse de lectura) aparecen primero en la aplicación móvil para un instante después reflejarse en la aplicación web abierta en nuestro navegador Chrome. Análogamente, un mensaje recibido en nuestra cuenta, aparecerá primero en la aplicación móvil para enseguida reflejarse en la aplicación web. Por supuesto, cualquier nueva actividad que realicemos en la aplicación móvil (enviar un mensaje o archivo, crear un nuevo chat, etc...) también aparece reflejado al instante en la aplicación web.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
La aplicación web dispone de funcionalidades para notificaciones en escritorio, permitiendo tener la ventana de Chrome que tiene "<i>Whatsapp Web</i>" minimizada. Asimismo, la propia aplicación web nos advertirá si el teléfono se encuentra con la batería baja, indicándonos que debemos cargarlo si queremos seguir usando la aplicación web.</div>
<div style="text-align: justify;">
<br /></div>
<h2 style="text-align: justify;">
Cuidado con las sesiones abiertas</h2>
<div>
<br /></div>
<div style="text-align: justify;">
Cuando la aplicación móvil de Whatsapp escanea un código QR de "<i>Whatsapp Web</i>" se produce un emparejamiento entre la aplicación móvil y la aplicación web en ese ordenador. El funcionamiento en esencia es similar al emparejamiento de dispositivos bluetooth. Mientras este emparejamiento permanezca activo, nuestro Whatsapp en el terminal móvil será accesible desde dicho ordenador. Esto significa que si dejamos el ordenador con la sesión abierta, cualquiera que lo encienda y acceda a <a href="https://web.whatsapp.com/" target="_blank">web.whatsapp.com</a> le aparecerá nuestra cuenta Whatsapp con todos sus chat, mensajes, fotos, contactos, etc...</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<b>No vale cerrar el navegador Chrome</b>. Hay que cerrar la sesión que empareja dicho ordenador con nuestra aplicación móvil. Para ello, la aplicación web, en la parte superior dispone de un menú con la opción "<i>Cerrar sesión</i>".</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
¿Y qué ocurre si me voy y no me acuerdo de cerrar la sesión? ¿Tengo que volver? Afortunadamente en Whatsapp también han pensado en ello, y desde la propia aplicación móvil podemos listar las sesiones "<i>Whatsapp Web</i>" abiertas y cerrarlas todas.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjS_49_yiMNGV4sopM7_TqSd9aFnF8EXXm0IwDniWoUAWIxVMyU2KHzLjB8pZBnXqA0S5bsMw9njHihvuV3u2sKyGQU0UNaVjbOVKP-YVOMr8MMMkFDNq4oZW33jMnRhqQHEtAHrv8F4qs/s1600/whatsapp_sesiones.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjS_49_yiMNGV4sopM7_TqSd9aFnF8EXXm0IwDniWoUAWIxVMyU2KHzLjB8pZBnXqA0S5bsMw9njHihvuV3u2sKyGQU0UNaVjbOVKP-YVOMr8MMMkFDNq4oZW33jMnRhqQHEtAHrv8F4qs/s1600/whatsapp_sesiones.jpg" height="320" width="180" /></a></div>
<br /></div>
<div style="text-align: justify;">
¿Sesiones abiertas? ¿Puedo acceder desde varios ordenadores a la misma cuenta de Whatsapp? Podemos tener nuestra aplicación móvil de Whatsapp emparejada simultáneamente con más de un ordenador, pero la aplicación móvil solo intercambiará datos con uno de ellos, quedando los demás con una pantalla de advertencia que permite volver a reconectar desde dicho ordenador.<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh76ZjlqfJVKOmV7IV5M6Mpd9_SxOtr2QJXdm49WVjkgxv01sAvmLAsVxeQJ03ByvU-HsrhenH3o0g5LetHlgocHFaSJLLCrtlcmWyZRMPBe3iHgitb9zifDZqYkFRPvG2d3pyixuYUwdqP/s1600/whatsapp_desconectado.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh76ZjlqfJVKOmV7IV5M6Mpd9_SxOtr2QJXdm49WVjkgxv01sAvmLAsVxeQJ03ByvU-HsrhenH3o0g5LetHlgocHFaSJLLCrtlcmWyZRMPBe3iHgitb9zifDZqYkFRPvG2d3pyixuYUwdqP/s1600/whatsapp_desconectado.jpg" height="231" width="320" /></a></div>
<br />
<h2>
Limitación a Google Chrome</h2>
<div>
Junto con la necesidad de mantener el móvil conectado, la otra queja que expresan los usuarios en estas primeras horas es la limitación de uso solo en Google Chrome. A falta de una comunicación oficial de la compañía que justifique esa decisión, solo nos queda revisar un poco por encima el código de la aplicación web.</div>
<div>
<br /></div>
<div>
Revisando las librerías javascript que usa la aplicación web conseguimos hacernos una idea de como puede funcionar. La mayor parte son librerías open-source y con una pequeña búsqueda en internet podemos ver para qué sirven. </div>
<div>
<br /></div>
<div>
Entre ellas encontramos una librería denominada "<i>end-to-end.compiled.min.js</i>". <a href="https://github.com/google/end-to-end" target="_blank">End-To-End</a> es una extensión creada por Google para Chrome que permite encriptar, desencriptar, firmar y verificar mensajes firmados en el propio navegador Chrome usando OpenPGP. Es de suponer que si Whatsapp en noviembre blindó criptográficamente el intercambio de mensajes en su aplicación, lo lógico es hacer los mismo en las comunicaciones entre la aplicación móvil y la aplicación web. Y seguro que en ese cometido la librería End-To-End juega un papel crucial. Puesto que está implementada como una extensión de Chrome, quizás por ahí venga la limitación de soporte únicamente al navegador de Google.</div>
<div>
<br /></div>
<div>
Pero hay más. Actualmente End-To-End se encuentra en desarrollo, pero Google <a href="http://googleonlinesecurity.blogspot.com.es/2014/06/making-end-to-end-encryption-easier-to.html" target="_blank">decidió en Junio de 2014 liberar una versión alfa</a> para permitir a la comunidad probar y evaluar esta extensión, principalmente para recibir opiniones, detectar fallos, etc... Es muy usual en aplicaciones criptográficas complejas donde un fallo puede tener consecuencias catastróficas, dejar un tiempo que la comunidad juegue con la nueva aplicación. <a href="https://github.com/google/end-to-end/wiki/FAQ" target="_blank">La propia Google ya advierte</a> que compilar y lanzar esta extensión prematuramente puede ser peligroso... y por añadidura entiendo que también lanzar una aplicación basada en parte del código de dicha extensión...</div>
<div>
<br /></div>
<div>
Así pues, da la impresión que <b>la encriptación de las comunicaciones entre "<i>Whatsapp Web</i>" y la aplicación Whatsapp de nuestro móvil parece basarse, presuntamente, en un producto cuyos creadores aún no se sienten lo suficientemente seguros como para lanzarlo formalmente</b>. Desconozco el estado de dicho proyecto de Google. Es posible que las partes que usa "<i>Whatsapp Web</i>" están ya debidamente probadas y su puesta en funcionamiento sea segura. Pero resulta cuanto menos inquietante la <a href="https://github.com/google/end-to-end/wiki/FAQ" target="_blank">advertencia de Google</a>... </div>
<div>
<br /></div>
<h2>
Lo que nos puede deparar el futuro</h2>
<div>
Conociendo la popularidad de Whatsapp, y la forma en la que se ha implementado "<i>Whatsapp Web</i>" doy prácticamente por seguro la aparición en breve de productos de terceros que se basen en esta nueva funcionalidad. Por ejemplo, no sería imposible crear una extensión de Chrome que permitiera hacer copias de seguridad de los chats... y tampoco sería imposible crear nuevos malware que explotaran esta nueva funcionalidad cuando el usuario accede con su ordenador a su cuenta de Whatsapp, o por ejemplo una librería simule el comportamiento de "<i>Whatsapp Web</i>" y que permita acceder a la funcionalidad de otra manera que no sea mediante el navegador Chrome.</div>
<div>
<br /></div>
<div>
La nueva funcionalidad abre muchas puertas a la imaginación a la hora de "meter mano" a Whatsapp. Seguro que en breve comenzarán a aparecer estas nuevas aplicaciones... </div>
</div>
Softbreakershttp://www.blogger.com/profile/01666968545873713297noreply@blogger.com0tag:blogger.com,1999:blog-5459690923545315155.post-87805940948345404832014-10-20T00:00:00.000+02:002015-03-02T22:12:36.485+01:00In Memoriam - 4 - "Virtualizando" internet<div style="text-align: justify;">
<h2>
<u>
Motores de búsqueda</u></h2>
<div>
Independientemente de la solución que se tome, el no registrar la treintena de dominios necesarios provocará que cuando el jugador realice búsquedas en <em>Google</em> u otro buscador usando las pistas que ofrece el juego, no va a encontrar las respuestas que necesita encontrar ya que los buscadores no van a tener indexados dominios que ya no existen.</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjU9lKT1kq5k8cV7nZSkky1OKCz_Zj5eZUid2iCdneh204kjHNwoS7kDz6W-M2iDnErx7xu_A5mcZhdqPQyYvo6kY0EoGjgQeHUvXUOF30JHW3TlSlWA2mhIm1KslXIQRQa3J2UEujCp4N0/s1600/search-engines_blank.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjU9lKT1kq5k8cV7nZSkky1OKCz_Zj5eZUid2iCdneh204kjHNwoS7kDz6W-M2iDnErx7xu_A5mcZhdqPQyYvo6kY0EoGjgQeHUvXUOF30JHW3TlSlWA2mhIm1KslXIQRQa3J2UEujCp4N0/s1600/search-engines_blank.png" /></a></div>
<span id="goog_1025670169"></span><span id="goog_1025670170"></span><br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<a name='more'></a>Para simular la presencia de los sitios web online, tendremos que "<em>insertar</em>" en los resultados que ofrezca el buscador los dominios que antaño, cuando la infraestructura online del juego estaba en pie, aparecían al buscar por determinadas palabras clave relacionadas con el juego. Además debe hacerse de manera que los resultados insertados no difieran en apariencia del resto, de manera que el jugador tenga que currarse el buscar las pistas como si las webs del juego estuvieran aún dispersas en Internet.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
De cara a facilitar la tarea, indicaremos al jugador que para realizar las búsquedas, en lugar de usar los buscadores que todos conocemos (<em>Google, Bing, Yahoo</em>...), deberá usar un buscador proporcionado por nosotros, y albergado en nuestro servidor. El propio juego ofrecía un buscador "optimizado" desde el sitio web de la agencia <em><a href="http://http//www.skl-network.com" target="_blank">SKL Network</a></em>.</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3Kza_uU_PvQXxeEzwNiGuWhX10oquwbjVk5oEeZx6CQuRRLQqJTzuZrpt6M1e8KGhlLIsoE6DOVyQxCO65giHX41Lw8jtwY5_nZIQC-mr8T3uqu8gR6WpXRwJ6G22MDDmAsbwjVFm-g-y/s1600/im_skl_buscador.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3Kza_uU_PvQXxeEzwNiGuWhX10oquwbjVk5oEeZx6CQuRRLQqJTzuZrpt6M1e8KGhlLIsoE6DOVyQxCO65giHX41Lw8jtwY5_nZIQC-mr8T3uqu8gR6WpXRwJ6G22MDDmAsbwjVFm-g-y/s1600/im_skl_buscador.png" height="194" width="320" /></a></div>
<br />
<div style="text-align: justify;">
Según uno de los primeros correos que nos llega desde la agencia, dicho buscador está optimizado en tiempo real basándose en las referencias encontradas por los participantes. Ese buscador lo único que hace es redirigir tu búsqueda al actual buscador <em>Bing</em> (en 2003 era <em>MSN Search</em>, de ahí el logo que aparece en el formulario), y añadir un "<i> -memoriam</i>" al final para evitar que al jugador le aparezcan en los resultados algunas de las soluciones y guías del juego disponibles por Internet.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Puesto que la web de <em>SKL Network</em> la albergaremos nosotros, ese es el sitio perfecto para meter nuestro buscador que hará aparecer mágicamente nuestros sitios webs virtuales.</div>
<br />
<h2 style="text-align: justify;">
<u>
Esquema de funcionamiento</u></h2>
<div>
<span style="text-align: justify;">Los resultados que insertemos tendrán que mezclarse con otros. Puesto que no vamos a construir un </span><em style="text-align: justify;">Google</em><span style="text-align: justify;"> o un </span><em style="text-align: justify;">Bing</em><span style="text-align: justify;">, usaremos estos buscadores para obtener resultados a la búsqueda que realiza el jugador. Esos resultados serán la base sobre la que introduciremos los resultados relacionados con los sitios web propios del juego.</span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Para obtener los resultados que debemos insertar, tendremos que realizar una búsqueda entre los sitios webs que descargamos con <em>HTTrack</em> en la entrada anterior. Para cada entrada a insertar, mostraremos la misma información que muestran los buscadores: título de la página con enlace a la misma, el texto del enlace, y una sección del contenido de la página. Además, resaltaremos en negrita la aparición de los términos de búsqueda, logrando así que las entradas insertadas no difieran de las que daría cualquier otro buscador. Omitiremos las funcionalidades avanzadas que ofrecen los buscadores modernos, como la copia en caché, traducción, etc...</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Tendremos que construirnos un motor de búsqueda para nuestra treintena de sitios webs. Buscando por internet, me gustó <a href="http://www.dmxzone.com/go/14246/free-how-to-build-a-php-search-engine/page1.htm" target="_blank">esta implementación</a> en la cual me basaré. El tema consiste en volcar en una base de datos la información relevante sobre cada página web, base de datos que será la que consulte nuestro motor de búsquedas a la hora de realizar búsquedas. Dicha base de datos se reducirá a una única tabla que funcionará como un índice para nuestro motor.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Los campos de la tabla contendrán la información a mostrar en los resultados (url, título de la página y contenido en texto plano) además de información que no se mostrará pero usará el motor de búsqueda en sus consultas, como son los metadatos de descripción y palabras clave.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Una vez lista la tabla (el tedioso llenado de datos lo he realizado programando un script en PHP, con algunos retoques manuales), y establecida la consulta a realizar, hay que comprobar, siguiendo alguna de las soluciones del juego disponibles online, que al introducir la pista adecuada proporcionada por el juego, nuestra consulta a la tabla devuelve los resultados adecuados.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Al igual que hacía el buscador original de <em>SKL Network</em>, añadiremos un " <em>- memoriam</em>" y además un " -<i>january</i>" (en EEUU el juego fue lanzado con el nombre "<i>Missing: Since January</i>") a la búsqueda introducida por el usuario para evitar <em><a href="http://es.wikipedia.org/wiki/Spoiler" target="_blank">spoilers</a></em> en el resultado. Pero en lugar limitarnos a redirigir a la página de Bing, introduciremos los resultados en la misma página, sin salirnos de la web de <em>SKL Network</em>.</div>
<br />
<div style="text-align: justify;">
<span style="font-family: inherit;">El servidor PHP realizará la búsqueda de las palabras introducidas por el usuario en algún buscador real. Los primeros resultados (20-30 resultados serán suficientes) se mezclarán con los resultados que se obtengan al lanzar esa consulta contra los contenidos de la base de datos. Solo queda dar un poco de formato, extractar de los resultados de la base de datos las porciones de contenido que contienen las palabras clave buscadas, y presentárselo todo al usuario.</span><br />
<span style="font-family: inherit;"><br /></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQosQ8tTbTk6rMfgCrjOFnYxgJTg_dbmTagnMh2vhkNXNzmpEzbT5Q6b9-74l_o2kPIGHVgJlHrqR4mMxh_ZSxv2rmCObev_nw8eOvG6i1eTF7BlfowPmfOCEyziCxL7J9DzFOGDGLEEWK/s1600/Motor+b%C3%BAsqueda.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQosQ8tTbTk6rMfgCrjOFnYxgJTg_dbmTagnMh2vhkNXNzmpEzbT5Q6b9-74l_o2kPIGHVgJlHrqR4mMxh_ZSxv2rmCObev_nw8eOvG6i1eTF7BlfowPmfOCEyziCxL7J9DzFOGDGLEEWK/s1600/Motor+b%C3%BAsqueda.png" height="240" width="640" /></a></div>
<br /></div>
<span style="text-align: justify;"><span style="font-family: inherit;">Hay que tener especial cuidado de que los resultados "virtuales" obtenidos de la base de datos no difieran estéticamente de los obtenidos del buscador real, para no impactar la experiencia de juego del usuario. Así el resultado obtenido debe ofrecer una experiencia similar a la que se obtendría si los sitios estuvieran realmente indexados por los buscadores de </span>Internet<span style="font-family: inherit;">.</span></span><span style="font-family: inherit;"></span><br />
<div style="text-align: justify;">
<span style="font-family: inherit;"><span style="font-family: inherit;"><br /></span></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnfhsLjStTJaBXzy04IQixmV1lRz2Jy6dEANlJ9Ro_ZWwUdVgsy6zaqKnetQaUxDqF7URPIv8-wFvtU8P804yEf72dHsUT2EeKouJzv4w1m70UWm2RGCcCUcof2ZSV5YUVeQrWY-zF191B/s1600/skl_search.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnfhsLjStTJaBXzy04IQixmV1lRz2Jy6dEANlJ9Ro_ZWwUdVgsy6zaqKnetQaUxDqF7URPIv8-wFvtU8P804yEf72dHsUT2EeKouJzv4w1m70UWm2RGCcCUcof2ZSV5YUVeQrWY-zF191B/s1600/skl_search.png" height="320" width="277" /></a></div>
<span style="font-family: inherit;"><span style="font-family: inherit;"><br /></span></span>
Los resultados que inserte nuestro motor de búsqueda entre los resultados reales, apuntarán a los nombres de dominio que tenían originalmente los sitios webs desplegados por Léxis Numérique. El archivo "hosts" al que nos referíamos en la entrada anterior, convenientemente modificado para que cada nombre de dominio se resuelva a la dirección IP donde hemos albergado cada sitio web, hará el resto de la "magia".<br />
<br />
La conjunción del archivo "hosts" modificado junto con el motor de búsquedas trucado se encargan de crear al usuario la ilusión de que los sitios webs del juego siguen desplegados tal y como lo estuvieron anteriormente, y que estos sitios son accesibles y aparecen indexados por el buscador. La única limitación respecto a la situación original es que ahora ya no podremos usar cualquier buscador, obligando al jugador a usar solo y exclusivamente el buscador integrado en la web de SKL Network. La ventaja con este esquema es que no tendremos que pagar la factura anual de mantener la treintena de nombres de dominio necesarios, cosa deseable teniendo en cuenta que esta iniciativa es completamente gratuita y sin ánimo de lucro.</div>
<span style="font-family: inherit;">
</span>Softbreakershttp://www.blogger.com/profile/01666968545873713297noreply@blogger.com0tag:blogger.com,1999:blog-5459690923545315155.post-61241523090573245412014-10-13T00:00:00.000+02:002014-10-13T00:00:01.275+02:00In Memoriam - 3 - Recolección, restauración, resolución...<div style="text-align: justify;">
<h2>
<u>
<div class="separator" style="clear: both; text-align: center;">
</div>
Recopilando material</u></h2>
<div>
<u><br /></u></div>
En vista de las <a href="http://www.gamekult.com/actu/cest-fini-pour-lexis-numerique-A134071.html" target="_blank">noticias comentadas</a> al final de la entrada anterior, aunque hemos encontrado el contenido perdido, éste no parece que vaya a estar ahí mucho tiempo (Edito: escribiendo esta serie, a fecha 28 de Agosto de 2014, el servidor oficial del juego y sus secuelas <em><a href="http://www.inmemoriam-thegame.com/" target="_blank">www.inmemoriam-thegame.com</a></em>, ha dejado de responder). Lo primero será recolectar todo lo que podamos desde ese servidor.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Para ello, primero tenemos que localizar qué dominios son los que los desarrolladores desplegaron para dar soporte al juego. Buscando soluciones al juego, podremos ir anotando todos aquellos dominios de importancia para el juego.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
El segundo paso será llenar nuestro archivo "<i>hosts</i>" con todos esos dominios ya perdidos para que apunten de nuevo a la <em>IP</em> del servidor online. Y como paso final, <em><a href="http://www.httrack.com/" target="_blank">HTTrack</a></em> hará el resto. Con esa aplicación haremos una copia de cada uno de los sitios webs identificados. Algunas páginas dinámicas (un par de .php) tendrán que ser reconstruidas a mano, para lo que tendremos que aprovechar mientras podamos para ver como funcionan esas páginas en el servidor real, y así poder reconstruir un PHP que ofrezca la misma funcionalidad.</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNnExhaFEbtXOlz_JMaE8UTyguC9fdp7qJoUwAMiA80TCgW8AYR3peVXCNGs88BhCAxdvhzBfvPSpIOTpMS35Ux1G-NMCSFWulSW3g7wqzQxcTbJHNGndmDzVOhezK8cJgT4sZOJIaU2Da/s1600/logo_httrack.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNnExhaFEbtXOlz_JMaE8UTyguC9fdp7qJoUwAMiA80TCgW8AYR3peVXCNGs88BhCAxdvhzBfvPSpIOTpMS35Ux1G-NMCSFWulSW3g7wqzQxcTbJHNGndmDzVOhezK8cJgT4sZOJIaU2Da/s1600/logo_httrack.png" /></a></div>
<br />
<a name='more'></a><br />
<h2>
<span style="text-align: justify;"><u>Posibles enfoques para la solución</u></span></h2>
<div>
<span style="text-align: justify;"><u><br /></u></span></div>
<span style="text-align: justify;">Otro tema es como vamos a enfocar la solución. Lo más sencillo es recomprar todos los dominios conforme vayan quedando disponibles, redirigirlos a la </span><em style="text-align: justify;">IP</em><span style="text-align: justify;"> del servidor actual mientras dure, y reinsertarlos en </span><em style="text-align: justify;"><a href="https://www.google.com/webmasters/tools/submit-url?pli=1" target="_blank">Google</a></em><span style="text-align: justify;"> y otros buscadores. El pero de esta solución, es que tendremos que costear el importe anual de todos los dominios y del posible hospedaje (el servidor actual no creo que dure mucho), y estamos hablando de algo más de una treintena de dominios...</span><br />
<span style="text-align: justify;"><br /></span>
<br />
<div style="text-align: justify;">
Otra opción más económica es crear un paquete con todo el contenido, de manera que el jugador albergue las webs en su propio equipo, redireccionando desde su archivo "<em>hosts</em>" a 127.0.0.1 todos los dominios necesarios. Además, el jugador tendrá que instalarse, como poco un servidor <em>HTTP</em> con soporte <em>PHP</em>... Esta parte puede solucionarse con facilidad gracias a <em><a href="https://www.apachefriends.org/es/index.html" target="_blank">XAMPP</a></em>, una distribución de <em>Apache</em> que incluye <em>MySQL, PHP </em>y<em> Perl</em>, y que con un par de clicks te lo pone todo a funcionar.</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCacM_6_NM42WicCrnwkDUZ9xejTbQzDnVKbUYGivJYPkY3S8HXCsiykkGTnP4Zcu-_B6WDPBPuSNC4PoMm_UlAdvvVLcUGKIqmAZeDxE9wLhgfBAG5uiGiRmXWQV08Y9vhZoxkufSszeu/s1600/xampp.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCacM_6_NM42WicCrnwkDUZ9xejTbQzDnVKbUYGivJYPkY3S8HXCsiykkGTnP4Zcu-_B6WDPBPuSNC4PoMm_UlAdvvVLcUGKIqmAZeDxE9wLhgfBAG5uiGiRmXWQV08Y9vhZoxkufSszeu/s1600/xampp.jpg" height="281" width="320" /></a></div>
<br />
<span style="text-align: justify;">Una evolución de la solución anterior puede ser distribuir todo el contenido, con el servidor </span><em style="text-align: justify;">Apache</em><span style="text-align: justify;"> correctamente configurado, en una máquina virtual en </span><em style="text-align: justify;">Linux,</em><span style="text-align: justify;"> de manera que el jugador solo tenga que arrancar ésta cuando quiera jugar al juego.</span><br />
<span style="text-align: justify;"><br /></span>
<br />
<div style="text-align: justify;">
Y finalmente, otra opción sería albergar todo el contenido en un servidor con varios "<em>Virtual Hosts</em>" redirigidos desde el archivo "<em>hosts</em>" de cada cliente, tal y como se vio en el artículo anterior. Cada jugador tendría que modificar su archivo "<em>hosts</em>" o bien descargarse una aplicación que lo hiciera por él. Teniendo en cuenta que se trata de un juego de 2003, es de esperar que produzca poco tráfico y no precise un servidor potente. Esta será la solución que adoptaremos, ya que económicamente es viable, es lo más sencillo para el usuario que no tiene que instalar nada salvo el juego, y además puede permitirnos en un futuro introducir modificaciones en la mecánica del juego...</div>
Softbreakershttp://www.blogger.com/profile/01666968545873713297noreply@blogger.com0tag:blogger.com,1999:blog-5459690923545315155.post-59162588195288077102014-10-06T00:00:00.000+02:002014-10-06T00:00:00.715+02:00In Memoriam - 2 - ¡¡ Rescoldos !!<div style="text-align: justify;">
Seguimos al tajo con <i>In Memoriam</i>.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Extraer todos los recursos que necesitamos de <em><a href="https://archive.org/" target="_blank">Archive.org</a></em>, aunque tedioso, es perfectamente posible. Afortunadamente estamos hablando de webs en las que la mayor parte de sus páginas son estáticas, con muy poco contenido dinámico que obviamente <em>Archive.org</em> no hubiera podido recoger en su totalidad. Es una solución laboriosa, pero al menos hay una salida.</div>
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjj7gn6-uXkjbP8yUt80CHVBdLoN3dGJp-Tl4Hj7lOgBe3sSTOl_Ljptjhrg09q_tM-nsgfQD7Qik3JoemUlFJaaZqoeY-xmUA3FagX8D29j0UsYymNaBY6fUvcUGm5BWl6qYDfzCKaHs5f/s1600/logo_wayback.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjj7gn6-uXkjbP8yUt80CHVBdLoN3dGJp-Tl4Hj7lOgBe3sSTOl_Ljptjhrg09q_tM-nsgfQD7Qik3JoemUlFJaaZqoeY-xmUA3FagX8D29j0UsYymNaBY6fUvcUGm5BWl6qYDfzCKaHs5f/s1600/logo_wayback.png" /></a></div>
<br />
<span style="text-align: justify;"></span><br />
<a name='more'></a><span style="text-align: justify;">Continuamos investigando sobre el dominio desaparecido y buscando por el dominio "</span><em style="text-align: justify;">www.inmemoriamdev.com</em><span style="text-align: justify;">" que aún sigue en pie, encontramos que el mismo servidor </span><a href="http://whois.domaintools.com/inmemoriamdev.com" style="text-align: justify;">alberga mucho otros dominios</a><span style="text-align: justify;">. En </span><a href="http://www.yougetsignal.com/tools/web-sites-on-web-server/" style="text-align: justify;" target="_blank">otra página</a><span style="text-align: justify;"> encontramos la información que nos interesa de manera gratuita. El servidor que alberga actualmente a "</span><em style="text-align: justify;">inmemoriamdev.com"</em><span style="text-align: justify;"> albergó en su momento a "</span><em style="text-align: justify;">xineph.com"</em><span style="text-align: justify;">, "</span><em style="text-align: justify;">skl-network.com"</em><span style="text-align: justify;">, etc... o al menos esos dominios en su momento apuntaron a la misma dirección IP.</span><br />
<span style="text-align: justify;"><br /></span>
<br />
<div style="text-align: justify;">
Sería genial que los contenidos estuvieran aún ahí...<br />
<br /></div>
<h2 style="text-align: justify;">
</h2>
<h2 style="text-align: justify;">
<u>
Deep web</u></h2>
<div style="text-align: justify;">
Mucho se ha hablado de la "<a href="http://es.wikipedia.org/wiki/Internet_profunda" target="_blank"><em>Deep Web</em></a>", y su acceso a través de la <a href="http://es.wikipedia.org/wiki/Tor" target="_blank">red <em>TOR</em></a>. Lo que se va a ver aquí no es tan enrevesado, ni tan anónimo, ni tan "<em>Deep</em>", pero igualmente permite servir contenidos que permanecen ocultos para el público general. Alguno pensará que para eso se coloca un control de acceso con usuario y contraseña, pero no, esto es aún mejor.</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6BhD0bu0-Rjxxh4_j_HlHact-GXp77b8GWTuh_DKPd8r1-pzaKocrKMFO-BP3NyfWp7t6JaXStWOJ5OoH30tsoEC-yC6t7ztC-942V1uajP5fo8cV1mao5rP7jCwPw3YSjaClVFF1kTne/s1600/Tor-logo.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6BhD0bu0-Rjxxh4_j_HlHact-GXp77b8GWTuh_DKPd8r1-pzaKocrKMFO-BP3NyfWp7t6JaXStWOJ5OoH30tsoEC-yC6t7ztC-942V1uajP5fo8cV1mao5rP7jCwPw3YSjaClVFF1kTne/s1600/Tor-logo.png" /></a></div>
<br />
<br />
<div style="text-align: justify;">
Todo comienza por la necesidad de servir varios sitios webs desde un mismo equipo. Hay una gran cantidad de sitios web que no precisan de una gran carga de proceso por parte del servidor que los hospeda. Unificar varios sitios webs en un único equipo permite un importante ahorro de costes.<br />
<br /></div>
<h4 style="text-align: justify;">
</h4>
<h4 style="text-align: justify;">
Cabeceras HTTP</h4>
<div style="text-align: justify;">
En estos casos, el software que sirve contenidos web en nuestro servidor debe poder distinguir, para cada cliente que le inicia una sesión <em>HTTP</em>, qué sitio web de los que comparten servidor es el que quiere acceder el cliente. Esto se consigue mediante una de las cabeceras que aporta el protocolo <em>HTTP</em>, la cabecera "<em>Host</em>". Cada vez que en nuestro navegador intentamos acceder a una página web, por ejemplo <i>http://www.dominio1.com/index.html</i>, nuestro navegador construye una petición <em>HTTP</em> y coloca en la cabecera "<em>Host</em>" el nombre del alias o dominio. Previamente, el servidor <em>DNS</em> que tengamos configurado informará a nuestro sistema operativo en qué dirección <em>IP</em> es alcanzable dicho dominio. Así, nuestro navegador enviará una petición <em>HTTP</em> con esta forma:</div>
<blockquote class="tr_bq">
<span style="font-family: Trebuchet MS, sans-serif;">GET /index.html HTTP/1.1</span><br />
<span style="font-family: Trebuchet MS, sans-serif;">Host: www.dominio1.com</span></blockquote>
<div style="text-align: justify;">
En realidad nuestro navegador enviará muchos más datos, pero lo único que define el <em><a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec5.html" target="_blank">World Wide Web Consortium (W3C)</a></em> como obligatorio en una petición <em>HTTP</em> es la cabecera "<em>Host</em>", además de la propia petición de la primera línea (salvo en casos que se especifique el enlace de manera absoluta, en cuyo caso el "<em>Host</em>" ya va incluido en la primera línea).</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Otro cliente puede querer acceder a <em>http://www.dominio2.com/index.html</em>. La petición <em>HTTP</em> será casi igual:</div>
<blockquote class="tr_bq">
<span style="font-family: Trebuchet MS, sans-serif;">GET /index.html HTTP/1.1</span><br />
<span style="font-family: Trebuchet MS, sans-serif;">Host: www.dominio2.com</span></blockquote>
<div style="text-align: justify;">
Puesto que tenemos ambos dominios configurados en un mismo servidor, los servidores <em>DNS</em> resolverán ambos dominios a la misma <em>IP</em>, por lo que el software servidor instalado en la máquina debe poder distinguir entre ambos dominios. Eso lo consigue mirando la cabecera "<em>Host</em>".<br />
<br /></div>
<h4 style="text-align: justify;">
</h4>
<h4 style="text-align: justify;">
Virtual Hosts</h4>
<div style="text-align: justify;">
En el servidor, se definen lo que se conocen como "<a href="http://httpd.apache.org/docs/2.2/vhosts/" target="_blank"><em>Virtual Hosts</em></a>". Para cada "<em>Virtual host</em>" se define cual es el directorio raíz en el servidor que alberga las páginas web para es dominio o alias. Al recibir una petición <em>HTTP</em>, el servidor usa la cabecera "<em>Host</em>" en conjunción con su configuración de "<em>Virtual Hosts</em>" para definir el directorio raíz, y junto con el directorio relativo indicado para la propia petición, calcula la ruta absoluta del contenido que tiene que servir.</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgj5vSJIXkEa5_s7KaS9jCEA_ieBkjasA6eVk4Tf99KSjwbHTUBQkzNO0Rd6KMAXxxgneOwGJt3xWJUQldDmQrESkXF-7Y1237iEeEXHYBhy2BF-MLRtWvnvXuiu-wp_QabgA8L9efgFkZU/s1600/virtualhost.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgj5vSJIXkEa5_s7KaS9jCEA_ieBkjasA6eVk4Tf99KSjwbHTUBQkzNO0Rd6KMAXxxgneOwGJt3xWJUQldDmQrESkXF-7Y1237iEeEXHYBhy2BF-MLRtWvnvXuiu-wp_QabgA8L9efgFkZU/s1600/virtualhost.png" height="200" width="320" /></a></div>
<br />
<br />
<div style="text-align: justify;">
En caso de recibir una petición <em>HTTP</em> con una cabecera "<em>Host"</em> que no coincide con ninguno de los "<em>Virtual hosts</em>" configurados, dependiendo de la configuración del servidor, éste puede resolver a una web por defecto, o bien devolver un error de página desconocida.<br />
<br /></div>
<h4 style="text-align: justify;">
</h4>
<h4 style="text-align: justify;">
El truco</h4>
<div style="text-align: justify;">
Tal y como se ha definido, es el contenido de la cabecera "<em>Host</em>" el que define a qué "<em>Virtual host</em>" queremos acceder.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
¿Qué ocurriría si definimos un "<em>Virtual host</em>" para un dominio "erróneo", bien no exista, o bien porque está apuntando a una <em>IP</em> distinta de la de nuestro servidor?</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
En teoría, dicho sitio web sería inaccesible ya que ningún servidor <em>DNS</em> resolvería dicho nombre de dominio hacia nuestra <em>IP</em>, ya sea porque el dominio no existe, o ya sea porque apunta a otra <em>IP</em>.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
El truco consiste en eso, en conseguir que nuestro equipo, cuando intente acceder al dominio "erróneo", resuelva dicho nombre de dominio a la <em>IP</em> del servidor donde se ha definido un "<em>Virtual host</em>" para dicho dominio. Solo aquéllos que accedan a dicha <em>IP</em> con la cabecera <em>HTTP</em> "<em>Host</em>" correcta, podrán acceder al sitio web. Los que no lleven la cabecera "<em>Host</em>" adecuada, obtendrán un bonito <a href="http://es.wikipedia.org/wiki/Error_404" target="_blank">error 404</a> o cualquier otra página web por defecto que tenga configurada el servidor.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
La manera más sencilla de establecer la resolución de un nombre de dominio a una dirección <em>IP</em> determinada es editando el archivo "<em>hosts</em>" de nuestro sistema operativo. En el caso de Windows NT, 2000, XP y posteriores se encuentra en:</div>
<blockquote class="tr_bq" style="text-align: justify;">
<span style="font-family: Trebuchet MS, sans-serif;">[WINDOWS_DIR]\System32\drivers\etc\hosts</span></blockquote>
<div style="text-align: justify;">
Y si usamos Linux, ese archivo está en:</div>
<blockquote class="tr_bq">
<span style="font-family: Trebuchet MS, sans-serif;">/etc/hosts</span></blockquote>
<div style="text-align: justify;">
En ambos casos es un archivo de texto plano en el que se definen pares IP - Dominio para establecer resoluciones estáticas. Por ejemplo, encontraremos el par:</div>
<blockquote class="tr_bq">
<span style="font-family: Trebuchet MS, sans-serif;">127.0.0.1 localhost</span></blockquote>
<div style="text-align: justify;">
Este par permite que el nombre "<em>localhost</em>" se resuelva hacia nuestro propio equipo. Es ahí donde colocaríamos la dirección <em>IP</em> del servidor y el nombre de dominio ficticio necesario para acceder al contenido oculto. Para una mayor seguridad, una vez que se accede a los contenidos protegidos, se puede colocar un esquema de autenticación como una capa más de seguridad. Un listado más completo de la localización del archivo "<em>hosts</em>" en distintos sistemas operativos se puede encontrar en la <a href="http://en.wikipedia.org/wiki/Hosts_(file)#Location_in_the_file_system" target="_blank"><em>Wikipedia</em></a>.<br />
<br /></div>
<h2 style="text-align: justify;">
</h2>
<h2 style="text-align: justify;">
<u>
Y aparecen rescoldos</u></h2>
<div style="text-align: justify;">
Volvemos a nuestro tema. Habíamos encontrado que en un tiempo pasado la <em>IP</em> a la que apunta uno de los dominios del juego que quedan en pie albergó otros dominios necesarios para el juego. Vamos a ver si siguen los contenidos perdidos en ese servidor...</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Colocamos al final de nuestro archivo "<em>hosts</em>" una linea adicional con el siguiente contenido:</div>
<blockquote class="tr_bq">
<span style="font-family: Trebuchet MS, sans-serif;">93.188.168.154 www.skl-network.com</span></blockquote>
<div style="text-align: justify;">
La <em>IP</em> corresponde a la que nos devuelven los <em>DNS</em> cuando intentamos resolver el dominio "<em>www.inmemoriamdev.com</em>", y "<em>www.skl-network.com</em>" es el dominio en el que se albergaba la web de la supuesta agencia para la que trabajan los dos secuestrados del juego. Salvamos, vamos al navegador, tecleamos <em><a href="http://www.skl-network.com/" target="_blank">http://www.skl-network.com</a></em> y...</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoECYbWklLv2lh7rjBfe2nQsBhJXgA4chijmAXeIDPmOH8QJLg3RnTgPx7eOkjdjdlPt5Lu2qYhHRWD-5uztTVFAtriLWn1BLkYxwJrvW8ao7TtkjAttbADcVlj3xs0vwweN8YujCPkFNz/s1600/skl-network.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoECYbWklLv2lh7rjBfe2nQsBhJXgA4chijmAXeIDPmOH8QJLg3RnTgPx7eOkjdjdlPt5Lu2qYhHRWD-5uztTVFAtriLWn1BLkYxwJrvW8ao7TtkjAttbADcVlj3xs0vwweN8YujCPkFNz/s1600/skl-network.png" height="207" width="320" /></a></div>
<br />
<br />
<div style="text-align: justify;">
Bingo. Procedemos a colocar en el archivo "<i>hosts</i>" algunas líneas más que redirijan hacia las misma <em>IP</em> otros dominios que nos devolvía <a href="http://www.yougetsignal.com/tools/web-sites-on-web-server/" target="_blank">esta web</a> y que puedan estar relacionados con el juego, como puede ser <em><a href="http://xineph.com/" target="_blank">xineph.com</a></em>.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
De los <a href="http://whois.domaintools.com/inmemoriamdev.com" target="_blank">datos de registro de "<em>inmemoriamdev.com</em>"</a> podemos deducir que dicho servidor pertenece a Lexis Numérique, los desarrolladores del juego, y por lo que aparece <a href="http://www.gamekult.com/actu/cest-fini-pour-lexis-numerique-A134071.html" target="_blank">en distintas webs</a>, dicha empresa anunció su liquidación el 16 de junio de 2014, por lo que han dejado de renovar los dominios conforme van venciendo, y de un momento a otro es de esperar que cierren el servidor que alberga los contenidos.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Parece ser que su última apuesta, <em><a href="http://www.alt-minds.com/home.html?lang=es" target="_blank">Alt-Minds</a></em>, aparecida finales de 2012 con el padrinazgo de <em>Orange</em>, no ha sido todo lo exitosa que se esperaba. Además por los trailers se puede apreciar que en comparación con <em>In Memoriam</em>, <em>Alt-Minds</em> era toda una superproducción.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: center;">
<iframe allowfullscreen="allowfullscreen" frameborder="0" height="270" src="//www.dailymotion.com/embed/video/xv0pjn" width="480"></iframe></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Así que salvo que los editores principales del juego, <em>Ubisoft</em> y <em>Nordic Games</em>, hagan algo, tanto "<em>In Memoriam</em>" como sus secuelas que compartían la misma mecánica, sin la infraestructura online, sencillamente serán injugables...</div>
Softbreakershttp://www.blogger.com/profile/01666968545873713297noreply@blogger.com0tag:blogger.com,1999:blog-5459690923545315155.post-22189369874939962082014-10-03T10:00:00.000+02:002014-10-03T10:53:56.748+02:00StealthGenie y otras historiasDesde el blog de <a href="http://www.elladodelmal.com/2014/10/estados-unidos-tumba-el-servicio-del.html"><i>Un informático en el lado del mal</i></a> nos llega la información de que el Departamento de Justicia de los EEUU ha presentado una demanda contra StealthGenie, y como medida cautelar han cerrado el acceso a los servidores del mismo alojados en los servicios de hosting de Amazon, y han detenido al CEO de la empresa desarrolladora.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNfRxQwDsOtfWUG1fzbECOeIrtY2edGvhVdjMYn87m1_dAeb2fFL5-t9q9qpHSb9V4P1gxBfTyQwCzp70p5iOKWl2_uuztckn95X3EPgoBRgoFfmMreUNDGpx8aeO63jY_zgO0HZje13-0/s1600/stealthgenielogo.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNfRxQwDsOtfWUG1fzbECOeIrtY2edGvhVdjMYn87m1_dAeb2fFL5-t9q9qpHSb9V4P1gxBfTyQwCzp70p5iOKWl2_uuztckn95X3EPgoBRgoFfmMreUNDGpx8aeO63jY_zgO0HZje13-0/s1600/stealthgenielogo.jpg" height="121" width="320" /></a></div>
<div style="text-align: justify;">
<br />
<a name='more'></a><br /></div>
<div style="text-align: justify;">
<span style="font-family: inherit;">No voy a entrar a analizar la funcionalidad que ofrece dicha aplicación. Ya está suficientemente bien explicado en </span><a href="http://www.elladodelmal.com/2013/11/troyano-para-espiar-un-android-o-para.html" style="font-family: inherit;" target="_blank"><i>ese blog</i></a><span style="font-family: inherit;"> puesto que es un servicio que llevaba tiempo en funcionamiento, y además se ofrecía públicamente, al alcance de cualquiera. No era un troyano que tenías que bucear en los vericuetos de la </span><a href="http://es.wikipedia.org/wiki/Tor" style="font-family: inherit;" target="_blank"><i>red TOR</i></a><span style="font-family: inherit;"> para adquirirlo en el mercado negro.</span></div>
<div style="text-align: justify;">
<span style="font-family: inherit;"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgekCXXIWDINgU_zTupBeMiEi_TFjI9DyygdnlyIjutDAZEGjBZQXYYUzvdnPav-MnvZ4I6XdfbjSBic-4o_h-Q27I_iIbL84qP2i7RrIDp1I99kfpGxL1HkYPP0dP247yywTUjy2unYYLx/s1600/stealth_genie_features.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgekCXXIWDINgU_zTupBeMiEi_TFjI9DyygdnlyIjutDAZEGjBZQXYYUzvdnPav-MnvZ4I6XdfbjSBic-4o_h-Q27I_iIbL84qP2i7RrIDp1I99kfpGxL1HkYPP0dP247yywTUjy2unYYLx/s1600/stealth_genie_features.png" height="162" width="320" /></a></div>
<div style="text-align: justify;">
<span style="font-family: inherit;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: inherit;">Mi entrada va más enfocada al por qué de esta acción tomada por parte del Departamento de Justicia americano tras una investigación </span><a href="http://www.fbi.gov/washingtondc/press-releases/2014/pakistani-man-indicted-for-selling-stealthgenie-spyware-app" style="font-family: inherit;" target="_blank"><i>por parte del FBI</i></a><span style="font-family: inherit;">. Según la nota de prensa del FBI que he enlazado, el fiscal federal que lleva la demanda ha declarado:</span></div>
<blockquote class="tr_bq" style="text-align: justify;">
"<i>StealthGenie tiene poca utilidad más allá de la invasión de la intimidad de la víctima</i>"... "<i>La publicidad y venta de tecnología spyware es un delito penal, y esa conducta se perseguirá agresivamente por esta oficina y nuestros colaboradores en aplicación de la ley.</i>"</blockquote>
<div style="text-align: justify;">
Dejando de lado la cuestión de que, con todo lo que ha llovido tras el <a href="http://es.wikipedia.org/wiki/Edward_Snowden" target="_blank"><i>caso Snowden</i></a>, sea precisamente la administración americana la que se auto-retrate como paladín en defensa de la privacidad de las comunicaciones de los ciudadanos (americanos o extranjeros), también sorprende que afirmen que la publicidad y venta de "<i>spyware</i>" es un delito penal perseguido.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<h2>
Spyware... ¿delito penal?</h2>
Aplicaciones comerciales destinadas a la monitorización de la actividad en dispositivos tecnológicos de comunicaciones existen casi desde que existen los dispositivos de comunicaciones. Estas aplicaciones, como cualquier "arma", pueden ser utilizadas para usos lícitos o ilícitos. Además, son aplicaciones que están permitidas por las legislaciones de multitud de países, en las que, y hablo de manera general, el hecho de informar al monitoreado de que está siendo monitorizado suele otorgar el suficiente respaldo legal para su uso.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Así, tenemos aplicaciones destinadas a que las empresas vigilen que sus empleados no realizan actividades que puedan dañar voluntaria o involuntariamente a los intereses de las empresas, para monitorizar el uso que se realiza de los recursos de la empresa, etc... Desde dispositivos GPS instalados en los vehículos de la empresa hasta las <a href="https://www.google.es/webhp?#q=software+supervision+empleados" target="_blank"><i>más complejas aplicaciones corporativas</i></a> para supervisar el uso de los recursos informáticos. Estas aplicaciones empresariales también tienen sus correspondientes versiones domésticas, que desde hace años se ofrecen a nivel comercial ni ningún tipo de traba legal.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Con la llegada de los smartphones y todas las capacidades que incluyen, el salto en los datos que se puede recoger ha sido cualitativo. Puesto que son dispositivos que llevamos encima todo el día, estas aplicaciones de monitoreo han pasado de permitir supervisar nuestra actividad cuando estamos delante del ordenador, a permitir supervisar nuestras actividades a todas horas.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Ya no es el hecho de poder ver qué escribes cuando te sientas en el PC, si no que pueden monitorizar tus comunicaciones telefónicas, el lugar geográfico en el que te encuentras, sacar fotos y videos de lo que se encuentre delante del objetivo de la cámara o registrar el sonido ambiente alrededor del móvil.<br />
<br />
Técnicamente hablando, ya sería posible para una organización disponer de una potente red de vigilancia en una determinada zona. El disponer de un "ejército" de smartphones troyanizados, permitiría a quién los controlara disponer a un bajo coste de ojos y oídos prácticamente en cada esquina. Ya no haría falta desplegar previamente sensores para cubrir una determinada zona urbana. En todo momento tendrías localizados los móviles pertenecientes a tu red presentes en la zona de interés, y a voluntad podrías activar sus cámaras y micrófonos.<br />
<br />
Este esquema, que vi propuesto durante las últimas <a href="https://www.jornadasciberdefensa-isdefe.es/index.php" target="_blank"><i>Jornadas de Ciberdefensa</i></a> organizadas por el Mando Conjunto de Ciberdefensa de las Fuerzas Armadas e ISDEFE, no es una historia de ciencia ficción. Tampoco se ha probado que sea una realidad ya en funcionamiento, pero aplicaciones como la clausurada StealthGenie muestran que una red de ese tipo no sería una mera entelequia.<br />
<br />
El que algún fabricante de smartphones incluya de serie estos "regalos ocultos" en sus productos para el beneficio de la agencia de inteligencia de algún país, por ahora parece que es una mera conjetura más propia de paranoicos. Si se rumorea que Google ha servido a las agencias de inteligencia americanas en bandeja los correos contenidos en los servidores de Gmail dentro del denominado proyecto <a href="http://es.wikipedia.org/wiki/PRISM" target="_blank">PRISM</a>... ¿podría llevar Android algún "regalito"? ¿y esas semidesconocidas marcas chinas que sirven smartphones de bajo coste al resto del mundo? Porque el gobierno chino tampoco tiene fama de ser un firme defensor de las libertades individuales...<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilv3arLOaDiA4fjs5kkIn8I8jEld8Ffovm_pANXw0XEsrpCmdgnA7sD4P-5z5yaV6nC0kmgsXkTsv6Jec_BQYNJdub0gOeoUZDNdSC1BgqaHA6pZYHocAsZHg9jvyU858w7KPFpFk_AKPE/s1600/PRISM_logo_(PNG).png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilv3arLOaDiA4fjs5kkIn8I8jEld8Ffovm_pANXw0XEsrpCmdgnA7sD4P-5z5yaV6nC0kmgsXkTsv6Jec_BQYNJdub0gOeoUZDNdSC1BgqaHA6pZYHocAsZHg9jvyU858w7KPFpFk_AKPE/s1600/PRISM_logo_(PNG).png" height="240" width="320" /></a></div>
<br />
<h2>
¿Por qué ahora?</h2>
Dejando de lado cuestiones "<i>orwellianas</i>" y centrándonos en lo ocurrido con StealthGenie. ¿Por qué ahora? Las aplicaciones clasificadas como "<i>spyware</i>" no son una novedad aparecida con la llegada de los smartphones. Llevan entre nosotros muchos años. Hace ya un tiempo, allá por el año 2.000 lancé una pequeña aplicación que me dió por llamar <a href="http://ww2.grn.es/merce/2001/spyware.html" target="_blank"><i>Spyhunter</i></a>, centrada en la detección de "<i><a href="http://es.wikipedia.org/wiki/Keylogger" target="_blank">keyloggers</a></i>" comerciales, que como su nombre indica, es un subgrupo dentro del concepto más amplio de "<i>spyware</i>", especializado en el registro de las pulsaciones de teclado, aunque normalmente aportan más funcionalidades como puede ser tomar capturas de pantalla.<br />
<br />
El campo de aplicaciones corporativas no era ajeno al tema, donde <a href="http://elpais.com/diario/2003/10/16/ciberpais/1066271728_850215.html" target="_blank"><i>también existían aplicaciones para entornos empresariales</i></a> destinadas a asegurar que ningún empleado se le fuera la mano usando los equipos de la empresa sin dejar pista.<br />
<br />
Estamos hablando de algo que existe desde hace ya muchos años, y que por ahora, y salvo <a href="http://www.cnet.com/news/district-court-halts-keylogger-spyware-sales/" target="_blank"><i>alguna excepción</i></a>, solo había generado demandas judiciales contra los usuarios que usaban estas aplicaciones para monitorizar en el equipo que no debían cosas que no debían monitorizar, tanto <a href="http://sophosiberia.es/detenido-por-instalar-keyloggers-en-pcs-publicos-en-hoteles-americanos/" target="_blank"><i>en EEUU</i></a> como aquí <a href="http://www.elmundo.es/elmundo/2012/02/06/andalucia/1328534596.html" target="_blank">en España</a>.<br />
<br />
Por otro lado, y leyendo <a href="http://cdn.arstechnica.net/wp-content/uploads/2014/09/akbar.pdf" target="_blank"><i>la acusación presentada</i></a> por el Departamento de Justicia ante el juez, la prueba de cargo que aporta el FBI es que uno de sus agentes compró e instaló la aplicación el 14 de diciembre de 2012 en un móvil, y que el día 17 del mismo mes las comunicaciones interceptadas en dicho móvil eran accesibles en el servidor de StealthGenie, como era de esperar. Estamos hablando de que la prueba de cargo ya la tenían el 17 de diciembre de 2012, y la demanda no la han presentado hasta finales de septiembre de 2014... casi dos años de diferencia.<br />
<br />
Por eso la primera pregunta que me invade con la noticia es por qué ahora. Y por qué StealthGenie. Qué tiene ésta que no tenga <a href="http://www.chilireviews.com/" target="_blank"><i>otra decena de servicios similares</i></a>, algunos de ellos de <a href="http://www.mobile-spy.com/retinax.html" target="_blank"><i>empresas con sede en EEUU</i></a>.<br />
<br />
<h4>
Arquitectura de funcionamiento</h4>
Cada uno puede tener sus propias hipótesis, o incluso no tener ninguna, pero para exponer la mía primero hay que hablar un poco de como es la estructura de funcionamiento de estas aplicaciones, y destacar una diferencia muy importante entre un "<i>spyware</i>" comercial para ordenadores y otro para móviles.<br />
<br />
A diferencia de sus primos del lado oscuro (troyanos, gusanos, virus y fauna relacionada), las aplicaciones comerciales para monitoreo precisan del acceso físico o remoto al equipo a monitorear a la hora de instalarse. No disponen de ningún encapsulado en forma de virus para que de manera autónoma puedan replicarse e instalarse en equipos al azar de manera automatizada. Estas aplicaciones, una vez instaladas, pueden mostrar, por cuestiones legales, algún tipo de notificación al usuario para anunciar su presencia, o bien no mostrar absolutamente nada. Y en algunos casos esta notificación puede configurarse para que aparezca o no.<br />
<br />
Las funcionalidades y datos recogidos pueden cambiar de un producto a otro. Pueden incluir capturas de pantalla, de pulsaciones de tecla, historial de navegación por internet, correos enviados y/o recibidos, programas instalados, actividad en determinados programas como los de mensajería instantánea, etc... En el caso de smartphones, además de lo que pueden hacer en equipos fijos, pueden recopilar información adicional relacionada con las funcionalidades y sensores extra que integran estos dispositivos: historial de llamadas, SMS / MMS, datos de geolocalización, grabación de audio y video, etc...<br />
<br />
Una vez instalados y funcionando, no requieren de acceso físico al equipo monitorizado a la hora de acceder a los datos registrados. El acceso se realiza de manera remota, para el que estas aplicaciones suelen presentar distintas posibilidades. Desde quedar a la escucha esperando que otra aplicación diseñada al efecto se conecte para recoger los datos, hasta enviarlos de manera autónoma a una dirección de correo preconfigurada.<br />
<br />
Es a la hora del acceso a los datos recopilados por la aplicación cuando entra en juego una diferencia sustancial entre el mundo fijo de los ordenadores y la movilidad de los smartphones. En un equipo fijo, las comunicaciones son, o al menos deben serlo, más estables. No presentan las caídas de conexión intermitentes que un móvil en su ajetreada vida diaria sufre. Por otro lado, la operadoras de telefonía no permiten abrir una conexión de datos hacia un terminal móvil, siendo éste el que tiene que iniciar dicha comunicación.<br />
<br />
Ambos factores provocan que en las aplicaciones de monitoreo para móviles deba existir un servidor intermedio con una conexión estable hacia el que el móvil, cuando sus "movidas" circunstancias lo permitan, irá volcando los datos que vaya recopilando. Ese servidor intermedio, en aplicaciones de monitoreo para equipos fijos, o bien no suele existir, o bien, y sobre todo en caso de aplicaciones corporativas, está en una máquina controlada por el que controla la monitorización.<br />
<br />
<h2>
Y un anillo para gobernarlos a todos...</h2>
<div>
Y llegamos al meollo de la cuestión. Ese servidor intermedio mantenido por la empresa que gestiona la aplicación de monitoreo contiene una tremenda carga de datos privados y muy sensibles. Llamadas, conversaciones, mensajes, vídeos, audios, fotos, historial de localizaciones, etc....</div>
<div>
<br /></div>
<div>
Adquirir uno de estos servicios para vigilar a tu pareja, a tus hijos, o las empresas a sus empleados en sus móviles corporativos es para pensárselo dos veces. No ya por cuestiones legales acerca de espiar a alguien sin su consentimiento, sino por la enorme cantidad de datos sensibles, que no solo afectan al espiado si no que también pueden provocar perjuicios al espía por su relación con la persona espiada, datos que son volcados a un servidor en manos de un tercero, y puestos a disposición del que tenga las credenciales válidas para acceder a la cuenta... y con la posibilidad de que esa empresa que te vende el servicio los ponga a tus espaldas a disposición de terceros...</div>
<div>
<ol>
<li>No sabes si la empresa que mantiene el servicio de monitoreo va a hacer un uso fraudulento con tu datos, o más bien con los datos que interceptas de la persona a la que espías.</li>
<li>No sabes si la empresa, a pesar de ser honesta, puede tener algún fallo de seguridad en su servidor que habilite el acceso de terceros a esos datos.</li>
<li>En muchos casos, aunque el que monitoriza descubra que la empresa hace lo que no debe con los datos que intercepta, se encuentra con las manos atadas a la hora de denunciar los hechos ya que supondría reconocer que él mismo ha cometido un delito al usar la aplicación.</li>
</ol>
<div>
Y aquí es donde se puede dar rienda suelta a la imaginación buscando las razones por las que el Departamento de Justicia americano podría haberse visto empujado a actuar, suspender el acceso a los servidores, y detener al CEO de la empresa que mantiene StealthGenie.</div>
</div>
<div>
<br /></div>
<div>
Los más paranoicos pueden pensar que el detenido, de nacionalidad paquistaní, entregaba estos datos a servicios de inteligencia de otros países, o bien, que se ha negado a entregarlos a las agencias americanas y éstas en represalia le cierran el chiringuito. Y aquí puede entrar de todo, desde datos privados de personas hasta secretos industriales volcados al servidor porque algún lince del departamento de seguridad de alguna empresa ha podido pensar que era bueno instalar el tema en los móviles corporativos de los empleados.</div>
<div>
<br /></div>
<div>
Otros pueden pensar que el asunto esté relacionado con lo que se ha dado en llamar el "<i>Fappening</i>" o "<i>celebgate</i>", en el que se han filtrado fotos íntimas de celebridades: actrices, cantantes, modelos, etc... Al parecer existe un mercado negro donde se trafica con este tipo de material. Y no sería muy descabellado pensar que los móviles de algunas de esta celebridades tuvieran instalado este "<i>spyware</i>" por parte personas con acceso a sus terminales, y que el detenido obtuviera estas imágenes directamente de los servidores de su empresa y traficara con ellas.</div>
<div>
<br /></div>
<div>
Sea cual sea la verdadera razón por la que las autoridades estadounidenses han actuado, la que no me cuadra de ninguna de las maneras es la que han declarado, el que la publicidad y venta de "<i>spyware</i>" sea delito, pero lo han permitido desde diciembre de 2012 hasta ahora. Aplicaciones y servicios similares hay a decenas y desde hace ya varios lustros.</div>
</div>
Softbreakershttp://www.blogger.com/profile/01666968545873713297noreply@blogger.com0