Seguridad y Redes

Tips & Video Tutoriales, Wifislax, VMware, GNS3, VirtualBox, CCNA, Cisco Routers & Switches, [ Programming ]

Vector de Ataque Web con Social-Engineer Toolkit (SET)

Social-Engineer Toolkit (SET) es un conjunto de colección de scripts en Python especialmente diseñadas para realizar ataques de ingeniería social en procesos de auditorias de seguridad. Esta herramienta fue creada por David Kennedy (ReL1K), el mismo creador de otra herramienta muy popular llamada Fast-Track, que también es una herramienta que automatiza algunos ataques más comunes y más usados en las pruebas de penetración (penetration test) mediante algunos scripts hechos en Python.

Social-Engineer Toolkit (SET) nos permite crear archivos PDF, sitios web falsos y enviar correos electrónicos con código malicioso incrustado, por cierto también se integra con el Metasploit Framework.

Como bien sabran y se han dado cuenta, la ingeniería social no es nada nuevo, los ataques de ingeniería social están ahora en su punto más alto, es decir en pleno auge y siempre han sido un gran riesgo para muchas organizaciones. Una persona que esta tratando de convencer a otras personas para que realicen actos que normalmente no harian es muy antigua como la misma historia de la tierra :D

Muchos creen que la ingeniería social es uno de los mayores riesgos que enfrentan las organizaciones actualmente, ya que es muy difícil proteger a las organizaciones de estos ataques. Por ejemplo puede que se acuerden del ataque a Google, del llamado “Operación Aurora” (también conocida como Comele o Hydraq) en el que la técnica de ingeniería social fue utilizada para atacar a Gmail y otras fuentes de Google.

Un vector de ataque es la vía que se utiliza para obtener información o acceso a un determinado sistema y la herramienta Social-Engineer Toolkit (SET) clasifica a los ataques por vectores de ataques web, correo, electrónico y también los ataques basados en USB. Utiliza correo electrónico, sitios web falso y otros vectores que típicamente lo que hacen es engañar a los usuarios a comprometer la información sensible. Cada vector puede tener éxito o todo lo contrario, dependiendo del objetivo a atacar y también el tipo de comunicación utilizada. SET también viene con correos electrónicos y plantillas de páginas web ya predefinidas que pueden ser utilizadas para los ataques de ingeniería social, también utiliza la herramienta Metasploit Framework. Así que en este post se mostrara un ejemplo de vector de ataque basado en web, manos a la obra y listos para la primera prueba.

Herramientas Utilizadas

Instalación de Social Engineer Toolkit (SET)

La instalación de SET es sencilla, lo que necesitamos es tener instalado Phyton y Metasploit Framework, ambas herramientas están instaladas en la distribución de BackTrack y no hay que preocuparnos por nada sobre cosas de la configuración e instalación, solo tenemos que tener actualizados a las versiones más recientes. Pero si requieren instalarlo en alguna otra distribución diferente, solo abrir la consola y teclear o copiar el siguiente comando.
svn co http://svn.secmaniac.com/social_engineering_toolkit set/
Después de ejecutar el comando anterior, tendremos un nuevo directorio que contiene todas herramientas necesarias para la ejecución de Social-Engineer Toolkit (SET).

Ejecutando Social-Engineer Toolkit (SET)

Para ejecutar SET es un proceso sencillo, ya que solo tenemos que abrir una terminal o consola y simplemente tenemos que teclear ./set. Bueno lo primero tenemos que estar en el directorio donde tenemos la herramienta, en BackTrack se encuentra en el directorio /pentest/exploits/set/. Lo haremos de la siguiente manera.
root@bt:~# cd /pentest/exploits/set/
root@bt:/pentest/exploits/set# ls
config modules readme reports set set-automate set-proxy set-update setup.py set-web src
root@bt:/pentest/exploits/set# ./set
Ejecución de Social-Engineer Toolkit (SET).

El comando ./set inicia la ejecución de SET y nos muestra el menú inicial. En este post veremos un ejemplo de un vector de ataque basado en web, clonando un sitio web y utilizando el método de ataque de Java Applet.

Website Attack Vectors

Los vectores de ataque web son probablemente uno de los aspectos más avanzados e interesantes de esta herramienta ya que están especialmente diseñados para ser de un aspecto muy creíble y de una apariencia muy atractiva para la víctima. Esta herramienta puede clonar sitios web que son idénticos a los sitios de confianza que normalmente visita un usuario normal, esto asegura a la víctima de que aparentemente está visitando un sitio legítimo.

Java Applet Attack

Uno de los ataques basados en un sitio web que tienes disponible Social-Engineer Toolkit (SET), es el ataque de Java Applet (Java Applet Attack), es uno de los vectores de ataque más exitoso de esta herramienta. Este ataque malicioso lo que hace es mostrar un applet de Java en el navegador web invitando a que el usuario de clic, en este caso a ejecutar el applet. Este ataque no se considera una vulnerabilidad de Java.

Para ejecutar este ataque en el menú principal de SET debemos primero elegir la opción 2, Website Attack Vectors. Al elegir la esta opción, nos mostrara en consola las siguientes opciones.

1) Java Applet Attack Method
2) Metasploit Browser Exploit Method
3) Credential Harvester Attack Method
4) Tabnabbing Attack Method
5) Man Left in the Middle Attack Method
6) Web Jacking Attack Method
7) Multi-Attack Web Method
8) Create or import a CodeSigning Certificate

Java Applet Attack Method

Elegimos la opción 1, Java Applet Attack Method y nos mostrara lo siguiente.


Elegimos la opción que 1 o 2, en mi caso la opción 2 donde pongo el sitio a clonar, en mi caso puse mi blog, delfirosales.blogspot.com y se generara la clonación del sitio.

Hemos creado un servidor de alojamiento con un sitio web clonado en este caso, el sitio es mi blog delfirosales.blogspot.com.
En el siguiente paso dependiendo del escenario u objetivo elegimos la opción adecuada, en mi caso realice la prueba con la opción 2, Windows Reverse_TCP Meterpreter.


Después elegimos el backdoor, en mi caso elegí la opción 16, Backdoored Executable (BEST), elegimos el puerto, esperamos a que se genere la configuración y esperamos a que cargue Metasploit Framework.


