miércoles, 24 de julio de 2013

JAVA - Bloqueador de pantalla al estilo Anonymous



Weno aproche que recién termine mi proyecto en java con ayuda netbeans para mostrar como hacer de manera sencilla un bloqueador de pantalla , e visto que muchos personas se preguntan  como hacer para bloquear la pantalla mostrando un imagen o algo al estilo cibercafe. Pero claro asta aqui seria tan facil como crear un jframe sin bordes  agregar un jlabel que contenga la imagen y iniciar siempre la ventana a pantalla completa pero claro ahora nos preguntamos que pasa si el usuario presiona alguna combinación de teclas como Alt+F4,Ctrl+Alt+Supr....etc.

Mi proyecto tiene 7 clases las principales son  3 :

jFrameBlocked// esto es nuestro jframe  ya creado con netbeans
jBlocked // esta es la que nos permite evitar cerrar nuestra ventana por cualquier metodo
Fondo  // nos permite colocar un fondo a nuestro jframe
Las demás son solamente para darle un toque a lo Anonymous jeje.
Alarma // reproduce el archivo de sonido que le indiquemos
Resolucion // nos permite saber la resolucion de la pantalla
Tiempo //la uso para controlar el tiempo que sonara la alarma
TestEncriptarMD5 // nos sirve para pasar un string a md5

1.- Crearemos un nuevo proyecto en netbeans llamado blocked, y a continuación un jframe llamado jFrameBlocked que tendra en siguiente diseño.(Aqui nose ven los jlabel porque estan en blanco)


 2.- Ahora crearemos una clase llamada Fondo para poner un imagen de fondo a nuestro jframe y copiamos es siguiente codigo.

Nota: Tener en cuenta que yo puse mi imagen en una carpeta llamada imágenes
import java.awt.Graphics;

import javax.swing.ImageIcon;



/**

 * http://jc-mouse.blogspot.com/

 * @author Mouse

 */

public class Fondo extends javax.swing.JPanel {

    String imagen;

    public Fondo(int w,int h,String foto){    

        this.setSize(w,h);

        imagen = foto;

    }

        

    @Override

    public void paint(Graphics g){

        Dimension tamanio = getSize();

        ImageIcon imagenFondo = new ImageIcon(getClass().getResource("/imagenes/"+imagen));        

        g.drawImage(imagenFondo.getImage(),0,0,tamanio.width, tamanio.height, null);        

        setOpaque(false);

        super.paintComponent(g);

    }

}



3.-Para que la imagen ocupe toda la pantalla independientemente del monitor crearemos un clase llamada Resolución.

Copiamos el siguiente código:
  
import java.awt.Dimension;

import java.awt.Toolkit;

/**

 * @web http://jc-mouse.blogspot.com/

 * @author Mouse

 */

public class Resolucion {



    public void tamaño() {

        // TODO code application logic here

        //Obtiene el tamaño de la pantalla

        Dimension d = Toolkit.getDefaultToolkit().getScreenSize();

        //obtiene la resolucion de la pantalla en PPP (Puntos por pulgada)

        int sr = Toolkit.getDefaultToolkit().getScreenResolution();

        //muestra la informacion por la consola de java

       // System.out.println("Tamaño de pantalla: " + d.width + "x" + d.height + ", definición: " + sr + " ppp");

       jFrameBlocked.ancho = d.width ;

        jFrameBlocked.alto = d.height;

    }

}



Y agregamos las siguiente líneas a nuestra clase jFrameBlocked que son las variables a las que se podrá acceder desde la clase fondo para modificarlas con la resolución de la pantalla.

  
public class jFrameBlocked extends javax.swing.JFrame {// esta es la clase de nuestro frame

    /**

     * Creates new form jFrameBlocked

     */

    public static int alto; //copiamos

    public static int ancho;; //copiamos



    Resolucion resolucion = new Resolucion();; //copiamos



4.- También agregamos un método dentro de la clase de nuestro frame para llamar a la clase fondo para mas comodidad.

  
public void ColocarImagen(String img) {

        Fondo p = new Fondo(ancho,alto,img);

        this.add( p , BorderLayout.CENTER);

        p.repaint();

      }


5.- Luego añadimos otra clases mas llamada  jBlocked que sera la encargada de enviar nuestro jframe al frente cada n milisegundos y asi no dara tiempo para usar alt+f4.. etc .

Copiamos el siguiente codigo.
 
import java.util.concurrent.Executors;

import java.util.concurrent.ScheduledExecutorService;

import java.util.concurrent.TimeUnit;

import javax.swing.JFrame;

/**

 * @web http://www.jc-mouse.net/

 * @author Mouse

 */

public class jBlocked {

    

    private JFrame jframe=null;

    

    /**

     * Constructor de clase

     */

