elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  Ejercicios Java [Teoría+Ejemplos]
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Ejercicios Java [Teoría+Ejemplos]  (Leído 647,140 veces)
Gospel
Ex-Staff
*
Desconectado Desconectado

Mensajes: 1.587


Ver Perfil WWW
Ejercicios Java [Teoría+Ejemplos]
« en: 1 Julio 2004, 11:15 am »

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.


Citar
Para los que no conocen mucho sobre los exploits, les recomiendo que se den una vuelta por http://foro.elhacker.net/index.php/board,32.0

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:
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
  1. class animal
  2. {
  3.    public void breathe()
  4.    {
  5.        System.out.println("Respirar...");
  6.    }
  7. }
  8.  
  9. class pez extends animal
  10. {
  11.    public void breathe()
  12.    {
  13.        System.out.println("Burbujear...");
  14.    }
  15. }

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:
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)

http://jleyer.wordpress.com/2010/07/27/recopilacion-de-ejercicios-programacion-orientada-a-objetos/


« Última modificación: 27 Julio 2011, 22:53 pm por Leyer » En línea

Gospel
Ex-Staff
*
Desconectado Desconectado

Mensajes: 1.587


Ver Perfil WWW
Re: Ejercicios Java básico [en desarrollo+]
« Respuesta #1 en: 5 Julio 2004, 06:33 am »

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 [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:
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:
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:
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:
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: MiClase.java ->
-> 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 http://java.sun.com, concretamente http://java.sun.com/j2se/1.4.2/download.html

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 @ http://www.netbeans.org/
Eclipse Open-Source @ http://www.eclipse.org/ (muy bueno, pero consume muchos recursos)
JBuilder de Borland @ http://www.borland.com/jbuilder/

Mi favorito: JCreator @ http://www.jcreator.com/


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
  1. class MiClase //La clase se llama igual que el archivo de codigo fuente *.java que la contiene
  2. {
  3.    public static void main (String[] args)
  4.    {
  5.       System.out.println("Hola mundo!");
  6.    }
  7. }

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

Código:
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 MiClase

y obtenemos:
Código:
Hola Mundo!

Si obtienes
Código:
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
  1. class MiClase //La clase se llama igual que el archivo de codigo fuente *.java que la contiene
  2. {
  3.    public static void main (String[] args)
  4.    {
  5.       System.out.println("Hola mundo!");
  6.    }
  7. }

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:
"Hola Mundo!"
Tambíen podemos utilizar los iconos en las barras de herramientas para compilar y ejecutar.



« Última modificación: 1 Junio 2008, 09:05 am por sirdarckcat » En línea

Gospel
Ex-Staff
*
Desconectado Desconectado

Mensajes: 1.587


Ver Perfil WWW
Re: Ejercicios Java básico [en desarrollo+]
« Respuesta #2 en: 8 Julio 2004, 03:10 am »

3) Sintaxis de Java

Java utiliza casi la misma sintaxis que C, para más información -> http://www.dcc.uchile.cl/~lmateu/Java/Apuntes/tiposprim.htm
En línea

Gospel
Ex-Staff
*
Desconectado Desconectado

Mensajes: 1.587


Ver Perfil WWW
Re: Ejercicios Java básico [en desarrollo+]
« Respuesta #3 en: 8 Julio 2004, 03:33 am »

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
  1. class Exploit
  2. {
  3.   //Definimos las variables o atributos
  4.  
  5.   String Autor;
  6.   String Vulnerabilidad;
  7.   String Lenguaje;
  8.  
  9.  
  10.   //Constructor - Construye el objeto-exploit e identifica sus atributos
  11.   //con los parámetros recibidos.
  12.  
  13.   Exploit(String a, String v, String l)
  14.   {
  15.    Autor = a;
  16.    Vulnerabilidad = v;
  17.    Lenguaje = l;
  18.   }
  19.  
  20.  
  21.   //Métodos
  22.  
  23.   String getAutor()
  24.   {
  25.    return Autor; //Devuelve autor
  26.   }
  27.  
  28.   String getVulnerabilidad()
  29.   {
  30.    return Vulnerabilidad;
  31.   }
  32.  
  33.   String getLenguaje()
  34.   {
  35.    return Lenguaje;
  36.   }
  37.  
  38.   String getInfoComun() //Devuelve toda la información de golpe
  39.   {
  40.    return ("\tAutor: " + Autor + "\n\tVulnerabilidad : " + Vulnerabilidad + "\n\tLenguaje: " + Lenguaje);
  41.   }
  42.  
  43.  
  44.   int setOffset(String o)
  45.   {
  46.    //Se implementa el parámetro offset en la función que se quiera
  47.    System.out.println("\n\n[*] Implementando la direccion offset " + o + " en el exploit...\n");
  48.  
  49.    //Un ejemplo de esta implementación:
  50.    //Se configura el código del exploit en C para que necesite como
  51.    // parámetro de entrada la direccion offset. Este método de la
  52.    // aplicación Java, realizaría una llamada externa al ejecutable
  53.    // del exploit y le pasaría como parámetro de entrada, este offset
  54.  
  55.    //Si se ha implementado con exito, el método devuelve 0.
  56.  
  57.    return (0);
  58.  
  59.   }
  60.  
  61. }


