Ejercicios Java [Teoría+Ejemplos]

Iniciado por alexander1712, Enero 26, 2013, 02:20:11 AM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Enero 26, 2013, 02:20:11 AM Ultima modificación: Abril 18, 2013, 01:06:29 PM por Expermicid
Teoría de Programación en Java

1) Teoría de Programación Orientada a Objetos (POO)


1.1) Concepto de Objeto: Atributos y Métodos
Un objeto es cualquier cosa real o abstracta de la cual nos interesa su comportamiento y que tiene una identidad única que la distingue de las demás. Un objeto es una unidad atómica formada por la unión de estado+comportamiento.
Un Objeto se compone de:
   - Atributos (datos o variables): Información que posee cada objeto y que identifica su estado.
   - Métodos (operaciones o funciones): Conjunto de instrucciones que definen el comportamiento del objeto. Reciben unos argumentos y devuelven un resultado.
Sólo se puede acceder a los atributos de un objeto a través de sus métodos.

Imaginemos que nuestro objeto es un exploit y que su plantilla es la siguiente:

------------------------------------------
|                        Dame el lenguaje  |
|   Dame la vulnerabilidad                 |
|            ---------------               |
|           |   Autor       |              |
|           |               |Dame el autor |
|           |Vulnerabilidad |              |
|           |               |              |
|           |     Lenguaje  |              |
|           |               |              |
|            ---------------               |
|                                          |
|     Introduzco nuevo offset              |
|                                          |
------------------------------------------

Este diagrama representa la estructura de un objeto. La parte interna del objeto no es accesible y contiene los atributos. La parte externa o interfaz del objeto es accesible y contiene los métodos.

CitarPara los que no conocen mucho sobre los exploits, les recomiendo que se den una vuelta por No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Para poder comprender este ejemplo, sólo es necesario saber que un exploit es un código (codificado por un autor) que explota una vulnerabilidad para lograr ejecutar código arbitrario en el sistema comprometido. La codificación puede haberse hecho en el lenguaje que prefiera el autor: C, C++, Perl...
Antes de lanzar un exploit contra un objetivo remoto, por ejemplo, debemos conocer su sistema operativo y a veces es necesario cambiar la dirección offset dentro del código del exploit, en función del sistema operativo y la versión de service pack que el objetivo tenga instalada, para ajustar el exploit a las características del sistema objetivo.

Bien, nuestro objeto-exploit tiene algunos atributos como el autor del exploit (= Lion), la vulnerabilidad que explota (= Serv-U FTPD 3.x/4.x "SITE CHMOD" Command Remote stack buffer overflow) y el lenguaje en que se ha codificado el exploit (= Lenguaje C). Si otro objeto quiere acceder a estos atributos, no lo puede hacer directamente, sino a través de los métodos del objeto-exploit. Es decir,
    · si quiere saber el autor que codificó el exploit, llamará al método "dame el autor" del objeto-exploit y recibirá como resultado el tipo string con el nombre del autor = "Lion".
    · si quiere introducir una nueva dirección offset, llamará al método "introduzco nuevo offset" y le pasará como argumento el tipo string con la dirección offset = "0x7ffa4a1b" a introducir para que el exploit nos funcione.
Generalmente, a estos métodos q "obtienen" o "introducen" se les llama métodos getters y setters. De esta forma, los métodos del objeto-exploit pasarán a codificarse bajo los nombres getAutor, getVulnerabilidad, getLenguaje, y setOffset.

Continuando con el ejemplo...
    · el prototipo del método getAutor será: String getAutor ()
String (antes del método), indica que la llamada al método devuelve un tipo String, como es una cadena de caracteres con el nombre del autor. Sin embargo, no hace falta pasarle ningún argumento al método, por lo que dejamos los paréntesis () vacíos.
    · el prototipo del método setOffset será: void setOffset (String offset)
