<?xml version="1.0" encoding="ISO-8859-1"?><article xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<front>
<journal-meta>
<journal-id>2227-1899</journal-id>
<journal-title><![CDATA[Revista Cubana de Ciencias Informáticas]]></journal-title>
<abbrev-journal-title><![CDATA[Rev cuba cienc informat]]></abbrev-journal-title>
<issn>2227-1899</issn>
<publisher>
<publisher-name><![CDATA[Editorial Ediciones Futuro]]></publisher-name>
</publisher>
</journal-meta>
<article-meta>
<article-id>S2227-18992015000500001</article-id>
<title-group>
<article-title xml:lang="es"><![CDATA[Arquitectura extensible para la protección automatizada de software: Un caso de estudio]]></article-title>
<article-title xml:lang="en"><![CDATA[Extensible architecture for the automated software protection: A study case]]></article-title>
</title-group>
<contrib-group>
<contrib contrib-type="author">
<name>
<surname><![CDATA[Nuñez Musa]]></surname>
<given-names><![CDATA[Yulier]]></given-names>
</name>
<xref ref-type="aff" rid="A01"/>
</contrib>
<contrib contrib-type="author">
<name>
<surname><![CDATA[Bolívar Rodríguez]]></surname>
<given-names><![CDATA[Miguel]]></given-names>
</name>
<xref ref-type="aff" rid="A01"/>
</contrib>
<contrib contrib-type="author">
<name>
<surname><![CDATA[Díaz Pando]]></surname>
<given-names><![CDATA[Humberto]]></given-names>
</name>
<xref ref-type="aff" rid="A01"/>
</contrib>
<contrib contrib-type="author">
<name>
<surname><![CDATA[Sepúlveda Lima]]></surname>
<given-names><![CDATA[Roberto]]></given-names>
</name>
<xref ref-type="aff" rid="A01"/>
</contrib>
</contrib-group>
<aff id="A01">
<institution><![CDATA[,Instituto Superior Politécnico José Antonio Echeverría  ]]></institution>
<addr-line><![CDATA[Marianao Habana]]></addr-line>
<country>Cuba</country>
</aff>
<pub-date pub-type="pub">
<day>00</day>
<month>00</month>
<year>2015</year>
</pub-date>
<pub-date pub-type="epub">
<day>00</day>
<month>00</month>
<year>2015</year>
</pub-date>
<volume>9</volume>
<fpage>19</fpage>
<lpage>34</lpage>
<copyright-statement/>
<copyright-year/>
<self-uri xlink:href="http://scielo.sld.cu/scielo.php?script=sci_arttext&amp;pid=S2227-18992015000500001&amp;lng=en&amp;nrm=iso"></self-uri><self-uri xlink:href="http://scielo.sld.cu/scielo.php?script=sci_abstract&amp;pid=S2227-18992015000500001&amp;lng=en&amp;nrm=iso"></self-uri><self-uri xlink:href="http://scielo.sld.cu/scielo.php?script=sci_pdf&amp;pid=S2227-18992015000500001&amp;lng=en&amp;nrm=iso"></self-uri><abstract abstract-type="short" xml:lang="es"><p><![CDATA[En la actualidad el software comercial es susceptible a la modificación y la observación de su código interno mediante ataques de ingeniería inversa. Estos ataques permiten la piratería del software, siendo billonarias las pérdidas ocasionadas a la industria de software por este concepto. Este trabajo se centra en el desarrollo de una arquitectura extensible para insertar de forma automatizada durante el proceso de compilación, mecanismos de protección en un software dado. La protección se realiza de forma transparente al desarrollador y además, permite diseñar e implementar de forma flexible y modular las diferentes técnicas de protección identificadas. Se implementó la técnica de ofuscación como caso de estudio para validar la arquitectura propuesta. Esta técnica fue probada sobre distintos algoritmos de pruebas, mostrándose los resultados obtenidos.]]></p></abstract>
<abstract abstract-type="short" xml:lang="en"><p><![CDATA[Nowadays the commercial software is susceptible to the modification and observation of its machine code, by means of reverse engineering attacks. These attacks allow the software piracy, being billionaire the losses caused to the software industry due to this concept. This work focuses on the development of an extensible architecture, that it allows inserting in automated way in the course of compilation, protective mechanisms in given software. Protection carries out of obvious way the developer itself and besides, allows designing and implementing of flexible and modular way the different techniques of protection identified. In order to validate the proposed architecture, the technique of obfuscation as a case study was implemented. This technique was tested on different algorithms and its show the obtained results.]]></p></abstract>
<kwd-group>
<kwd lng="es"><![CDATA[integridad de software]]></kwd>
<kwd lng="es"><![CDATA[Microsoft Phoenix]]></kwd>
<kwd lng="es"><![CDATA[proceso de compilación]]></kwd>
<kwd lng="es"><![CDATA[protección de software]]></kwd>
<kwd lng="es"><![CDATA[ofuscación de código]]></kwd>
<kwd lng="en"><![CDATA[software integrity]]></kwd>
<kwd lng="en"><![CDATA[Microsoft Phoenix]]></kwd>
<kwd lng="en"><![CDATA[compilation process]]></kwd>
<kwd lng="en"><![CDATA[software protection]]></kwd>
<kwd lng="en"><![CDATA[code obfuscation]]></kwd>
</kwd-group>
</article-meta>
</front><body><![CDATA[ <p align="right"><font face="Verdana, Arial, Helvetica, sans-serif" size="2"><B>ART&Iacute;CULO  ORIGINAL</B></font></p>     <p>&nbsp;</p>     <p><font size="4"><strong><font face="Verdana, Arial, Helvetica, sans-serif">Arquitectura extensible  para la protecci&oacute;n automatizada de software: Un caso de estudio</font></strong></font></p>     <p>&nbsp;</p>     <p><font size="3"><strong><font face="Verdana, Arial, Helvetica, sans-serif">Extensible architecture for the automated software  protection: A study case</font></strong></font></p>     <p>&nbsp;</p>     <p>&nbsp;</p>     <P><font size="2"><strong><font face="Verdana, Arial, Helvetica, sans-serif">Yulier Nu&ntilde;ez Musa<sup>1*</sup></font></strong><font face="Verdana, Arial, Helvetica, sans-serif"><strong>, Miguel Bol&iacute;var Rodr&iacute;guez</strong><font size="2"><strong><sup>1</sup></strong></font><strong>, Humberto D&iacute;az Pando</strong><font size="2"><strong><sup>1</sup></strong></font><strong>,</strong>&nbsp;<strong>Roberto Sep&uacute;lveda Lima</strong><font size="2"><strong><sup>1</sup></strong></font></font> </font></p>     <p><font size="2"><font face="Verdana, Arial, Helvetica, sans-serif"><sup>1</sup></font></font> <font size="2" face="Verdana, Arial, Helvetica, sans-serif">Instituto Superior Polit&eacute;cnico Jos&eacute; Antonio  Echeverr&iacute;a. Avenida 114 entre Ciclov&iacute;a y Rotonda, Marianao, Habana, Cuba.    <br> </font></p>     ]]></body>
<body><![CDATA[<p><font size="2"><strong><font face="Verdana, Arial, Helvetica, sans-serif"><sup>*</sup></font></strong><font face="Verdana, Arial, Helvetica, sans-serif"><strong></strong></font></font><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Autor  para correspondencia: jnunezm@ceis.cujae.edu.cu</font> </p>     <p>&nbsp;</p>     <p>&nbsp;</p> <hr>     <P><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b>RESUMEN</b> </font>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">En la  actualidad el software comercial es susceptible a la modificaci&oacute;n y la  observaci&oacute;n de su c&oacute;digo interno mediante ataques de ingenier&iacute;a inversa. Estos  ataques permiten la pirater&iacute;a del software, siendo billonarias las p&eacute;rdidas  ocasionadas a la industria de software por este concepto. Este trabajo se  centra en el desarrollo de una arquitectura extensible para insertar de forma  automatizada durante el proceso de compilaci&oacute;n, mecanismos de protecci&oacute;n en un  software dado. La protecci&oacute;n se realiza de forma transparente al desarrollador  y adem&aacute;s, permite dise&ntilde;ar e implementar de forma flexible y modular las  diferentes t&eacute;cnicas de protecci&oacute;n identificadas. Se implement&oacute; la t&eacute;cnica de  ofuscaci&oacute;n como caso de estudio para validar la arquitectura propuesta. Esta  t&eacute;cnica fue probada sobre distintos algoritmos de pruebas, mostr&aacute;ndose los  resultados obtenidos<em>.</em>    <br>       <br>   <strong>Palabras clave:</strong></font> <font size="2" face="Verdana, Arial, Helvetica, sans-serif">integridad de  software, Microsoft Phoenix, proceso de compilaci&oacute;n, protecci&oacute;n de software,  ofuscaci&oacute;n de c&oacute;digo</font>. </p> <hr>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><b><span lang=EN-GB>ABSTRACT</span></b> </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Nowadays the commercial  software is susceptible to the modification and observation of its machine  code, by means of reverse engineering attacks. These attacks allow the software piracy, being billionaire the losses  caused to the software industry due to this concept. This work focuses on the  development of an extensible architecture, that it allows inserting in  automated way in the course of compilation, protective mechanisms in given  software. Protection carries out of obvious way the developer itself and  besides, allows designing and implementing of flexible and modular way the  different techniques of protection identified. In order to validate the  proposed architecture, the technique of obfuscation as a case study was  implemented. This technique was tested on  different algorithms and its show the obtained results.    <br>       ]]></body>
<body><![CDATA[<br> <strong>Keywords: </strong>software  integrity, Microsoft Phoenix, compilation process, software protection, code  obfuscation.</font> </p> <hr>     <p>&nbsp;</p>     <p>&nbsp;</p>     <p><font size="3" face="Verdana, Arial, Helvetica, sans-serif"><b>INTRODUCCI&Oacute;N</b></font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">En la industria del software moderna, los proveedores y desarrolladores de  software sufren grandes p&eacute;rdidas debido a la distribuci&oacute;n ilegal de software,  una pr&aacute;ctica conocida com&uacute;nmente como pirater&iacute;a de software. Parte del problema  de la pirater&iacute;a de software se debe al hecho de que los programas son  distribuidos como archivos electr&oacute;nicos a trav&eacute;s de Internet, siendo vulnerables  a la modificaci&oacute;n y observaci&oacute;n por los usuarios. Por lo tanto, incluso los  programas de software que hacen cumplir las inscripciones en l&iacute;nea antes de su  uso legal, como medio de prevenir el uso no autorizado, pueden ser modificados de  forma local por un usuario malicioso para evitar el proceso de registro en  l&iacute;nea.    <br>   Estos peligros aumentan, debido a que el software puede ser duplicado y  distribuido masivamente, en particular en los pa&iacute;ses donde los proveedores de  software del programa tienen menos control sobre sus productos. Como resultado,  los propietarios del software tienen p&eacute;rdidas de ingresos significativos. La  tasa de pirater&iacute;a aument&oacute; a 51 billones de d&oacute;lares en el 2009 (BSA, 2010).    <br>   En los &uacute;ltimos a&ntilde;os ha crecido con mayor importancia el tema de la  seguridad de las aplicaciones, espec&iacute;ficamente c&oacute;mo proteger las aplicaciones  frente a la observaci&oacute;n o modificaci&oacute;n de su c&oacute;digo. Son diversas las t&eacute;cnicas  propuestas por la comunidad cient&iacute;fica y la cantidad de variantes que se  obtienen al unir varias de ellas se incrementan cada a&ntilde;o. Debido a que la  mayor&iacute;a presenta un alto grado de complejidad, no es com&uacute;n que los  programadores tengan conocimientos de estas y cuando lo tienen, aplicarlos de  forma manual es inviable, ya que consumir&iacute;a una gran cantidad de tiempo de  desarrollo. No existe un mecanismo de protecci&oacute;n infalible, por lo que estas  t&eacute;cnicas tratan de dificultar el proceso de observaci&oacute;n y modificaci&oacute;n de los  ejecutables.    <br>   Las aplicaciones pueden ser atacadas atentando contra su privacidad o  contra su integridad. Atentar contra la privacidad es cuando se quiere observar  sus datos y funcionamiento interno. Cuando se atenta contra la integridad de  una aplicaci&oacute;n se modifica el contenido de esta. Primero se debe conocer el  funcionamiento interno de la aplicaci&oacute;n para conocer c&oacute;mo debe ser modificada  esta. Mediante estos ataques se puede invalidar el mecanismo de protecci&oacute;n que  tenga la aplicaci&oacute;n y de esta forma ser usada ilegalmente. Por ejemplo, si se  modifica el algoritmo de comprobaci&oacute;n de la licencia, se puede lograr que no se  detecte el uso ilegal de la aplicaci&oacute;n.    <br> A partir del conocimiento de c&oacute;mo debe ser modificada la aplicaci&oacute;n se  pueden crear otras aplicaciones que realicen este proceso de forma autom&aacute;tica.  Estas aplicaciones, conocidas como &ldquo;<em>cracks</em>&rdquo;  o &ldquo;<em>keygen</em>&rdquo;, pueden ser distribuidas  por Internet y permiten que usuarios inexpertos logren violar la protecci&oacute;n de  las aplicaciones. Para contrarrestar estos mecanismos existen variadas t&eacute;cnicas  de protecci&oacute;n que garantizan en cierta medida la protecci&oacute;n de su privacidad e  integridad. La privacidad es garantizada mediante t&eacute;cnicas como la ofuscaci&oacute;n (Lin  y Debray, 2003; Collberg y Thomborson, 2002) y el cifrado (Wang 2005; Chow et.  al., 2003; Chow et. al., 2002), y la integridad se garantiza mediante la  auto-verificaci&oacute;n (Horne et. al., 2002; Chang y Atallah, 2003; Jakubowski et.  al., 2007; Aucsmith, 1996) y las marcas de agua (Myles et. al., 2005; Nagra et.  al., 2002). Para lograr un nivel de seguridad adecuado en la aplicaci&oacute;n, es  necesario garantizar tanto la privacidad como la integridad, por lo que es  necesario complementar t&eacute;cnicas que garanticen ambos atributos. Implementar  estas t&eacute;cnicas dentro de una aplicaci&oacute;n tiene ciertos inconvenientes:</font></p> <ul>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Existen una gran variedad de  t&eacute;cnicas, y estas pueden llegar a tener un alto grado de complejidad.</font></li>       ]]></body>
<body><![CDATA[<li><font size="2" face="Verdana, Arial, Helvetica, sans-serif">No es com&uacute;n que los programadores  tengan conocimientos de estas. En los proyectos de desarrollo se necesita el  rol de analista de seguridad que es el encargado de esta tarea.</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Implementar la mayor&iacute;a de las  t&eacute;cnicas de forma manual puede consumir gran parte del desarrollo de la  aplicaci&oacute;n e introducir muchos errores de implementaci&oacute;n. Adem&aacute;s, la mayor&iacute;a de  estas t&eacute;cnicas deben ser implementadas de forma automatizada.</font></li>     </ul>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Con el objetivo de solucionar los inconvenientes anteriores, existe software  para aplicar t&eacute;cnicas de protecci&oacute;n de forma automatizada. Estas aplicaciones  solucionan parcialmente los problemas expuestos anteriormente pero introducen  nuevos problemas:</font></p> <ul>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Estas herramientas est&aacute;n  dise&ntilde;adas para aplicar un grupo de protecciones espec&iacute;ficas.</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif">No son extensibles, es decir, no  permiten personalizar las protecciones que insertan ni permiten insertarle  mecanismos de protecci&oacute;n realizados por terceros.</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Al ser propietarias no permiten  ver su funcionamiento interno, para comprobar que la protecci&oacute;n es aplicada  correctamente.</font></li>     </ul>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Para dotar a una aplicaci&oacute;n de estos mecanismos hay que insert&aacute;rselos en la  misma, y esto se puede realizar en tres momentos distintos: pre-compilaci&oacute;n,  compilaci&oacute;n y post compilaci&oacute;n.    <br>   A partir de un estudio realizado se reconoci&oacute; que la mejor fase donde  insertar las protecciones es en el proceso de compilaci&oacute;n, debido a que la  mayor&iacute;a de las protecciones pueden ser insertadas completamente en esta fase.  Las protecciones que no se pueden insertar completamente en esta fase,  necesitan peque&ntilde;as modificaciones en post-compilaci&oacute;n.    ]]></body>
<body><![CDATA[<br>   El presente  trabajo aborda el desarrollo de una arquitectura de protecci&oacute;n basada en el  compilador Phoenix, que permita automatizar la aplicaci&oacute;n de mecanismos de protecci&oacute;n  en el proceso de compilaci&oacute;n. Adicionalmente se realizan pruebas sobre la  arquitectura desarrollada mediante la implementaci&oacute;n de una t&eacute;cnica de  ofuscaci&oacute;n de c&oacute;digo.</font></p>     <p>&nbsp;</p>     <p><font face="Verdana, Arial, Helvetica, sans-serif"><strong><font size="3">MATERIALES Y M&Eacute;TODOS </font></strong></font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">En la presente  secci&oacute;n se brindan los detalles del desarrollo de la investigaci&oacute;n. Inicialmente  se brindan los fundamentos te&oacute;ricos actualizados en los cuales se bas&oacute; la  investigaci&oacute;n, tales como la seguridad y amenazas existentes sobre el software  a comercializar, las t&eacute;cnicas de protecci&oacute;n a emplear para evitar los ataques  de ingenier&iacute;a inversa, y las posibles v&iacute;as de automatizaci&oacute;n para aplicar las  distintas t&eacute;cnicas de protecci&oacute;n. Por otra parte, se brinda una descripci&oacute;n de  la arquitectura propuesta para la protecci&oacute;n automatizada de software.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><strong>Seguridad y amenazas del software</strong>     <br>   Al escoger la  manera en que se va a proteger una aplicaci&oacute;n, se tiene que crear un modelo de  amenaza. Esto no es m&aacute;s que un estudio del tipo de ataque que se le pueden  realizar y los recursos que valen la pena proteger. Este modelo no es una  ciencia exacta, se basa en suposiciones y su calidad se mide en cuan realmente  refleja la realidad del ambiente de ejecuci&oacute;n. A partir de este modelo es que  se analiza, qu&eacute; tipo de protecci&oacute;n aplicarle al software en cuesti&oacute;n para  evitar los ataques, protegiendo los recursos necesarios. Dentro del modelo de  amenaza se analizan que zonas del software es necesario proteger pues solamente  se necesita proteger zonas cr&iacute;ticas de su c&oacute;digo, como por ejemplo, d&oacute;nde se  encuentre el algoritmo encargado de la comprobaci&oacute;n de la licencia (Oorschot y  Main, 2003).    <br>   Los modelos de  amenazas existentes son: red (<em>network</em>),  local (<em>insider</em>) y el anfitri&oacute;n no  confiable (<em>untrusted-host</em>) (Wang  2005; Oorschot y Main, 2003). El modelo red es donde el atacante realiza el ataque  a partir de tratar de infiltrarse a trav&eacute;s de la red o enviando mensajes por la  red para provocar comportamientos no esperados de la aplicaci&oacute;n. El modelo  local es donde el atacante se encuentra en la red dentro de la misma compa&ntilde;&iacute;a y  tiene m&aacute;s privilegios que un atacante exterior. El modelo anfitri&oacute;n no  confiable es donde el atacante tiene control completo de la computadora y sus  recursos, donde se encuentra la aplicaci&oacute;n y puede analizarla y modificarla.  Para el modelo red y local existen soluciones para disminuir o anular la  efectividad de los ataques. El modelo anfitri&oacute;n no confiable no cuenta  actualmente con una soluci&oacute;n que garantice la inefectividad de los ataques.    <br>   En el trabajo  actual se considerar&aacute; a las aplicaciones como confiables y el ambiente de  ejecuci&oacute;n no confiable. Esto corresponde con el modelo anfitri&oacute;n no confiable,  donde el objetivo del atacante es violentar la privacidad y la integridad de la  aplicaci&oacute;n, mediante el empleo de herramientas externas. El objetivo es  proteger la integridad y privacidad de una aplicaci&oacute;n confiable en un ambiente  no confiable.    <br>   Las aplicaciones  tienen dos atributos de seguridad: integridad y privacidad:</font></p> <ul>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Cuando se atenta contra su privacidad es cuando se  intenta ver el contenido de la aplicaci&oacute;n sin permiso del propietario. El  objetivo de un ataque contra la privacidad de la aplicaci&oacute;n es comprender el  funcionamiento interno de esta.</font></li>       ]]></body>
<body><![CDATA[<li><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Atentar contra la integridad es cuando se intenta  modificar el contenido de esta, igualmente sin permiso del propietario. El objetivo  que persigue un ataque contra la integridad es variar el funcionamiento de las  aplicaciones de forma que estas tengan un comportamiento distinto al original.</font></li>     </ul>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">El proceso de  ingenier&iacute;a inversa es un ataque que atenta contra estas dos caracter&iacute;sticas de  la aplicaci&oacute;n. Este proceso consiste en la observaci&oacute;n del funcionamiento de la  aplicaci&oacute;n y despu&eacute;s la modificaci&oacute;n, para poder usarla de forma ilegal. Estos  ataques pueden ser realizados de forma est&aacute;tica o din&aacute;mica (Oorschot y Main,  2003):</font></p> <ul type="disc">       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif">El ataque       est&aacute;tico es cuando la aplicaci&oacute;n no se encuentra ejecut&aacute;ndose, y se       observa o modifica como si fuera un fichero binario, mediante herramientas       llamadas desensambladores. Mediante el ataque est&aacute;tico, al no estar       ejecut&aacute;ndose, no hay modificaci&oacute;n de los registros y banderas del       microprocesador.</font></li>     </ul>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">El ataque din&aacute;mico se realiza con  herramientas depuradoras (<em>debuggers</em>)  y la aplicaci&oacute;n se ejecuta mientras se puede observar el contenido de esta,  detenerlo en alg&uacute;n punto espec&iacute;fico o modificarlo si se desea. Como la aplicaci&oacute;n  se encuentra ejecut&aacute;ndose se puede observar como modifica los registros del  microprocesador.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><strong>T&eacute;cnicas de protecci&oacute;n</strong>    <br>   Existen t&eacute;cnicas para disminuir la  efectividad de los ataques aunque ninguna garantiza una seguridad absoluta.  Para proteger la privacidad de la aplicaci&oacute;n se logra con mecanismos que  impiden al atacante observar el contenido de esta o dificultar su  entendimiento. Cuando se intenta proteger la integridad de la aplicaci&oacute;n, se le  insertan mecanismos donde la aplicaci&oacute;n puede verificarse a s&iacute; misma y  comprobar que su contenido es correcto. Ninguno de estos mecanismos puede  garantizar una protecci&oacute;n absoluta.    <br>   Existen varias  v&iacute;as para proteger la privacidad e integridad de las aplicaciones. La  privacidad puede ser protegida con t&eacute;cnicas como el cifrado (Wang 2005) y la  ofuscaci&oacute;n (Collberg et. al., 1997), y la integridad puede ser protegida con  t&eacute;cnicas como la marca de agua en software (Nagra et. al., 2002) y la  auto-verificaci&oacute;n (Chang y Atallah , 2003; Aucsmith, 1996). Adem&aacute;s, existe la t&eacute;cnica  de diversidad de c&oacute;digo (Wong y Stamp, 2006) que no ofrece resistencia contra  estos ataques, pero impide que una vulnerabilidad en una aplicaci&oacute;n se disperse  por internet. Ninguna de estas t&eacute;cnicas garantiza que un software sea totalmente  seguro. Todas tienen ventajas y desventajas y deben aplicarse seg&uacute;n el tipo de  ataque del que se quiera proteger.    <br>   Estas t&eacute;cnicas  se usan en conjunto debido a que por s&iacute; solas es f&aacute;cil encontrarles puntos  d&eacute;biles y explotarlos. Distintos autores han propuesto mezclas de estas  t&eacute;cnicas para lograr un grado superior de protecci&oacute;n: Aucsmith (1996) propone  una arquitectura para la protecci&oacute;n del software contra la modificaci&oacute;n  mezclando t&eacute;cnicas de ofuscaci&oacute;n, auto-verificaci&oacute;n de integridad y cifrado. Matias  (2007) propone una protecci&oacute;n basada en capas donde la ofuscaci&oacute;n impedir&iacute;a  entender el funcionamiento del software, la protecci&oacute;n preventiva impedir&iacute;a que  se pudiera inspeccionar el software y la t&eacute;cnica de auto-verificaci&oacute;n  detectar&iacute;a modificaciones en la aplicaci&oacute;n si ocurrieran.    ]]></body>
<body><![CDATA[<br>   En la <a href="/img/revistas/rcci/v9n5/t0101515.jpg" target="_blank">tabla 1</a> se  expone un resumen sobre estas t&eacute;cnicas y el nivel de protecci&oacute;n que ofrecen  seg&uacute;n el tipo de ataque. Se puede apreciar que a pesar de que el cifrado ofrece  protecci&oacute;n completa, si se logra obtener la llave de cifrado pierde toda la  protecci&oacute;n (Billet et. al., 2004; Goubin et. al., 2007; Wyseur et. al., 2007).  La diversidad de c&oacute;digo, parecer&iacute;a una mala t&eacute;cnica a emplear, por el hecho de  que no ofrece ninguna protecci&oacute;n contra an&aacute;lisis o modificaci&oacute;n, pero sin  embargo, es una t&eacute;cnica muy &uacute;til cuando se quiere evitar que un atacante pueda  encontrar dentro del software la licencia o la llave, a partir de la  comparaci&oacute;n de versiones. Adem&aacute;s, dentro de las v&iacute;as para lograr diversidad de  c&oacute;digo se encuentra la ofuscaci&oacute;n y el cifrado, por lo que si se utiliza la  diversidad de c&oacute;digo a partir de estas t&eacute;cnicas tendr&iacute;a sus ventajas.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">A pesar de que  esta tabla no refleja exactamente la importancia de cada t&eacute;cnica, da una buena  idea de para qu&eacute; tipo de ataque ofrecen mejor protecci&oacute;n. Dentro de las  t&eacute;cnicas que garantizan integridad la auto-verificaci&oacute;n es la m&aacute;s fuerte,  debido a que existe una diversidad de ataques satisfactorios a varios  algoritmos de marcas de agua. Las marcas de agua son usadas m&aacute;s con prop&oacute;sitos  jur&iacute;dicos para probar autenticidad (Nagra et. al., 2002). Por otra parte de las  t&eacute;cnicas que garantizan privacidad, la mejor es la ofuscaci&oacute;n por el hecho de  que en el cifrado es muy dif&iacute;cil ocultar la llave con la que se descifra en un  modelo de amenaza de anfitri&oacute;n no confiable.    <br> En el trabajo actual se implementar&aacute; una  t&eacute;cnica de ofuscaci&oacute;n. Para comprender mejor el funcionamiento de esta, a  continuaci&oacute;n se da una explicaci&oacute;n m&aacute;s completa.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><em>Ofuscaci&oacute;n</em> </font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">La ofuscaci&oacute;n (Lin y Debray, 2003;  Collberg y Thomborson, 2002) es una t&eacute;cnica que propone modificar una  aplicaci&oacute;n estructuralmente, manteniendo su funcionalidad, con el objetivo de  que sea m&aacute;s complejo analizarla. La ofuscaci&oacute;n no esconde el contenido de la  aplicaci&oacute;n, sino que este es incomprensible para un humano o aut&oacute;mata y por lo  tanto, es dif&iacute;cil determinar c&oacute;mo violentar la protecci&oacute;n. El atacante puede  acceder f&aacute;cilmente al c&oacute;digo de la aplicaci&oacute;n, pero necesita comprenderlo para  que el ataque sea satisfactorio. Es en este punto donde la ofuscaci&oacute;n  interviene, modificando el c&oacute;digo de forma que este sea incomprensible en un  tiempo razonable. Se dice que &ldquo;en un tiempo razonable&rdquo; porque &ldquo;con suficiente  tiempo, esfuerzo y determinaci&oacute;n, un programador competente siempre va a ser  capaz de hacerle ingenier&iacute;a inversa a una aplicaci&oacute;n&rdquo; (Collberg et. al., 1997).    <br>   Es por la caracter&iacute;stica de la  ofuscaci&oacute;n de que no basa su fuerza en esconder el c&oacute;digo, que se utiliza mucho  con los lenguajes de Java y .NET por el hecho de que en estos lenguajes, el  c&oacute;digo no se compila en c&oacute;digo m&aacute;quina, sino que se lleva a una interpretaci&oacute;n  intermedia, y se compila solamente en el momento de ejecuci&oacute;n, permiti&eacute;ndoles  un alto grado de portabilidad. Esta ventaja hacen que sean m&aacute;s vulnerables a la  ingenier&iacute;a inversa y por lo tanto, con descompiladores se puede obtener el  c&oacute;digo fuente casi igual a como lo escribi&oacute; el programador.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><em>Clasificaciones de ofuscaci&oacute;n</em></font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Las ofuscaciones  tienen varias clasificaciones seg&uacute;n el objeto que ofuscan. Pueden ser  clasificadas en control, datos o preventivas. Las ofuscaciones de control  tienen como objetivo modificar el control de flujo de una aplicaci&oacute;n. Este  grupo de transformaciones son &uacute;tiles en todos los lenguajes porque a partir del  an&aacute;lisis del control de flujo de una aplicaci&oacute;n, se obtiene informaci&oacute;n  importante de cu&aacute;l es el funcionamiento interno.    <br>   Las ofuscaciones  de datos modifican la forma en que los datos son almacenados en la aplicaci&oacute;n.  Son &uacute;tiles debido a que al oscurecer la forma en que los datos son almacenados  es m&aacute;s dif&iacute;cil por un an&aacute;lisis de ingenier&iacute;a inversa identificar qu&eacute; tipo de  dato est&aacute; siendo procesado.    <br>   Las ofuscaciones preventivas no realizan  ofuscaci&oacute;n en el c&oacute;digo. No est&aacute;n destinadas a proteger la aplicaci&oacute;n contra el  ataque de un humano, sino est&aacute;n destinadas a explotar debilidades de de-ofuscadores autom&aacute;ticos y desensambladores con el objetivo de impedir que estos realicen su  ataque (Collberg et. al., 1997).</font></p>     ]]></body>
<body><![CDATA[<p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><em>Evaluaci&oacute;n de la ofuscaci&oacute;n</em></font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Las ofuscaciones  tienen tres formas de ser evaluadas: potencia, flexibilidad y costo. La  potencia es una medida del nivel de complejidad a&ntilde;adido al c&oacute;digo. Para evaluarla  se mide el nivel de complejidad en la aplicaci&oacute;n, antes y despu&eacute;s de ofuscar, a  partir de una m&eacute;trica de complejidad. Estas m&eacute;tricas miden caracter&iacute;sticas del  c&oacute;digo, como el nivel de anidamiento, cantidad de bloques b&aacute;sicos, etc. La  potencia de una ofuscaci&oacute;n depende del software donde se aplique pues cada  software tiene caracter&iacute;sticas distintas. La flexibilidad de una ofuscaci&oacute;n es  la capacidad de soportar ataques automatizados por otro software, llamado de-ofuscador.  Esta es una medida subjetiva pues no existe forma de medirla con valores  exactos. El costo de una ofuscaci&oacute;n es la carga agregada a la aplicaci&oacute;n en  tama&ntilde;o y tiempo de ejecuci&oacute;n. Esta medida se debe tratar que sea menor, pues  sino la aplicaci&oacute;n ser&iacute;a muy lenta    <br>   En el trabajo actual se implementar&aacute; una  t&eacute;cnica de ofuscaci&oacute;n del grupo de control. Esta t&eacute;cnica se llama &ldquo;Aplanamiento  del grafo de control de flujo&rdquo; (Matias, 2007) y el objetivo que persigue es  eliminar la informaci&oacute;n que se obtiene al realizarse ingenier&iacute;a inversa a una  aplicaci&oacute;n y obtener el grafo de control de flujo. Con esta t&eacute;cnica todos los  nodos del grafo de control de flujo tienen el mismo sucesor y predecesor,  dificultando de esta forma el an&aacute;lisis de la continuidad del c&oacute;digo.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><strong>V&iacute;as de automatizaci&oacute;n de la protecci&oacute;n</strong>     <br>   Las aplicaciones desde que son creadas  pasan por tres estados b&aacute;sicos: pre-compilaci&oacute;n (Liem et. al., 2008; Wang et.  al., 2000), compilaci&oacute;n (Jakubowski et. al., 2009) y post-compilaci&oacute;n (Ya-qi y  Li, 2007). En cada uno de estos estados se le puede hacer modificaciones para  insertarle la protecci&oacute;n deseada, aunque no todas las protecciones pueden ser  insertadas en todos los estados.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><em>En el c&oacute;digo fuente (pre-compilaci&oacute;n)</em>     <br>   En el estado de pre-compilaci&oacute;n, la  aplicaci&oacute;n se encuentra en el c&oacute;digo fuente y la protecci&oacute;n a insertar se  realiza mediante la modificaci&oacute;n de su c&oacute;digo fuente. Hay transformaciones  aplicadas al c&oacute;digo fuente que no afectan el funcionamiento del programa pues  est&aacute;n orientadas a modificar los identificadores y a explotar caracter&iacute;sticas del  pre-procesador. Este grupo de transformaciones se utiliza cuando es obligado o  necesario distribuir el c&oacute;digo fuente de la aplicaci&oacute;n. Hay otras  transformaciones aplicadas al c&oacute;digo fuente que sobreviven al proceso de  compilaci&oacute;n, o sea, que modifican el funcionamiento de la aplicaci&oacute;n. Este  grupo de transformaciones modifican a la aplicaci&oacute;n estructuralmente y por lo  tanto son m&aacute;s dif&iacute;ciles de aplicar que las anteriores.    <br>   Aplicar  protecciones de forma autom&aacute;tica en el c&oacute;digo fuente es complejo debido a que  primero se necesita interpretarlo y crear estructuras que lo representen para  despu&eacute;s modificar esta estructura y al final volver a escribir esta estructura  como c&oacute;digo fuente. La protecci&oacute;n que m&aacute;s se aplica al c&oacute;digo fuente es la  ofuscaci&oacute;n, y espec&iacute;ficamente las transformaciones de capa. En el c&oacute;digo fuente  se pueden aplicar otras transformaciones de forma manual, pero consume gran  cantidad de tiempo.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><em>En el proceso de compilaci&oacute;n</em>    <br>   La aplicaci&oacute;n en  el proceso de compilaci&oacute;n, pasa por una fase donde se encuentra en una  representaci&oacute;n intermedia. Es en este estado donde se aplican las  transformaciones a la aplicaci&oacute;n para que sean realizadas durante el proceso de  compilaci&oacute;n. En este estado se encuentran gran cantidad de la informaci&oacute;n que  se encuentra en el c&oacute;digo fuente por lo que la mayor&iacute;a de las transformaciones  que se pueden realizar en el c&oacute;digo fuente se pueden realizar en esta fase.    ]]></body>
<body><![CDATA[<br>   La protecci&oacute;n de  c&oacute;digo auto-modificable y la auto-verificaci&oacute;n no es posible aplicarla  completamente, porque en este estado no tiene las direcciones de memoria de los  saltos. Sin embargo, a pesar de que no se puede implementar completamente, se  puede implementar la mayor parte de la l&oacute;gica que necesitan estas  transformaciones. La ventaja de este estado es que se abstrae del proceso de  interpretar el c&oacute;digo fuente, dej&aacute;ndole este proceso al compilador, y es  independiente de la arquitectura, al dejar que el compilador genere el c&oacute;digo  m&aacute;quina para la arquitectura espec&iacute;fica.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><em>En el software final (post-compilaci&oacute;n)</em>    <br>   El momento de  post-compilaci&oacute;n es cuando el compilador procesa esta representaci&oacute;n intermedia  y se obtiene el c&oacute;digo compilado. Este c&oacute;digo puede tener varias formas seg&uacute;n  como sea compilada la aplicaci&oacute;n y bajo que plataforma. Cuando la aplicaci&oacute;n  compilada est&aacute; escrita en c&oacute;digo m&aacute;quina, es muy dif&iacute;cil aplicarle  transformaciones, por el hecho de que al insertar c&oacute;digo se necesitan  actualizar los valores de los saltos y estos no expresan una direcci&oacute;n  absoluta, sino, son relativos a su posici&oacute;n dentro del c&oacute;digo.    <br>   Realizar una  transformaci&oacute;n en este estado es igual a realizar un ataque est&aacute;tico mediante  modificaci&oacute;n, que tiene una gran complejidad, por el hecho de que se debe  interpretar el c&oacute;digo m&aacute;quina y existen muchos tipos de arquitecturas de  hardware con estructuras particulares para cada uno.    <br>   Por lo anterior  expuesto se decidi&oacute; insertar las protecciones en el proceso de compilaci&oacute;n.  Esto se debe a que durante este proceso se pueden insertar la mayor cantidad de  protecciones. Hay protecciones que no se pueden insertar completamente durante  la compilaci&oacute;n, pero se puede insertar la mayor parte de su l&oacute;gica durante este  proceso, necesitando peque&ntilde;os cambios despu&eacute;s de ser compiladas, como es el  caso de la auto-verificaci&oacute;n.</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><em>Herramientas</em>    <br>   Se identificaron  una serie de herramientas que permiten aplicar los mecanismos de protecci&oacute;n en  los tres momentos identificados.     <br>   En el proceso  pre-compilaci&oacute;n pueden emplearse la herramienta NetBeans.  Por otra parte durante el proceso de compilaci&oacute;n, pueden estarse empleando compiladores  que permitan la extensi&oacute;n del proceso de compilaci&oacute;n, entre los que se  encuentran el GCC (GCC, 2010) y el Microsoft Phoenix (Microsoft,  2010). Por &uacute;ltimo, en post-compilaci&oacute;n se puede emplear la herramienta Yoda&lsquo;s  Protector (Yoda, 2010) y Themida (Oreans, 2010).    <br>   Se tuvieron en  cuenta una serie de elementos que ayudaron a decidirse por utilizar una  herramienta que permite insertar los mecanismos de protecci&oacute;n en el proceso de  compilaci&oacute;n y no en las otras etapas:</font></p> <ul>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Resulta un trabajo dif&iacute;cil y complejo aplicar las  t&eacute;cnicas de protecci&oacute;n en la etapa de post-compilaci&oacute;n debido a que las  t&eacute;cnicas deben ser desarrolladas en c&oacute;digo maquina dependiente de la  arquitectura.</font></li>       ]]></body>
<body><![CDATA[<li><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Lo f&aacute;cil que resulta eliminar el protector del software  al realizarle un ataque por modificaci&oacute;n.</font></li>       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Netbeans construyen clases que permiten obtener  informaci&oacute;n sobre el c&oacute;digo fuente, pero no permiten su modificaci&oacute;n.</font></li>     </ul> <ul type="disc">       <li><font size="2" face="Verdana, Arial, Helvetica, sans-serif">El GCC es       una herramienta con muchas prestaciones pero tiene un alto nivel de       complejidad para utilizarlo en la modificaci&oacute;n de c&oacute;digo. Se espera en       trabajos futuros utilizarlo.</font></li>     </ul>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Por lo anterior  expuesto, se puede ver que el Phoenix es una buena herramienta. Esto se  demuestra con el hecho de que tiene mejor soporte que las dem&aacute;s herramientas y  uno de los objetivos de su creaci&oacute;n fue permitir la ofuscaci&oacute;n de las  aplicaciones creadas. Provee de una extensa librer&iacute;as como soporte para la  realizaci&oacute;n de <em>plugin</em> y herramientas.  Tambi&eacute;n se justifica la elecci&oacute;n de esta herramienta con el hecho de que se han  realizado estudios anteriores sobre aplicaciones, en an&aacute;lisis y modificaci&oacute;n (Jakubowski  et. al., 2009).</font></p>     <p><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><strong>Descripci&oacute;n de la arquitectura propuesta</strong>     <br>   La soluci&oacute;n  propuesta tiene el objetivo de ser flexible, permiti&eacute;ndoles a los usuarios  extender sus funcionalidades. Mediante esta cualidad el sistema puede ser  f&aacute;cilmente ajustado a distintos ambientes y necesidades. Permite la abstracci&oacute;n  del proceso de protecci&oacute;n del proceso de desarrollo y adem&aacute;s, permite que le  sean integradas protecciones y funcionalidades desarrolladas por terceros, dando  soluci&oacute;n al problema inicial. Como compilador se escogi&oacute; el Phoenix por las  facilidades que tiene. Este compilador da la posibilidad de mediante <em>plugins</em> manipular el listado de fases  que se ejecuta.    <br>   El sistema que  se propone crear introduce una capa de abstracci&oacute;n que separa el mecanismo de  protecci&oacute;n de la forma de inserci&oacute;n. Para lograr un buen entendimiento de la  arquitectura del sistema se muestra un diagrama, en la <a href="#f01">figura 1</a>, utilizando el  patr&oacute;n de arquitectura conocido como capas (<em>layer</em>),  organizado por responsabilidades. Mediante el patr&oacute;n de capas por  responsabilidades se separa en capas las partes del sistema, cada una tiene  ciertas responsabilidades y las superiores usan las facilidades que dan las  inferiores.</font></p>     <p align="center"><a name="f01"></a><img src="/img/revistas/rcci/v9n5/f0101515.jpg" alt="f01" width="375" height="287"></p>     ]]></body>
<body><![CDATA[<p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Capa Compilador:  Esta capa es donde se encuentra el compilador del Phoenix (CL) y tiene la  responsabilidad de compilar la aplicaci&oacute;n deseada mediante la aplicaci&oacute;n de un  grupo de fases. Esta capa da la facilidad para integrar un <em>plugin</em> y manipular el listado de fases, a trav&eacute;s de la  eliminaci&oacute;n o creaci&oacute;n. Esta capa no es introducida por el sistema. En esta se  encuentra el paquete &ldquo;CL&rdquo; que agrupa todas las funcionalidades del compilador.    <br>   Capa  Abstracci&oacute;n: Esta capa es introducida por el sistema y es la encargada de  mantener la l&oacute;gica de negocio para la manipulaci&oacute;n de las protecciones que se  desean insertar y las funcionalidades que se desean utilizar. Ofrece la  funcionalidad, a las capas superiores, de permitir la inserci&oacute;n de varios  mecanismos de protecci&oacute;n utilizando diversas funcionalidades que se pueden  incluir si son deseadas.    <br>   Capa Protecci&oacute;n:  Esta capa es introducida por el sistema y es en esta donde se implementa la  protecci&oacute;n que se desea incluir en la aplicaci&oacute;n que se va a compilar. Es  tambi&eacute;n en esta donde se implementan las funcionalidades nuevas que se pudieran  usar cuando sean deseadas. En esta capa se encuentran los paquetes &ldquo;Ofuscaci&oacute;n&rdquo;  y &ldquo;Auto-verificaci&oacute;n&rdquo;. Ambos paquetes tienen incluido dentro t&eacute;cnicas de  ofuscaci&oacute;n y de verificaci&oacute;n de integridad. En esta capa se pueden incluir m&aacute;s  paquetes con t&eacute;cnicas nuevas desarrolladas por terceros.    <br> Este sistema  facilita el proceso de protecci&oacute;n de aplicaciones. Mediante este, los  desarrolladores de aplicaciones no necesitan preocuparse por las protecciones  debido a que estas son insertadas autom&aacute;ticamente por el sistema.</font></p>     <p>&nbsp;</p>     <p><font size="2"><strong><font size="3" face="Verdana, Arial, Helvetica, sans-serif">RESULTADOS Y DISCUCI&Oacute;N     <br> </font></strong><font face="Verdana, Arial, Helvetica, sans-serif">    <br> </font></font><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Para demostrar  la validez del sistema y el correcto funcionamiento de las protecciones  creadas, se realiz&oacute; una prueba para insertarlas en tres aplicaciones distintas.  Estas aplicaciones son parte de la suite MiBench (Guthaus et. al., 2001),  utilizadas para probar el rendimiento en procesadores. La aplicaciones donde se  van a probar las protecciones son: <em>Susan</em>, <em>Dijkstra</em> y <em>Sha</em>. <em>Susan</em> es un algoritmo  para detectar bordes y esquinas en im&aacute;genes de resonancia magn&eacute;tica del  cerebro. <em>Dijkstra</em> es una prueba donde  se construye un grafo en una matriz y despu&eacute;s calcula el camino m&aacute;s corto entre  cada par de nodos usando repetidas corridas del algoritmo de <em>Dijkstra</em>. El algoritmo de Dijkstra es  una soluci&oacute;n al problema del camino m&aacute;s corto y se completa en tiempo  polinomial. <em>Sha</em> es el algoritmo que  produce un mensaje de 160 bits para una entrada dada.    <br> La t&eacute;cnica de  ofuscaci&oacute;n, llamada &ldquo;Aplanamiento del Grafo de Control de Flujo&rdquo;, se utiliz&oacute;  sobre estos 3 algoritmos y se obtuvieron las medidas de potencia y costo vistos  en la<a href="#t02"> tabla 2</a>. La potencia del algoritmo fue  medida con una m&eacute;trica que mide la complejidad del grafo de control de flujo.</font></p>     <p align="center"><a name="t02"></a><img src="/img/revistas/rcci/v9n5/t0201515.jpg" width="559" height="165"></p>     ]]></body>
<body><![CDATA[<p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Esta tabla  muestra como la potencia de esta t&eacute;cnica es adecuada, pero aumenta el costo en  ejecuci&oacute;n significativamente. Esto se debe a que la ofuscaci&oacute;n fue aplicada a  todos los m&eacute;todos de los algoritmos, por lo que es necesario antes de proteger  una aplicaci&oacute;n saber cu&aacute;les son los m&eacute;todos donde la protecci&oacute;n es necesaria.  Los resultados obtenidos para el algoritmo &ldquo;<em>Dijkstra</em>&rdquo;  son muy favorables debido a que aumenta significativamente la potencia  manteniendo bajo los costos de ejecuci&oacute;n y espacio.</font></p>     <p>&nbsp;</p>     <p><font face="Verdana, Arial, Helvetica, sans-serif" size="3"><B>CONCLUSIONES    <br>       <br> </B></font><font size="2" face="Verdana, Arial, Helvetica, sans-serif">El presente  trabajo tiene un alto valor pr&aacute;ctico ya que por una parte permite a los  desarrolladores de software aplicar de forma transparente y f&aacute;cil los  mecanismos de protecci&oacute;n, incluso sin tener mucho conocimiento de ellos. Este  proceso ser&iacute;a casi transparente para los desarrolladores pues no necesitan  saber en detalle c&oacute;mo se aplica la protecci&oacute;n, solamente como afecta &eacute;sta a la  aplicaci&oacute;n.    <br> Por otra parte a  los que desarrollan t&eacute;cnicas de protecci&oacute;n esta arquitectura le permite  insertar sus m&oacute;dulos sin mayores contratiempos, adem&aacute;s de reutilizar las  bibliotecas de otras t&eacute;cnicas ya desarrolladas.</font></p>     <p>&nbsp;</p>     <p><font face="Verdana, Arial, Helvetica, sans-serif" size="3"><B>REFERENCIAS  BIBLIOGR&Aacute;FICAS</B></font></p>     <!-- ref --><p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">AUSUBEL, D.P. Educational  psychology: a cognitive view, second edition. Michigan, Holt, Rinehart and Winston. 1978. 733 p.    <br>         ]]></body>
<body><![CDATA[<!-- ref --><br> AUSUBEL, D.P. The  psychology of meaningful verbal learning. Oxford, Grune and Stratton, 1963. 255 p.    <br>     <!-- ref --><br> BAKER,  E.L.; GEARHART, M.; HERMAN, L. Evaluating the apple classrooms of tomorrow. In: Baker,  E; O'Neil,  H. F jr; O'Neil,  H. F (Editores). Technology Assessment in Education and Training.    <br>     <!-- ref --><br> Hillsdale:  New York, Routledge, 1994, p 173-198.    <br>     <!-- ref --><br> BRATKO I.  Prolog. Programming for Artificial Intelligence, fourth edition: Addison Wesley  2011. 673 p.    <br>     <br> BRITTAIN,  J.; DARWIN, I. Tomcat: The Definitive Guide. Vital Information for Tomcat  Programmers &amp; Administrators. Sebastopol, O'Reilly Media. 2007. 496 p.    <br>     ]]></body>
<body><![CDATA[<!-- ref --><br> CA&Ntilde;AS,  A.; NOVAK, J. La teor&iacute;a subyacente a los mapas conceptuales y a c&oacute;mo  construirlos, reporte t&eacute;cnico IHMC CmapTools. Pensacola, Institute for Human  and Machine Cognition (IHMC), 2006. 37 p.    <br>     <!-- ref --><br> CHAO,  K. Estrategias did&aacute;cticas mediadas con TIC en un curso de expresi&oacute;n oral  francesa. Revista Actualidades investigativas en educaci&oacute;n. 2014, 14 (2): p.  1-30.    <br>     <br> DALEY,  B. J.; CA&Ntilde;AS, ALBERTO; STARK-SCHWEITZER, T. CmapTools: Integrating teaching,  learning, and evaluation in online courses. Journal New Directions for Adult  and Continuing Education. 2007, 2007 (113): p. 37-47.    <br>     <!-- ref --><br> GARC&Iacute;A,  B. A.; GIL, M. R. Entornos constructivistas de aprendizaje basados en  simulaciones inform&aacute;ticas. Revista Electr&oacute;nica de Ense&ntilde;anza de las Ciencias.  2006, 5 (2): p. 304-322.    <br>     <br> GARRIDO,  D.; GONZ&Aacute;LEZ, L. Mapas conceptuales para la ense&ntilde;anza de Sistemas Operativos.  Trabajo de Diploma para optar por el t&iacute;tulo de Licenciado en Ciencia de la  Computaci&oacute;n. Universidad Central &ldquo;Marta Abreu&rdquo; de Las Villas, Santa Clara,  2009.    <br>     ]]></body>
<body><![CDATA[<br> GONZ&Aacute;LEZ,  Y. Sistema de Mapas Conceptuales para la ense&ntilde;anza de Redes de Computadoras.  Trabajo de Diploma para optar por el t&iacute;tulo de Licenciado en Ciencia de la  Computaci&oacute;n. Universidad Central &ldquo;Marta Abreu&rdquo; de Las Villas, Santa Clara,  2011.    <br>     <br> KULIK, J.A. Meta-Analytic  studies of finding on computer-based instruction. In: Baker,  E; O'Neil;  H. F jr; O'NEIL,  H. F (Editors). Technology Assessment in Education and Training. Hillsdale: New  York, Routledge, 1994, p. 9-34.    <br>     <!-- ref --><br> LAURIE,  B; LAURIE, P. Apache the definitive guide 3rd Edition. Sebastopol, O'Reilly  Media. 2002. 598 p.    <br>     <br> LINARES,  M. Mapas conceptuales para la ense&ntilde;anza de la Bot&aacute;nica. Una  propuesta organizativa. Tesis para optar por el t&iacute;tulo de M&aacute;ster en Computaci&oacute;n  Aplicada. Universidad Central &ldquo;Marta Abreu&rdquo; de Las Villas, Santa Clara, 2007.    <br>     <br> L&Oacute;PEZ,  J. C. Del origen de los Mapas Conceptuales al desarrollo de CmapTools. [en  l&iacute;nea]. EDUTEKA. 2007. [Consultado el: 18 de febrero 2015] Disponible en: http://www.eduteka.org/Entrevista22.php.    <br>     ]]></body>
<body><![CDATA[<br> LUTZ,  M. Learning Python, Fifth Edition. Sebastopol, O'Reilly  Media. 2013. 1600 p.    <br>     <!-- ref --><br> MOOCK,  C. Essential ActionScript 3.0. Sebastopol, O'Reilly Media / Adobe Developer  Library. 2007. 948p.    <br>     <br> NOVAK,  J. Learning, Creating, and Using Knowledge: Concept Maps as Facilitative Tools  in Schools and Corporations. Journal of e-Learning and Knowledge Society. 2010,  Vol. 6 (3): p. 21 &ndash; 30.    <br>     <br> R&Iacute;OS,  L. Ambiente de ense&ntilde;anza-aprendizaje inteligente para la Programaci&oacute;n L&oacute;gica.  Tesis para optar por el t&iacute;tulo de Doctor en Ciencias T&eacute;cnicas, Universidad  Central &ldquo;Marta Abreu&rdquo; de Las Villas, Santa Clara, 2009.    <br>     <br> SOLER Y.  Aplicaci&oacute;n de la visualizaci&oacute;n din&aacute;mica de programas en el dise&ntilde;o de  estructuras de datos y el an&aacute;lisis de la complejidad de algoritmos. Tesis para  optar por el t&iacute;tulo de Doctor en Ciencias T&eacute;cnicas, Universidad Central &ldquo;Marta  Abreu&rdquo; de Las Villas, Santa Clara, 2009.    <br>     ]]></body>
<body><![CDATA[<br> SORI,  J. Mapas Conceptuales para la ense&ntilde;anza de Arquitectura de Computadoras.  Trabajo de Diploma para optar por el t&iacute;tulo de Licenciado en Ciencia de la  Computaci&oacute;n. Universidad Central &ldquo;Marta Abreu&rdquo; de Las Villas, Santa Clara,  2010.    <br>     <!-- ref --><br> TATROE,  K.; Macintyre, P.; RASMUS, L. Programming PHP 3rd Edition. Sebastopol, O'Reilly  Media, 2013. 540 p.    <br>     <!-- ref --><br> Ullman,  R. Modern JavaScript. Develop and design. New York, Peachpit Pr, 2012. 611 p.    <br>     <!-- ref --><br> WALL,  L.; Christiansen, T.; Orwant, J. Programming Perl 3rd Edition. Sebastopol, O'Reilly Media, 2000. 1104 p.    </font></p>     <p align="left">     <p name="_ENREF_1">&nbsp;</p>     ]]></body>
<body><![CDATA[<p><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Recibido: 05/01/2015        <br> Aceptado: 15/02/2015</font>    </p>      ]]></body><back>
<ref-list>
<ref id="B1">
<nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[AUSUBEL]]></surname>
<given-names><![CDATA[D.P]]></given-names>
</name>
</person-group>
<source><![CDATA[Educational psychology: a cognitive view, second edition.]]></source>
<year>1978</year>
<page-range>733 p</page-range><publisher-loc><![CDATA[Holt^eMichigan Michigan]]></publisher-loc>
<publisher-name><![CDATA[Rinehart and Winston]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B2">
<nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[AUSUBEL]]></surname>
<given-names><![CDATA[D.P]]></given-names>
</name>
</person-group>
<source><![CDATA[The psychology of meaningful verbal learning.]]></source>
<year>1963</year>
<page-range>255 p</page-range><publisher-loc><![CDATA[Oxford ]]></publisher-loc>
<publisher-name><![CDATA[Grune and Stratton]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B3">
<nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[BAKER]]></surname>
<given-names><![CDATA[E.L]]></given-names>
</name>
<name>
<surname><![CDATA[GEARHART]]></surname>
<given-names><![CDATA[M]]></given-names>
</name>
<name>
<surname><![CDATA[HERMAN]]></surname>
<given-names><![CDATA[L]]></given-names>
</name>
</person-group>
<source><![CDATA[Evaluating the apple classrooms of tomorrow.]]></source>
<year></year>
<publisher-name><![CDATA[Technology Assessment in Education and Training]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B4">
<nlm-citation citation-type="book">
<source><![CDATA[Hillsdale]]></source>
<year>1994</year>
<page-range>p 173-198.</page-range><publisher-loc><![CDATA[New York ]]></publisher-loc>
<publisher-name><![CDATA[Routledge]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B5">
<nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[BRATKO]]></surname>
<given-names><![CDATA[I]]></given-names>
</name>
</person-group>
<source><![CDATA[Prolog: Programming for Artificial Intelligence]]></source>
<year>2011</year>
<page-range>673 p</page-range><publisher-name><![CDATA[Addison Wesley]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B6">
<nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[BRITTAIN]]></surname>
<given-names><![CDATA[J]]></given-names>
</name>
<name>
<surname><![CDATA[DARWIN]]></surname>
<given-names><![CDATA[I]]></given-names>
</name>
</person-group>
<source><![CDATA[Vital Information for Tomcat Programmers & Administrators]]></source>
<year>2007</year>
<page-range>496 p</page-range><publisher-loc><![CDATA[Sebastopol ]]></publisher-loc>
<publisher-name><![CDATA[O'Reilly Media.]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B7">
<nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[CAÑAS]]></surname>
<given-names><![CDATA[A]]></given-names>
</name>
<name>
<surname><![CDATA[NOVAK]]></surname>
<given-names><![CDATA[J]]></given-names>
</name>
</person-group>
<source><![CDATA[La teoría subyacente a los mapas conceptuales y a cómo construirlos, reporte técnico IHMC CmapTools.]]></source>
<year>2006</year>
<page-range>37 p</page-range><publisher-loc><![CDATA[Pensacola ]]></publisher-loc>
<publisher-name><![CDATA[Institute for Human and Machine Cognition (IHMC)]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B8">
<nlm-citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname><![CDATA[CHAO]]></surname>
<given-names><![CDATA[K]]></given-names>
</name>
</person-group>
<article-title xml:lang="es"><![CDATA[Estrategias didácticas mediadas con TIC en un curso de expresión oral francesa]]></article-title>
<source><![CDATA[Revista Actualidades investigativas en educación]]></source>
<year>2014</year>
<volume>14</volume>
<numero>2</numero>
<issue>2</issue>
<page-range>p. 1-30</page-range></nlm-citation>
</ref>
<ref id="B9">
<nlm-citation citation-type="">
<person-group person-group-type="author">
<name>
<surname><![CDATA[DALEY]]></surname>
<given-names><![CDATA[B. J]]></given-names>
</name>
<name>
<surname><![CDATA[CAÑAS]]></surname>
<given-names><![CDATA[ALBERTO]]></given-names>
</name>
<name>
<surname><![CDATA[STARK-SCHWEITZER]]></surname>
<given-names><![CDATA[T]]></given-names>
</name>
</person-group>
<source><![CDATA[CmapTools: Integrating teaching, learning, and evaluation in online courses]]></source>
<year>2007</year>
<page-range>p. 37-47</page-range></nlm-citation>
</ref>
<ref id="B10">
<nlm-citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname><![CDATA[GARCÍA]]></surname>
<given-names><![CDATA[B. A]]></given-names>
</name>
<name>
<surname><![CDATA[GIL]]></surname>
<given-names><![CDATA[M. R]]></given-names>
</name>
</person-group>
<article-title xml:lang="es"><![CDATA[Entornos constructivistas de aprendizaje basados en simulaciones informáticas.]]></article-title>
<source><![CDATA[Revista Electrónica de Enseñanza de las Ciencias]]></source>
<year>2006</year>
<volume>5</volume>
<numero>2</numero>
<issue>2</issue>
<page-range>p. 304-322</page-range></nlm-citation>
</ref>
<ref id="B11">
<nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[GARRIDO]]></surname>
<given-names><![CDATA[D]]></given-names>
</name>
<name>
<surname><![CDATA[GONZÁLEZ]]></surname>
<given-names><![CDATA[L]]></given-names>
</name>
</person-group>
<source><![CDATA[Mapas conceptuales para la enseñanza de Sistemas Operativos]]></source>
<year>2009</year>
<publisher-loc><![CDATA[Santa Clara ]]></publisher-loc>
<publisher-name><![CDATA[Universidad Central &#8220;Marta Abreu&#8221; de Las Villas]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B12">
<nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[GONZÁLEZ]]></surname>
<given-names><![CDATA[Y]]></given-names>
</name>
</person-group>
<source><![CDATA[Sistema de Mapas Conceptuales para la enseñanza de Redes de Computadoras]]></source>
<year>2011</year>
<publisher-loc><![CDATA[Santa Clara ]]></publisher-loc>
<publisher-name><![CDATA[Universidad Central &#8220;Marta Abreu&#8221; de Las Villas]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B13">
<nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[KULIK]]></surname>
<given-names><![CDATA[J.A]]></given-names>
</name>
</person-group>
<source><![CDATA[Meta-Analytic studies of finding on computer-based instruction.]]></source>
<year>1994</year>
<page-range>p. 9-34</page-range><publisher-loc><![CDATA[New York ]]></publisher-loc>
<publisher-name><![CDATA[Technology Assessment in Education and TrainingRoutledge]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B14">
<nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[LAURIE]]></surname>
<given-names><![CDATA[B]]></given-names>
</name>
<name>
<surname><![CDATA[LAURIE]]></surname>
<given-names><![CDATA[P]]></given-names>
</name>
</person-group>
<source><![CDATA[Apache the definitive guide 3rd Edition]]></source>
<year>2002</year>
<page-range>598 p</page-range><publisher-loc><![CDATA[Sebastopol ]]></publisher-loc>
<publisher-name><![CDATA[O'Reilly Media]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B15">
<nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[LINARES]]></surname>
<given-names><![CDATA[M]]></given-names>
</name>
</person-group>
<source><![CDATA[Mapas conceptuales para la enseñanza de la Botánica: Una propuesta organizativa]]></source>
<year>2007</year>
<publisher-loc><![CDATA[Santa Clara ]]></publisher-loc>
<publisher-name><![CDATA[Universidad Central &#8220;Marta Abreu&#8221; de Las Villas]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B16">
<nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[LÓPEZ]]></surname>
<given-names><![CDATA[J. C]]></given-names>
</name>
</person-group>
<source><![CDATA[Del origen de los Mapas Conceptuales al desarrollo de CmapTools]]></source>
<year>2007</year>
<publisher-name><![CDATA[EDUTEKA]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B17">
<nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[LUTZ]]></surname>
<given-names><![CDATA[M]]></given-names>
</name>
</person-group>
<source><![CDATA[Learning Python]]></source>
<year>2013</year>
<page-range>1600 p</page-range><publisher-loc><![CDATA[Sebastopol ]]></publisher-loc>
<publisher-name><![CDATA[O'Reilly Media]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B18">
<nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[MOOCK]]></surname>
<given-names><![CDATA[C]]></given-names>
</name>
</person-group>
<source><![CDATA[Essential ActionScript 3.0]]></source>
<year>2007</year>
<page-range>948p</page-range><publisher-loc><![CDATA[Sebastopol ]]></publisher-loc>
<publisher-name><![CDATA[O'Reilly Media / Adobe Developer Library]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B19">
<nlm-citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname><![CDATA[NOVAK]]></surname>
<given-names><![CDATA[J]]></given-names>
</name>
</person-group>
<article-title xml:lang="en"><![CDATA[, Creating, and Using Knowledge: Concept Maps as Facilitative Tools in Schools and Corporations.]]></article-title>
<source><![CDATA[Journal of e-Learning and Knowledge Society.]]></source>
<year>2010</year>
<volume>6</volume>
<numero>3</numero>
<issue>3</issue>
<page-range>21 - 30</page-range></nlm-citation>
</ref>
<ref id="B20">
<nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[RÍOS]]></surname>
<given-names><![CDATA[L]]></given-names>
</name>
</person-group>
<source><![CDATA[Ambiente de enseñanza-aprendizaje inteligente para la Programación Lógica.]]></source>
<year>2009</year>
<publisher-loc><![CDATA[Santa Clara ]]></publisher-loc>
<publisher-name><![CDATA[Universidad Central &#8220;Marta Abreu&#8221; de Las Villas]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B21">
<nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[SOLER]]></surname>
<given-names><![CDATA[Y]]></given-names>
</name>
</person-group>
<source><![CDATA[Aplicación de la visualización dinámica de programas en el diseño de estructuras de datos y el análisis de la complejidad de algoritmos.]]></source>
<year>2009</year>
<publisher-loc><![CDATA[Santa Clara ]]></publisher-loc>
<publisher-name><![CDATA[Universidad Central &#8220;Marta Abreu&#8221; de Las Villas]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B22">
<nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[SORI]]></surname>
<given-names><![CDATA[J]]></given-names>
</name>
</person-group>
<source><![CDATA[Mapas Conceptuales para la enseñanza de Arquitectura de Computadoras.]]></source>
<year>2010</year>
<publisher-loc><![CDATA[Santa Clara ]]></publisher-loc>
<publisher-name><![CDATA[Universidad Central &#8220;Marta Abreu&#8221; de Las Villas]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B23">
<nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[TATROE]]></surname>
<given-names><![CDATA[K]]></given-names>
</name>
<name>
<surname><![CDATA[Macintyre]]></surname>
<given-names><![CDATA[P]]></given-names>
</name>
<name>
<surname><![CDATA[RASMUS]]></surname>
<given-names><![CDATA[L]]></given-names>
</name>
</person-group>
<source><![CDATA[Programming PHP 3rd Edition]]></source>
<year>2013</year>
<page-range>540 p</page-range><publisher-loc><![CDATA[Sebastopol ]]></publisher-loc>
<publisher-name><![CDATA[O'Reilly Media]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B24">
<nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Ullman]]></surname>
<given-names><![CDATA[R]]></given-names>
</name>
</person-group>
<source><![CDATA[Modern JavaScript: Develop and design]]></source>
<year>2012</year>
<page-range>611 p.</page-range><publisher-loc><![CDATA[New York ]]></publisher-loc>
<publisher-name><![CDATA[Peachpit Pr]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B25">
<nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[WALL]]></surname>
<given-names><![CDATA[L]]></given-names>
</name>
<name>
<surname><![CDATA[Christiansen]]></surname>
<given-names><![CDATA[T]]></given-names>
</name>
<name>
<surname><![CDATA[Orwant]]></surname>
<given-names><![CDATA[J]]></given-names>
</name>
</person-group>
<source><![CDATA[Programming Perl 3rd Edition]]></source>
<year>2000</year>
<page-range>1104 p</page-range><publisher-loc><![CDATA[Sebastopol ]]></publisher-loc>
<publisher-name><![CDATA[O'Reilly Media]]></publisher-name>
</nlm-citation>
</ref>
</ref-list>
</back>
</article>
