1 00:00:00,000 --> 00:00:04,000 Imaginaros que un día conseguimos tecnología extraterrestre 2 00:00:04,000 --> 00:00:07,000 o que por lo que sea conseguimos un dispositivo arcaico. 3 00:00:07,000 --> 00:00:10,000 ¿Cómo podríamos comprender su funcionamiento? 4 00:00:10,000 --> 00:00:12,000 Con un sencillo procedimiento, la ingeniería inversa. 5 00:00:12,000 --> 00:00:17,000 Yo soy Víctor Reguillo y este es mi proyecto sobre este proceso. 6 00:00:19,000 --> 00:00:21,000 ¿Qué es la ingeniería inversa? 7 00:00:21,000 --> 00:00:26,000 La ingeniería inversa, la mejor forma de definirla es en base a la ingeniería. 8 00:00:26,000 --> 00:00:32,000 La ingeniería es la forma de solucionar problemas de la vida cotidiana del ser humano. 9 00:00:32,000 --> 00:00:36,000 Para ello emplea unos recursos y unos procedimientos determinados 10 00:00:36,000 --> 00:00:39,000 para crear unos productos que resuelvan estos problemas. 11 00:00:39,000 --> 00:00:42,000 La ingeniería inversa es todo lo contrario, 12 00:00:42,000 --> 00:00:45,000 por ello también se la conoce como ingeniería de retorno, 13 00:00:45,000 --> 00:00:48,000 ya que sigue los pasos al revés de la ingeniería. 14 00:00:48,000 --> 00:00:54,000 Y en base a un producto se encarga de obtener los materiales 15 00:00:54,000 --> 00:00:57,000 y los procedimientos que se han utilizado para su creación. 16 00:00:59,000 --> 00:01:02,000 Respecto a su origen hay diversidad de opiniones, 17 00:01:02,000 --> 00:01:07,000 pero la mayoría de expertos afirman que se remonta a la Segunda Guerra Mundial 18 00:01:07,000 --> 00:01:11,000 con la máquina Enigma a la que se le realizó un proceso de ingeniería inversa 19 00:01:11,000 --> 00:01:14,000 para así poder descifrar los mensajes de los nazis. 20 00:01:14,000 --> 00:01:21,000 Por otra parte también se dice que se remonta a los primeros inventos de la humanidad 21 00:01:21,000 --> 00:01:24,000 con las invenciones como puede ser la rueda, 22 00:01:24,000 --> 00:01:30,000 de la que se copiaban medidas y proporciones para así replicarla más tarde. 23 00:01:30,000 --> 00:01:34,000 Otro de los casos más destacables es el de los procesadores de IBM 24 00:01:34,000 --> 00:01:38,000 a los que se le realizó un proceso de ingeniería inversa 25 00:01:38,000 --> 00:01:42,000 para así romper con el monopolio que tenía esta empresa a principios de los 80. 26 00:01:44,000 --> 00:01:47,000 Sus utilidades son principalmente tres. 27 00:01:47,000 --> 00:01:50,000 Uno, la obtención de información de dicho objeto. 28 00:01:50,000 --> 00:01:54,000 Dos, representar el objeto o recrearlo. 29 00:01:54,000 --> 00:01:58,000 Como podemos ver en esta imagen de la especie de la silla. 30 00:02:02,000 --> 00:02:07,000 Como se ve en la imagen de la silla está representado en todas sus vistas 31 00:02:07,000 --> 00:02:09,000 y los componentes que la forman. 32 00:02:09,000 --> 00:02:16,000 Y tercero, descubrir posibles fallos y mejorar funciones que tenga dicho objeto. 33 00:02:17,000 --> 00:02:22,000 Respecto a las ventajas y desventajas podemos encontrar marcadas en blanco 34 00:02:22,000 --> 00:02:25,000 tres. Uno, la mejora de la comprensión del objeto 35 00:02:25,000 --> 00:02:31,000 ya que permite entender su funcionamiento y los procedimientos que este lleva a cabo. 36 00:02:31,000 --> 00:02:35,000 Dos, la aceleración en los procesos de producción. 37 00:02:35,000 --> 00:02:41,000 Y tres, una recuperación de información perdida que no se haya podido obtener de otra forma. 38 00:02:41,000 --> 00:02:44,000 Por otro lado, marcados en naranja tenemos los contras 39 00:02:44,000 --> 00:02:46,000 que son una cierta tendencia al plagio 40 00:02:46,000 --> 00:02:49,000 ya que al final tú estás copiando el trabajo de otra persona. 41 00:02:50,000 --> 00:02:54,000 La abundancia de recursos que necesita 42 00:02:54,000 --> 00:02:58,000 ya que al final tú tienes que pagar a una persona que lleva a cabo este proceso 43 00:02:58,000 --> 00:03:02,000 y los materiales que pueda necesitar que voy a explicar más adelante. 44 00:03:02,000 --> 00:03:04,000 Y tres, los problemas éticos que implica 45 00:03:04,000 --> 00:03:09,000 ya que habría que ver hasta qué punto es ético copiar o no el trabajo de otra persona. 46 00:03:11,000 --> 00:03:14,000 Por otro lado, tenemos una un poco más bilateral 47 00:03:14,000 --> 00:03:17,000 como es la regulación de piezas del OEM. 48 00:03:17,000 --> 00:03:21,000 Esta no es ni ventaja ni desventaja ya que por un lado 49 00:03:21,000 --> 00:03:25,000 permite abaratar costes de producción y reducir gastos y tiempos de envío. 50 00:03:25,000 --> 00:03:32,000 Por el otro es una desventaja ya que impide que estas empresas ganen dinero. 51 00:03:34,000 --> 00:03:37,000 Respecto a los ámbitos podemos destacar dos principalmente. 52 00:03:37,000 --> 00:03:39,000 Uno de ellos es el físico 53 00:03:39,000 --> 00:03:43,000 y este se lleva a cabo principalmente a través de medición de objetos. 54 00:03:43,000 --> 00:03:45,000 Puede haber dos tipos. 55 00:03:45,000 --> 00:03:49,000 Simple si se puede medir con un cálculo de verbias o un micrómetro 56 00:03:49,000 --> 00:03:54,000 y complejo si se puede medir con un ACM o un escáner 3D. 57 00:03:54,000 --> 00:03:57,000 Estos más adelante se llevan a un entorno virtual 58 00:03:57,000 --> 00:04:01,000 con un programa de diseño asistido por ordenador o CAD. 59 00:04:01,000 --> 00:04:06,000 Más tarde se les realiza un proceso de análisis de rendimiento 60 00:04:06,000 --> 00:04:09,000 en este caso de resistencia con un programa CAE 61 00:04:09,000 --> 00:04:12,000 de ingeniería asistida por computadora 62 00:04:12,000 --> 00:04:14,000 y se lleva a producción con un programa CAM 63 00:04:14,000 --> 00:04:16,000 de manufactura asistida por computadora 64 00:04:16,000 --> 00:04:19,000 como podemos ver en la tercera imagen. 65 00:04:21,000 --> 00:04:25,000 El segundo ámbito que podemos destacar es el ámbito virtual 66 00:04:25,000 --> 00:04:28,000 y este se sirve de los programas de compilación. 67 00:04:28,000 --> 00:04:33,000 Estos programas se encargan de obtener el código fuente original de un programa 68 00:04:33,000 --> 00:04:37,000 partiendo del binario que crea el ejecutable. 69 00:04:37,000 --> 00:04:40,000 El que se ha empleado en la parte práctica es Hydra. 70 00:04:42,000 --> 00:04:46,000 Para ello se emplea como intermediario el lenguaje ensamblador 71 00:04:46,000 --> 00:04:50,000 que es un punto intermedio entre un lenguaje de alto nivel y el binario. 72 00:04:50,000 --> 00:04:52,000 ¿Pero qué es el lenguaje ensamblador? 73 00:04:52,000 --> 00:04:56,000 Pues el lenguaje ensamblador es el único lenguaje de bajo nivel 74 00:04:56,000 --> 00:04:57,000 empleado en la actualidad. 75 00:04:57,000 --> 00:05:01,000 Como podéis ver es un lenguaje bastante abstracto 76 00:05:01,000 --> 00:05:04,000 en el que funciona en base a mnemónicos y abreviaturas. 77 00:05:05,000 --> 00:05:09,000 En la imagen de la derecha podemos observar un lenguaje de alto nivel 78 00:05:09,000 --> 00:05:12,000 que si bien es más fácil de entender para el ser humano 79 00:05:12,000 --> 00:05:17,000 también es cierto que al ordenador le cuesta más tiempo procesarlo. 80 00:05:17,000 --> 00:05:21,000 Por ello se emplea como intermediario este lenguaje. 81 00:05:23,000 --> 00:05:27,000 Para la parte práctica se han investigado diferentes métodos de defensa 82 00:05:27,000 --> 00:05:30,000 contra esta práctica y se han encontrado los siguientes. 83 00:05:30,000 --> 00:05:34,000 Uno de ellos es la encriptación que puede ser de los siguientes tipos. 84 00:05:34,000 --> 00:05:38,000 Simétrica si se encripta y desencripta con una única clave. 85 00:05:38,000 --> 00:05:43,000 Asimétrica si se cifra con una clave pública que puede tener cualquier persona 86 00:05:43,000 --> 00:05:48,000 y se descifra con una clave privada que nunca se envía 87 00:05:48,000 --> 00:05:51,000 de ahí la seguridad que tiene este método. 88 00:05:51,000 --> 00:05:54,000 E híbrida que es una combinación entre las dos. 89 00:05:54,000 --> 00:05:59,000 Encriptación híbrida se encarga de cifrar la clave con un patrón 90 00:05:59,000 --> 00:06:07,000 asimétrico y el código o el archivo en sí lo cifra con un patrón simétrico. 91 00:06:09,000 --> 00:06:12,000 El otro método que se ha encontrado es la ajustación 92 00:06:12,000 --> 00:06:14,000 que son cambios en el código. 93 00:06:14,000 --> 00:06:16,000 Puede ser de tres tipos. 94 00:06:16,000 --> 00:06:19,000 Información si se cambian, por ejemplo, números. 95 00:06:19,000 --> 00:06:24,000 En este caso el número 42 por la operación que podéis ver aquí 96 00:06:24,000 --> 00:06:27,000 que al final acaba dando como resultado este mismo número. 97 00:06:27,000 --> 00:06:28,000 O de palabras. 98 00:06:28,000 --> 00:06:32,000 En este caso las palabras hello world se han cambiado por este conjunto 99 00:06:32,000 --> 00:06:35,000 de secuencias de escape hexadecimal binario y octal 100 00:06:35,000 --> 00:06:39,000 para lograr un código un poco más abstracto y más difícil de entender. 101 00:06:39,000 --> 00:06:41,000 También tenemos los cambios de sintaxis 102 00:06:41,000 --> 00:06:44,000 que son cambios en la estructura del programa. 103 00:06:44,000 --> 00:06:50,000 Los más destacables son la alineación de comentarios del desarrollador 104 00:06:50,000 --> 00:06:55,000 o el inlining que consiste en escribir todo el código en una única línea. 105 00:06:55,000 --> 00:06:58,000 Por otro lado tenemos los cambios de control 106 00:06:58,000 --> 00:07:01,000 que son cambios que a diferencia de los otros 107 00:07:01,000 --> 00:07:04,000 pueden afectar a los tiempos de ejecución del programa. 108 00:07:04,000 --> 00:07:09,000 El ejemplo que he escogido es la adición de estructuras de control booleanas 109 00:07:09,000 --> 00:07:12,000 innecesarias u operadores lógicos. 110 00:07:12,000 --> 00:07:16,000 En este caso tenemos el código que dice que x es igual a 42 111 00:07:16,000 --> 00:07:20,000 y que si x es mayor de 12 se ejecuta un código. 112 00:07:20,000 --> 00:07:24,000 Y al buscar el código tenemos que x es igual a 42 113 00:07:24,000 --> 00:07:27,000 y si x es mayor de 12 y doble elevación 114 00:07:27,000 --> 00:07:29,000 por lo tanto se ejecutaría el siguiente código 115 00:07:29,000 --> 00:07:32,000 x mayor de 12 se ejecuta el código. 116 00:07:34,000 --> 00:07:38,000 Estos son los ejemplos más llamativos que he encontrado en internet. 117 00:07:41,000 --> 00:07:45,000 Para la parte práctica se decidió dividirla en dos fases. 118 00:07:45,000 --> 00:07:48,000 La primera fase se encargaba de comprobar 119 00:07:48,000 --> 00:07:51,000 si se podía obtener el código fuente de un programa. 120 00:07:51,000 --> 00:07:54,000 La conclusión a la que se llegó es que gracias a los programas 121 00:07:54,000 --> 00:07:59,000 de compilación previamente explicados se podía obtener este código. 122 00:08:01,000 --> 00:08:04,000 También se observó que realizaba diversos cambios. 123 00:08:04,000 --> 00:08:07,000 Uno de ellos es el cambio en los nombres de las variables. 124 00:08:07,000 --> 00:08:10,000 Como podemos ver la variable a se cambia por local18, 125 00:08:10,000 --> 00:08:15,000 la variable b por locallc y la variable c por local14. 126 00:08:16,000 --> 00:08:21,000 El segundo cambio que se encontró es un cambio en el bucle while 127 00:08:21,000 --> 00:08:23,000 que se cambiaba por el bucle for. 128 00:08:23,000 --> 00:08:28,000 Tras analizar el lenguaje ensamblador de este bucle 129 00:08:28,000 --> 00:08:30,000 se llegó a la conclusión de que el bucle for 130 00:08:30,000 --> 00:08:32,000 era un tipo concreto de bucle while. 131 00:08:32,000 --> 00:08:36,000 Por último se comprobó que la división entre dos 132 00:08:36,000 --> 00:08:39,000 se cambiaba por el operador lógico and1 133 00:08:39,000 --> 00:08:44,000 y nuevamente al comprobarlo con el lenguaje ensamblador 134 00:08:44,000 --> 00:08:47,000 se llegó a la conclusión de que la división entre dos 135 00:08:47,000 --> 00:08:49,000 al traducirlo al lenguaje ensamblador 136 00:08:49,000 --> 00:08:51,000 era equivalente a este operador lógico. 137 00:08:53,000 --> 00:08:55,000 La segunda parte se centró en comprobar 138 00:08:55,000 --> 00:08:59,000 si se podía defender un código de esta práctica 139 00:08:59,000 --> 00:09:02,000 y las conclusiones fueron negativas ya que al final 140 00:09:02,000 --> 00:09:04,000 un programa de compilación siempre va a ser capaz 141 00:09:04,000 --> 00:09:07,000 de obtener el código binario teniendo un ejecutable 142 00:09:07,000 --> 00:09:10,000 y si tiene este ya va a poder traducirlo 143 00:09:10,000 --> 00:09:12,000 a un lenguaje de alto nivel como es C++ 144 00:09:12,000 --> 00:09:14,000 que es el que se utilizaba en la parte práctica. 145 00:09:14,000 --> 00:09:18,000 Algunas técnicas que se emplearon fueron las siguientes 146 00:09:18,000 --> 00:09:22,000 el cambio de los números por estas operaciones 147 00:09:22,000 --> 00:09:25,000 el cambio de los nombres de las variables 148 00:09:25,000 --> 00:09:29,000 o el cambio de las palabras por, como ya he mencionado antes 149 00:09:29,000 --> 00:09:33,000 un conjunto de secuencias de escape binario hexadecimal y octal. 150 00:09:33,000 --> 00:09:35,000 Muchas gracias por vuestra atención 151 00:09:35,000 --> 00:09:37,000 espero que os haya gustado y estoy a vuestra disposición 152 00:09:37,000 --> 00:09:39,000 para cualquier pregunta. 153 00:09:42,000 --> 00:09:44,000 Gracias.