void (antes del método), indica que la llamada al método no devuelve ningún tipo. Sin embargo, es necesario pasarle un argumento tipo String, como es la cadena de caracteres de la dirección offset para que, por ejemplo, el código del método implemente esa dirección offset y entonces lance el exploit ya ajustado a las características del sistema objetivo.

Si este ejemplo del objeto-exploit te ha resultado demasiado confuso por los tecnicismos empleados, quizás te resulte más fácil comprender un objeto-reloj. Tiene los atributos Hora (= 19:00), Fecha (= 31/12/2004) y Marca (=Casio) y sus métodos podrían ser getHora (para pedir la hora que marca el reloj), getFecha (para pedir la fecha que marca el reloj), getMarca (para pedir la marca del reloj), setHora (para introducir una nueva hora en el reloj) y setFecha (para introducir una nueva fecha en el reloj). Jejejeje, mejor así?? ;)


1.2) Concepto de Clase.
Justo antes del dibujo del objeto-exploit, he remarcado que ese diagrama representaba su "plantilla". Es decir, imagina que tenemos una plantilla para crear muchos objetos-exploit, todos ellos con los mismos tipos de atributos y los mismos métodos, pero cada uno con su identidad propia. Otro ejemplo de objeto-exploit diferente podría contener la siguiente información en sus atributos:
Autor = fiNis,
Vulnerabilidad = Jordan Telnet Server Buffer Overflow,
Lenguaje = C
y tener los mismos métodos para acceder a estos atributos, pero como ves, la identidad es distinta.

Las clases son una especie de plantilla para los objetos, es decir, si se piensa en una clase como un molde de galletas, los objetos que se crean a partir de esa clase son las galletas.
Definimos formalmente clase como la representación de la estructura (atributos) y comportamiento (métodos) de un objeto.
La creación de un objeto a partir de una clase se denomina "instanciación". Cualquier objeto que se instancie de una clase creará una copia de la definición de atributos de la clase y dispondrá de los métodos definidos en ella.
Para crear objetos, se invoca al constructor de la clase, que es un método que se llama igual que la clase.

Tipos de clases:
- Clase abstracta: ningún objeto pertenece directamente a dicha clase.
- Clase concreta: exiten objetos que pertenecen directamente a dicha clase.


1.3) Atributos y Métodos de Objeto/Clase
Antes hemos visto que un Objeto se compone de:
   - Atributos (datos o variables): Información que posee cada objeto y que identifica su estado.
   - Métodos (operaciones o funciones): Conjunto de instrucciones que definen el comportamiento del objeto. Reciben unos argumentos y devuelven un resultado.

Y hemos dicho que la única manera de acceder a los atributos de los objetos, es a través de los métodos.
Los métodos son un conjunto de instrucciones al cual se le pueden pasar unos argumentos y/o devolver unos resultados.
Existen dos tipos de métodos:
- Métodos de instancia: invocados en los objetos.
- Métodos de clase: invocados en las clases. Estos atributos y métodos serán compartidos por todos los objetos creados a partir de una misma clase.

Para comprender el concepto de atributo/método de instancia o de clase, volvamos al ejemplo del objeto-reloj:
Imaginemos una clase-reloj que crea objetos-reloj, todos de la misma marca = Casio. Estos objetos-reloj implementan los atributos Hora, Fecha y Marca; y los métodos getHora, getFecha, getMarca, setHora y setFecha. Sin embargo, algunos de estos atributos y métodos son de clase y otros son de instancia:

- Atributos de instancia:
    · Hora
    · Fecha
- Métodos de instancia:
    · getHora
    · getFecha

- Atributos de clase:
    · Marca
- Métodos de clase:
    · getMarca

Se puede distinguir las diferencias entre unos y otros de manera sencilla:

    · Si le preguntamos a dos objetos (relojA y relojB) con getHora o getFecha, nos pueden contestar un valor diferente para cada objeto. Estos atributos y métodos serán denominados atributos de instancia y métodos de instancia.
    · Si le preguntamos a dos objetos (relojA y relojB) con getMarca, ambos contestarán el mismo valor = Casio, ya que la clase-reloj se lo ha asignado forzósamente. Estos atributos y métodos serán denominados atributos de clase y métodos de clase.