Ahora que tenemos todo listo, solo tenemos que tener un objetivo a atacar para que navegue a través del sitio malicioso. Al llegar a la pagina web, la victima se le mostrar una advertencia pop-up tal como se muestra en la siguiente figura.


Si la victima da clic en Ejecutar (que por cierto la mayoría de los usuarios la hacen) el exploit será ejecutado y con esto tendremos acceso y el control total del sistema de la victima, en este caso la maquina con Windows XP SP3, tal y como se muestran en las siguientes imágenes.


De vuelta en nuestro equipo atacante, la sesión de Meterpreter se ha establecido correctamente y ahora tenemos el acceso a la maquina de la victima, tal como se muestra.


Referencias:
Computer Based Social Engineering Tools: Social Engineer Toolkit (SET)
Social Engineering: The Art of Human Hacking
Penetration Tester's Open Source Toolkit, Third Edition

Algunos conceptos sobre la Memoria en Java

En nuestro anterior post, declaramos las variables valor1, valor2 y suma, en realidad estas variables corresponden a ciertas ubicaciones en la memoria de la computadora. Toda variable declarada tiene un nombre, un tipo, un tamaño y un valor.

valor1 = entrada.nextInt(); // Lee el primer numero del usuario

El numero introducido por el usuario se coloca en una ubicación en memoria a la cual se le asigna el nombre de valor1. Ahora supongamos por ejemplo que el usuario introduce el número 50, la computadora coloca este valor entero en la ubicación valor1, tal como se muestra en la siguiente imagen.

Ubicación de memoria que muestra el nombre y el valor de la variable valo1.

Cada vez que se coloca un nuevo valor en una ubicación de memoria, se sustituye al valor anterior en esa ubicación, es decir, el valor anterior se pierde.

valor2 = entrada.nextInt(); // Lee el segundo numero del usuario

Ahora supongamos que el usuario introduce el número 75, la computadora coloca este valor entero en la ubicación valor2. Ahora la memoria aparece tal como se muestra en la siguiente imagen.

Ubicación de memoria, después de almacenar los valores para valor1 y valor2.

Una vez que el programa realiza lo anterior, donde obtiene los valores para valor1 y valor2, los suma y coloca el resultado en la variable suma.

suma = valor1 + valor2; // Suma el valor1 + valor2

Aquí se realiza la suma y después sustituye el valor anterior de suma. Una vez que se calcula la suma, la memoria aparece como se muestra en la siguiente imagen.

Ubicación de memoria, después de almacenar la suma de valor1 y valor2.

Como podemos observar en la imagen, los valores de valor1 y valor2 aparecen exactamente como antes de usarlos en el cálculo de suma. Estos valores se utilizaron, pero no se destruyeron, cuando la computadora realiza el cálculo. Por lo tanto, cuando se lee un valor de una ubicación de memoria el proceso es no destructivo.

Instalación JDK + Netbeans en Ubuntu

Primero descargamos el JDK + NetBeans desde la siguiente pagina http://www.oracle.com/technetwork/java/javase/downloads/jdk-7-netbeans-download-432126.html. NetBeans es un entorno de desarrollo integrado (IDE) libre, hecho principalmente para el lenguaje de programación Java. En la pagina descargamos el archivo para linux, de nombre jdk-7u1-nb-7_0_1-linux-ml.sh, este archivo contiene el JDK y NetBeans.

Versiones:
NetBeans versión 7.0.1
Java versión 1.7.0_01
Ubuntu 11.10

Una vez finalizado la descarga, nos dirigimos desde consola en la ubicación donde tenemos el archivo descargado y realizamos lo siguiente.
chmod a+x jdk-7u1-nb-7_0_1-linux-ml.sh
./jdk-7u1-nb-7_0_1-linux-ml.sh
gedit /etc/bash.bashrc
Si en el asistente de instalación lo dejamos todo por defecto (es decir siguiente, siguiente y finalizar) al final del archivo bash.bashrc, agregamos los siguiente.
export JAVA_HOME=/usr/local/jdk1.7.0_01
export NETBEANS_HOME=/usr/local/netbeans-7.0.1
export PATH=$JAVA_HOME/bin:$NETBEANS_HOME/bin:$PATH
Una vez realizado este proceso podremos verificar que todo este correcto escribiendo en consola el comando java -version, este comando invoca el compilador de Java y nos muestra la version de Java instalado.
root@computer:/home/delfi# java -versión
java version "1.7.0_01"
Java(TM) SE Runtime Environment (build 1.7.0_01-b08)
Java HotSpot(TM) Server VM (build 21.1-b02, mixed mode)
Lo anterior comprueba que tenemos instalado Java correctamente y esta listo para escribir y compilar código Java desde nuestro Ubuntu. Si no sale lo anterior es necesario que tengamos que reiniciar nuestro equipo.

Los objetos de salida estándar System.out permiten a las aplicaciones de Java mostrar caracteres en la ventana de comandos. De manera similar, el objeto que veremos en este post, llamado el objeto de entrada estándar System.in permite a las aplicaciones de Java leer la información escrita por el usuario.

Los programas recuerdan números y otros datos en la memoria de la computadora y acceden a esos datos a través de elementos del programa conocidos como variables. En esto post veremos una aplicación donde utilizaremos estos variables para que realicen una operación de suma de dos enteros introducidos por el usuario mediante el teclado.
//Programa que muestra la suma de dos enteros.
import java.util.Scanner; // Este programa usa la clase Scanner

public class Suma
{
 public static void main ( String args[] )
 {
  Scanner entrada = new Scanner( System.in );
  
  int valor1; // Primer Numero a sumar
  int valor2; // Segundo Numero a sumar
  int suma;   // Suma de valor1 y valor2
  
  System.out.print( "Escriba el primer numero a sumar: ");
  valor1 = entrada.nextInt(); // Lee el primer numero del usuario
  
  System.out.print( "Escriba el segundo numero a sumar: ");
  valor2 = entrada.nextInt(); // Lee el segundo numero del usaurio
  
  suma = valor1 + valor2; // Suma el valor1 + valor2
  
  System.out.printf( "La suma es %d\n", suma); // Muestra el resultado
 }
}
Programa que calcula la suma y muestra el resultado en consola.