Clase WinExploit

Código
  1. class WinExploit extends Exploit
  2. {
  3.   //Además de disponer de los atributos heredados de la clase padre...
  4.   //Definimos las nuevas variables o atributos a añadir
  5.  
  6.   String CodigoMS;
  7.  
  8.  
  9.   //Constructor - Construye el objeto-exploit e identifica sus atributos con los parámetros recibidos.
  10.  
  11.   WinExploit(String a, String v, String l, String cms)
  12.   {
  13.    super(a,v,l); //Estos atributos son implementados por el constructor de la clase padre
  14.    CodigoMS = cms;
  15.   }
  16.  
  17.  
  18.   //Además de disponer de los métodos heredados de la clase padre...
  19.   //Definimos los nuevos métodos
  20.  
  21.   String getCodigoMS()
  22.   {
  23.    return CodigoMS;
  24.   }
  25.  
  26.   String getInfoWin() //Devuelve toda la información de golpe
  27.   {
  28.    String s;
  29.    s = this.getInfoComun() + "\n\tCogigo MS: " + CodigoMS;
  30.    return s;
  31.   }
  32. }


Clase app

Código
  1. class app
  2. {
  3.   public static void main (String[] args)
  4.   {
  5.    //Creamos dos objetos-Exploit llamando al Constructor
  6.    Exploit e1 = new Exploit ("Lion", "Serv-U FTPD SITE CHMOD Command Stack Buffer Overflow", "C");
  7.  
  8.    Exploit e2 = new Exploit ("fiNis", "Jordan Telnet Server Buffer Overflow", "C");
  9.  
  10.  
  11.    //Creamos dos objetos-WinExploit llamando al Constructor
  12.    WinExploit w1 = new WinExploit ("Wirepair", "Windows Workstation Service WKSSVC.DLL Buffer Overflow", "C", "MS03-049");
  13.  
  14.    WinExploit w2 = new WinExploit ("HoD", "Lsasrv.dll RPC buffer overflow", "C", "MS04-011");
  15.  
  16.  
  17.    //Imprimimos las características de los objetos (se puede hacer de dos formas)
  18.  
  19.    System.out.println("\nInfo de e1\n");
  20.    System.out.println("\tAutor: " + e1.getAutor());
  21.    System.out.println("\tVulnerabilidad: " + e1.getVulnerabilidad());
  22.    System.out.println("\tLenguaje: " + e1.getLenguaje());
  23.  
  24.    System.out.println("\n\nInfo de e2\n");
  25.    System.out.println(e2.getInfoComun());
  26.  
  27.  
  28.    System.out.println("\nInfo de w1\n");
  29.    System.out.println("\tAutor: " + w1.getAutor());
  30.    System.out.println("\tVulnerabilidad: " + w1.getVulnerabilidad());
  31.    System.out.println("\tLenguaje: " + w1.getLenguaje());
  32.    System.out.println("\tCodigo MS: " + w1.getCodigoMS());
  33.  
  34.    System.out.println("\n\nInfo de w2\n");
  35.    System.out.println(w2.getInfoWin());
  36.  
  37.    int resultado = w2.setOffset("0x7517123c");
  38.    if (resultado == 0)
  39.    {
  40.     System.out.println("[!] La direccion offset se implemento con exito\n");
  41.    }
  42.    else
  43.    {
  44.     System.out.println("[!] Error durante la implementacion de la direccion offset\n");
  45.    }
  46.   }
  47. }


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


« Última modificación: 1 Junio 2008, 09:04 am por sirdarckcat » En línea