En este caso, por ejemplo, si existiera el método setMarca y modificaramos el atributo Marca de cualquier objeto a través de él, este atributo se modificaría para todos los objetos, pues estamos tratando con métodos de clase.

CONSECUENCIAS
Cualquier objeto creado a partir de una clase contendrá la definición de los atributos de clase y dispondrá de los método de clase. Por tanto, cuando se modifica un atributo de clase a través de un objeto, se modifica ese atributo en todos los objetos creados a partir de esa clase.


Especificaciones sobre los métodos:
Un objeto de clase no puede acceder a un método de instancia, porque no sabemos si el objeto al que intenta acceder ha sido ya creado. Sin embargo, el resto de accesos son posibles:
    · método de clase - método de clase
    · método de instancia - método de instancia
    · método de instancia - método de clase
Asimismo, un método de instancia de un objeto A no puede acceder directamente a los atributos (variables) de un objeto B, pero puede hacer referencia a un método de instancia del objeto B, y que sea este el que acceda a los atributos del objeto B.


1.4) Modificadores de acceso.
Alcance de los modificadores de acceso prefijos a atributos y métodos:

- public: accesible desde cualquier lugar de la aplicación (por el resto de clases).
- private: sólo accesible desde la clase a la que pertenece.
- protected: disponible para la clase actual, clases del mismo paquete y subclases derivadas de esa clase.


1.5) Paradigmas de la POO

1.5.1) Abstracción
Consiste en abstraer conceptualmente los atributos y comportamiento (métodos) comunes a un determinado conjunto de objetos y almacenarlos en una clase.

1.5.2) Encapsulamiento
El encapsulamiento es el principio por el cual se ocultan los detalles de implementación al usuario.
Cada clase tiene dos partes:
    · El Interfaz es la parte pública con la que interactúa el usuario (métodos públicos)
    · La Implementación es el código que realiza todas las operaciones de la clase (métodos privados)

1.5.3) Herencia
La herencia permite crear una clase nueva (subclase o clase derivada) que tenga el mismo comportamiento que otra (superclase o clase base) y además extienda o adapte ese comportamiento a unas necesidades específicas.
La nueva subclase heredará los atributos y los métodos de la clase base, los cuales se añadirán a los definidos en la propia subclase.

Continuando con el ejemplo de la clase-exploit, observamos que por Internet circulan bastantes exploits que afectan a vulnerabilidades en servicios de Microsoft Windows. ¿Por qué no agrupar todo este conjunto de objetos-exploit bajo una nueva clase-winexploit?. Esta nueva clase-winexploit herederá los mismos atributos (Autor, Vulnerabilidad y Lenguaje) y los mismos métodos (getAutor, getVulnerabilidad, getLenguaje y setOffset) de la clase-exploit. A su vez, "extenderá su comportamiento" implementando otros atributos y otros métodos específicos como, por ejemplo, el atributo CodigoMS (referente al Codigo Microsoft Security Bulletin asignado a la vulnerabilidad) y el método getCodigoMS.
La clase-winexploit quedaría así:

------------------------------------------
|                        getLenguaje       |
|   getVulnerabilidad                      |
|            ---------------               |
|           |   Autor       |              |
|           |               | getAutor     |
|           |Vulnerabilidad |              |
|           |               |              |
|           |     Lenguaje  |              |
|           | CodigoMS      |              |
|            ---------------               |
|                                          |
| setOffset                                |
|                          getCodigoMS     |
------------------------------------------

Un ejemplo de objeto-winexploit podría ser el siguiente:
- Atributos:
    (atributos heredados de la clase-exploit)
    · Autor: Wirepair
    · Vulnerabilidad: Windows Workstation Service WKSSVC.DLL Buffer Overflow
    · Lenguaje: C
   
    (nuevos atributos implementados por la clase-winexploit)
    · CodigoMS: MS03-049