Salida del Programa.
Escriba el primer numero a sumar: 50
Escriba el segundo numero a sumar: 75
La suma es 125

import java.util.Scanner; // Este programa usa la clase Scanner

La declaración import indica que este programa utiliza la clase Scanner predefinida de Java del paquete java.util.

Scanner entrada = new Scanner( System.in );

La línea anterior es una instrucción de declaración de variable (también conocido como declaración), la cual especifica el nombre (entrada) y tipo (Scanner) de una variable utilizada en este programa. Una variable como lo mencionamos, es una ubicación en la memoria de la computadora, en donde se puede guardar un valor para utilizarlo posteriormente en un programa. Todas las variables deben declararse con un nombre y un tipo antes de poder usarse. Este nombre permite al programa acceder el valor de la variable en memoria y puede ser cualquier identificador valido. El tipo de una variable especifica el tipo de información que se guarda en esa ubicación de memoria. Al igual que los demás instrucciones, las instrucciones de declaración terminan con un punto y como (;).

Entonces la variable llamada entrada es de tipo Scanner. Un objeto Scanner permite a un programa leer datos (como números) para usarlos. Los datos pueden provenir de muchas fuentes, como archivos de disco o datos de teclado. Antes de usar el objeto Scanner, primero debemos crearlo y especificar el origen de los datos.

El signo ( = ) indica que la variable entrada tipo Scanner debe inicializarse en su declaración con el resultado de la expresión new Scanner ( System.ini ) a la derecha del signo igual. Cuando decimos que la variable entrada tipo Scanner debe inicializarse, significa que hay que prepararla para usarla en el programa. Así que esta expresión crea un objeto Scanner que lee los datos escritos por el usuario mediante el teclado.

int valor1; // Primer Numero a sumar
int valor2; // Segundo Numero a sumar
int suma; // Suma de valor1 y valor2

Las líneas anteriores declaran que las variables valor1, valor2 y suma contienen datos de tipo int. Estas variables pueden contener valores enteros. Las instrucciones de declaración de variables pueden dividirse en varias líneas, separando los nombres de las variables por comas. Por ejemplo, las líneas anteriores se pueden declarar como una sola instrucción, de la siguiente manera.

int valor1, int valor2, int suma; // Declaración de variables en una sola instrucción.

El seleccionar nombres de variables significativos ayudan a que un programa se mas fácil de entender con solo leerlo.

System.out.print( "Escriba el primer numero a sumar: ");

Estas líneas utilizan System.out.print para mostrar el mensaje "Escriba el primer número a sumar: ". Ese mensaje se conoce como indicador, ya que indica al usuario que debe realizar una acción específica, en este caso a que introduzca el primer número a sumar. Los identificadores que empiezan con letras mayúsculas representan nombre de clases. Por lo tanto, System es una clase que forma parte del paquete java.lang. Esta clase (System) no se importa con una declaración import al principio del programa ya que el paquete java.lang se importa de manera predeterminada en todos los programas de Java. Las clases que se encuentran en el paquete java.lang son las únicas que no requieren una declaración import.

valor1 = entrada.nextInt(); // Lee el primer numero del usuario

