Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Entregable 2 Barragán García Ricardo Josué APLICACIONES DISTRIBUIDAS
Entregable 2 Barragán García Ricardo Josué APLICACIONES DISTRIBUIDAS
ENTREGABLE 2
Barragán García Ricardo Josué
Introducción
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.
Definición
El método 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.
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.
La ingeniería inversa suele ser empleada por empresas, para analizar si el producto de su
competencia infringe patentes de sus propios productos.
Muchas veces, la ingeniería inversa es utilizada en el área militar para investigar (y copiar)
las tecnologías de otras naciones, sin obtener planos ni detalles de su construcción o
desarrollo.
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.
La aplicación de ingeniería inversa nunca cambia la funcionalidad del software sino que
permite obtener productos que indican cómo se ha construido el mismo. Se realiza
permite obtener los siguientes beneficios:
– Generar diferentes alternativas: del punto de partida del proceso, principalmente
código fuente, se generan representaciones gráficas lo que facilita su comprensión.
– Detectar efectos laterales: los cambios que se puedan realizar en un sistema
puede conducirnos a que surjan efectos no deseados, esta serie de anomalías puede ser
detectados por la ingeniería inversa.
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.
Introducción
Fase lógica utiliza como entrada a un esquema conceptual (un modelo de entidades y
relacionamientos) y produce como salida un esquema lógico (un conjunto de relaciones y
restricciones de integridad).
Fase física acepta como entrada al esquema lógico y produce un esquema físico
optimizado para un DBMS específico. Entonces, durante el proceso de reingeniería de
una base de datos se distinguen a su vez dos fases, denominadas fase de extracción y
fase de conceptualización, que revierten respectivamente a la fase física y a la fase
lógica.
Fase de extracción los procesos acceden a la base de datos fuente para recuperar
información de las estructuras de datos implementadas en el esquema físico. Los
principales objetos de interés son, por ejemplo las tablas, columnas, claves primarias y
claves foráneas. Tales objetos de interés se almacenan en una estructura de datos
denominada base de conocimiento.
Los módulos de reingeniería comprenden a los algoritmos que realizan las tareas típicas
de la fase de extracción.
Repositorios de datos
Los algoritmos utilizan repositorios de datos a los efectos de almacenar la información que
va siendo descubierta durante la reingeniería.
El primer repositorio de datos utilizado se denomina base de conocimiento y almacena
información del esquema físico, que es descubierta durante la fase de extracción.
RECONSTRUCCIÓN DE LA ARQUITECTURA
Extracción de la información.
Construcción de la base de datos.
Fusión de vistas.
Composición de las vistas arquitectónicas.
Extracción de la Información
Cada una de las relaciones entre los elementos constituye una vista diferente del sistema.
Las relaciones "calls" entre funciones muestran como interactúan varias funciones en el
sistema. Las relaciones "includes" entre archivos muestra las dependencias entre los
archivos del sistema. Las relaciones "access_read" y "access_write" entre funciones y
variables muestra como son usados los datos en el sistema. Ciertas funciones pueden
escribir en un conjunto de datos y otros pueden leerlos. Esta información de relaciones es
usada para determinar como son pasados los datos entre varias partes del sistema.
Las vistas extraídas pueden ser catalogadas en estáticas o dinámicas. Las vistas
estáticas son aquellas obtenidas por observación de los artefactos del sistema, mientras
que las vistas dinámicas son las obtenidas por la observación del sistema durante su
ejecución. En muchos casos, las vistas estáticas y dinámicas pueden ser combinadas
para crear una representación más completa y exacta del sistema. Si la arquitectura del
sistema cambia en tiempo de ejecución, por ejemplo, un archivo de configuración es leído
por el sistema, y ciertos componentes son cargados en tiempo de ejecución, la
configuración en tiempo de ejecución deber ser capturado y usado cuando se lleve a cabo
la reconstrucción.
Una vista fuente puede ser extraída aplicando cualquiera de las herramientas disponibles,
apropiadas o necesarias para un sistema objetivo dado. El tipo de herramientas que se
usan regularmente en la extracción de información son las siguientes [Kazm 03]:
Estas herramientas son aplicadas a las líneas del código fuente. Parsers analizan el
código y generan representaciones internas del código. Típicamente, es posible salvar
esta representación interna para obtener una vista fuente. Los analizadores basados en
AST hacen un trabajo similar, pero ellos construyen una representación del árbol explicito
de la información analizada.
Analizadores léxicos examinan los artefactos fuentes como cadenas de elementos léxicos
o señales. El usuario del analizador léxico puede especificar un conjunto de patrones
léxicos que coincidan y los elementos que regresará. Similarmente se usan una colección
de herramientas ad hoc tales como Grez y Perl para llevar a cabo comparaciones y
búsqueda de patrones léxicos dentro del código en orden de alguna información de salida
requerida.
Las herramientas perfiladoras y de código son usadas para extraer información acerca del
código que esta siendo ejecutado. Usar estas herramientas generalmente no requiere la
agregación de cualquier código nuevo al sistema. Por otro lado, instrumentación de
código – tales como los aplicados en el campo del testeo – involucra agregar código al
sistema para hacer resaltar alguna información especifica (por ejemplo, que procesos se
conectan con otros) mientras el sistema se ejecuta [McCa 02]. Estas herramientas y
técnicas generan vistas dinámicas del sistema.
El conjunto de vistas extraídas son convertidas al formato "Rigi Standard Format" (RSF) o
al "Graph eXchange Language" (GXL) y cargadas en ARMIN durante la fase de
construcción de bases de datos. Esta conversión es hecha usando Perl scripts que leen
los datos y los convierten en un archivo RSF. Las vistas extraídas pueden estar en
diferentes formatos dependiendo de las herramientas usadas para extraerlas. Por
ejemplo, una herramientas de extracción tal como "Understand for C/C++/Java" o "Imagix-
4D", pueden ser usadas para cargar el código fuente dentro de una representación
interna, y esta información puede entonces ser descargada a un conjunto de archivos
bandera indexados por archivos o función. Estos archivos tienen una estructura uniforme,
y los scripts pueden ser desarrollados en Perl para leer esos archivos y extraer
información acerca de los elementos y relaciones. La siguiente figura describe este
proceso.
Una vez que los elementos y relaciones de archivos (la vista extraída) es convertida a
RSF o a GXL, estos pueden ser cargados en ARMIN. La figura 4.2 muestra un extracto de
un archivo RSF ejemplo. El archivo completo puede ser cargado dentro de una base de
datos en ARMIN.
Fusión de vistas.
En la fase Fusión de vistas, las vistas extraídas son manipuladas para crear vistas
fusionadas. Por ejemplo, una vista estática puede ser fusionada con una vista dinámica.
Como se puede notar, una vista estática no puede proporcionar toda la información
relevante de la arquitectura. En algunos casos, algunas funciones solo pueden ser
identificables en tiempo de ejecución, entonces se necesitará generar una vista dinámica.
Estas dos vistas necesitan ser compaginadas y fusionadas para producir la gráfica
completa del sistema.
La fase de fusión de vistas compagina y establece conexiones entre las vistas que
proporcionan información complementaria. La fusión es ilustrada usando los ejemplos de
las siguientes sub-secciones. El primer ejemplo muestra el mejoramiento de una vista
estática de un sistema orientado a objetos agregándole información dinámica. El segundo
muestra la fusión de varias vistas para identificar funciones llamadas en un sistema.
Consideramos las dos vistas de código de la figura 4.3, las cuales son del conjunto de
métodos extraídos desde un sistema implementado en C++.
La vista dinámica muestra que List::getnth es llamada. Sin embargo, este método no esta
incluido en el análisis de la vista estática porque este no fue identificado por la
herramienta de extracción estática. Esto muestra que la herramienta de extracción
estática no es perfecta, haciendo necesario validar los resultados de la información
extraída. También, las llamadas a los métodos constructores y destructores de InputValue
y List no están incluidas en la vista estática. Esa ausencia de métodos debe ser agregada
a la vista de arquitectura compaginada.
En adición, la extracción estática muestra que la clase PrimitiveOp tiene una llamada al
método Compute. La extracción dinámica no muestra tal clase, pero muestra clases tales
como ArithmeticOp, AttachOp y StringOp, cada una de las cuales tiene un método
Compute y es de echo una subclase de PrimitiveOp, PrimitiveOp es una superclase; este
nunca es llamada en la ejecución del programa. Pero este es la llamada a PrimitiveOp
que se muestra cuando se ejecuta el extractor estático. Para tener una vista exacta de la
arquitectura, las vistas estáticas y dinámicas de PrimitiveOp deben ser compaginadas.
La siguiente figura muestra los ítems que deben ser agregados a la vista fusionada y
aquellos que deben ser removidos desde la vista fusionada.
Despejando la ambigüedad de las funciones llamadas.
En una aplicación multi procesos, es muy probable que ocurra choque de nombres. Por
ejemplo, varios de los procesos pueden tener un procedimiento llamada main al cual
pueden llamar. Es importante identificar y eliminar la ambigüedad de esas colisiones de
nombres dentro de las vistas extraídas. Otra vez, por medio de la fusión de información
que puede ser extraída fácilmente, podremos remover las ambigüedades potenciales. En
este caso, necesitamos fusionar las vistas estáticas con una vista que contenga
archivos/funciones (para determinar cuales funciones están definidos en cuales archivos)
y con una vista de dependencias (para determinar que archivos están compilados junto a
los ejecutables producidos). La fusión de estas tres fuentes de información hace a los
nombres de procedimientos, métodos y otros elementos nombrados, permitiendo
entonces ser referidos sin ambigüedad en el proceso de reconstrucción de la arquitectura.
Sin la fusión de vistas, la colisión de nombres puede persistir, y los resultados de la
reconstrucción pueden ser ambiguos.
Visualización e interacción.
Definición de scripts de comandos e interpretación.
En este ejemplo, las variables "a" y "b" están definidas en la función "f"; esto es, ellas son
locales a "f". Esta información la podemos representar gráficamente como se muestra en
la figura 4.7.
Las variables locales no importan durante una reconstrucción de arquitectura porque ellas
proporcionan poca comprensión de la arquitectura del sistema. Por consiguiente,
instancias de variables locales pueden ser agregadas a la función en la cual ocurren. Un
script tal como el que se muestra a continuación se puede escribir para ese propósito.
Identificar tipos.
Agregar variables locales con funciones.
Agregar miembros a las clases.
Crear elementos del nivel de arquitectura.
El script esta escrito de esta forma para abstraer información desde la información de bajo
nivel para generar vistas a nivel de arquitectura. El reconstructor crea este script para
probar la hipótesis acerca del sistema. Si un script no produce los resultados esperados,
este puede ser descartado. El reconstructor iteractúa a través de este proceso hasta que
obtiene las vistas arquitectónicas útiles.
Costo y beneficios de la Reingeniería en sistemas
Una vez que se ha calculado el coste de la reingeniería, la última etapa es comparar los
costes con los beneficios esperados (no es suficiente con examinar los beneficios que
aporte la reingeniería).
Conclusión
Actualmente la forma de darle mantenimiento a los sistemas de información (SI) es bastante
controlada y metodológica, dependiendo de qué tipo de mantenimiento quiera o deba dársele al
sistema. Las técnicas, métodos y procesos que se utilizan siempre tienen como finalidad el
desarrollo de software de calidad. Se explican de forma general que son los sistemas de
información y cuáles son sus funciones en la actualidad, la importancia que representan en las
corporaciones para el manejo de datos e información de gran importancia, de la misma forma
hace mención a los tipos de sistemas más comunes, cuál es su función o para que fueron
diseñados y cuál es la diferencia de otros sistemas, iniciando con los sistemas generales y los de
una utilidad particular, también se hace una descripción de cómo es la estructura principal dentro
de un SI, que sucede en cada fase y cuál es su función, posteriormente se describen como fueron
creados mediante paradigmas de desarrollo y cuáles son los ciclos de vida de un sistema, desde un
sistema clásico en cascada hasta los modelos más recientes diseñados por prototipos. El manejo
del sistema o la administración del mismo debe ser bastante detallada, se debe realizar
documentación y registro de todo lo que es modificado desde su origen hasta la fecha en la que se
encuentra funcionando, para esto existen varios métodos de medición; métricas, modelos,
estándares y procesos. En este trabajo se describen los principales métodos que se utilizan para
garantizar la calidad del software, los estándares de calidad que llevan a la mejora continua de un
sistema de información, así como métodos estadísticos que en base a sus métricas nos indican
cual es la calidad que actualmente se maneja en el sistema. Cuando se elaboran planes para la
estrategia de información, las organizaciones no pueden dejar de considerar que el
mantenimiento de sistemas es la fase más prolongada y costosa del ciclo de vida de los sistemas.
Por eso también se hace mención a los tipos de mantenimiento que tienen una función específica
para poder darle al sistema un mejor desempeño optimizando los procesos que tienen algún
defecto o bien que no tienen defectos pero se puede realizar de una mejor forma, el de
mantenimiento es continuo nunca termina hasta que el ciclo de vida del sistema concluye, por eso
la importancia del mantenimiento que puede prevenir, corregir y mejorar siempre la forma de
operar en un sistema de información.
Bibliografía
Tecnicas auxiliares de mantenimiento de sistemas informaticos - PCPI 12/13 INFORMATICA
MARIO. (s. f.). Recuperado 16 de marzo de 2020, de
https://sites.google.com/site/pcpi1213informaticamario/home/modulos/2-mantenimiento/1-
mantenimiento-de-sistemas-informaticos/4-tecnicas-auxiliares-de-mantenimiento-de-sistemas-
informaticos
http://cc.etsii.ull.es/ftp/antiguo/INGSOF2/Metricav3/MSIPROC.PDF