Casidiablo
Desarrollador
Colaborador
***
Desconectado Desconectado

Mensajes: 2.919



Ver Perfil WWW
Ejercicios Java Básico [ejemplos prácticos]
« Respuesta #4 en: 29 Diciembre 2005, 18:42 pm »

SUMARIO DE EJERCICIOS BÁSICOS Y COMPLEJOS DE JAVA

Hola a todos... en este hilo puedes encontran códigos fuente de diversos temas de Java. Está organizado de lo más básico a lo más complejo y para cada tema he puesto una pequeña introducción, que ilustra a grandes rasgos lo que abarcan los programas. La mayoría de los programas, incluyendo los del principio, utilizan el paquete Swing de Java para las interfaces gráficas de usuario, e incluso se utilizan clases internas anónimas para el manejo de eventos, en vez de los métodos convencionales. Se incluyen también programas que tienen errores a propósito, para explicar restricciones de Java; estos se encuentran subrayados. Los programas están organizados y distribuidos en los siguientes temas:

   Introducción a las aplicaciones en Java
   Introducción a los Applets en Java
   Instrucciones de control
   Métodos (funciones)
   Arreglos
   Programación Basada en Objetos
   Programación Orientada a Objetos (Herencia y Polimorfismo)
   Cadenas y caracteres
   Gráficos y Java2D
   Componentes de la interfaz gráfica de usuario (GUI's)
   Manejo de excepciones
   Subprocesamiento múltiple (Hilos, Threads)




Introducción a las Aplicaciones en Java

Ofrece una ligera introducción a la programación de aplicaciones en el lenguaje de programación Java. En estos programas se concentran los conceptos y las construcciones básicas de programación, para los no programadores y newbies. También ilustran como mostrar datos en pantalla y como leer datos desde el teclado, así como el uso de operadores relacionales y de igualdad y operadores aritméticos.

Introducción a los subprogramas de Java (Applets)

En esta sección se pueden bajar subprogramas básicos de Java, también llamados Applets, que son programas diseñados para transportarse a través de Internet y ejecutarse en navegadores Web (como el Internet Explorer, Opera, FireFox, etc.). Hay muchos otros applets en la sección de demos del J2DSK(j2sdk1.4.1/demo/applets), en los cuales te puedes basar.

Instrucciones de Control

Esta sección se enfoca en el proceso de desarrollo de programas. Se exponen los tipos primitivos de instrucciones de control para la tomas de decisiones (if, else, if... else, while, do...while, for, switch, etc.). Los ejemplos también muestran el manejo de la repetición controlada por contador y por centinela, y se introducen los operadores de incremento, decremento y asignación de Java y las instrucciones break y switch.

Métodos (funciones)

En esta sección se ofrece un análisis más detallados de los objetos. Los objetos contienen datos llamados campos y unidades llamados métodos. En esta sección se encuentran ejemplos muy conocidos sobre recursividad. Las técnicas aquí expuestas son esenciales para producir programas correctamente estructurados, especialmente los más grandes que desarrollan los programadores de sistemas y aplicaciones. También se muestra el uso de la sobrecarga de métodos y se presentan el manejo de eventos.

Arreglos (arrays)

Los arreglos en Java son objetos, demostrando el compromiso de Java con la orientación a objetos. En esta sección se encuentran diversos ejemplos de arreglos unidimensionales y multidimensionales, y se exponen las manipulaciones más comunes de estos. También el proceso de pasar arreglos a métodos y las técnicas elementales para ordenar y realizar búsquedas, junto con la presentación de la búsqueda binaria como una mejora sobre la búsqueda lineal.

Programación Basada en Objetos

En esta sección se encuentran ejemplos más detallados de las clases. Muestra: la implementación de clases en Java, el acceso a los miembros de una clase, como implementar la ocultación de la información con modificadores de acceso, separar la interfaz de la implementación, usar métodos de acceso, separar la interfaz de la implementación, usar métodos de acceso y métodos utilitarios e inicializar objetos con constructores. También: el como declarar y utilizar constantes, la composición, la referencia con this, los miembros de la clase static y tipos de datos abstractos populares como pilas y colas. Al igual que se da un ejemplo introductorio al uso de paquetes (package) de Java.

Programación Orientada a Objetos (Herencia y Polimorfismo)

En esta sección puedes descargar ejemplos de una de las herramientas fundamentales en la programación orientada a objetos, la herencia, la cual es una forma de reutilización de software en la que nuevas clases se desarrollan rápida y fácilmente al absorber las características de las clases existentes y agregar nuevas características que sean apropiadas. También se muestran ejemplos introductorios sobre superclases y subclases, el modificador de acceso protected, las superclases directas e indirectas, el uso de constructores en superclases y subclases, y la ingeniería de software con herencia. También hay ejemplos sobre polimorfismo, otra importante herramienta en la llamada Programación Orientada a Objetos. Se muestra la diferencia de clases abstractas (abstract) y clases concretas; además de presentar las interfaces, que es el reemplazo de la llamada "herencia múltiple" de C++. También presenta el concepto de las clases anidadas, las cuales utilizamos en este caso para el manejo de eventos de componentes de la GUI. Véase especialmente tres ejemplos prácticos de polimorfismo: un sistema de nóminas, una jerarquía de figuras encabezada por una clase abstract y una jerarquía de clases encabezada por una interfaz.

Cadenas y caracteres

Esta sección trata el procesamiento de palabras, oraciones, caracteres y grupos de caracteres. Se presentan las clases String, StringBuffer, Character y StringTokeizer. También se presentan ejemplos de la API de Java para las expresiones regulares (nueva en la J2SE 1.4), la cual permite a los programas buscar en las cadenas secuencias de caracteres que concuerden con ciertos patrones especificados.

Gráficos y Java2D

En esta sección de tratan los contextos y objetos gráficos; el dibujo de cadenas, caracteres y bytes; el control de color y tipo de letra; la manipulación de la pantallas, los modos de pantalla y el dibujo de líneas, rectángulos, rectángulos redondeados, rectángulos tridimensionales, óvalos, arcos y polígonos. Se presenta la API de Java2D, la cual ofrece poderosas herramientas para gráficos.

Componentes de la Interfaz Gráfica de Usuario GUI

En esta sección se presentan varios de los componentes de Java para la creación de interfaces gráficas de usuario. Los componentes de Swing pueden personalizarse para asemejarse a la apariencia de la plataforma computacional en la que se ejecute el programa, o pueden usar la apariencia visual de Java para brindar una interfaz idéntica en cualquier Sistema Operativo. Esta sección ilustra la jerarquía javax.swing, las labels, botones, listas, campos de texto, áreas de texto, cuadros combinados, casillas de verificación, los controles deslizables, las ventanas, los menús, menús contextuales, botones de opción paneles, como cambiar la apariencia visual, las interfaces con documentos múltiples, los paneles con fichas, el manejo de eventos de ratón y de teclado, y los administradores de esquemas, normales y avanzados, para posicionar componentes. También se muestra como extender los componentes de Swing.

Manejo de Excepciones

Esta sección ejemplifica el tema de las excepciones, un tema importante en la construcción de aplicaciones de "misión crítica" o de "comercio crítico". para utilizar un componente de Java, es necesario saber no sólo la manera como se comporta ese componente cuando "las cosas salen bien", sino también cuando "las cosas salen mal". En esta sección se introducen instrucciones imprescindibles en el manejo de excepciones (try, catch, finally), además introduce la nueva capacidad de encadenamiento de excepciones en la J2SE 1.4.

Subprocesamiento múltiple (Hilos o Threads)

Esta sección trata sobre cómo desarrollar programas en Java que puedan llevar a cabo varias actividades en forma concurrente. Aquí se presentan programas con subprocesamiento múltiple, los cuales muestran los problemas que pueden ocurrir en la programación concurrente. También se encuentra el típico ejercicio de la relación productor/consumidor sin sicronización (demostrando sus problemas) y despues con sincronización (para solucionar estos problemas). También se implementa una relación productor/consumidor con un búfer circular, y una sicronización adecuada con un monitor. Finalmente un ejercicio donde se trata la interfaz Runnable, que permite a los objetos ejecutarse como subprocesos sin tener que usar la clase Thread como subclase.

« Última modificación: 15 Agosto 2008, 20:41 pm por Casidiablo » En línea

Casidiablo
Desarrollador
Colaborador
***
Desconectado Desconectado

Mensajes: 2.919



Ver Perfil WWW
Ejercicios Java Básico [ejemplos prácticos]
« Respuesta #5 en: 11 Enero 2006, 19:37 pm »

Archivos y Flujos

Esta sección habla sobre la entrada/salida que se logra a través de flujos de datos dirigidos hacia, y desde, los archivos. En los siguientes ejemplos se traducen los objetos a un formato persistente. El proceso de poder almacenar datos en archivos o desplazarlos a través de redes (siguiente capítulo) hace que los programas puedan guardar datos y comunicarse entre sí. Se presenta un ejemplo de la clase File, que sirve para obtener información acerca de los archivos y directorios; también ejemplos sobre las clases ObjectInputStream, ObjectOutputStream, RandomAccessFile, etc. Nota: Muchos de los ejercicios de esta sección, necesitan de las clases de otros ejercicios de aquí mismo, para su correcto funcionamiento.


Redes

En esta sección se presentan programas que se comunican a través de redes de computadores, exponiendo las mejores herramientas de red para Java. Es casi necesario manejar el tema de Archivos y Flujos ya que Java maneja las redes como si fueran flujos de datos. Se manejan objetos de las clases URL, Socket, ServerSocket, DatagramSocket, DatagramPacket, SocketException, HiperLinkEvent, Serializable, InetAdress, entre otras. El ejemplo cuilminante para esta sección es la creación de un Chat, que utiliza las características más importantes a la hora de implementar programas de redes en Java.

Multimedia: imagenes, animación y audio

En esta sección se presentan características de Java que permiten que los programas cobren vida a través de la multimedia. Hay ejemplos sobre la manipulación de Imagenes, Audio y Animación.

Nota: Las herramientas de multimedia de Java van más allá de las que se presentan en esta sección. Entre estas herramientas se incluyen la API del marco de trabajos de medios de Java (Java Media Framework API), la API de sonido de Java (Java Sound API), la API de 3D de Java (Java 3D API), la API de procesamiento avanzado de imágenes de Java (Java Avanced Imaging API), la API de síntesis de voz de Java (Java Speech API), la API 2D de Java (Java 2D API) y la API de E/S de imágenes de Java (Java Image I/O API).
Por esto os dejo una pequeña fuente de información, para las API's anteriormente mencionadas, y algunas que se me escapan en el momento:

« Última modificación: 15 Agosto 2008, 20:36 pm por Casidiablo » En línea

Casidiablo
Desarrollador
Colaborador
***
Desconectado Desconectado

Mensajes: 2.919



Ver Perfil WWW
Fundamentos de un entorno típico en Java
« Respuesta #6 en: 4 Septiembre 2006, 01:40 am »

Fundamentos de un entorno típico en Java

La siguiente explicación define los pasos típicos para crear y ejecutar un programa en Java, utilizando el entronos de desarrollo de Java. Estos pasos se aplican en el dibujo mostrado más abajo y se explican en este texto.

Por lo general, los programas en Java pasan a través de cinco fases para poder ejecutarse. Estas fases son: edición, compilación, carga, verificación y ejecución. Hablamos sobre estos conceptos en el contexto del Kit de Desarrollo de software para Java 2 (J2SDK).


La fase 1 consiste en editar un archivo. Esto se logra mediante un programa de edición (el block de notas de Windows, el vim de Linux, o el que más te guste). El programador escribe un programa en Java utilizando el editor, y realiza las correcciones, si es necesario. Cuando en programador determina que el programa está listo, guarda el programa en un archivo con la extensión .java.

En la fase 2, el programador proporciona el comando javac para compilar el programa. El compilador de Java traduce el programa a código de bytes: las instrucciones que el intérprete de Java (o máquina virtual) puede entender. Por ejemplo, para compilar un programa llamado Hola.java, escriba:

javac Hola.java

en la ventana de comandos de su sistema. Si el programa se compila correctamente, el compilador genera un archivo Hola.class. Este archivo contiene códigos de bytes que se interpretan en la fase de ejecución.

La fase 3 se conoce como carga. El programa debe colocarse en memoria antes de ejecutarse. De esto se encarga el cargador de clases, que toma los archivos .class que contienen los códigos de bytes y los transfiere a la memoria principal. Depués, el archivo .class puede cargarse desde un disco en un sistema o a través de una red.

A medida que se cargan las clases, el veirficador de códigos de bytes se encarga de verificar sus códigos de bytes en la fase 4. Este proceso de verificación asegura que los códigos de bytes de las clases sean válidos y que no violen las restricciones de seguridad de Java. Java implementa una estrecha seguridad, ya que los programas en Java que llegan a través de la red no deben ser capaces de dañar sus archivos o su sistema (como podrían hacerlo un virus de computadora). Tome en cuenta que la verificación del código de bytes también se lleva a cabo en aplicaciones que descargan clases a través de una red.

Finalmente en la fase 5, el intérprete, bajo el control del sistema operativo, interpreta el programa un código de bytes a la vez, realizando en esta forma las acciones especificadas por el programa. Existen dos tipos de programas para los cuales ocurre este proceso: las aplicaciones y los applets. Una aplicación es un programa (como por ejemplo un programa de procesamiento de palabras, de hojas de cálculo, de dibujo o de correo electrónico) que generalmente se guarda y ejecuta desde el equipo local de usuario. Un applet es un pequeño programna que se guarda en un equipo remoto, al cual se conectan los usuarios a través de un navegador Web. El equipo remoto se conoce como un servidor Web. Los applets se cargan desde un equipo remoto en el navegador, se ejecutan en éste y se descartan cuando termina la ejecución. Para ejecutar un applet de nuevo, el usuario debe dirigir un navegador a la ubicacion apropiada en Internet y volver a cargar el programa en el navegador.

Las aplicaciones se cargan en memoria y se ejecutan, utilizando el intérprete de Java mediante el comando java. Al ejecutar una aplicación de Java llamada, por ejemplo, Hola.class, el comando

java Hola

invoca al intérprete para la aplicación Hola, y hace que el cargador de clases cargue la información utilizada en el programa Hola. [Nota: El intérprete de Java se conoce también como la Máquina Virtual, o la JVM (Java Virtual Maquine)].

Los navegadore Web como el Firefox o Internet Explorer se utilizan para ver los documentos en Internet, que generalmente son archivos HTML. Un documento HTML puede contener un applet de Java. Cuando el navegador ve la referencia (las etiquetas) a un applet en un documento HTML, inicia el cargador de clases de Java para cargar el applet. Todos los navegadores que cuentan con soporte para Java tienen un intérprete de Java incluido (es decir, una JVM). Una vez que se carga el applet, el intérprete de Java lo ejecuta. Los applets también pueden ejecutarse desde una linea de comandos, mediante el comando appletviewer que se incluye con el J2SDK. Al igual que un navegador, el appletviewer requiere un documento html para poder invocar al applet. Por ejemplo, si el archivo Hola.html hace referencia al applet Hola, el comando appletviewer se utiliza de la siguiente manera:

appletviewer Bienvenido.html

Este comando ocasiona que el cargador de clases cargue la información utilizada en el applet Hola. El appletviewer es un navegador muy básico; solo sabe como interpretar referencias a los applets e ignora el resto de código HTML del documento.

Es posible que los programas no funcionen bien la primera vez. Cada una de las fases anteriores puede fallar, debido a diversos errores. Por ejemplo, un programa podría intentar una división entre cero (una operación ilegal para la aritmética con números enteros en Java). Esto haría que el programa de java imprimiera un mensaje de error. El programador tendría que volver a la fase de edición, hacer las correciones y proceder con las fases restantes de nuevo, para determinar que las correciones funcionen apropiadamente.

Bien, eso fue una pequeña introducción a un entorno típico de desarrollo en Java, pero más adelante veremos como los IDE's nos pueden facilitar mucho trabajo integrando las herramientas que necesitemos en una sola.
« Última modificación: 13 Septiembre 2006, 00:28 am por Casidiablo » En línea

Casidiablo
Desarrollador
Colaborador
***
Desconectado Desconectado

Mensajes: 2.919



Ver Perfil WWW
Entornos de Desarrollo Integrado (IDE's) para Java
« Respuesta #7 en: 20 Noviembre 2007, 20:28 pm »

Entornos de Desarrollo Integrado para Java

¿Qué es un IDE?

En línea

Mioshi

Desconectado Desconectado

Mensajes: 23



Ver Perfil
Re: Ejercicios Java [Teoría+Ejemplos]
« Respuesta #8 en: 30 Noviembre 2011, 22:29 pm »

Buen aporte  ;D
En línea

jesusgll

Desconectado Desconectado

Mensajes: 1


Ver Perfil
Re: Ejercicios Java [Teoría+Ejemplos]
« Respuesta #9 en: 22 Julio 2012, 23:52 pm »

que buen manual, te felicito!!!!
En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines