Introducción
El objetivo de la ingeniería inversa es obtener información o un diseño a partir 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.
Hoy en día (principios del siglo XXI), los productos más comúnmente sometidos a
ingeniería inversa son los programas de computadoras y los componentes electrónicos,
pero, en realidad, cualquier producto puede ser objeto de un análisis de Ingeniería
Inversa.
En el caso concreto del software, se conoce por ingeniería inversa a la actividad que se
ocupa de descubrir cómo funciona un programa, función o característica de cuyo código
fuente no se dispone, hasta el punto de poder modificar ese código o generar código
propio que cumpla las mismas funciones.
Pero este término no sólo se aplica al software, sino que también se considera ingeniería
inversa el estudio de todo tipo de elementos (por ejemplo, equipos electrónicos,
microcontroladores, u objeto fabril de cualquier clase). Diríamos, más bien, que la
ingeniería inversa antecede al nacimiento del software, tratándose de una posibilidad a
disposición de las empresas para la producción de bienes mediante copiado1 desde el
mismo surgimiento de la ingeniería.
Motivación
Ilícitas:
– Apropiación tecnológica.
Licitas:
– Auditoria de seguridad.
La ingeniería inversa en software significa descubrir qué hace el software sin tener el
código fuente programado del mismo. Es una tarea que, en general, es complicada.
En el nivel del sistema, es frecuente que se efectúe una reingeniería de las estructuras
globales de datos (por ejemplo: archivos, bases de datos) para ajustarlas a los
paradigmas nuevos de gestión de bases de datos (por ejemplo, la transferencia de
archivos planos a unos sistemas de bases de datos relacionales u orientados a objetos).
– Para toda variable (dentro de un programa) que represente una matriz o archivo,
la construcción de un listado de todas las variables que tengan una relación lógica con
ella.
Estos pasos hacen posible que el ingeniero del software identifique las clases del
programa que interactúan con las estructuras de datos globales.
Por tanto, la reingeniería de un esquema de bases de datos para formar otro exige
comprender los objetos ya existentes y sus relaciones.
Para definir el modelo de datos existente como precursor para una reingeniería que
producirá un nuevo modelo de base de datos se pueden emplear los pasos siguientes:
1- Construcción de un modelo de objetos inicial. Las claves definidas como parte del
modelo se podrán conseguir mediante la revisión de registros de una base de datos de
archivos planos o de tablas de un esquema relacional. Los elementos de esos registros o
tablas pasarán a ser atributos de una clase.
Una vez que se conoce la información definida en los pasos anteriores, se pueden
aplicar una serie de transformaciones para hacer corresponder la estructura de la vieja
base de datos con una nueva estructura de base de datos.
Para los sistemas grandes, la ingeniería inversa suele efectuarse mediante el uso de un
enfoque semiautomatizado. Las herramientas CASE se utilizan para “analizar” la
semántica del código existente. La salida de este proceso se pasa entonces a unas
herramientas de reestructuración y de ingeniería directa que completarán el proceso de
reingeniería.
– Generar/completar la documentación.
A la hora de encontrar los componentes funcionales hay que tener en cuenta que los
módulos suelen estar ocupados por componentes funcionales. Además, suele haber
componentes funcionales cerca de grandes zonas de comentarios y los identificadores
de los componentes funcionales suelen ser largos y formados por palabras entendibles.
Una vez encontrados los posibles componentes funcionales, conviene repasar la lista
teniendo en cuenta que un componente es funcional cuando Un componente es
funcional cuando su ausencia impide seriamente el funcionamiento de la aplicación,
dificulta la legibilidad del código, impide la comprensión de todo o de otro componente
funcional o cuando hace caer a niveles muy bajos la calidad, fiabilidad, mantenibilidad,
etc.
Vamos a ver cómo a partir de un código java cómo se puede realizar Ingeniería Inversa
de Procesos. Tenemos dos clases (Persona y Trabajador)
1 class Persona {
2
protected String nombre;
3
4 protected int edad;
5
6 protected int seguroSocial;
7
8 protected String licenciaConducir;
9
10public Persona(String nom, int ed, int seg, String lic) {
11
12set(nom, ed); seguroSocial = seg; licenciaConducir = lic; }
13
public Persona() {
14
15Persona(null, 0, 0, null); }
16
17public int setNombre(String nom) {
18
19nombre = nom; return 1; }
20
21public int setEdad(int ed) {
22
edad = ed; return 1; }
23
24public void set(String nom, int ed) {
25
26setNombre(nom); setEdad(ed); }
27
28public void set(int ed, String nom) {
29
30setNombre(nom); setEdad(ed); }
31
32<b>}</b>
33<b>class Trabajador extends Persona {</b>
34
35private String empresa;
36
37private int salario;
38
39public Trabajador(String emp, int sal) {
40
41empresa = emp; salario = sal; }
42
public Trabajador() {
43
44this(null,0); }
45
46public int setEmpresa String emp) {
47
48empresa = emp; return 1; }
49
50public int setSalario(int sal) {
51
52salario = sal; return 1; }
53public void set(String emp, int sal) {
54
55setEmpresa(emp); setSalario(sal); }
56
57public void set(int sal, String emp) {
58
59setEmpresa(emp); setSalario(sal); }
60
61}
62
63
64
65
66
67
3- Ingeniería inversa de interfaces de usuario:
Las IGUs sofisticadas se van volviendo de rigor para los productos basados en
computadoras y para los sistemas de todo tipo. Por tanto el nuevo desarrollo de
interfaces de usuario ha pasado a ser uno de los tipos más comunes de las actividades de
reingeniería. Ahora bien, antes de que se pueda reconstruir una interfaz de usuario,
deberá tener lugar una actividad de ingeniería inversa.
– ¿Cuáles son las acciones básicas que deberá procesar la interfaz, por ejemplo,
acciones de teclado y clics de ratón?
Es importante indicar que una IGU de sustitución puede que no refleje la interfaz
antigua de forma exacta (de hecho, puede ser totalmente diferente). Con frecuencia,
merece la pena desarrollar metáforas de interacción nuevas. Por ejemplo, una solicitud
de IU antigua en la que un usuario proporcione un superior (del 1 a 10) para encoger o
agrandar una imagen gráfica. Es posible que una IGU diseñada utilice una barra de
imágenes y un ratón para realizar la misma función.
WinDBG → es una pieza de software gratuita de Microsoft que puede ser usada para
depuración local en modo usuario, o incluso depuración remota en modo kernel.
Los Desensambladores
Se trata de una herramienta que convierte código máquina en lenguaje ensamblador. El
lenguaje ensamblador es una forma legible para los humanos del código máquina. Los
desensambladores revelan que instrucciones máquinas son usadas en el código. El
código máquina normalmente es específico para una arquitectura dada del hardware. De
forma que los desensambladores son escritor expresamente para la arquitectura del
hardware del software a desensamblar.
IDA Pro Freeware 4.1 → se comporta casi como IDA Pro, pero solo desensambla
código para procesadores Intel x86 y solo funciona en Windows.
Bastard Disassembler → es un potente y programable desensamblador para Linux y
FreeBSD.
Conclusión
La ingeniería inversa se denomina así porque avanza en dirección opuesta a las tareas
habituales de ingeniería, que consisten en utilizar datos técnicos para elaborar un
producto determinado. En general, si el producto u otro material que fue sometido a la
ingeniería inversa fue obtenido en forma apropiada, entonces el proceso es legítimo y
legal. De la misma forma, pueden fabricarse y distribuirse, legalmente, los productos
genéricos creados a partir de la información obtenida de la ingeniería inversa, como es
el caso de algunos proyectos de Software libre ampliamente conocidos.
La ingeniería inversa es un método de resolución. Aplicar ingeniería inversa a algo
supone profundizar en el estudio de su funcionamiento, hasta el punto de que podamos
llegar a entender, modificar y mejorar dicho modo de funcionamiento.
Bibliografía
– Libro Pressman Roger S. – Ingeniería Del Software Un Enfoque Practico
(Quinta edición).
Internet:
http://www.alegsa.com.ar/Dic/ingenieria%20inversa%20de%20software.php
http://es.wikipedia.org/wiki/Ingeniería_inversa
http://es.wikibooks.org/wiki/Ingenieria_Inversa
http://cnx.org/content/m17432/latest/