- Metodos:
    (métodos heredados de la clase-exploit)
    · getAutor
    · getVulnerabilidad
    · getLenguaje
    · setOffset

    (nuevos métodos implementados por la clase-winexploit)
    · getCodigoMS

La sintaxis en Java para indicar que una nueva clase hereda de otra superclase es:

Código: java
class winexploit extends exploit


Especificaciones sobre la Herencia:
Además de "extender" el comportamiento implementando nuevos atributos y nuevos métodos, una clase heredada puede "adaptar" el comportamiento sobreescribiendo la funcionalidad de la clase base, esto es, sobreescribiendo la implementación del algún método heredado de la clase base para que al llamar a ese método desde la nueva clase heredada, en vez de ejecutar el código original del método heredado, se ejecute un nuevo código adaptado al comportamiento de la nueva clase. (Polimorfismo)

1.5.4) Polimorfismo
El Polimorfismo es la respuesta distinta frente a una llamada a un método dependiendo de la naturaleza del objeto.
Consiste en definir métodos distintos, que comparten el mismo nombre, pero que se aplican a clases diferentes.
Por ejemplo, un método llamado breathe puede responder de manera distinta dependiendo de quien lo invoque:

Código: java
class animal
{
    public void breathe()
    {
        System.out.println("Respirar...");
    }
}

class pez extends animal
{
    public void breathe()
    {
        System.out.println("Burbujear...");
    }
}


Si se invoca el método breathe desde un objeto-perro, imprimirá en pantalla "Respirar...", pero si es invocado desde un objeto-trucha, imprimirá en pantalla "Burbujear...".


Otra forma de utilizar polimorfismo es mediante la sobrecarga de funciones:

Código: java
char convertir_numero_cadena(int valor, char cadena, int base)
char convertir_numero_cadena(long valor, char cadena, int base)



En este caso, cuando se invoca la función, el compilador debe analizar los argumentos de la llamada y, en función de su tipo, deducir cual de las distintas versiones del método con ese nombre debe recibir el control.

Recopilación de Ejercicios Java POO(Programación Orientada a Objetos)
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

autor: Gospel

Enero 26, 2013, 02:20:35 AM #1 Ultima modificación: Abril 18, 2013, 01:05:18 PM por Expermicid
2) Soporte para el desarrollo en Java


2.1) JDK (Java Development Kit)
Es el entorno de desarrollo para aplicaciones Java. Se define como el conjunto de herramientas, utilidades, documentación y ejemplos para desarrollar aplicaciones Java.

Componentes del JDK:

2.1.1) JRE (Java Runtime Enviroment)
Es el entorno de ejecución para aplicaciones Java. Se define como el intérprete en tiempo de ejecución.

Para ejecutar un archivo de clase Java *.class, la sintaxis es la siguiente:

Código: java
java [opciones] clase_a_ejecutar [argumentos]



- opciones: se especifican las opciones relacionadas con la forma en que el intérprete Java ejecutará la aplicación.
- clase_a_ejecutar: será el nombre de la clase *.class principal que contiene el método main().
- argumentos: se especifican los argumentos que recibirá el método main(String[] args), por si la aplicación necesita parámetros de ejecución.

Por supuesto, es necesario haber compilado la aplicación antes de ejecutarla.

2.1.2) Compilador
Permite compilar archivos de código fuente Java *.java en archivos de clases Java ejecutables *.class. Se crea un archivo de clase para cada archivo de código fuente que contiene la aplicación.

Para compilar un archivo de código fuente Java *.java, la sintaxis es la siguiente:

Código: java
javac [opciones] codigo_fuente_a_compilar



- opciones: se especifican las opciones de compilación
- codigo_fuente_a_compilar: será el nombre del archivo de código fuente *.java a compilar

2.1.3) Visualizador de applets
Es una herramienta que permite visualizar los applets tal y como se mostrarían el navegador.
Al ser llamado, muestra una ventana con el contenido del applet.

Para visualizar un applet, la sintaxis es la siguiente:

Código: java
appletviewer [opciones] applet



- opciones: se especifican las opciones para ejecutar el applet Java.
- applet: especifica la ruta que contiene una página HTML con el applet Java empotrado.

2.1.4) Depurador
Es una utilidad de comandos que permite depurar aplicaciones Java.
Permite encontrar los errores en el código fuente de la aplicación Java.

Para depurar un código fuente Java, la sintaxis es la siguiente:

Código: java
jdb [opciones]



2.1.5) Desensamblador de archivos de clase
Permite desensamblar un archivo de clase, mostrando los atributos y métodos de la clase desensamblada. Es útil cuando no se tiene el código fuente de una clase de la que se quiere saber cómo fue codificada.

Para desensamblar un archivo de clase, la sintaxis es la siguiente:

Código: java
javap [opciones] [nombres_de_clases_a_desensamblar]



- opciones: se especifica la forma en la que se han de desensamblar las clases.
- nombres_de_clases_a_desensamblar: especifica la ruta de las clases a desensamblar, separadas por espacios.

2.1.6) Más componentes como el Generador de cabecera y archivo de apéndice, generador de documentación, etc.


CICLO DE VIDA DE UNA APLICACIÓN JAVA BÁSICA

Edición del código fuente en un editor de textos (notepad, vi...) -> Codigo fuente Java: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta ->
-> Compilación: javac MiClase -> Codebyte Java: MiClase.class ->
-> Ejecución del programa: java MiClase -> Salida del programa


2.2) Obtener e instalar el JDK
Se puede obtener el JDK en No tienes permitido ver los links. Registrarse o Entrar a mi cuenta, concretamente No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Necesitamos descargarnos el SDK (Software Developmente Kit), el cual ya incluye el JRE (Java Runtime Environment), así que pinchamos en Download J2SE SDK. Posteriormente, elegiremos la plataforma de sistema operativo que vayamos a utilizar.
Aviso:
Windows Offline Installation, Multi-language (j2sdk-1_4_2_05-windows-i586-p.exe) -> 51.0 MB

Para usuarios de Windows, después de haber instalado el SDK, vamos a agregar la carpeta bin al PATH del sistema de forma que podamos usar todos los comandos del SDK/JRE desde cualquier carpeta del sistema...

Inicio > Panel de Control > Sistema > Opciones Avanzadas > Variables de Entorno. En Variables del Sistema, seleccionamos Path y pinchamos en Modificar. Agregamos -> ;C:\j2sdk1.4.2_05\bin al final del todo y Aceptar, Aceptar, Aceptar. [Nota: adaptad esta linea a vuestra ruta donde habéis instalado el SDK].
Ahora, desde cualquier carpeta del sistema, podemos ejecutar los comandos de consola del SDK/JRE como java, javac, etc.



2.3) IDE (Indegrated Development Environment)
Mientras que un JDK/SDK ofrece las herramientas para compilar y ejecutar aplicaciones Java, este no ofrece un entorno de trabajo cómodo para proyectos complejos. Los IDEs ofrecen un entorno de trabajo con aspecto gráfico en los que se tiene acceso a un mayor número de herramientas avanzadas: gestión de workspaces y proyectos para clasificar las aplicaciones, debuggers más elaborados, check-points durante la compilación y ejecución, "wizards" para acelerar el desarrollo, etc.
Algunos IDEs:

NetBeans Open-Source @ No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Eclipse Open-Source @ No tienes permitido ver los links. Registrarse o Entrar a mi cuenta (muy bueno, pero consume muchos recursos)
JBuilder de Borland @ No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Mi favorito: JCreator @ No tienes permitido ver los links. Registrarse o Entrar a mi cuenta


2.4) Cómo codificar, compilar y ejecutar una aplicación Java
Como no podía ser de otra forma, nuestra primera aplicación Java mostrará por pantalla "Hola Mundo!".

2.4.1) Cómo codificar, compilar y ejecutar una aplicación Java de manera clásica.
Utilizaremos para ello un editor de texto plano como el notepad y los comandos de consola del SDK y JRE.
Lo primero es abrir el notepad y escribir el siguiente código:

Código: java
class MiClase //La clase se llama igual que el archivo de codigo fuente *.java que la contiene
{
    public static void main (String[] args)
    {
       System.out.println("Hola mundo!");
    }
}



Guardamos este archivo de código fuente Java como c:\MiClase.java
Procedemos a compilar: abrimos consola, vamos a c:\ y tecleamos:

Código: java
javac MiClase.java



Con el proceso de compilación, hemos obtenido el archivo de clase MiClase.class en la misma carpeta.
Procedemos a ejecutar la aplicación tecleando:

Código: java
java MiClase



y obtenemos:

Código: java
Hola Mundo!



Si obtienes

Código: java
Exception in thread "main" java.lang.NoClassDefFoundError: loquesea


es q no lo has hecho exactamente como yo te he dicho!!

2.4.2) Cómo codificar, compilar y ejecutar una aplicación Java a través del IDE JCreator
Una vez que ya tenemos JCreator listo para utilizar sin restricciones (ya me entendéis...), creamos un nuevo archivo de código fuente Java para codificar nuestra primera aplicación Java. Pinchamos en File > New > Files > Java File. En Location seleccionamos la carpeta destino donde queremos almacenar nuestra aplicación. Después, en la casilla nombre escribimos MiClase y damos a Aceptar.
Ante nosotros aparecerá la barra de menús, las barras de herramientas y tres ventanas: superior izqda. para la jerarquía de archivos en el workspace; inferior izqda. para la jerarquía de clases y métodos; ventana grande al centro-dcha. para escribir el código fuente. Por tanto, en esta última ventana, escribimos el siguiente código

Código: java
class MiClase //La clase se llama igual que el archivo de codigo fuente *.java que la contiene
{
    public static void main (String[] args)
    {
       System.out.println("Hola mundo!");
    }
}



Procedemos a compilar la aplicación: Menú Build > Compile File y debería aparecer Process completed. en la ventana de abajo (información sobre el proceso de compilación).
Para ejecutar la aplicación: Menú Build > Execute File y debería aparecer una nueva ventana de consola con el texto

Código: java
"Hola Mundo!"


Tambíen podemos utilizar los iconos en las barras de herramientas para compilar y ejecutar.

3) Sintaxis de Java

Java utiliza casi la misma sintaxis que C, para más información -> No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Enero 26, 2013, 02:21:51 AM #3 Ultima modificación: Abril 18, 2013, 01:05:51 PM por Expermicid
4) Ejemplo de Aplicación Básica en Java

La siguiente aplicación sirve para mostrar, de forma práctica, los conceptos de clases, objetos, atributos, métodos, herencia...

La aplicación en sí se divide en 3 clases:
- La clase Exploit que define los atributos y métodos de los objetos-Exploit
- La clase WinExploit, heredada de la clase Exploit. Hereda los mismos atributos y métodos que la clase Exploit y, a su vez, define nuevos atributos y métodos a implementar.
- La clase app, que contiene el método Main para la ejecución de la aplicación (clase principal). En esta clase se crean 2 objetos-Exploit y 2 objetos-WinExploit invocando a los métodos Constructores de sus respectivas clases. También accede a los objetos creados a través de sus métodos getters y setters.


Clase Exploit

Código: java
class Exploit
{
   //Definimos las variables o atributos

   String Autor;
   String Vulnerabilidad;
   String Lenguaje;


   //Constructor - Construye el objeto-exploit e identifica sus atributos
   //con los parámetros recibidos.

