Descarga la aplicación para disfrutar aún más
Vista previa del material en texto
UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO FACULTAD DE ESTUDIOS SUPERIORES ARAGÓN INGENIERÍA EN COMPUTACIÓN INTRODUCCIÓN A LA INGENIERÍA INVERSA TRABAJO ESCRITO EN LA MODALIDAD DE ALTO NIVEL ACADÉMICO PARA OBTENER EL TÍTULO DE INGENIERO EN COMPUTACIÓN P R E S E N T A: JOSÉ ALBERTO TREJO HERNÁNDEZ ASESOR: ING. SILVIA VEGA MUYTOY MÉXICO 2010 UNAM – Dirección General de Bibliotecas Tesis Digitales Restricciones de uso DERECHOS RESERVADOS © PROHIBIDA SU REPRODUCCIÓN TOTAL O PARCIAL Todo el material contenido en esta tesis esta protegido por la Ley Federal del Derecho de Autor (LFDA) de los Estados Unidos Mexicanos (México). El uso de imágenes, fragmentos de videos, y demás material que sea objeto de protección de los derechos de autor, será exclusivamente para fines educativos e informativos y deberá citar la fuente donde la obtuvo mencionando el autor o autores. Cualquier uso distinto como el lucro, reproducción, edición o modificación, será perseguido y sancionado por el respectivo titular de los Derechos de Autor. AgradecimientosAgradecimientosAgradecimientosAgradecimientos Gracias a DiosGracias a DiosGracias a DiosGracias a Dios Por permitirme concluir mi carrera y llegar hasta este momento tan importante de mi vida. Gracias a mis padresGracias a mis padresGracias a mis padresGracias a mis padres Por darme la estabilidad emocional, económica y sentimental; por su cariño, comprensión y apoyo incondicional para poder llegar hasta este logro que definitivamente, no sería realidad sin ustedes. Gracias por guiarme sobre el camino de la educación y por enseñarme que todo se aprende y que todo esfuerzo es al final recompensa. Serán siempre mi inspiración para alcanzar mis metas. GraciasGraciasGraciasGracias a Fabya Fabya Fabya Faby Por tu apoyo, compresión y gran amor que me permite sentir que puedo lograr lo que me proponga. Gracias por escucharme, por tus consejos y por ser parte de mi vida, eres lo mejor que me ha pasado. Gracias a todos mis amigosGracias a todos mis amigosGracias a todos mis amigosGracias a todos mis amigos Que estuvieron conmigo y compartimos tantas aventuras, experiencias, desveladas, triunfos y derrotas. Gracias a cada uno por hacer que mi estancia en la universidad fuera realmente dichosa. Gracias a cada uno de los maestrosGracias a cada uno de los maestrosGracias a cada uno de los maestrosGracias a cada uno de los maestros A la maestra Silvia Vega Muytoy por ser sustento y dirección de este trabajo de titulación, al maestro Marcelo Pérez Medel por todo el apoyo y conocimiento que me brindó. Y a todos los profesores que participaron en mi desarrollo profesional no sólo durante mi carrera sino de toda la vida, sin su ayuda e intelecto no estaría en donde me encuentro ahora. DDDDedicatoriaedicatoriaedicatoriaedicatoria Dedico la presente como agradecimiento al apoyo brindado durante estos años de estudio y como un reconocimiento de gratitud al finalizar esta carrera. En mí han quedado marcadas huellas profundas de este recorrido. Son madre, tu mirada y tu aliento. Son padre tu trabajo y esfuerzo. Son maestros sus palabras y sabios consejos: mi trofeo, que también es de ustedes. ÍNDICE Introducción………………………………………………………………..………...…....…I Capítulo 1 Conceptos Básicos 1.1.- Breve Historia ………...………...………………………..…………………………....2 1.2.- ¿Qué es la Ingeniería Inversa?........................................................................................3 1.2.1- Objetivo y Beneficios de la Ingeniería Inversa……....………………..………….4 1.2.2- Para qué sirve la Ingeniería Inversa………………..………………..……………5 1.2.3- Tipos de Ingeniería Inversa………………………………………..……………...6 1.3.- Herramientas de la Ingeniería Inversa...………………………………….……………9 1.3.1- .Lenguaje Ensamblador…………...……………………………….……………..9 1.3.2-. Depurador…………………………...………………………….………………11 1.3.3.- Desensamblador…………………………………………………………..…….11 1.3.4.- Compilador Inverso o Decompilador…………………………………….…….12 1.3.5.- Editor Hexadecimal……………………………………………………….……12 1.3.6.- Descompresor…………………………………………………………….…….13 1.3.7.- Analizador de Archivos………………………………………………….……..13 1.3.8.- Dumpeador de Memoria………………………………………………………..13 1.3.9.- Monitor de Registros……………………………………………………….…..14 1.3.10.- Emulador………………………………………………………………..……..14 1.3.11.- Herramientas CASE…………………………………………………..……….14 1.4.- Proceso de la Ingeniería Inversa……………………………………………………...15 1.4.1.- Nivel de Abstracción…………………………………………………………...15 1.4.2.- Completitud…………………………………………………………………….16 1.4.3.- Interactividad……………………………………………………………….…..16 1.4.4.- Direccionalidad…………………………………………………………..……..16 1.4.5.- Historia y Evolución de las Técnicas de Ingeniería Inversa…………………....17 1.4.6.- Estrategias para Implementar la Ingeniería Inversa………………………..…..18 1.4.6.1.- Método 1 (Ingeniería Inversa)……………………………………….…...19 1.4.6.2.- Método 2 (Ingeniería Inversa y las Interfaces de Usuario)……….….…...20 1.4.6.3.- Método 3 (Ingeniería Social)…………………………………….……….21 1.5.- ¿Cuándo Aplicar Ingeniería Inversa?………………………………….……………..23 1.6.- Ingeniería Inversa y Protección del Software Mediante Derechos de Autor……..…..24 Capítulo 2 Ejemplos y Aplicaciones 2.1.- Programa Samba………………………………………………………………..…….30 2.1.1- Historia de Samba……...………………………………………………………..30 2.1.2.- ¿Qué es Samba?...................................................................................................31 2.1.3.- ¿Qué permite Samba?..........................................................................................31 2.1.4.- ¿Cómo funciona Samba?.....................................................................................31 2.1.5.- Componentes de la “Suite” Samba……………………………………..………32 2.2.- Ingeniería Inversa y los Números Mágicos……………………………………….….33 2.2.1.- Paso a Paso…………………………………………………………………..….34 2.2.2.- La genialidad que Oculta Ensamblador……………………………………..….37 2.2.3.- Números Mágicos……………………………………………………………....39 2.3.- Ingeniería Inversa y Prototipaje Rápido………………………………………….…..41 2.4.- Ingeniería Inversa y El Hacking……………………………………………………...42 2.4.1.- ¿En qué consiste el Hacking?...............................................................................45 2.5 Aplicaciones de la Ingeniería Inversa…………………………………………….……46 2.6.- Ingeniería Inversa y Escaners 3D………………………………………………….…47 Conclusiones………………………………………………………………………….…....49 Glosario……………………………………………………………………………….....…50 Bibliografía.……………………………………...……………………………………..….59 I INTRODUCCIÓN La “Ingeniería Inversa” se ha definido como el método que permite elaborar de manera específica un mejor y mayor nivel de análisis de un sistema, software o cualquier otro producto terminado con el fin de desentrañar sus características de fabricación y diseño. Dichas características pueden volver a ser utilizadas para construir una nueva implementación del sistema utilizando, en la mayoría de los casos, técnicas de ingeniería directa logrando de esta manera, extraer los secretos o formas de producción de estos sistemas con el fin de adaptar y hacer compatible dicho producto con las necesidades requeridas donde, la “Ingeniería Inversa” puede ser definida en varios contextos de análisis de sistemas. El objetivo de este trabajo de investigación es dar una introducción a lo que se conoce como “Ingeniería Inversa” para inducir al lector en el contexto de este proceso y así poder ampliar sus conocimientos o iniciarlo en el tema. Cabe mencionar que no sólo se trata de generar interés en lectores que estén familiarizados en el campo de la ingeniería,sino también al público en general, sin embargo es recomendable contar con una serie de conocimientos básicos de informática para comprender mejor el uso de la “Ingeniería Inversa” ya que el campo de aplicación de ésta (desde sus inicios y hasta la actualidad) es basto y socorrido por los usuarios que la realizan, debido a que en los casos que es aplicable reduce costos y tiempo de diseño para generar un producto nuevo. Por otra parte, no se puede dejar de lado el punto de vista contrario (con el afán de dañar) ya que por ser una herramienta que se puede utilizar en el área de la seguridad, el mal uso de este proceso puede mostrar las vulnerabilidades de los sistemas que se involucran con lo cual, se podría dañar al propietario de dichos productos (principalmente software, hardware y manufactura). II Así mismo, se dará a conocer la postura legal política del tema, para destacar que la “Ingeniería Inversa” puede llegar a ser catalogada como un proceso lícito o ilícito dependiendo del uso que se le dé. A su vez, se cuestionará el asunto sobre las licencias y los términos de utilización que el usuario obtiene así como, diferentes maneras de proteger sus creaciones. En el capítulo 1 se hablará de lo que es la “Ingeniería Inversa”; en qué consiste, por quiénes es usada y aplicada, sus beneficios, ventajas y desventajas, casos recomendables para llevarla a cabo, así como también un par de métodos propuestos para su empleo y las herramientas básicas como lo son el lenguaje ensamblador, compiladores, decompiladores, editores de registros, entre otras que se requieren para lograr una correcta y adecuada aplicación dejando a criterio del lector y/o usuario el empleo que de ella hará. En el capítulo 2, se verá un proyecto llamado Samba que evidencia que este proceso tiene aplicaciones benéficas no sólo para quien lo pone en práctica sino también para los usuarios del sistema Samba. Así mismo, se podrá notar que la “Ingeniería Inversa” es apta para muchos productos, no sólo programas informáticos (software), aunque ésta es una de sus principales aplicaciones en la actualidad. A su vez, se mostrará un claro ejemplo de la “Ingeniería Inversa” que consiste en el análisis de un programa llamado “Números Mágicos” que el autor explica paso a paso para entender su lógica en un proceso inverso así como también una muestra de la relación de la “Ingeniería Inversa” con el hacking y la utilización de ésta en la manufactura, la milicia, las empresas para generar productos competentes con sus adversarios de mercado con ayuda de herramientas como lo son los escaners 3D, aplicaciones de diseño asistido por computadora (CAD) con III las cuales se puede descubrir el proceso de producción de dichos productos sin necesidad de tener la documentación de diseño. Finalmente, después de explicar y delimitar los conceptos y funciones de la llamada “Ingeniería Inversa”, se complementará la investigación con un pequeño glosario que incluye términos técnicos implicados en este proceso para obtener una mayor comprensión del tema por parte del lector. CCAAPPÍÍTTUULLOO 11 CCOONNCCEEPPTTOOSS BBÁÁSSIICCOOSS 2 1.1 Breve Historia El concepto de “Ingeniaría Inversa” se aproxima a los 58 años de edad ya que se estudia, produce y ejerce en Estados Unidos y otros lugares del mundo desde 1952. En el caso de Estados Unidos, la “Ingeniería Inversa” es aplicada por un número elevado de personas entre las que se encuentran “una gran cantidad de científicos, peritos e ingenieros especialistas, astrónomos y militares, [que] se juntaron en un lugar de Nevada, que decidieron llamar “Área 51” (http://www.elobservatodo.cl/admin/render/noticia/13629, 2009), lugar que se encuentra en el centro de la Base de la Fuerza Aérea de Nellis en la cual se prueban aeronaves secretas y desconocidas dentro de una atmósfera completamente hermética, así como también se ha dedicado a estudiar el funcionamiento de algunas naves espaciales traídas de lugares anónimos; dicha zona se conoce con el nombre oficial de “Air Force Flight Test Center, Detachment 3”.donde el gobierno estadounidense realiza lo que hoy en día se conoce como “Ingeniería Inversa”. Por otra parte, es importante mencionar que la “Ingeniaría Inversa” tiene su origen en el mundo del hardware: una empresa desensambla un producto de hardware competitivo en un esfuerzo por comprender los secretos de diseño y fabricación de su competidor ya que, dichos secretos se podrían entender con facilidad si se obtuvieran las especificaciones de diseño y fabricación del competidor pero, como es lógico, estos documentos son privados y por ende no están disponibles para la competencia, por lo cual se necesita aplicar “Ingeniería Inversa” que, si es aplicada con éxito, dará lugar a una o más especificaciones de diseño y fabricación para el producto mediante el examen de ejemplos reales del objeto. 3 En cuanto a lo que es “Ingeniería Inversa” en ámbitos de software, se puede decir que es un término relativamente nuevo. 1.2 ¿Qué es la Ingeniería Inversa? La “Ingeniería Inversa” es un subproceso de la reingeniería, la cual tiene como misión descubrir los misterios y secretos de los sistemas en uso cuyo objetivo principal es recuperar el diseño de una aplicación u objeto a partir del código o pieza terminada, esto se logra mediante un proceso que se verá más adelante, pero ¿qué es la reingeniería? Se puede definir la reingeniería como el examen y alteración de un sistema de software o hardware para la recuperación del diseño de una aplicación u objeto existente que usa la información obtenida para reconstruir, mejorar la calidad y reducir el costo de su mantenimiento. A continuación se mencionan algunas definiciones de lo que es la “Ingeniería Inversa”: � La “Ingeniería Inversa” se ha definido como el proceso de construir especificaciones de un mayor nivel de abstracción partiendo del código fuente de un sistema software o cualquier otro producto (se puede utilizar como punto de partida cualquier otro elemento de diseño). (http://cnx.org/content/m17432/latest/, 2009). � Se conoce como “Ingeniería Inversa” o Reverse Engineering al proceso de duplicar una pieza, componente o conjunto, sin la ayuda de planos, documentación o modelos auxiliares. Se parte del modelo físico y se usan métodos de ingeniería de medida, análisis, diseño y adquisición de datos para finalmente obtener una réplica idéntica o mejorada del objeto. (http://bdigital.eafit.edu.co/bdigital/PROYECTO/P621.9023F634/capitulo1.pdf). 4 � En el contexto de software, Chikofsky y Cross establecen que la “Ingeniería Inversa” es el proceso de analizar un sistema para crear una representación del mismo pero a un nivel más elevado de abstracción. (http://www.iiisci.org/Journal/RISCI/pdfs/X581YP.pdf). � Hall establece que la “Ingeniería Inversa” es un proceso que recorre hacia atrás el ciclo de desarrollo de software. (http://www.securityc.com/eventos/presentaciones/Ingenieria%20Inversa. pdf). � La “Ingeniería Inversa” es un proceso de asilar y analizar con detalle una obra de ingeniería con el objeto de obtener información relevante acerca de su diseño, implementación y funcionamiento. (http://www.securityc.com/eventos/presentaciones/Ingenieria%20Inversa. pdf). De esta manera, el proceso es denominado “Ingeniería Inversa” debido a que va en dirección opuesta a las tareas habituales de la ingeniería ya que su proceso consiste en partir de datos técnicos a un determinado producto donde, si dicho producto es obtenido de manera apropiada, el proceso de “Ingeniería Inversa” es legítimo y legal y así, pueden crearse y destruirse productos genéricos creados y basados en la información obtenida una vez aplicado el método, un ejemplo claroes el software de uso libre. 1.2.1 Objetivos y Beneficios de la Ingeniería Inver sa La aplicación de la “Ingeniería Inversa” nunca tendrá el objetivo de cambiar la funcionalidad de un programa o hardware, lo que busca es obtener información técnica de un producto accesible al público con el fin de determinar de qué está hecho, qué lo hace funcionar, y cómo fue fabricado; esto permite obtener los siguientes beneficios: 5 - Reducir la complejidad de los sistemas a través de la comprensión del software facilitando su mantenimiento y disminuyendo la complejidad existente. - Recuperar y/o actualizar información no documentada. - Generar diferentes alternativas para facilitar la comprensión de su código fuente o su algoritmo, mediante representaciones gráficas. - Detectar efectos laterales ya que los cambios que se pueden realizar en un sistema pueden provocar efectos no deseados y una serie de anomalías que sólo es posible detectar mediante el proceso de “Ingeniería Inversa”. - Facilitar la reutilización del sistema o partes de él con la posibilidad de aumentar la productividad y reducir los costos y riesgos de mantenimiento. Todos estos beneficios en conjunto conforman una serie de “secretos” contenidos en los sistemas, donde el papel de la “Ingeniería Inversa” es desentrañar dichos secretos empleando herramientas que pueden extraer los datos, procedimientos y arquitectura de los sistemas en análisis. 1.2.2 Para qué sirve la Ingeniería Inversa La “Ingeniería Inversa” es útil para el desarrollo e industrialización de nuevos productos o modificación de lo ya existente, debido a que es necesario aprovechar y reutilizar todo lo relacionado con un producto que se encuentra en proceso de producción, para obtener una rápida y efectiva respuesta que satisfaga nuestras necesidades y las del mercado con productos de calidad e innovación y evitar el proceso de ingeniería tradicional el cual implicaría inversión de bastante tiempo, diseño de un producto, modelado, pruebas de factibilidad, funcionalidad y conformidad, además de un costo elevado, entre otras. Dicho proceso también facilita el seguimiento a los productos en fases posteriores a la fabricación como su mantenimiento y post-venta para así poder competir con los considerados mejores del mercado (benchmarking) evitando 6 invertir recursos en una investigación y desarrollo que posiblemente llevaría a un producto similar al que se encuentra en el mercado pero con un mayor costo. También es usada para comprobar la seguridad de un producto, generar keygens de aplicaciones, reparación de productos que sufren desgaste, etc. De esta forma la “Ingeniería Inversa” es utilizada tanto en el software como en el hardware para el desarrollo de productos compatibles con otros ya existentes sin la necesidad de conocer los detalles del desarrollo de éstos es decir; sin que el fabricante de los nuevos productos tenga acceso a los detalles de fabricación de los productos con que intenta ser compatible. La “Ingeniería Inversa” puede aplicarse de acuerdo al tipo de producto y se clasifica en: � Ingeniería Inversa de lógica o de procesos (Ingeniería para comprender el procesamiento) � Ingeniería Inversa de datos (Ingeniería Inversa para comprender los datos) � Ingeniería Inversa de interfaces de usuarios 1.2.3 Tipos de Ingeniería Inversa • Ingeniería Inversa de lógica o de procesos (Ingenie ría Inversa para comprender el procesamiento) La primera actividad real de la “Ingeniería Inversa” comienza con un intento de comprensión y extracción de procedimientos representados por el código fuente o instrumento de diseño para obtener documentos de análisis o de requisitos. Para comprender las extracciones de procedimientos se analiza el código en distintos niveles de abstracción: sistema, programa, componente, configuración y sentencia. 7 Debe tenerse en cuenta que la funcionalidad general de todo el sistema de aplicaciones deberá ser algo perfectamente comprendido antes de que tenga lugar un trabajo de “Ingeniería Inversa” más detallado, para poder establecer un contexto de análisis posterior y así, proporcionar ideas generales acerca de los problemas de inter-operabilidad entre aplicaciones del sistema. Cada una de las aplicaciones de las que consta el sistema representará una abstracción funcional con un elevado nivel de detalle, y permitirá crear un diagrama de bloques, como representación de la interacción entre estas abstracciones funcionales, donde el ingeniero busca las secciones de código que representan las configuraciones genéricas de procedimientos. De esta manera, se nota que cada uno de los componentes efectúa una sub- función, la cual representa una abstracción definida de procedimientos, donde una parte del código prepara los datos para su procesamiento, otra efectúa el procesamiento y una más prepara los resultados del procesamiento para exportarlos del componente. En el interior de cada una de estas secciones se encuentran configuraciones más pequeñas. Cuando se trata con sistemas grandes, la “Ingeniería Inversa” suele efectuarse, mediante el uso de un enfoque semi-automatizado con ayuda de las herramientas CASE, que son empleadas para “analizar” la semántica del código en cuestión, donde la salida de este proceso se pasa entonces a herramientas de reestructuración y de ingeniería directa, las cuales completarán el proceso de reingeniería. 8 • Ingeniería Inversa de datos (Ingeniería Inversa par a comprender los datos) Este tipo de ingeniería suele producirse a diferentes niveles de abstracción. En el nivel de programa, es preciso realizar una “Ingeniería Inversa” de las estructuras de datos internas del programa como parte del proceso de reingeniería. Ésta es aplicada a nivel del sistema sobre algún código de base de datos (aplicación, código SQL, etc.) y sus estructuras globales para ajustarlas a los paradigmas nuevos de gestión y obtener los modelos relacionales para obtener el diagrama entidad-relación y establecer el escenario para la introducción de una nueva base de datos que abarque todo el sistema y pueda ser aplicado en: � Estructuras de datos internas � Estructuras de bases de datos • Ingeniería Inversa de interfaces de usuario Ésta se aplica con el objeto de mantener la lógica interna del programa para obtener los modelos y especificaciones que sirvieron de base para la construcción de la misma, para tomarlas como punto de partida en procesos de ingeniería directa que permitan modificar dicha interfaz. Como las interfaces gráficas de usuarios (GUI) actualmente son sofisticadas, se vuelven de rigor para los productos basados en computadoras y para los sistemas de todo tipo, se debe responder a las siguientes cuestiones en cada caso: � ¿Cuáles son las acciones básicas que deberá procesar la interfaz? � ¿Cuál es la descripción compactada de la respuesta de comportamiento del sistema a estas acciones? � ¿Qué se quiere decir con “sustitución” o más preciso, qué concepto de equivalencia de interfaces es relevante en este caso? 9 Así mismo, la “Ingeniería Inversa” requiere de un proceso para su aplicación a través de una serie de herramientas. 1.3 Herramientas de la Ingeniería Inversa Dentro de las cosas que debemos tener en cuenta y que son importantes para poder aplicar “Ingeniería Inversa” se encuentran: 1.3.1 Lenguaje Ensamblador Es necesario tener noción de lo qué es un lenguaje ensamblador porque su funcionamiento permite llevar a cabo algunas instrucciones o pasos del proceso. Un lenguaje ensamblador es una colección de términos mnemónicos que pueden representar operaciones, nombres simbólicos, operadores y símbolos especiales; los cuales se utilizan para codificar los programas origen que serán procesadospor dicho ensamblador. Un ensamblador es un programa encargado de traducir el “programa fuente” que se encuentra escrito en ensamblador (mnemónicos) a un lenguaje máquina (binario) que ya entiende y puede ser ejecutado por el procesador; dichos mnemónicos dependen de la arquitectura del procesador. Algunas instrucciones de ensamblador son: Instrucciones de transferencia : Son utilizadas para mover los contenidos de los operandos. Cada instrucción se puede usar con diferentes modos de direccionamiento. MOV MOVS (MOVSB) (MOVSW) 10 Instrucciones de carga: Son instrucciones específicas de los registros. Son usadas para cargar en algún registro bytes o cadenas de bytes. LODS (LODSB) (LODSW) LAHF LDS LEA LES Instrucciones de la pila: Estas instrucciones permiten el uso de la pila para almacenar y extraer datos. Cada unas de éstas realiza una función específica. POP POPF PUSH PUSHF Ahora bien, se tienen varios tipos de ensambladores y pueden ser clasificados por su forma de trabajar en: De línea: Éstos ensamblan una sola línea a la vez del programa fuente. De archivos: Ensamblan todo un programa fuente completo previamente guardado en un archivo. Y también se pueden clasificar de acuerdo al tipo de información que procesan en: Propios o residentes: Éstos ensamblan programas escritos en el mismo lenguaje ensamblador del procesador de trabajo. 11 Cruzados: Ensamblan programas escritos en un lenguaje ensamblador distinto al del procesador de trabajo. Macroensambladores: Son ensambladores residentes que permiten la definición de macros y debido a su potencia normalmente son programas complejos y permanecen en memoria sólo hasta que se crea el programa objeto. 1.3.1 Depurador Es un programa que se utiliza para controlar otros programas. Permite avanzar paso a paso por el código, rastrear fallos, establecer puntos de control y observar las variables y el estado de la memoria en un momento dado del programa que se esté depurando. Los depuradores son muy valiosos al momento de determinar el flujo lógico del programa. Un punto de ruptura (breakpoint) es una instrucción al depurador que permite parar la ejecución del programa cuando cierta condición se cumpla. Por ejemplo cuando un programa accede a cierta variable, o accede a cierta función de la API, el depurador puede parar la ejecución del programa. 1.3.2 Desensamblador Se trata de una herramienta que carga archivos en código máquina y los convierte en archivos de texto en lenguaje ensamblador. El lenguaje ensamblador es una forma legible para los humanos del código máquina. Los desensambladores revelan qué instrucciones en el código máquina son usadas. El código máquina normalmente es específico para una arquitectura dada del hardware de manera que los desensambladores son escritos exclusivamente para la arquitectura del hardware o del software a desensamblar. 12 1.3.3 Compilador Inverso o Decompilador Es una herramienta que transforma un código ensamblador o código máquina en código fuente en lenguaje de alto nivel. También existen decompiladores que transforman lenguaje intermedio en código fuente en lenguaje de alto nivel. Estas herramientas son sumamente útiles para determinar la lógica a nivel superior como bucles o declaraciones if-then de los programas que son decompilados. Los decompiladores son parecidos a los desensambladores pero llevan el proceso a un grado más importante. 1.3.4 Editor Hexadecimal Es un programa de computadora que permite modificar archivos binarios, que fueron creados con el fin de editar sectores de datos de disquetes o discos duros, por lo que también son llamados editores de sectores. En la mayoría de los editores hexadecimales, los datos del archivo son presentados como valores hexadecimales organizados en dos grupos de 8 bytes y un grupo de 16 caracteres ASCII. (Normalmente los caracteres no imprimibles se representan con un punto en ASCII). A través de este tipo de herramienta es posible conocer el contenido de cualquier tipo de archivo, imágenes, ejecutables, etc. así como el contenido de un disco duro. Quienes realizan cómputo forense usan esta herramienta para descubrir información oculta. Es importante hacer notar que no sólo es posible conocer el contenido de un archivo, sino que también se pueden modificar los datos que se consideran relevantes dentro de éste. Usando esta herramienta es posible cambiar una instrucción por otra si se conoce el código hexadecimal de la instrucción y dónde 13 se encuentra ubicada. Entre los editores hexadecimales más conocidos se pueden mencionar a Winhex, Hex, Ultraedit y Hacker's View. 1.3.6 Descompresor Son aplicaciones que permiten obtener el ejecutable original antes de que fuera procesado por el compresor/cifrador o, por lo menos contar con una imagen descomprimida que pueda ser ejecutada o funcional. Ejemplo de este tipo de aplicaciones son Armadillo Kille, CUP, EXELOCK, PeUNLOCK, Deshrink. 1.3.7 Analizador de Archivos Éstos proporcionan información sobre un archivo. En el caso de ejecutables pueden dar a conocer el tipo de plataforma para la cual fue compilada la aplicación. Si se conoce el tipo de plataforma se podrá elegir el desensamblador y depurador adecuado. El comando file de Linux es un ejemplo de este tipo de utilerías, así como File Inspector XL, EXEScan, GETTyp. FILE Info, Multi Ripper y Language 2000. 1.3.8 Dumpeador de Memoria Éstos permiten vaciar el contenido de una región de la memoria RAM. Lo cual puede ser interesante ya que muchas aplicaciones almacenan información al arranque de la aplicación para consultarla periódicamente. Al conocer el contenido de la memoria es posible que se conozcan contraseñas utilizadas por la aplicación. Como ejemplos se pueden mencionar a AMDUump, LordPE DEeluex, ProcDump, Pupe. 14 1.3.9. Monitor de registros Son utilizados en aplicaciones que corren sobre Windows. Varias aplicaciones almacenan información en los registros de Windows y este tipo de herramienta permite conocer el contenido de los registros. 1.3.10 Emulador Muestra en pantalla los registros, puertos, stacks, Dptr, Psw, Flags, y banco actual de registros en sistema binario y hexadecimal con la opción de que cualquier puerto o registro puede ser modificado por el usuario. Así mismo se puede ver la ejecución paso a paso o con puntos de ruptura, examinando y cambiando la RAM interna. 1.3.11 Herramientas CASE Estas herramientas de sistemas asistidos por computadora (Computer Aided Systems Engineering - CASE) aplican la tecnología informática a las actividades, las técnicas y metodologías propias de desarrollo de sistemas para automatizar o apoyar una o más fases del ciclo de vida de los sistemas. En el caso de la “Ingeniería Inversa” éstas suelen mejorar el rendimiento y eficiencia del producto o sistema. Las anteriores son algunas de las herramientas básicas para llevar a cabo el proceso de “Ingeniería Inversa” pero no basta con tener esta gran variedad, sin embargo, hay que saber usarlas y en este sentido, existen diferentes metodologías para establecer dicho proceso. 15 1.4 Proceso de la Ingeniería Inversa Para llevar acabo la “Ingeniería Inversa” no existe un método como tal que especifique exactamente cómo efectuar el proceso, cada ingeniero que desea realizarlo propone sus estrategias de elaboración sin embargo, sí están definidos algunos elementos o enfoques que se deben tomar en cuenta para poder hacer correctamente el proceso de “Ingeniería Inversa” y extraer los datos requeridos: 1.4.1 Nivel de Abstracción El nivel de abstracción de un proceso de “Ingeniería Inversa”, en conjunto con las herramientas que se utilizanpara llevarlo a cabo, determinan el refinamiento de la información en su diseño y que se puede extraer del código fuente. Se puede tener un nivel de abstracción ideal, si éste es lo más alto posible, es decir, que sea capaz de derivar: � Sus representaciones de diseño de procedimiento (con un bajo nivel de abstracción) � La información de las estructuras de datos y de programa (con un nivel de abstracción ligeramente más elevado) � Modelos de flujo de datos y de control (con un nivel de abstracción relativamente alto) � Modelos de entidades y relaciones (con un elevado nivel de abstracción). De esta manera se puede deducir que el ingeniero de software proporciona información que le permitirá comprender más fácilmente éstos programas a medida que crece el nivel de abstracción. 16 1.4.2 Completitud Ésta se refiere al nivel de detalle que se proporciona en un determinado nivel de abstracción, en la mayoría de los casos mientras más aumente el nivel de abstracción la completitud decrece. Por ejemplo dado un listado del código fuente, es relativamente sencillo desarrollar una representación del diseño de procedimientos completa. Así, se pueden derivar representaciones sencillas del flujo de datos, pero es mucho más difícil desarrollar un conjunto completo de diagramas de flujo de datos o un diagrama de transacción de datos. De tal forma que la completitud mejora en proporción directa a la cantidad de análisis realizado por la persona que lleva a cabo la “Ingeniería Inversa”. 1.4.3 Interactividad Se refiere al grado en que el ser humano se “integra” o “involucra” con las herramientas automatizadas para crear un proceso de “Ingeniería Inversa” efectivo. En la mayoría de los casos, a medida que aumenta el nivel de abstracción la interactividad deberá aumentar de lo contrario la completitud será deficiente. 1.4.4 Direccionalidad Ésta puede ser monodireccional o bidireccional. Es monodireccional, si se extrae toda la información del código fuente y es proporcional a la ingeniería del software para poder entonces, ser utilizada durante la actividad de mantenimiento y es bidireccional cuando la información se suministra a una herramienta de reingeniería la cual intentará reestructurar o regenerar el viejo programa. 17 Así pues, el núcleo de la “Ingeniería Inversa” está en una actividad denominada extracción de abstracciones, la cual consiste en que el ingeniero tiene que evaluar el programa viejo y a partir del código fuente (el cual comúnmente no está documentado) extraer una especificación significativa del procedimiento que se realizará, la interfaz del usuario que se aplicará y las estructuras de datos de programa o base de datos que se utilizarán. 1.4.5 Historia y Evolución de las Técnicas de Ingen iería Inversa Desde el principio de la humanidad, la realización de copias de objetos ha sido una constante preocupación. Dicha realización admite y permite la generalización de aplicación a toda ciencia, la cual podría ser considerada como el proyecto de “Ingeniería Inversa” que busca discernir el diseño del universo en su conjunto y que permite a un gran número de personas beneficiarse con dicho proceso, ya que muchos de los productos fabricados en serie se basan en un prototipo o modelo único que sirve de patrón para lanzar la producción. A este respecto se puede mencionar el ejemplo de la evolución del sistema de copiado como proceso de “Ingeniería Inversa” y que a continuación se menciona: Hace 30 años que aparecieron las primeras máquinas copiadoras que eran con dos cabezales, uno de ellos equipado con un palpador que recorría las secciones de la pieza maestra, y el otro equipado con un cabezal de fresado que seguía la geometría que iba describiendo el palpador y copiaba la pieza sobre un bloque de material en bruto tratándose de pantógrafos adaptados a un proceso mecanizado. En los últimos 20 años, se ha conseguido un avance importante en el proceso del copiado, separándose la fase de digitalización del mecanizado mediante el uso de los sistemas de control numérico y automatizando el trabajo de digitalización que anteriormente se hacía a mano. Sin embargo, a últimas fechas, el desarrollo de los modernos sistemas de CAD/CAM han cambiado las necesidades de los 18 industriales, debido a que antes se requerían trabajos de simple copia y hoy en día son necesarias herramientas de “Ingeniería Inversa”. Así, esto que se le ha llamado “Ingeniería Inversa” es un procedimiento que viene de lejos y constituye el nacimiento de nuevas formas de producción y el acceso a diferentes sistemas funcionales, ejemplo de esto es que durante el siglo XX la copia de objetos 3D no hubiera sido posible sin la existencia de la “Ingeniería Inversa”. El problema del copiado reside en que se trata de un proceso en una sola dirección, ya que a partir de un modelo se generan los programas de mecanizado para reproducir las formas del modelo. Si se requiere saber el funcionamiento de programas o productos en general para poder llevar a cabo el proceso de capturar sus formas y detalles y posteriormente descubrir la forma de funcionamiento del sistema en cuestión, se puede aplicar diferentes modelos o métodos. 1.4.6 Estrategias para Implementar la Ingeniería In versa Se iniciará por un modelo de procesos de reingeniería del software ya que la “Ingeniería Inversa” es sólo un paso o proceso para poder llevar a cabo la remodelación de un producto, debido a que el proceso completo se llama reingeniería el cual consiste en: Actividades de la reingeniería: 1.- Análisis del inventario 2.- Reestructuración de documentos 3.- Ingeniería Inversa 4.- Reestructuración del código 5.- Reestructuración de datos 6.- Ingeniería directa (foward Engineering) 19 1.4.6.1 Método 1 (Ingeniería Inversa) El método propuesto por el Instituto de Ingeniería de Software propone un marco de trabajo para llevar a cabo el proceso de “Ingeniería Inversa”. 1.- Definición y delimitación del componente de sof tware Esta es la primera etapa del proceso y comprende la selección y evaluación de los componentes a los que se aplicará el proceso de “Ingeniería Inversa”. 2.- Recolección de funcionalidades existentes a. Documentación de casos de usos 3.- Generación automática de diagramas de clase y d e paquete mediante una herramienta semi-automatizada CASE En esta parte del proceso se debe comprender la generación de: a. Diagramas de clase b. Diagramas de paquete Que se pueden realizar con ayuda de las herramientas CASE semi- automatizadas, como por ejemplo el Jbuilder 9.0, Enterprise Architect o Rational Rose. 4.-Análisis de código y relación entre paquetes Aquí se realiza el estudio por parte del analista para descubrir, con ayuda de la información obtenida hasta el momento, el funcionamiento del sistema pero a un nivel más detallado, siendo esta la parte más pesada de la técnica o metodología debido a que se involucra la pericia del analista para descubrir cómo funciona el sistema a partir de la poca o nula información que posee. 20 5.-Mapeo de requerimientos a paquetes y de ser posi ble a clases Esta parte es de suma importancia para la documentación de un software, producto o componente, ya que ésta facilita mucho la identificación cuando ocurre algo o simplemente se desea modificar una parte. Consiste en una tabla donde se ponen los requerimientos del sistema, los casos de uso involucrados y las clases o paquetes afectados así como también, se establece la relación entre todos estos elementos. Una vez que se tiene esta tabla (la cual será realizada a detalle según sea el caso) servirá en un futuro si se requiere modificar alguna parte del sistema e indicará qué casos de uso se verán afectados, así como los requerimientosque estarán involucrados en la modificación. Todo esto es de mucha ayuda para sistemas de gran tamaño, debido a que no se debe esperar a las pruebas de regresión para descubrir lo que se alteró. 1.4.6.2 Método 2 (Ingeniería Inversa y las interfac es de usuario) Este método está basado en el uso de la “Ingeniería Inversa” de interfases de usuario, donde el objetivo es generar una documentación del sistema que permita tratamientos futuros, como lo son los aumentos en la funcionalidad lo cual representa extender el tiempo de vida del mismo. Por tal motivo, lo más conveniente es construir un modelo de casos de uso a partir del código fuente y la construcción de un grafo de relaciones, obteniendo de esta forma, una combinación de la vista conceptual y la vista de implementación con la posibilidad de ir de la vista de casos de uso hacia atrás (a los requerimientos) lo mismo hacia delante a las vistas lógicas y de proceso; esto con el fin de completar todas las vistas de la arquitectura del sistema. Teniendo como resultado el siguiente proceso o método para llevar a cabo la “Ingeniería Inversa” a través de las interfaces de usuario: 21 1.- Identificación de casos de uso de las GUI (Interfaz graficas de usuario). 2.- Identificación de las relaciones entre casos de uso. 3.- Construir un grafo con los casos de uso y sus relaciones. 4.- Localización de los archivos de código fuente correspondientes a los casos de uso y las entidades de código fuente derivadas. Agregar estos artefactos a un grafo. 5.- Identificación de las relaciones entre las entidades del código fuente. Conectar los artefactos de código fuente entre ellos y desconectarlos con el nivel anterior del grafo. 6.- Generación de la versión final del grafo de relaciones. Si no se dispone del código ejecutable la “Ingeniería Inversa” se aplicará desde el código fuente. 1.4.6.3 Método 3 (Ingeniería Social) Es un conjunto de técnicas y trucos empleados por los hackers e intrusos para extraer información sensible de usuarios de un sistema informático que se puede clasificar de la siguiente manera: Intrusos que se hacen pasar por empleados de otros departamentos de una empresa, proveedores de servicios de informática, de una operadora telefónica o de acceso a internet. Todo esto es posible mediante una llamada telefónica por la cual se solicita información de usuario y contraseña, para llevar a cabo determinado proceso o a través de una supuesta reparación del equipo en cuestión para así infiltrarse con el fin de obtener la información de interés. Correos Electrónicos que suponen ser de algún proveedor o administrador para obtener la contraseña y usuario del sistema, con el asunto de hacer una reparación o revisión en algún momento. 22 Usuarios de foros o chats mediante éstos se intenta conseguir acceso a determinados archivos sensibles del sistema o de configuración y medidas de seguridad del mismo, así como también protección de los equipos. “Shoulder surfing” consiste en mirar lo que teclean directamente los usuarios de la pc para obtener la contraseña y usuario deseados o información de interés particular. “Dumpster diving” consiste en la revisión de la basura en busca de papeles y documentos que no se destruyen de forma segura para obtener lo requerido. Instalación de sitios web falsos o maliciosos en la red que tratan de engañar al usuario para que teclee sus datos redirigiéndolo a un mensaje de error. Como esta es una técnica basada en la persuasión que podría aplicarse a diario “ganando la confianza de la gente”, es la más difícil de detectar ya que aplicada de manera maliciosa, manipuladora, engañosa y muy poco ética, puede tener efectos devastadores. En esta técnica el ser humano juega un papel importante debido a que es la puerta de entrada al sistema por medio de los diferentes procedimientos que se ven en la ingeniería social. A este respecto, se tiene de palabras de Kevin Mitnick (uno de los hackers más famosos de la historia) que: “usted puede tener la mejor tecnología, firewalls, sistemas de detección de ataques, dispositivos biométricos… lo único que se necesita es una llamada a un empleado desprevenido y acceden al sistema sin más. Tienen todo en sus manos.”(Citado por Álvaro Gómez, 2007, p. 78). Como se puede ver, las técnicas anteriores para aplicar “Ingeniería Inversa” son un tanto diferentes debido a que el método o estrategia a seguir depende de quien la aplique. Así como estas estrategias se podrían mencionar infinidad de métodos pero siempre siguiendo el mismo fin: desentrañar los secretos del funcionamiento del sistema de estudio. 23 1.5 ¿Cuándo Aplicar Ingeniería Inversa? El proceso de “Ingeniería Inversa” es un proceso estratégico, por lo cual se debe saber cuándo es conveniente aplicarla y cuándo es más pertinente sustituirla e implementar una nueva. Las aplicaciones para el primer paso de “Ingeniería Inversa” se pueden identificar si presentan las siguientes situaciones: 1.- Fallos frecuentes con dificultad de localización 2.- Realizan la actividad requerida pero con poca eficiencia o menor a la esperada 3.- Dificultad para integrarse o interactuar con otros sistemas 4.- Calidad pobre o baja en el diseño original 5.- Resistencia a introducir cambios en el sistema 6.- Pocas personas capacitadas para mantener o modificar el sistema 7.- Dificultades para realizar pruebas 8.- Mantenimiento que consume demasiados recursos 9.- Necesidad de incluir nuevos requisitos manteniendo los básicos 10.- Poca factibilidad para realizar cambios La “Ingeniería Inversa” es una metodología para analizar un dispositivo o sistema, la cual puede variar en su objetivo final ya que, como toda herramienta en el campo de seguridad, puede ser utilizada como un arma de dos filos, por un lado para conocer cómo funciona un sistema y así poder “burlar” su seguridad y hacer copias no legales y por otra, es útil para comprender su funcionamiento y de esta manera mejorar su rendimiento y funcionalidad. Respecto a intentar usar la “Ingeniería Inversa” de manera ilegal, existen reglas o leyes que castigan dicho uso y que se verán a continuación: 24 1.6 Ingeniería Inversa y Protección del Software M ediante Derechos de Autor Los derechos de autor constituyen hoy en día la forma principal de protección legal del software como bien inmaterial, resultado de la creatividad humana. La Ley de Protección Intelectual (LPI) contempla su protección como obra literaria e incluye los programas en la lista no exhaustiva de obras protegidas. Aunque post-programas de computadora no encajen a la perfección en esta figura legal, dicha protección ofrece los siguientes beneficios: � Una protección automática : Los derechos de autor nacen por el mero hecho de la creación original. � Una protección internacional : La protección se ofrece en casi todo el mundo, en virtud de tratados internacionales como los de Berna, el ADPIC (TRIPS en inglés) y los acuerdos OMPI (WIPO), así como también las directivas europeas. � Una protección simple y económica : No hace falta realizar solicitudes ni registrar la obra (y pagar las correspondientes tasas y honorarios legales) para obtener la protección. � Una protección limitada : La protección es limitada en el tiempo y a la expresión de las ideas y principios (el código escrito). La limitación de la protección a esta “expresión” permite la creación de software interoperable y/o compatible por un lado y la creación nueva de una misma funcionalidad por el otro, por ejemplo a partir de una “Ingeniería Inversa” o especificación independiente de un software inicial (una patente impediría esta recreación). Los derechos de propiedad intelectual (DPI) protegen el programa en cualquiera de sus expresiones posibles (Códigofuente y objeto) en su totalidad, además la LPI amplía la protección a la documentación preparatoria, así como a la documentación técnica y manuales de uso. Lo que no protege es la idea y los principios y esto permite aplicar “Ingeniería Inversa” a un producto o a la creación 25 de programas con funcionalidades similares como se puede ver en el siguiente artículo de la ley de protección intelectual: Artículo 96. TRLPI 1.- A los efectos de la presente ley, se entenderá por programa de computadora toda secuencia de instrucciones o indicaciones destinadas a ser utilizadas directa o indirectamente, en un sistema informático para realizar una función o para obtener un resultado determinado en cualquiera que fuere su forma de expresión y fijación. A los mismos efectos, la expresión programas de computadora comprenderá también su documentación preparatoria. La documentación técnica y los manuales de uso de un programa gozarán de la misma protección que este título dispensa a dichos programas. 2.- El programa de computadora será protegido únicamente si es original, en el sentido de ser una creación intelectual propia de su autor. 3.- La protección prevista en la presente ley se aplicará a cualquier forma de expresión de un programa de computadora. Esta definición incluye cualquier tipo de “secuencia de instrucciones”, por lo tanto incluye como ejemplos: � Sistemas operativos, programas “estándares” de uso general, programas desarrollados a medida. � Librerías y otros componentes de software, scripts, servlets, Java Beans, Stored Procedures, motores de bases de datos (pero no el contenido de las mismas). � Entornos de desarrollo (IDE’s, por ejemplo el JDK de Sun, .NET de MSFT) y de ejecución (runtime engines). � Instrucciones incorporadas en los chips. 26 � Programas que soportan las redes de telecomunicaciones (routers, switches, servidores). Los derechos de autor protegerán los siguientes elementos, siempre que tengan un suficiente nivel de creatividad u originalidad: � El código fuente del programa � El código objeto del programa � Los iconos, gráficos e imágenes incluidos en el programa � Cualquier documentación relativa al software (documentación preparatoria, los diseños, los manuales de instalación o de usuario, las capturas de pantalla) � Los “guiones” o scripts de compilación e instalación � Versiones sucesivas de un programa 4. No estarán protegidos mediante los derechos de autor con arreglo a la presente ley, las ideas y principios en los que se basan cualquiera de los elementos de un programa de computadora incluidos los que sirven de fundamento a sus interfaces. Los titulares El titular de los derechos de autor será el autor o grupo de autores originales de la obra. Hay una presunción de que el autor es la persona identificada que “firma” la obra. La figura de “autor” incluirá no solamente al programador que escribe el código del programa, sino también al diseñador del programa siempre que sus contribuciones hayan sido significativas. Por otro lado, no incluye necesariamente: 27 Una persona que realice pruebas y notifique errores en el programa, una persona que haya establecido las especificaciones del programa, excepto en la medida que dichas personas hayan participado activamente en crear el programa. Las excepciones son las obras creadas bajo una relación laboral, en este caso la empresa será titular de los derechos de explotación y programas creados en circunstancias que den lugar a la naturaleza “colectiva” del programa, en cuyo caso el editor/divulgador de la obra ostentará los derechos de explotación. Los derechos Los derechos de explotación reservados exclusivamente al autor de un programa de computadora son los siguientes actos: � La reproducción total o parcial: la copia, por cualquier medio y bajo cualquier forma, ya sea de manera permanente o transitoria. � La distribución pública: la transmisión del programa a un tercero por la venta, el alquiler o cualquier otra forma. � Transformación: traducción, adaptación, arreglo o cualquier otra transformación del programa. La ley establece algunos límites a estos derechos, que son los siguientes: � Límite temporal: La duración de los derechos de autor, de acuerdo a la OMPI, es la vida de su autor más setenta años si éste muere después de 1987 y ochenta años si murió antes de dicho año. � Límites aplicables al usuario legítimo: es decir, alguien que tiene un derecho de uso: � Reproducir, transformar y corregir errores pero sólo en la medida necesaria para utilizar el programa. 28 � Realizar una copia de seguridad. � Analizar el programa, pero sólo mientras se utiliza para obtener información con fines de interoperabilidad (y sujeto a ciertas condiciones). Cesión de derechos El titular original puede ceder los derechos a un tercero por contrato de cesión (o licencia exclusiva) sujeto a diferentes condiciones libremente pactadas. Aquí entran en juego las licencias de software y en particular las licencias libres. Formas de protección La LPI establece varias medidas de protección de estos derechos, incluyendo acciones administrativas, civiles (incluso solicitar medidas cautelares) y penales. La tutela civil incluye acciones por infracción de los mencionados derechos de autor y la LPI prohíbe también la puesta en circulación de copias ilegales, su posesión por fines comerciales o la puesta en circulación o posesión de medios específicamente destinados a facilitar la supresión o neutralización de dispositivos técnicos de protección del software. Los derechos de autor están protegidos también por el Derecho Penal. El Código Penal castiga en su Artículo 270 (y otros) la reproducción, plagio, distribución y comunicación pública con ánimo de lucro y sin autorización de los correspondientes titulares de las obras protegidas por derechos de autor. Como se puede ver, siempre que se utilice “Ingeniería Inversa” con fines de lucro, ésta será penada a menos de que se utilice con fines de mejorar el producto, generar otro compatible con el original adaptándolo a las necesidades requeridas o con fines educativos. CCAAPPÍÍTTUULLOO 22 EEJJEEMMPPLLOOSS YY AAPPLLIICCAACCIIOONNEESS 30 Desde el punto de vista de que la “Ingeniería Inversa” es una necesidad actual para la creación de nueva tecnología basada en una productividad con menores costos y tiempos de desarrollo, en este capítulo se muestran algunos ejemplos que permiten mostrar el alcance de este proceso de ingeniería no sólo en el software, sino también en las manufacturas (hardware) comenzando con el programa llamado Samba, el cual, muestra la aplicación de la “Ingeniería Inversa” en uso público. También el desarrollo de un método en un programa determinado para conocer cómo se lleva a cabo el proceso de “Ingeniería Inversa” y su relación con el hacking y por último, el apoyo de herramientas de diseño asistido por computadora (CAD) para realizar un “prototipaje” rápido concluyendo así, con algunos de los ejemplos más conocidos de los procesos de manufactura. 2.1 Programa Samba El programa Samba es un claro ejemplo de “Ingeniería Inversa” dado que permite a sistemas operativos Unix compartir archivos con sistemas Microsoft Windows. El proyecto Samba tuvo que averiguar información clasificada (no liberada al público) sobre los aspectos técnicos relacionados con el sistema de archivos Windows. 2.1.1 Historia de Samba Este proyecto se origina en 1991 con la idea de Andrew Tridgell, que en la actualidad es el líder de dicho proyecto en Australia. Samba fue diseñado originalmente para Unix cuando Andrew crea un sistema servidor de archivos para su red local utilizando un sniffer,capturando paquetes y aplicando “Ingeniería Inversa” con lo cual logró soportar el protocolo DEC de Digital Path. Tiempo más tarde, dicho protocolo se convertiría en SMB, el cual fue adoptado por Microsoft, cuyo nombre proviene de la inserción de dos vocales al protocolo 31 estándar que utiliza Microsoft, teniendo que cambiar el nombre de SMB por problemas de una marca registrada con dicho nombre, de esta manera Andrew buscó en el diccionario de su máquina de Unix una palabra que incluyera las letras “s”,”m” y “b”, dando como resultado la palabra “Samba”, nombre que decide darle y con el cual se conoce hoy en día. 2.1.2 ¿Qué es Samba? Es una suite de aplicaciones GNU/Linux (o Unix) de las que habla el protocolo SMB (Server Message Block) que se encuentra dentro de la capa OSI. Muchos sistemas operativos incluidos Windows y OS/2 usan SMB para operaciones de red cliente-servidor; mediante el soporte de este protocolo Samba permite a los servidores Unix entrar en acción comunicándose con el mismo protocolo de red que los productos de Microsoft Windows. 2.1.3 ¿Qué permite Samba? � Compartir uno o más sistemas de archivos. � Compartir impresoras instaladas tanto en el servidor como en los clientes. � Ayudar a los clientes con Visualizador de Clientes de Red. � Autentificar clientes “logeándose” contra un dominio Windows. � Proporcionar o asistir con un servidor de resolución de nombres WINS. 2.1.4 ¿Cómo funciona Samba? Samba configura directorios Unix/Linux (incluyendo sus subdirectorios) como recursos para compartir a través de la red. Para los usuarios de Microsoft Windows, estos recursos aparecen como carpetas normales de red. 32 Los usuarios de Linux pueden montar en sus sistemas de archivos estas unidades de red como si fueran dispositivos locales o utilizar la orden smbcilent para conectarse a ellas muy al estilo del cliente de la línea de órdenes ftp. Cada directorio puede tener diferentes permisos de acceso sobrepuestos a las protecciones del sistema de archivos que se estén usando en Linux; por ejemplo las carpetas home pueden tener permisos de lectura y escritura para cada usuario, permitiendo que cada uno acceda a sus propios archivos; sin embargo debemos cambiar localmente los permisos de los archivos para ver nuestros archivos ya que permitir la escritura en el recurso, no será suficiente. 2.1.5 Componentes de la “Suite” SAMBA � Smbd es el servidor smb que actúa con las conexiones desde clientes dando todos los archivos, permisos y directorio de trabajo al usuario. � Nmbd es el servidor de nombre de NetBIOS, el cual ayuda a los clientes a localizar servidores buscando y manejando dominios. � Smbclient, el programa cliente del host-Unix. � Testprns es un programa para hacer un test al servidor que accede a las impresoras. � Testparms es un programa que hace un test a la configuración del archivo Samba y verifica que esté correcto. � Smb.conf es el archivo de configuración Samba. � Smbstatus muestra lo compartido (recursos) exportado por Samba. De éstos, los procesos smbd y nmbd son considerados como el "corazón” de Samba ya que usualmente corren a altas velocidades y circulan todo el tiempo. El proceso nmbd habilita al servidor Linux para poder ser explorado por otras máquinas. El proceso smbd procede los paquetes SMB y éstos arriban en la red y negocian con el kernel de Linux para acceder a los recursos y compartirlos. 33 2.2 Ingeniería Inversa y los Números Mágicos A continuación se verá un ejemplo que nos explica Edwin Ried (2009) el cual consiste en entender el funcionamiento de un programa que genera “números mágicos” a partir de una entrada: Primero, es necesario imaginar que se cuenta con una aplicación que entrega un valor diferente para cada entrada realizada. Sin mucha dificultad es posible hacerse la idea de algo similar a la figura 2.1: (Figura 2.1 Ventana de la aplicación “números mágicos”). Esta aplicación lo único que hace es desplegar un mensaje de la siguiente forma: (Figura 2.2) (Figura 2.2 Muestra el resultado después de introducir un dato). ¿Cómo descubrir el algoritmo tras esos resultados? 34 Es substancial tratar de lograr un pensamiento inductivo en donde se logra identificar el principio particular del problema para poder llegar a extrapolarlo a una solución general. Datos de prueba Código: Ingreso "0" salida "30" Ingreso "1" salida "46" Ingreso "2" salida "65" Ingreso "3" salida "90" Ingreso "4" salida "120" Ingreso "5" salida "156" ... Al observar la aplicación, se podría decidir procesar los datos que entrega y lograr crear un código equivalente o investigar el funcionamiento interno. Generalmente, la primera forma de investigación servirá para abarcar problemas sencillos, no obstante el objetivo siempre será estar capacitados para enfrentar el mayor desafío posible por lo que el camino continuará con la investigación interna. 2.2.1 Paso a paso Primero, se busca el segmento de código involucrado en desplegar ese mensaje de forma casi mecánica, simplemente se busca una llamada a MessageBox o MessageBoxEx de la librería de sistema user32.dll. (Figura 2.3) 35 (Figura 2.3 Segmento de código ensamblador donde se puede observar la llamada a MessageBoxA). Cualquier programador intuiría fácilmente lo que hacen las líneas superiores de esta aplicación, en especial que sprintf es parte de la librería estándar de C++. Claramente se ve también el título de la ventana en el código, estos valores son interpretados de forma inteligente por este descompilador (OllyDbg), lo que asiste de sobremanera a comprender el código. Teniendo en cuenta las consideraciones anteriores, la verdad es que por lógica, se pude entrever que una sencilla investigación ya nos dio indicios suficientes para bosquejar los pasos de la rutina, la cual comienza un poco más arriba:(Figura 2.4) (Figura 2.4 Se muestra con rojo el inicio de la rutina del proceso) 36 Cabe destacar que se omitirán pasos intermedios de asignaciones de memoria y otros formalismos propios de ensamblador para favorecer el entendimiento del lector. Inicialmente se tiene el valor de entrada supuestamente ya leído desde el cuadro de diálogo del programa, ahora es momento de enfocarse en la primera acción importante. Asumiendo el valor de entrada como una incógnita. En el siguiente trozo de código destacado, se añadió siete a la incógnita:(Figura 2.5) (Figura 2.5 La instrucción ADD, incrementa en 7 la incógnita). Es decir, por el momento se tiene una fórmula bastante sencilla que luce así: A continuación, se multiplica ese valor resultante de la suma por el mismo: (Figura 2.6) (Figura 2.6 La instrucción MUL, indica la multiplicación del resultado por sí mismo). Nuevamente se multiplica el resultado por el anterior proporcionado tras la suma. En esta segunda vez ya se puede expresar la operación simplemente elevando al cubo la suma anterior:(Figura 2.7) 37 (Figura 2.7 La instrucción MUL indica una vez más la multiplicación del resultado por sí mismo). Ahora se le resta diez al resultado:(Figura 2.8) (Figura 2.8 La instrucción SUB, resta 10 al resultado). El procedimiento que viene a continuación propone un mayor desafío intelectual y será abordado en el siguiente punto. 2.2.2 La genialidad que oculta ensamblador Los siguientes pasos son un resumen de varias horas de trabajo en el código y de comienzo puede parecer algo complejo su funcionamiento. Luego de realizar todos los pasos, un número constante es cargado al registro EAX:(Figura 2.9) (Figura 2.9 La instrucción MOV, indica que se carga un valor en el registro EAX). Lo que hace el código es multiplicar el resultado de la salidatemporal por aquel número:(Figura 2.10) 38 (Figura 2.10 La instrucción MUL, indica la multiplicación de la salida por el contenido del registro ECX). La multiplicación por un número tan grande produce una especie de desbordamiento en el registro contenedor del resultado al exceder el tamaño de palabra del procesador (en este caso de 32 bits). Los bits sobrantes se almacenan en el registro contiguo EDX de una forma natural (estos registros son contiguos) dentro de los registros del procesador. Ahora, se desplaza un bit (se trunca el último bit) del registro EDX:(Figura 2.11) (Figura 2.11 La instrucción SAR almacena el bit que se desborda en el registro EDX) ¿Qué sucedió tras aquella “maraña” de operaciones sin un sentido lógico aparente? Les revelaré la respuesta dándoles la ecuación final: Es cierto y aunque parezca increíble, lo único que se logró es dividir el resultado de las operaciones anteriores por once. Ahora se preguntarán ¿pero cómo?, en dos palabras: números mágicos. 39 2.2.3 Números mágicos Para dividir, lo que se debe hacer es restar cíclicamente hasta que se llegue a cero o menos, por ejemplo para dividir 42 por 13, se tendría que realizar la siguiente secuencia:(Figura 2.12) (Figura 2.12 Ejemplo de la división de 42 por 13 mediante restas). Así, se obtiene que la división de 42 por 13, es 3 con 3 de resto. Ahora, ¿Recuerdan el gran número que fue cargado al registro EAX? Imaginen que tiene un número cualquiera. En este caso usaré el número 7326, seleccionado de forma totalmente aleatoria, en decimales: Se multiplica por el número cargado en EAX, siguiendo el procedimiento anterior, pero en decimales: 40 El resultado es bastante grande: Se expresa el resultado en hexadecimal. Como en este caso se trabajó con un tamaño de palabra de 32 bits, se tiene que sólo 8 cifras del número en hexadecimal corresponden a esos 32 bits, FFFFFFFF en este caso sería la cifra máxima representada en hexadecimal con 32 ceros o unos, es decir, los restantes "quedarán" en el registro contiguo: Ahora se tiene el número que quedó en el registro de más adelante: Siguiendo con el procedimiento, se debe truncar el último bit del resultado, primero se convierte la cifra a binario: ¿Qué se obtiene? Hay que recordar que al quitar el último bit lo que realmente se hace es dividir por la base, análogamente a lo que representa añadir cifras al final, por ejemplo, en decimales es simplemente multiplicar por diez, en este caso, en base dos, se está dividiendo por dos: 41 Aún más evidente, en base diez: Pero ¿a cuánto corresponde el resultado, respecto del número inicial?: Increíblemente, es la división por once del valor: ¿Sorprendente?, es increíble como una costosa operación, como lo es la división, puede ser reducida a estos niveles. Los números mágicos son cifras especiales que permiten dividir valores de esta particular forma, hay tablas de estos números, para 32 y 64 bits y generalmente los compiladores los utilizan cuando detectan una división por una constante de la que conozcan su “número mágico". Como se pude ver, este ejemplo es una manera básica y sencilla de aplicar la “Ingeniería Inversa” a dicho programa y así dar una idea general de cómo se lleva a cabo este proceso. 2.3 Ingeniería Inversa y Prototipaje rápido La “Ingeniería Inversa” como herramienta del prototipaje rápido se define como el proceso de generar, a partir de un objeto físico, un archivo digital en formato CAD del objeto con el cual se puedan producir copias exactas o modificadas del mismo. 42 Primero se debe reproducir el objeto físico a través de un proceso de digitalización, el cual genera una “nube de puntos” coordenados que describen la superficie del objeto, es decir; un conjunto de puntos organizados en un espacio tridimensional que sirve para representar un objeto sólido. Los datos pueden ser adquiridos también en forma manual por medio de una sonda, la cual se pone en contacto con el objeto, luego cada uno de los puntos coordenados es ingresado al computador presionando un pedal o un botón. Las máquinas de medición de coordenadas (CMM) están basadas en el mismo concepto, excepto que el censor que tiene contacto con el objeto sea manejado electrónicamente para tocar la superficie e ingresar los puntos adquiridos. Un scanner láser obtiene los datos pasando un láser más pequeño o una serie de láser por toda la superficie y luego reciben los datos coordenados por reflexión del rayo. Existen también técnicas destructivas que por ejemplo, remueven capas de la parte y por medio de fotografías graban cada una de las secciones para luego convertir las fotos en datos coordenados de sección por sección. Finalmente los rayos x, tomografías, resonancias magnéticas, etc. pueden usarse para crear “nubes de puntos” de cualquier superficie. La “nube de puntos” obtenida, que a simple vista parecen puntos aislados en el espacio, se deben convertir en una superficie que represente el objeto real. Existen varios software con aplicaciones que permiten conectar los puntos para luego generar archivos STL o archivos CAD comunes. Después de tener el archivo CAD o STL se puede generar un prototipo rápido acelerando el proceso de desarrollo de productos. 2.4 Ingeniería Inversa y el Hacking. El hacking es quizás una de las aplicaciones más usadas de la “Ingeniería Inversa”, ya que ésta nace como un estado de diversión y satisfacción personal y a través del tiempo ha recopilado diversos significados; la mayoría 43 de ellos son acusadores y negativos debido a que lo malo no es hacer hacking sino el uso que se le dé. Dicho término tiene su origen en los llamados “hacks”, palabra que denomina los golpes que efectuaban los técnicos cuando intentaban reparar algún aparato; dichos golpes recibían el nombre de hachazos y quien realizaba esta técnica de reparación se denominaba hacker. Otro enfoque de este término dice que las primeras computadoras grandes y defectuosas, se bloqueaban constantemente y quienes los operaban se “quebraban la cabeza” generando nuevas rutas para aumentar la velocidad y eficiencia, a dichas situaciones se les nombraba como “hacks” y a quienes las hacían como hackers. Por otra parte, se le llama hacker al experto en cualquier campo que disfruta de modificar el orden o funcionamiento de un aparato, superando siempre las limitaciones del sistema, lo cual le produce satisfacción. Posteriormente, surgieron los “crackers” (en el año 1985), término inventado por los propios hackers, para diferenciar a aquél que fisgoneaba en una computadora creando un virus dañino o copia de un software. De esta manera no es lo mismo un hacker que un cracker frente a una computadora ajena. En esta introducción a la aplicación de la “Ingeniería Inversa”, se pude dar una definición aún más concreta de lo que es un hacker: Un hacker es una persona, de cualquier edad, con amplios conocimientos informáticos y/o electrónicos que a su vez descubre la intolerancia de algunos organismos por proteger ciertas cosas o intereses. Un hacker no sólo habita en los suburbios de la gran red como lo es la internet, ni navega continuamente entre los discos 44 duros de las computadoras, que aunque se les conocen en estos entornos mayoritariamente, los hackers también fisgonean fuera de una CPU. Sólo tenemos que echar una ojeada a nuestro alrededor para saber cuántas cosas más atentan contra la curiosidad (Claudio Hernández, 1998, pag.6). Como ya se dijo, en el año de 1985 surgieron los crackers que son más “devastadores” que un hacker, pero poco después surgiendo otros términos como lo es el Carding, el cual es capaz de clonar tarjetas bancarias y deacceso inteligente a canales de pago, los warez, quienes se dedican a copiar programas informáticos en el mundo de la información. Los hackers utilizan una serie de herramientas (vistas en el primer capítulo) y a la vez, se aprovechan de los errores de diseño o programación que se hayan tenido durante la creación del proyecto, en la mayoría de las ocasiones dichos fallos se pueden encontrar en los parches y/o actualizaciones de seguridad, realizadas por los fabricantes, que muchas veces no arreglan los problemas detectados sino que además aumentan las vulnerabilidades del sistema. Una causa más de que sea posible el hacking son las configuraciones inadecuadas de los sistemas informáticos , que permiten explotar determinadas fragilidades ya que las opciones de fabricación de muchos dispositivos o programas, en la mayoría de los casos carecen de seguridad, así como el inadecuado mantenimiento de los sistemas y las políticas de seguridad ineficientes o inexistentes como lo son la falta de contraseñas de alta seguridad, políticas de usuarios y permisos, etc. Todo esto ha creado una competencia entre los fabricantes de hardware y software y los atacantes o usuarios maliciosos, que día a día descubren y tratan de explotar los nuevos “agujeros” de seguridad, “puertas traseras” mediante las cuales pueden entrar a modificar o clonar los productos en cuestión, mediante el hacking. 45 2.4.1 ¿En qué consiste el Hacking? El hacking consta de tres etapas esenciales antes de llegar a su cometido: 1er Etapa “La Observación” Esta etapa es muy importante ya que sin ésta no se entendería nada de lo que existe detrás del sistema o hardware en cuestión. Primeramente se tendrá que observar y buscar el núcleo, lo que hace funcionar al sistema, ya sea un microprocesador en el caso de un hardware o el proceso central en caso de software es decir, el cerebro que controla todo, después se debe entender el funcionamiento del objetivo para así pasar a la segunda etapa que es el intento. 2da Etapa “El intento” Esta etapa es bastante importante ya que aquí es donde se intentará “engañar” al software o hardware para su modificación, ya sea mediante adaptaciones en el hardware o modificaciones vía software según sea el caso de lo que se requiera hacer, para después poder modificarlo. 3ra Etapa “La realización” Ésta es la última etapa y la más complicada ya que es esencial la intuición, conocimientos electrónicos y de programación y posiblemente de costoso material, en este punto se debe plantear qué es lo que se intenta hacer: si es un programa o hardware pirata (lo cual está penado por la ley) o de lo contrario, simplemente entender el funcionamiento del sistema y conocer las vulnerabilidades del mismo. 46 2.5 Aplicaciones de Ingeniería Inversa � Sector automovilístico y sus suministradores. Partes y componentes de forma irregular (carrocerías, parabrisas, sistemas de escape, retrovisores externos e internos, partes de motores, elementos de mando, etc.) � Construcción mecánica / construcción de máquinas / fabricación de moldes / fundiciones. “Ingeniería Inversa” de productos ya existentes o de objetos nuevamente diseñados para los cuales no son disponibles datos CAD. � Industria de plástico y goma. Fabricación de moldes para una gran variedad de productos, máscaras protectoras y para aplicaciones médicas, medición de partes vulcanizadas. � Industrias de calzado y deporte. Ensanchadores, suelas, tacones; artículos deportivos diseñados, gafas, cascos, botas de esquiar, armas, bicicletas, trineos, tablas de surf. � Medicina / protésica / ortopedia. Implantaciones, ensanchadores y suelas ortopédicas, vendajes, máscaras para la respiración artificial, miembros artificiales. � Ciencia e investigación. Archivos digitales de bienes científicos (por ejemplo objetos arqueológicos o huesos de animales prehistóricos), fabricación de copias, simulación de trabajos de restauración. � Arte y bienes culturales. Archivos digitales de obras de arte, réplicas, simulaciones de trabajos de restauración. 47 � Utensilios de casa y juguetes. Planchas, cafeteras, vasijas, cubiertos, pomos, grifería, juguetes, muñecas, modelos. � Industria de cristal, cerámica y porcelana. Recipientes y botellas de cristal, moldes de cristal, productos de porcelana y cerámica, re-edición de diseños históricos. � Industria alimentaria. Figuras de chocolate, bombones, dulces de todo tipo, moldes de horno. � Garantía de calidad asistida por computadora (CAQ). Comparación de la “nube de puntos” escaneada con datos CAD ya existentes, cálculo y visualización de las diferencias espaciales. � Simulación/Animación. Digitalización de objetos físicos para el traslado a programas de animación. 2.6 Ingeniería Inversa y Escaners 3D Al efectuar un nuevo diseño mediante técnicas de “Ingeniería Inversa”, se debe realizar un proceso basado en la utilización de ese diseño con superficies físicas ya existentes. El primer paso en un proceso de “Ingeniería Inversa” es la digitalización de la superficie que se lleva a cabo mediante un escaner 3D. Un escaner 3D captura puntos de la superficie de un objeto y construye lo que se denomina como “nube de puntos”. A partir de ahí, con la ayuda del software del escaner, se genera una superficie poligonal, una malla formada por triángulos como se aprecia en la imagen. (Figura 2.13) 48 (Figura 2.13 Del lado izquierdo, una pieza metálica y del lado derecho, su modelo digital formado por la red de triángulos denominada “nube de puntos”) Un aparato que, pasándolo sobre la geometría que se quiere obtener, realiza un CAD en 3D en la computadora, a este proceso se le llama digitalización. (Figura 2.14) (Figura 2.14 Escaner 3D que genera un CAD al pasarlo sobre el objeto) Dicha digitalización se puede hacer con escaners 3D de corto, mediano y largo alcance, ya sean de lente fijo o móvil, esto dependerá de las necesidades y las herramientas a utilizar. Así, se puede ver que la “Ingeniería Inversa” no sólo se aplica en el software ya que ésta es sólo una de sus tantas aplicaciones debido a que existen otras utilidades y tecnología nueva. 49 CONCLUSIONES Como se puede ver, a lo largo de este trabajo de investigación se mostró cómo el mundo de la tecnología avanza a pasos agigantados donde, irremediablemente tenemos que ir al par de ésta ya que hoy en día, es común que utilicemos programas de computación ya sean básicos o complejos. Las exigencias de la vida cotidiana nos obligan a ponernos al día con el mundo informático y tecnológico. Comprender el funcionamiento de estos procesos, es una excelente opción para adaptar dichos conocimientos a nuestras necesidades, ya que la “Ingeniería Inversa” nos es de gran utilidad para “competir” con los productos que existen en el mercado y crear algunos de mejor calidad. Es importante mencionar que el hecho de indagar más a fondo en el tema de la “Ingeniería Inversa”, permite concluir que las aplicaciones de este proceso pueden llevarse a cabo sin la necesidad de romper la seguridad de productos con el fin de hacer daño, sino simplemente de entender su funcionamiento y modificarlos si es necesario. Por otra parte, se ha logrado profundizar en el campo de la “Ingeniería Inversa” a partir de elementos específicos, como lo son los ensambladores y herramientas requeridas para poder hacer el proceso de una manera adecuada fuera de todo carácter ilícito. Así mismo, se ha dado una visión general del amplio campo de investigación, como de aplicación, de la “Ingeniería Inversa” con fines no lucrativos, pero a la vez se especificó el modo de llevar a cabo este proceso desde el punto de vista contrario a través del llamado hacking, el cual en la mayoría
Compartir