    public jBlocked( JFrame f )

    {

        this.jframe = f;

    }

    

    /**

     * ejecuta una tarea cada "n" tiempo

     * Para evitar que el usuario utilice las teclas (WINDOWS + D)(TAB) y asi perder el foco

     * de la aplicación, cada 50 milisegundos se envia el JFrame al frente y se cambia su propiedad a maximizado

     */

    public void block()

    {

        ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();

        scheduler.scheduleAtFixedRate( 

            new Runnable() 

            {

                @Override

                public void run() {                   

                    front(); 

                }

              }, 500, 50 , TimeUnit.MILLISECONDS ); //comienza dentro de 1/2 segundo y luego se repite cada N segundos

    }

    public void front()

    {

        jframe.setExtendedState( JFrame.MAXIMIZED_BOTH );//maximizado

        jframe.toFront();

    }
}




6.- Una vez que tenemos creado la clase jBlocked , Fondo y todo lo demas, debemos hacer lo siguiente
- Modificaremos el constructor de jFrameBlocked de la siguiente manera:

Nota: Mi imagen que voy a poner se llamada foto.jpg cambiar esto si su imagen tiene otro nombre
 
public jFrameBlocked() {

        

        this.setUndecorated(true);//quita bordes a jframe

        

        initComponents();

        

        resolucion.tamaño();// obtenemos el tamaño de la pantalla

        ColocarImagen("foto.jpg"); // colocamos nuestro fondo al frame

        

        this.setDefaultCloseOperation( DO_NOTHING_ON_CLOSE  );//evita cerra jframe con ALT+C

        this.setExtendedState( MAXIMIZED_BOTH );//maximizado

        this.setAlwaysOnTop(true);//siempre al frente       

        //nueva instancia de jBlocked pasando como parametros e este JFrame

        new jBlocked( this ).block();

    }



Weno hasta aquí estaría todo lo principal echo pero como quiero darle un toque mas de estilo le voy a agregar sonidos y una alarma que suene el tercer intento fallido para los intrusos(osea mi hermana XD), primero creo otra clases llamada Alarma y copiamos este código que será el encargado de reproducir el sonido.

Antes crearemos un nueva carpeta dentro de un proyecto llamada sonido y colocaremos los archivos de sonido (en este caso yo tengo 6 archivo WAV )
  
import java.net.URL;

import javax.sound.sampled.AudioInputStream;

import javax.sound.sampled.AudioSystem;

import javax.sound.sampled.Clip;

public class Alarma {

        public static Clip sonido;

        