La línea anterior utiliza el método nextInt del objeto entrada de la clase Scanner para obtener un entero introducido por el usuario. El resultado de llamar al método nextInt (un valor int) se coloca en la variable valor1 mediante el uso del operador de asignación =. La instrucción se lee como valor1 obtiene el valor de entrada.nextInt(). El operador = se le llama operador binario, ya que tiene dos operandos, valor1 y el resultado de la llamada al método entrada.nextInt(). Esta instrucción se le llama instrucción de asignación, ya que asigna un valor a una variable. Todo lo que esta después (a la derecha= del operador de asignación (=) se evalúa siempre antes de realizar la asignación.

System.out.print( "Escriba el segundo numero a sumar: ");

Pide al usuario que introduzca el segundo numero a sumar.

valor2 = entrada.nextInt(); // Lee el segundo numero del usuario

Lee el segundo numero introducido por el usuario y lo asigna a la variable valor2.

suma = valor1 + valor2; // Suma el valor1 + valor2

Esta línea es una instrucción de asignación que calcula la suma de las variables valor1 y valor2 y asigna el resultado de estos dos variables a la variable suma mediante el uso del operador de asignación =. La instrucción se lee como suma obtiene el valor de valor1 + valor2. La mayoría de los cálculos se realizan en instrucciones de asignación. Cuando el programa encuentra la operación de suma utiliza los valores almacenados en las variables valor1 y valor2 para realizar el cálculo. La operación de suma es binaria, sus dos operandos son valor1 y valor2. Las partes de las instrucciones contienen cálculos que se llaman expresiones.

System.out.printf( "La suma es %d\n", suma); // Muestra el resultado

Una vez realizado el cálculo, se utiliza el método Sistem.out.printf para mostrar la suma en la consola. El especificador %d es un receptáculo para un valor int, en este caso, el valor de suma, la letra d representa entero decimal. El método printf imprime en pantalla “La suma es “, seguido del valor de suma y una nueva línea. Los cálculos también pueden realzarse dentro de la instrucción printf, en este caso, también podríamos haberlo hecho de la siguiente manera.

System.out.printf( "La suma es %d\n", ( valor1 + valor2 ) );

Los paréntesis alrededor de la expresión valor1 + valor2 no son requeridos;

Otro ejemplo sencillo utilizando la clase Scanner.
import java.util.Scanner;

public class ClaseScanner 
{
 public static void main ( String args[] )
 {
  int años;
  String nombre;
  
  Scanner entrada = new Scanner( System.in );
  System.out.print( "Escribe tu nombre >> " );
  nombre = entrada.nextLine();
  System.out.print( "Introduce tus años >> " );
  años = entrada.nextInt();
  System.out.println( "Tu nombre es " + nombre + " y tienes " + años + " años ");
 }
}
Escribe tu nombre >> delfirosales
Introduce tus años >> 10
Tu nombre es delfirosales y tienes 10 años

Referencias:
Documentación de la API de Java
http://docs.oracle.com/javase/7/docs/api/index.html
Java How to Program (early objects) (9thEdition) (Deitel)

Usando cuadros de diálogo para Entrada/Salida con JOptionPane

En los anteriores posts vimos un par de programas que muestran la salida en la ventana de comandos. Ahora veremos un par de programas de como mostrar la salida o entrada utilizando una ventana o cuadro de dialogo. Generalmente muchos programas ofrecen una interfaz gráfica de usuario (GUI) o los cuadros de dialogo (también llamados diálogos) que son ventanas en las que los programas muestran mensajes importantes a los usuarios del programa. Java contiene una clase llamada JOptionPane que nos permite producir cuadros de dialogo previamente empaquetados, los cuales permiten a los programas mostrar ventanas que contengan mensajes. A estas ventanas se les conoce como diálogos de mensaje. Un cuadro de dialogo es un objeto de interfaz gráfica de usuario (GUI), pero ¿cual es la diferencia entre mostrar la salida en consola y en interfaz gráfica?. En consola solo podemos mostrar texto y en una interfaz gráfica de usuario podemos mostrar no solo texto, si no también varios elementos gráficos como botones, barras, casillas de verificación, menús, cuadros de texto e imágenes.

El método showMessageDialog es un método especial de la clase JOptionPane, el cual se conoce como método static. Generalmente los métodos estatic se llaman utilizando el nombre de la clase, seguido de un punto ( . ) y el nombre del método, tal como se muestra a continuación.

Proceso de llamar un método estatic.

Uno de los puntos fuertes de Java es su extenso conjunto de clases predefinidas que los programadores pueden usar, en vez de tener que "reinventar todo". Las numerosas clases predefinidas de Java se agrupan en clases relacionadas, conocidas como paquetes. Un paquete es una colección de clases con nombre, estos se conocen colectivamente como biblioteca de clases, o la Interfaz de Programación de Aplicaciones (API) de Java. Estos paquetes (API) de Java se dividen en básicos y opcionales. Los nombres de la mayoría de los paquetes del API de Java comienzan, ya sea con "java" (paquetes básicos) o "javax" (paquetes opcionales). Muchos de estos se incluyen como parte del Kit de desarrollo de software para Java.

En este post mostraremos un pequeño programa modificado del anterior post llamado PrimerPrograma para que el texto que muestra en consola, ahora lo muestre en un cuadro de dialogo. Este programa muestra el objeto String “"¡Bienvenido a la programacion en Java!\n\n http://delfirosales.blogspot.com” en un dialogo de mensaje (o cuadro de dialogo).
//usando JOptionPane para mostrar la salida en un cuadro de dialogo.

import javax.swing.JOptionPane;

public class PrimerPrograma {
 
 public static void main ( String args [] )
 {
  JOptionPane.showMessageDialog( null, "¡Bienvenido a la programacion en Java!\n
  \n http://delfirosales.blogspot.com" );
 }
}
En este ejemplo utilizamos la clase predefinida de Java JOptionPane, la cual se encuentra en el paquete javax.swing.

import javax.swing.JOptionPane; //Este programa usa JOptionPane

La declaración import es una declaración que se utiliza para identificar las clases predefinidas que se utilizan en nuestro programa en Java. Esta declaración ayuda al compilador a localizar las clases que deseamos utilizar. Importante saber es que todas las declaraciones import deben de aparecer antes de las declaración de la clase, si lo ponemos dentro o después de la declaración de una clase, es un error de sintaxis . Por cada nueva clase que utilizamos del API de Java debemos indicar el paquete en el que se encuentra esa clase.

Ahora entonces, la linea import javax.swing.JOptionPane; indica al compilador que en nuestro programa utilizaremos la clase JOptionPane del paquete javax.swing.

JOptionPane.showMessageDialog( null, "¡Bienvenido a la programacion en Java!\n\n http://delfirosales.blogspot.com" );

Las lineas anteriores contenidas en el método main, llaman al método showMessageDialog de la clase JOptionPane para mostrar un cuadro de dialogo que contiene un mensaje. Este método requiere de dos argumentos y cuando un método requiere varios argumentos, estos se separan con comas ( , ). Por ahora el primer argumento sera la palabra clave null y el segundo argumento "¡Bienvenido a la programacion en Java!\n\n http://delfirosales.blogspot.com" es la cadena a mostrar en el cuadro de dialogo. El primer argumento ayuda a la aplicación en Java a determinar en donde se va a colocar el cuadro de dialogo, cuando el primero argumento es null, el cuadro de dialogo aparece en el centro de la pantalla de la computadora, tal como se muestra en la siguiente imagen.

Usando JOptionPane para mostrar la salida de la aplicación PrimerPrograma.

La barra de titulo del cuadro de dialogo contiene la cadena Mensaje, esto para indicar que este cuadro de dialogo va a presentar un mensaje al usuario. El cuadro de dialogo incluye un botón Aceptar (OK), que el usuario puede oprimir para descartarlo (ocultarlo).
Cuadro de Dialogo de Mensaje.

El paquete javax.swing contiene muchas clases que ayudan a los programadores en Java a crear Interfaces Gráficas de Usuario (GUIs) para las aplicaciones. Los componentes de la GUI facilitan la entrada de datos al usuario del programa y la presentación de los datos de salida. Tal como lo comentamos anteriormente en las GUIs (interfaz gráfica de usuario) podemos mostrar no solo texto, si no también elementos gráficos como botones, casillas de verificación, menús, cuadros de texto e imágenes. Todos estos forman parte de la GUI y permiten interactuar con el programa.

Introducción de Texto en un Cuadro de Dialogo (Diálogos de Entrada)

Hay varios tipos de cuadros de dialogo de la clase JOptionPane. Consideremos el anterior uno de ellos, el cuadro de dialogo de salida, es el que genera el método showMessageDialog. Ahora toca mostrar el cuadro de dialogo de entrada, el cual permite al usuario introducir datos en el programa. El cuadro de dialogo de entrada muestra un mensaje de confirmación y muestran un icono de signo de pregunta esperando la entrada del usuario. Al hacer clic en el botón Aceptar se procede el valor introducido. El siguiente programa utiliza otro cuadro de dialogo predefinido de la clase JoptionPane, que permite al usuario introducir un valor para utilizarlo en el programa. En este caso pide el nombre del usuario y responde con un dialogo de mensaje que contiene un saludo y el nombre que el usuario haya introducido.
//Entrada básica con un cuadro de dialogo.
import javax.swing.JOptionPane;

public class EjemploGUI
{
 public static void main ( String args[] )
 {
  // Pide al usuario que escriba su nombre
  String nombre = JOptionPane.showInputDialog( "Cual es su nombre?" );
  
  // Crea el mensaje
  String mensaje = String.format( "Bienvenido, %s, a la programación en Java!", nombre );
  
  // Muestra el mensaje para dar la bienvenida al usaurio por su nombre
  JOptionPane.showMessageDialog( null, mensaje, JOptionPane.INFORMATION_MESSAGE );
 }
}

Cuadro de dialogo de Entrada, pide al usuario que escriba su nombre.

Muestra el mensaje para dar la bienvenida al usuario por su nombre.

String nombre = JOptionPane.showInputDialog( "Cual es su nombre?" );

Las líneas anteriores utilizan el método showInputDialog de JOptionPane para mostrar el dialogo de entrada, el cual contiene un indicador y un campo (conocido como campo de texto) en la cual el usuario puede introducir texto. El argumento de showInputDialog es el indicador que muestra lo que el usuario debe escribir. El usuario escribe caracteres en el campo de texto, a continuación, hace clic en el botón Aceptar o presionar la tecla intro para devolver la cadena de caracteres (objeto String) al programa. El método showInputDialog devuelve un objeto String que contiene los caracteres tecleados por el usuario. Almacenamos el objeto String en la variable nombre. Si se oprime el botón Cancelar en el cuadro de dialogo, el método devuelve null y el programa muestra la palabra clave “null” como el nombre.

String mensaje = String.format( "Bienvenido, %s, a la programación en Java!", nombre );

La linea anterior es una instrucción que utiliza el método static String llamado format para devolver un objeto String que contiene un saludo con el nombre de usuario. El método format es similar al metodo System.out.printf, excepto que format devuelve el objeto String con formato, en vez de mostrarlo en una ventana de comandos.

JOptionPane.showMessageDialog( null, mensaje );

La línea anterior muestra el saludo en un cuadro de dialogo del mensaje.

Iconos o constantes de dialogo utilizados por JoptionPane

La clase JoptionPane proporciona varias versiones sobrecargadas de los métodos showInputDialog y showMessageDialog, así como métodos que muestran otros tipos de diálogos. Los Iconos o constantes que representan los tipos de diálogos de mensajes se muestran en la siguiente figura.

Iconos o contantes static de la clase JoptionPane para diálogos de mensaje.

Todos los tipos de dialogo de mensaje, excepto PLAIN_MESSAGE, muestran un icono a la izquierda del mensaje. Estos iconos proporcionan una indicación visual de la importancia del mensaje para el usuario. Por ejemplo el icono QUESTION_MESSAGE es el icono predeterminado para un cuadro de dialogo de entrada.

Referencias:
Class JOptionPane
Java How to Program (early objects) (9th Edition) (Deitel)
Java Programming, Joyce Farrell.
Introduction to Java Programming, Comprehensive (8th Edition)

Ejecución de Aplicaciones Java usando la Linea de Comandos

Lo primero que haremos para compilar y ejecutar aplicaciones Java, es descargarnos el JDK (Java Development Kit) que es un software que provee herramientas de desarrollo para la creacion de programas en Java. Hay versiones disponibles para Windows, Linux, y Solaris. Desde la pagina http://www.oracle.com/technetwork/java/index.html podemos buscar y examinar la documentación en línea o descargar el archivo de la documentación del JDK e instalarlo en nuestro equipo. Una vez instalado, podremos buscar y navegar por la documentación a nivel local.

JDK en Windows
En los sistemas operativos Microsoft Windows sus variables de entorno son:
  • JAVAPATH: es una ruta completa del directorio donde está instalado JDK.
  • CLASSPATH: son las bibliotecas o clases de usuario.
  • PATH: variable donde se agrega la ubicación de JDK.
Los programas más importantes que se incluyen son:
  • Appletviewer: es un visor de applets para generar sus vistas previas, ya que un applet carece de método main y no se puede ejecutar con el programa java.
  • Javac: es el compilador de Java.
  • java: es el intérprete de Java.
  • javadoc: genera la documentación de las clases Java de un programa
Primero iremos a la siguiente pagina http://www.oracle.com/technetwork/java/javase/downloads/java-se-jdk-7-download-432154.html donde descargaremos el JDK.

Una vez descargado el JDK, lo ejecutamos y comenzara un asistente que nos guiara a traves del proceso de instalacion. Podemos cambiar el directorio donde instalaremos JDK, pero por defaul es en el directorio C:\Program Files\Java. En un par de minutos solo tendremos que hacer clic en finalizar para terminar el proceso de instalacion. Ahora toca el proceso de establecer las opciones del class y la classpath. Estos valores indican al sistema operativo donde encontrar el compilador Java y sus clases.

Configuración del path en Windows 7

Java se instala por defecto en la ruta C:\Program Files\Java. En este directorio hay dos carpetas llamadas jdk1.7.0 y jre7 que contienen el Java Development Kit, o herramientas de desarrollo y entorno de ejecución. Tenemos que poner atencion en la primera carpeta que contiene el JDK, esta carpeta contiene una carpeta llamada bin, la que contiene todos los programas de Java necesarios para compilar y ejecutar codigo Java. Los programas mas importantes de esta carpeta son javac.exe (compilador de Java) y appletviewer.exe (la utilidad de visor de applets). Tenemos que agregar esta carpeta a las variables de entorno de nuestro sistema que para que podamos invocar el compilador de Java desde cualquier ubicacion de nuestro disco duro. Este proceso se muestra a continuacion.

Clic boton inicio de Windows.
Seleccionar Panel de Control.

Seleccionar la opcion de Sistema y Seguridad.


En el siguiente paso seleccionar la opcion de Sistema.


En la seccion de la izquierda, seleccionar la opcion de Configuración avanzada del sistema.


En la seccion de Configuracion avanzada del sistema, dar clic en las variables de entorno y nos mostrara una ventana similar a la siguiente imagen.

En esta ventana, seccion de Variables de entorno, nos dezplazaremos hacia abajo y buscaremos la opcion Path, la seleccionamos y luego hacemos clic en editar. En esta seccion escribiremos/copiaremos la ruta donde esta el bin de Java, en mi caso.

;C:\Program Files\Java\jdk1.7.0\bin


Una vez realizado este proceso podremos verificar que este todo correcto abriendo el Simbolo del Sistema y escribiendo java -version, este comando invoca el compilador de Java y nos muestra la version de Java instalado
C:\Users\Delfi>java -version
java version "1.7.0"
Java(TM) SE Runtime Environment (build 1.7.0-b147)
Java HotSpot(TM) Client VM (build 21.0-b17, mixed mode, sharing)
Lo anterior comprueba que tenemos instalado Java correctamente y esta listo para escribir y compilar codigo Java. Pero si recibe un error como “Bad command or file name”, entonces las variables de entorno no se han configurado correctamente.

Creación, Compilacón y Ejecución de Aplicaciones en Java

Para compilar un programa, abrimos el simbolo del sistema (tambien conocido como consola). Para abrir, nos vamos a Inicio - Todos los programas - Accesorios - Simbolo de Sistema, o bien tecleando en el buscador de inicio Simbolo de Sistema o cmd (cmd significa "command"). Al hacer esto se habrira el Simbolo de Sistema. Para compilar una aplicacion necesitamos estar en el directorio donde se encuentra nuestra aplicacion.
public class PrimerPrograma 
{
 public static void main ( String args [] )
  {
   System.out.print( "¡¡Bienvenido a la programacion en Java!!\n" );  
   System.out.println( " http://delfirosales.blogspot.com " );
  }
}
En este ejemplo utilizaremos nuestro primer programa que realizamos en el anterior post, llamado PrimerPrograma lo tenemos en el directorio C:\programasjava. Asi que, lo que haremos es cambiarnos de directorio de C:\Users\Delfi> a C:\programasjava. Para esto usamos el comando cd ( cd es el comando de cambio de directorio).

C:\Users\Delfi> cd \programasjava

Nos hemos cambiado de directorio, ahora para mostrar que archivos se encuentran en el directorio utilizaremos el comando dir y nos mostrar los archivos contenidos en el directorio programasjava.

En nuesto caso solo tenemos la aplicacion PrimerPrograma utilizado en el anterior post.

Un compilador de Java traduce un archivo fuente de Java en un archivo bytecode (codigo de bytes) de Java. Estamos listos para compilar el programa llamado PrimerPrograma.java El siguiente comando compila la aplicacion PrimerPrograma.java (javac significa compilar java).
javac PrimerPrograma.java
Si no hay errores de sintaxis, el compilador genera un archivo con una extension de codigo de bytes. Asi el comando anterior genera un archivo con el nombre de PrimerPrograma.class como se muestra en la siguiente figura.

El archivo PrimerPrograma.class generado.

Realizado el paso anterior, ahora podemos utilizar el siguiente comando para ejecutar el programa PrimerPrograma.
java PrimerPrograma
Este comando inicia la maquina virtual de java (JVM). Las palabras ¡¡Bienvenido a la programacion en Java!! se muestran en la ventana de comandos.
¡¡Bienvenido a la programacion en Java!!http://delfirosales.blogspot.com
La siguiente siguiente imagen muestra el resumen del proceso de compilacion, ejecuacion de PrimerPrograma en Java.

Proceso de compilacion, ejecuacion de PrimerPrograma en Java.

El lenguaje Java es un lenguaje de alto nivel, mientras que el bytecode de Java es un lenguaje de bajo nivel. El bytecode es similar a las intrucciones de la maquina, pero es arquitectura neutral y puede ejecutarse en cualquier plataforma que tenga una maquina virtual de Java (JVM). En lugar de una maquina fisica, la maquina virtual es un programa que interpreta el bytecode de Java. Esta es una de las principales ventajas de Java.

Codigo Fuente de Java es traducido a Codigo Byte (bytecode).

Podemos utilizar cualquier editor de texto o IDE para crear y editar nuestro codigo fuente de Java, ejemplo en Windows podemos utilizar el blog de notas o bien utilizar un IDE (Entorno de Desarrollo Integrado) como Eclipse, NetBeans, JCreator etc.

Tambien podemos ingresar al sitio de Java e ir a la seccion de frequently asked questions (FAQs) que proporcionan respuestas breves a las preguntas mas frecuentes sobre el software de Java.

Referencias:
Java Development Kit o (JDK)
Java Programming: From Problem Analysis to Program Design
Introduction to Java Programming, Comprehensive (8th Edition)

Introducción a la Programación en Java

Qué es un Programa

Un programa no es nada mas que una serie de instrucciones dadas al ordenador en un lenguaje entendido por el, para decirle exactamente lo que queremos que haga. Si el ordenador no entiende algún instrucción, lo comunicara generalmente mediante mensajes visualizados en la pantalla.

Lenguaje de Programación


Un programa tiene que escribirse en un lenguaje entendible por el ordenador. Dese el punto de vista física, un ordenador es una maquina electrónica. Los elementos físicos (memoria, unidad central de procesos, etc.) de que dispone el ordenador para representar los datos son de tipo binario. Esto es, cada elemento puede diferenciar dos estados (dos niveles de voltaje). Cada estado se denomina genéricamente bit y se simboliza por 0 o 1. Por lo tanto, para representar y manipular información numérica, alfabética y alfanumérica se emplean cadenas de bits. Según esto, se denomina byte a la cantidad de información empleada por un ordenador para representar un carácter, generalmente un byte es una cadena de ocho bits.

Asi por ejemplo, cuando un programa le indica al ordenador que visualice un mensaje en nuestro monitor, o que imprima en una impresora, las instrucciones para llevar acabo estas acciones, para que puedan ser entendibles por el ordenador tienen que estar almacenadas en memoria como cadenas de bits. Esto hace pensar que escribir un programa utiliza ceros y unos (lenguaje maquina), llevaría mucho tiempo y muchas posibilidades de cometer errores. Por este motivo se desarrollaron los lenguajes ensambladores y lenguajes de programación de alto nivel.

Los lenguajes de alto nivel para traducir las instrucciones a lenguaje maquina utilizan otro programa denominado compilador. Para traducir un programa escrito en un lenguaje de alto nivel (programa fuente) a lenguaje maquina se utiliza un programa llamado compilador. Este programa tomara como datos nuestro programa escrito en lenguaje de alto nivel y dará como resultado el mismo programa pero escrito en lenguaje maquina, programa que ya puede ejecutar directa o indirectamente el ordenador.

Compilador

Por ejemplo, un programa escrito en el lenguaje C necesito del compilador C para poder ser traducido. Posteriormente el programa traducido podrá ejecutarse directamente por el ordenador. En cambio, para traducir un programa escrito en el lenguaje Java necesita del compilador Java, en este caso, el lenguaje maquina no corresponde al lado del ordenador sino al de una maquina ficticia, denominada maquina virtual Java, que sera puesta en marcha por el ordenador para ejecutar el programa.

¿Que es una maquina virtual? Una maquina que no existe físicamente sino que es simulada en un ordenador por un programa. ¿Por que utilizar una maquina virtual? Porque, por tratarse de un programa, es muy facil instalarla en cualquier ordenador, basta con copiar ese programa al disco duro, por ejemplo. Y, ¿que ventajas reporta? Pues, en el caso de Java, que un programa escrito en este lenguaje y compilado, puede ser ejecutado en cualquier ordenador del mundo que tenga instalada esa maquina virtual. Esta solución hace posible que cualquier ordenador pueda ejecutar un programa escrito en Java independiente de la plataforma que utilice, lo que se conoce como transportabilidad de programas.

Lenguaje de Programación Java

Java es un lenguaje de programación de alto nivel con el que se puede escribir tanto programas convencionales como para Internet. Una de las ventajas significativas de Java sobre otros lenguajes de programación es independiente de la plataforma, tanto en código fuente como en binario. Java incluye dos elementos: un compilador y un interprete.

El compilador produce un código de bytes que se almacena en un fichero para ser ejecutado por el interprete Java denominado maquina virtual de Java.

Maquina Virtual de Java

Otra característica importante de Java es que es un lenguaje de programación orientada a objetos (POO). Ademas de ser transportable y orientado a objetos, Java es un lenguaje fácil de aprender. Tiene un tamaño pequeño que favorece el desarrollo y reduce las posibilidades de cometer errores, a la vez es potente y flexible.

Realización de un Programa en Java

Una aplicación en Java es un programa que se ejecuta utilizando el interprete Java. Un programa puede ser una aplicación o un applet. Empecemos con la creación de una aplicación sencilla, el clásico ejemplo de mostrar un mensaje de texto en pantalla.

// indica que el resto de la linea es un comentario. Los comentarios son insertados para documentar los programas y mejor la legibilidad de estos, también ayudan a otras personas a leer y comprender un programa. El compilador de Java ignora estos comentarios, de manera que la computadora no hace nada cuando el programa se ejecuta.

Los comentarios tradicionales o también conocidos como comentarios de múltiples lineas se distribuyen en varias lineas, son como se muestra a continuación.
/* Este es un comentariotradicional que puedecontener muchas lineas */
Este tipo de comentarios comienzan con el delimitador /* y termina con */. El compilador de Java ignora todo el texto que este entre delimitadores.

Nuestro primer programa para imprimir texto en pantalla.
public class PrimerPrograma 
{
 public static void main ( String args [] )
  {
   System.out.print( "¡¡Bienvenido a la programacion en Java!!\n" );  
   System.out.println( " http://delfirosales.blogspot.com " );
  }
}
¿Que hace este programa?

Comentaremos brevemente cada linea de este programa. Primero se define una clase o declara una clase para la clase PrimerPrograma.
public class PrimerPrograma
Todo programa en Java consiste de, cuando menos, una declaración de clase que se debe definir. Estas clases se conocen como clases definidas por el programador o clases definidas por el usuario. La palabra clave class lo que hace es introducir una declaración de clase en Java, la cual debe ir seguida inmediatamente por el nombre de la clase, que en este primer caso es PrimerPrograma. Las palabras clave, algunas veces también conocidas como palabras reservadas, se reservan para uso exclusivo de Java y siempre se escriben en minúscula.

Programa para Imprimir Texto.

La llave { comienza el cuerpo de la declaración de una clase y tiene su correspondiente llave que } que termina la declaración de una clase.
public static void main ( String args [] )
La linea anterior es el punto de inicio de toda aplacion en Java. Los parentisis despues del main indican que este es un bloque de construcción del programa, al cual se llama metodo. Las declaraciones de clases en Java generalmente contienen uno o mas metodos. En una aplicacion en Java, solo uno de esos metodos debe llamarse main y debe definirse como public static void main ( String args [] ) de lo contrario, el interprete java no ejecutara la aplicacion.

Los metodos pueden realizar tareas y devolver informacion una vez que las hayan concluido. La palabra clave void indica que este metodo realizara una tarea, en este primer caso, mostrara una linea de texto, pero no devolvera ningun tipo de informacion cuando se complete la tarea.

La siguiente llave { es el que comienza el cuerpo de la declaracion del metodo y su correspondiente llava } debe terminar el cuerpo de la declaracion del metodo.
System.out.println( "¡¡Bienvenido a la programacion en Java!!" );
La linea anterior indica a la computadora que realice una accion, es decir, que imprima la cadena de caracteres contenida entre los caracteres de comillas dobles. A una cadena tambien se le denomina cadena de caracteres, mensaje o literal de cadena, pero generealmente se refiere como cadenas. El compilador en Java no ignora los caracteres de espacio en blanco dentro de cadenas.

System.out se conoce como el objeto de salida estandar, permite a las aplicaciones en Java mostrar conjuntos de caracteres en la ventana de comandos, desde la cual se ejecuta la aplicacion en Java.

En Microsoft Windows 95/98/ME la ventana de comandos es el simbolo de MS-DOS.
En Microsoft Windows NT/2000/XP la ventana de comandos es el simbolo de sistema.
En UNIX/GNU Linux/Mac OS X la ventana de comandos se llama ventana de terminal o shell.

El metodo System.out.println muestra o imprime una linea de texto en la ventana de comandos. La cadena dentro de los parentisis es el argumento para el metodo. Cuando System.out.println completa su tarea, posiciona el curso de salida.

El argumento "¡¡Bienvenido a la programacion en Java!!" entre parentisis y el punto y coma (;), se conoce como una instruccion. La mayoria de las intrucciones terminan con punto y coma. Cuando se ejecuta la instruccion muestra el mensaje "¡¡Bienvenido a la programacion en Java!!" en la ventana de comandos.

PrimerPrograma en ejecucion utilizando JCreator un entorno de Desarrollo integrado (IDE).

El metodo print a diferencia de println despues de mostrar su argumento, print no posiciona el curso de salida al inicio de la siguiente linea en la ventana de comandos. Cada instruccion print o println continua mostrando caracteres a partir de donde la ultima instruccion print o println dejo de mostrar caracteres.

La barra diagonal inversa ( \ ) se conoce como caracter de escape. Este caracter indica a los metodos print y println de System.out que se va imprimir un "caracter especial". Cuando aparece una barra diagonal inversa en una cadena de caracteres, Java lo que hace es combinar el siguiente caracter con la barra diagonal inversa para mostrar una secuencia de escape. La secuancia de escape \n representa el caracter de nueva linea. Cuando aparece un caracter de nueva linea en una cadena que se va imprimir con System.out, el caracter de nueva linea ( \n ) hace que el cursor de salida de pantalla se desplace al inicio de la siguiente linea en la ventana de comandos.

Referencias:

Java: How to Program, 8th Edition
Java 2: Curso de Programación - Fco. Javier Ceballos

Arreglos en Java

Los arreglos son estructuras de datos que consisten de elementos de datos relacionados, del mismo tipo. Los arreglos son entidades de longitud fija, conservan siempre la misma longitud una vez creados.

En Java, un arreglo es un grupo de variables (llamadas elementos o componentes) que contienen valores del mismo tipo. Los tipos en Java se dividen en dos categorias: Tipos primitivos y tipos de referencia.

Los arreglos en Java son objetos, por lo que se consideran como tipos de referencia. Los elementos de un arreglo en Java pueden ser tipos primitivos o de referencia ( incluyendo arreglos). Para hace referencia a un alemento especifico en un arreglo, debemos especificar el nombre de la referencia al arreglo y el numero de la posicion del elemento en el arreglo. El numero de la posicion del elemento se conoce formalmente como el indice o subindice del elemento.

En la siguiente figura se muestra una representacion logica de un arreglo de enteros, llamado C. Este arreglo llamado C contiene 8 elementos ( es decir, variables). El primer elemento en cualquier arreglo tiene el indice cero ( lo que se denomina como elemento cero). Por lo tanto, el primer elemento del arreglo C es C [ 0 ], el segundo elemento es C [ 1 ], el octavo elemento es C [ 7 ]. Un indice debe ser un entero positivo o una expresion entera que pueda promoverse a un int.

Arreglo con 8 elementos.

El nombre de la referencia al arreglo es C. Todo objeto arreglo en Java conoce su propia longitud y mantiene esta informacion en un campo del objeto arreglo, llamado length. La expresion C.length accede al campo length del arreglo C para determinar la longitud del arreglo. La manera en que se hace referencia a los 8 elementos de este arreglo es: C [ 0 ], C[ 1 ]. C[ 2 ], ..., C [ 7 ]. El valor de C [ 0 ] es 12. el valor de C[ 1 ] es 3, el valor de C[ 2 ] es 27. Para calcular la suma de los valores contenidos en los primeros tres elementos del arreglo C y guardar el resultado en la variable suma, lo escribiremos de la siguiente forma:
suma =  C[ 0 ] + C[ 1 ] + C[ 2 ];
Para divir el valor del septimo elemento del arreglo C entre 4 y asigncar el resultado a la variable X, lo escribiremos de la siguiente manera:
X = C[ 6 ] / 4;

Declaracion y Creacion de Arreglos en Java


Los objetos arreglo ocupan espacio en memoria. Todos los objetos en Java ( incluyendo los arreglos) deben crearse con la palabra clave new. Para crear un arreglo se debe especificar el tipo de cada elemento y el numero de elementos que se requieren para el arreglo, como parte de una expresion para crear un arreglo que utiliza la palabra clave new. La siguiente declaracion y expresion crea 8 elementos para el arreglo de entros C del anterior figura.
int C[] = new int [ 8 ];
Este proceso puede realizarse en dos pasos, tal como se muestra a continuacion.
int C[];            // declara la varibale arreglo
C = new int [ 8 ];    // crea el arreglo
Un programa en Java puede crear varios arreglos en una sola declaracion. La siguiente declaracion de un arreglo String reserva 50 elementos para arregloA y 32 para arregloB.
String arregloA[] = new String [ 50 ], arregloB[] = new String[ 32 ];
Al declarar un arreglo, su tipo y los corchetes puende conbinarse al principio de la declaracion para indicar que todos los identificadores en la declaracion son referencias a arreglos. Por ejemplo.
double[] arreglo1, arreglo2;
declara a un arreglo1 y arreglo2 como referencia a arreglos de valores double. La siguiente declaracion reserva 12 elementos para arreglo1 y 25 para arreglo2.
double[] arreglo1 = new double[ 12 ], arreglo2 = new double[ 25 ];
Un programa puede declarar arreglos de cualquier tipo. Por ejemplo, cada uno de los elementos de un arreglo int es una variable int. Cada uno de los elementos de una rreglo String es una referencia a un objeto String.

Referencias:
Java: How to Program, 8th Edition
La instruccion especifica para crear un Objeto en Java es la palabra clave new. La palabra clave new comienza una expresion del creacion de instancia de una clase, la cual crea un objeto del tipo especificado a la derecha del new. El proceso de crear nuevos objetos se conoce tambien como crear una instancia de, o instanciar un objeto. El valor entre parentisis despues del tipo de expresion de creacion de instancia de una clase se utiliza para inicializar ( es decir, dar un valor a) el nuevo objeto.

Ejemplo:
Circulo Figura = new Circulo();
El operador new realiza las siguientes acciones:
  • Separa memoria para el nuevo objeto
  • Invoca el método de inicio de la clase llamado constructor.
  • Retorna la referencia a un nuevo objeto.
Por lo general, los objetos se crean con new. El uso del operador new en Java es similar al del comando malloc en C y el operador new en C++