   Exploit(String a, String v, String l)
   {
    Autor = a;
    Vulnerabilidad = v;
    Lenguaje = l;
   }


   //Métodos

   String getAutor()
   {
    return Autor; //Devuelve autor
   }

   String getVulnerabilidad()
   {
    return Vulnerabilidad;
   }

   String getLenguaje()
   {
    return Lenguaje;
   }

   String getInfoComun() //Devuelve toda la información de golpe
   {
    return ("\tAutor: " + Autor + "\n\tVulnerabilidad : " + Vulnerabilidad + "\n\tLenguaje: " + Lenguaje);
   }


   int setOffset(String o)
   {
    //Se implementa el parámetro offset en la función que se quiera
    System.out.println("\n\n[*] Implementando la direccion offset " + o + " en el exploit...\n");

    //Un ejemplo de esta implementación:
    //Se configura el código del exploit en C para que necesite como
    // parámetro de entrada la direccion offset. Este método de la
    // aplicación Java, realizaría una llamada externa al ejecutable
    // del exploit y le pasaría como parámetro de entrada, este offset

    //Si se ha implementado con exito, el método devuelve 0.

    return (0);

   }

}


Clase WinExploit

Código: java

class WinExploit extends Exploit
{
   //Además de disponer de los atributos heredados de la clase padre...
   //Definimos las nuevas variables o atributos a añadir

   String CodigoMS;


   //Constructor - Construye el objeto-exploit e identifica sus atributos con los parámetros recibidos.

   WinExploit(String a, String v, String l, String cms)
   {
    super(a,v,l); //Estos atributos son implementados por el constructor de la clase padre
    CodigoMS = cms;
   }


   //Además de disponer de los métodos heredados de la clase padre...
   //Definimos los nuevos métodos

   String getCodigoMS()
   {
    return CodigoMS;
   }

   String getInfoWin() //Devuelve toda la información de golpe
   {
    String s;
    s = this.getInfoComun() + "\n\tCogigo MS: " + CodigoMS;
    return s;
   }
}



Clase app

Código: java

class app
{
   public static void main (String[] args)
   {
    //Creamos dos objetos-Exploit llamando al Constructor
    Exploit e1 = new Exploit ("Lion", "Serv-U FTPD SITE CHMOD Command Stack Buffer Overflow", "C");

    Exploit e2 = new Exploit ("fiNis", "Jordan Telnet Server Buffer Overflow", "C");


    //Creamos dos objetos-WinExploit llamando al Constructor
    WinExploit w1 = new WinExploit ("Wirepair", "Windows Workstation Service WKSSVC.DLL Buffer Overflow", "C", "MS03-049");

    WinExploit w2 = new WinExploit ("HoD", "Lsasrv.dll RPC buffer overflow", "C", "MS04-011");


    //Imprimimos las características de los objetos (se puede hacer de dos formas)

    System.out.println("\nInfo de e1\n");
    System.out.println("\tAutor: " + e1.getAutor());
    System.out.println("\tVulnerabilidad: " + e1.getVulnerabilidad());
    System.out.println("\tLenguaje: " + e1.getLenguaje());

    System.out.println("\n\nInfo de e2\n");
    System.out.println(e2.getInfoComun());


    System.out.println("\nInfo de w1\n");
    System.out.println("\tAutor: " + w1.getAutor());
    System.out.println("\tVulnerabilidad: " + w1.getVulnerabilidad());
    System.out.println("\tLenguaje: " + w1.getLenguaje());
    System.out.println("\tCodigo MS: " + w1.getCodigoMS());

    System.out.println("\n\nInfo de w2\n");
    System.out.println(w2.getInfoWin());

    int resultado = w2.setOffset("0x7517123c");
    if (resultado == 0)
    {
     System.out.println("[!] La direccion offset se implemento con exito\n");
    }
    else
    {
     System.out.println("[!] Error durante la implementacion de la direccion offset\n");
    }
   }
}



Resultado de la ejecución de la aplicación Java