        public void Reproducir(String archivo,int bd,int duracion){

             URL path = Alarma.class.getResource("/sonido/"+archivo);

            try {

                sonido = AudioSystem.getClip();

                AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(path);

                sonido.open(audioInputStream);

                sonido.start();

                if(bd == 0){ // si la bd(bandera)  es 0 entonces reproduce la alarma una y otra ves

                    sonido.loop(Clip.LOOP_CONTINUOUSLY);// reproduce el fichero de sonido una y otra vez sin parar. 

                }else{ //sino esperamos a que es archivo termine para cerrarlo

                    while (sonido.isRunning()){ // verifica si el archivo todabia se esta reproduciendo

                      

                        // Se cierra el clip. Significa que acabo el archivo y tendremos que cerrarlo

                        sonido.close(); 

                   

                    }

                

                }

                //Thread.sleep(60000); // 1000 milisegundos (10 segundos)

                //sonido.close();

            }

                catch (Exception tipoerror) {

                System.out.println("" + tipoerror);

        }



    }     

 }

Quiero aclarar que este código funciona muy bien cuando tengamos nuestro JAR
Ya que hay muchos códigos que he probado y solo reproduce el sonido cuando lo ejecutamos desde el netbeans, asi que aprovechen jeje.

Ya con todo listo solo nos queda colocar el código de los botón Aceptar y Cancelar este ultimo no es necesario solamente lo vamos a utilizar para cerrar nuestra aplicación en las etapas de prueba .

En el botón aceptar damos doble click y nos llevara al método del botón ay copiamos lo siguiente:
Nota: para que esto funcione deben tener los archivos que yo tengo sino solamente borren toda las líneas que usan la clase Alarma.

Nota: el usuario es user y la contraseña es 12345 cambiarlas por la de ustedes.

 
int cont = 0  ; // nuestro contador para saber cuantas veces a fallado

private void btnEntrarActionPerformed(java.awt.event.ActionEvent evt) { 

  // este es el metodo de nuestro boton                                 

 

        // TODO add your handling code here:

        if(this.user.getText().equals("") || this.pass.getText().equals("")){

             Alarma alarma1 =  new Alarma();

              alarma1.Reproducir("Error-lockendo2.wav",1,3);

              JOptionPane.showMessageDialog( this, "Intruso alejate del computadora",".::ERROR::.",JOptionPane.ERROR_MESSAGE);

            

        }else{

        

           // String clavemd5 = TestEncriptarMD5.encriptaEnMD5(this.pass.getText());

            



            if( this.user.getText().equals("user") && this.pass.getText().equals("12345") )

            {

                

                Alarma permitido =  new Alarma();

                permitido.Reproducir("acceso_permitido.wav",1,3);

                try {

                    Thread.sleep(1000);

                    this.dispose(); 

                    Thread.sleep(1000);

                     System.exit(0);

                } catch (InterruptedException ex) {

                    

     Logger.getLogger(jFrameBlocked.class.getName()).log(Level.SEVERE, null, ex);

                }

                

               

            }else{   

                cont = cont+1 ;

                if(cont < 3){

                

                Alarma alarma2 =  new Alarma();

                alarma2.Reproducir("Error-lockendo.wav",1,3);



                JOptionPane.showMessageDialog( this, "Usuario o contraseña invalida!",".::ERROR::.",JOptionPane.ERROR_MESSAGE);

                }

               

                 if(cont == 2){

                    try {

                        Thread.sleep(1000);  

                        Alarma alarma3 =  new Alarma();

                         alarma3.Reproducir("Error-lockendo3.wav",1,3);

                    } catch (InterruptedException ex) {

      Logger.getLogger(jFrameBlocked.class.getName()).log(Level.SEVERE, null, ex);

                    }

                   



                }

                if(cont == 3){

                    //System.out.println(cont);

                     Alarma alarma4 =  new Alarma();

                     alarma4.Reproducir("Error-lockendo4.wav",1,3);



                   //JOptionPane.showMessageDialog( this, "Te lo adverti!",".::ERROR::.",JOptionPane.ERROR_MESSAGE);

                   Alarma alarma =  new Alarma();

                   alarma.Reproducir("alarma.wav",0,0);



                   cont = 0;// reiniciamos nuestro contador a 0 de nuevo

                }

             }

        }

    }                   


Para mayor seguridad yo había puesto la comparación de la contraseña en md5 pero para no complicar las cosas lo hice así directo, para los que le interese la clase llamada TestEncriptarMD5 para convertir string a md5 esta es:

 
/**

 *

 * @author Administrador

 */

/**

 *      Instituto Tecnologico de Zacatepec

 * Descripcion:   Encriptacion de paswords en MD5

 * @author Gonzalo Silverio

 * Fecha: 03-12-2011

 * Archivo:  TestEncriptarMD5.java

 */

 

import java.security.MessageDigest;

import java.security.NoSuchAlgorithmException;

 

public class TestEncriptarMD5

{

    private static final char[] CONSTS_HEX = { '0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f' };

    public static String encriptaEnMD5(String stringAEncriptar)

    {

        try

        {

           MessageDigest msgd = MessageDigest.getInstance("MD5");

           byte[] bytes = msgd.digest(stringAEncriptar.getBytes());

           StringBuilder strbCadenaMD5 = new StringBuilder(2 * bytes.length);

           for (int i = 0; i < bytes.length; i++)

           {

               int bajo = (int)(bytes[i] & 0x0f);

               int alto = (int)((bytes[i] & 0xf0) >> 4);

               strbCadenaMD5.append(CONSTS_HEX[alto]);

               strbCadenaMD5.append(CONSTS_HEX[bajo]);

           }

           return strbCadenaMD5.toString();

        } catch (NoSuchAlgorithmException e) {

           return null;

        }

    }

 

     public static void main(String args[])

      {

     System.out.println("\n\nEncriptacion en MD5 : '"+encriptaEnMD5("123")+"'");

   System.out.println("Encriptacion en MD5 de hola: '"+encriptaEnMD5("hola")+"'");

      

      }

}



Y en el botón cancelar solo ponemos   System.exit(0);

Y  terminamos ! ! ! Espero que les haya gustado ,cualquier sugerencia, error o critica constructiva comente . Y siendo sinceros me a costado escribir tanto, porque me cuesta explicarme y porque recien empiezo a entender el creador de entradas del blog jeje.

 Para los que quieran descargar este proyecto completo y original + el JAR


Este incluye una clase llamada tiempo que la puse para poder controlar en tiempo de se reproduce la alarma y la demás clases pero con pequeños cambios . Si quieren que quede como lo hicimos en este entrada solamente reemplacen el código de las clases con el código que esta aquí .

Sigueme en facebook
https://www.facebook.com/pages/Espacio-Hacker/393964274047994

Paginas que me han ayudado al desarrollo de este proyecto y que son autoras de las mayorías de las clases que he puesto :
http://www.jc-mouse.net/


7 comentarios: